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

Merge branch 'master' of github.com:TomHarte/CLK

This commit is contained in:
Thomas Harte 2016-07-01 16:28:18 -04:00
commit 2bc87ee095
2 changed files with 25 additions and 1 deletions

View File

@ -14,6 +14,11 @@
namespace CRTMachine {
/*!
A CRTMachine::Machine is a mostly-abstract base class for machines that connect to a CRT,
that optionally provide a speaker, and that nominate a clock rate and can announce to a delegate
should that clock rate change.
*/
class Machine {
public:
virtual void setup_output(float aspect_ratio) = 0;
@ -24,6 +29,7 @@ class Machine {
virtual void run_for_cycles(int number_of_cycles) = 0;
// TODO: sever the clock-rate stuff.
virtual double get_clock_rate() = 0;
class Delegate {
public:

View File

@ -17,6 +17,14 @@
namespace Outputs {
/*!
Provides the base class for an audio output source, with an input rate (the speed at which the source will
provide data), an output rate (the speed at which the destination will receive data), a delegate to receive
the output and some help for the output in picking an appropriate rate once the input rate is known.
Intended to be a parent class, allowing descendants to pick the strategy by which input samples are mapped to
output samples.
*/
class Speaker {
public:
class Delegate {
@ -82,6 +90,16 @@ class Speaker {
}
};
/*!
A concrete descendant of Speaker that uses a FIR filter to map from input data to output data when scaling
and a copy-through buffer when input and output rates are the same.
Audio sources should use @c Filter as both a template and a parent, implementing at least
`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.
*/
template <class T> class Filter: public Speaker {
public:
void run_for_cycles(unsigned int input_cycles)
@ -147,7 +165,7 @@ template <class T> class Filter: public Speaker {
if(steps < _number_of_taps)
{
int16_t *input_buffer = _input_buffer.get();
memmove(input_buffer, &input_buffer[steps], sizeof(int16_t) * ((size_t)_number_of_taps - (size_t)steps));
memmove(input_buffer, &input_buffer[steps], sizeof(int16_t) * ((size_t)_number_of_taps - (size_t)steps));
_input_buffer_depth -= steps;
}
else