1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-12-26 09:29:45 +00:00

Filter is now a ClockReciever, affecting all sound output devices.

This commit is contained in:
Thomas Harte 2017-07-24 21:29:13 -04:00
parent 677ed463f0
commit b7f88e8f61
5 changed files with 10 additions and 9 deletions

View File

@ -408,7 +408,7 @@ template <class T> class MOS6560 {
std::shared_ptr<Speaker> speaker_;
unsigned int cycles_since_speaker_update_;
void update_audio() {
speaker_->run_for_cycles(cycles_since_speaker_update_ >> 2);
speaker_->run_for(Cycles((int)cycles_since_speaker_update_ >> 2));
cycles_since_speaker_update_ &= 3;
}

View File

@ -42,7 +42,7 @@ class Bus {
inline void update_audio() {
unsigned int audio_cycles = cycles_since_speaker_update_ / (CPUTicksPerAudioTick * 3);
cycles_since_speaker_update_ %= (CPUTicksPerAudioTick * 3);
speaker_->run_for_cycles(audio_cycles);
speaker_->run_for(Cycles((int)audio_cycles));
}
// video backlog accumulation counter

View File

@ -368,7 +368,7 @@ inline void Machine::update_audio() {
if(cycles_since_audio_update_) {
unsigned int difference = cycles_since_audio_update_ / Speaker::clock_rate_divider;
cycles_since_audio_update_ %= Speaker::clock_rate_divider;
speaker_->run_for_cycles(difference);
speaker_->run_for(Cycles((int)difference));
}
}

View File

@ -235,7 +235,7 @@ uint8_t Machine::VIA::get_port_input(Port port) {
}
void Machine::VIA::flush() {
ay8910->run_for_cycles(cycles_since_ay_update_);
ay8910->run_for(Cycles((int)cycles_since_ay_update_));
ay8910->flush();
cycles_since_ay_update_ = 0;
}
@ -247,7 +247,7 @@ void Machine::VIA::run_for_cycles(unsigned int number_of_cycles) {
}
void Machine::VIA::update_ay() {
ay8910->run_for_cycles(cycles_since_ay_update_);
ay8910->run_for(Cycles((int)cycles_since_ay_update_));
cycles_since_ay_update_ = 0;
ay8910->set_control_lines( (GI::AY38910::ControlLines)((ay_bdir_ ? GI::AY38910::BCDIR : 0) | (ay_bc1_ ? GI::AY38910::BC1 : 0) | GI::AY38910::BC2));
}

View File

@ -20,6 +20,7 @@
#include "../SignalProcessing/Stepper.hpp"
#include "../SignalProcessing/FIRFilter.hpp"
#include "../Concurrency/AsyncTaskQueue.hpp"
#include "../Components/ClockReceiver.hpp"
namespace Outputs {
@ -132,17 +133,17 @@ class Speaker {
`get_samples(unsigned int quantity, int16_t *target)` and ideally also `skip_samples(unsigned int quantity)`
to provide source data.
Call `run_for_cycles(n)` to request that the next n cycles of input data are collected.
Call `run_for` to request that the next period of input data is collected.
*/
template <class T> class Filter: public Speaker {
template <class T> class Filter: public Speaker, public ClockReceiver<Filter<T>> {
public:
~Filter() {
_queue->flush();
}
void run_for_cycles(unsigned int input_cycles) {
void run_for(const Cycles &cycles) {
enqueue([=]() {
unsigned int cycles_remaining = input_cycles;
unsigned int cycles_remaining = (unsigned int)cycles.as_int();
if(coefficients_are_dirty_) update_filter_coefficients();
// if input and output rates exactly match, just accumulate results and pass on