2019-06-01 18:39:40 +00:00
|
|
|
//
|
|
|
|
// Audio.cpp
|
|
|
|
// Clock Signal
|
|
|
|
//
|
|
|
|
// Created by Thomas Harte on 31/05/2019.
|
|
|
|
// Copyright © 2019 Thomas Harte. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
#include "Audio.hpp"
|
|
|
|
|
|
|
|
using namespace Apple::Macintosh;
|
|
|
|
|
2019-06-01 19:18:27 +00:00
|
|
|
namespace {
|
|
|
|
const HalfCycles sample_length(704);
|
|
|
|
}
|
|
|
|
|
2019-06-01 18:39:40 +00:00
|
|
|
Audio::Audio(Concurrency::DeferringAsyncTaskQueue &task_queue) : task_queue_(task_queue) {}
|
|
|
|
|
|
|
|
// MARK: - Inputs
|
|
|
|
|
|
|
|
void Audio::post_sample(uint8_t sample) {
|
2019-06-01 19:18:27 +00:00
|
|
|
// Grab the read and write pointers, ensure there's room for a new sample and, if not,
|
|
|
|
// drop this one.
|
2019-06-01 18:39:40 +00:00
|
|
|
const auto write_pointer = sample_queue_.write_pointer.load();
|
|
|
|
const auto read_pointer = sample_queue_.read_pointer.load();
|
2019-06-01 19:18:27 +00:00
|
|
|
const decltype(write_pointer) next_write_pointer = (write_pointer + 1) % sample_queue_.buffer.size();
|
|
|
|
if(next_write_pointer == read_pointer) return;
|
|
|
|
|
|
|
|
sample_queue_.buffer[write_pointer] = sample;
|
|
|
|
sample_queue_.write_pointer.store(next_write_pointer);
|
2019-06-01 18:39:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Audio::set_volume(int volume) {
|
2019-06-01 19:18:27 +00:00
|
|
|
// Post the volume change as a deferred event.
|
2019-06-01 18:39:40 +00:00
|
|
|
task_queue_.defer([=] () {
|
|
|
|
volume_ = volume;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
void Audio::set_enabled(bool on) {
|
2019-06-01 19:18:27 +00:00
|
|
|
// Post the enabled mask change as a deferred event.
|
2019-06-01 18:39:40 +00:00
|
|
|
task_queue_.defer([=] () {
|
2019-06-01 19:18:27 +00:00
|
|
|
enabled_mask_ = on ? 1 : 0;
|
2019-06-01 18:39:40 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// MARK: - Output generation
|
|
|
|
|
|
|
|
bool Audio::is_zero_level() {
|
2019-06-01 19:18:27 +00:00
|
|
|
return !volume_ || !enabled_mask_;
|
2019-06-01 18:39:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Audio::set_sample_volume_range(std::int16_t range) {
|
2019-06-01 19:18:27 +00:00
|
|
|
// Some underflow here doesn't really matter.
|
2019-06-01 18:39:40 +00:00
|
|
|
volume_multiplier_ = range / 7;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Audio::get_samples(std::size_t number_of_samples, int16_t *target) {
|
2019-06-01 19:18:27 +00:00
|
|
|
// TODO.
|
|
|
|
}
|
|
|
|
|
|
|
|
void Audio::skip_samples(std::size_t number_of_samples) {
|
|
|
|
// TODO.
|
2019-06-01 18:39:40 +00:00
|
|
|
}
|