1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-19 08:31:11 +00:00

Correct stereo.

This commit is contained in:
Thomas Harte 2021-12-02 11:15:29 -05:00
parent d6f1ea50a6
commit 06b6f85d55
2 changed files with 12 additions and 8 deletions

View File

@ -93,21 +93,25 @@ void Audio::output() {
} }
} }
// TEMPORARY: just fill the audio buffer with silence. // Spin until the next buffer is available if just entering it for the first time.
// Contention here should be essentially non-existent.
if(!sample_pointer_) { if(!sample_pointer_) {
while(!buffer_available_[buffer_pointer_].load(std::memory_order::memory_order_relaxed)); while(!buffer_available_[buffer_pointer_].load(std::memory_order::memory_order_relaxed));
} }
// Left.
buffer_[buffer_pointer_][sample_pointer_] = int16_t( buffer_[buffer_pointer_][sample_pointer_] = int16_t(
( (
int8_t(channels_[0].output_level) * channels_[0].output_enabled + channels_[1].output_level * channels_[1].output_enabled +
int8_t(channels_[2].output_level) * channels_[2].output_enabled channels_[2].output_level * channels_[2].output_enabled
) << 7 ) << 7
); );
// Right.
buffer_[buffer_pointer_][sample_pointer_+1] = int16_t( buffer_[buffer_pointer_][sample_pointer_+1] = int16_t(
( (
int8_t(channels_[1].output_level) * channels_[1].output_enabled + channels_[0].output_level * channels_[0].output_enabled +
int8_t(channels_[3].output_level) * channels_[3].output_enabled channels_[3].output_level * channels_[3].output_enabled
) << 7 ) << 7
); );
sample_pointer_ += 2; sample_pointer_ += 2;
@ -445,7 +449,7 @@ template <> bool Audio::Channel::output<Audio::Channel::State::PlayingHigh>() {
} }
// Output high byte. // Output high byte.
output_level = data_latch >> 8; output_level = int8_t(data_latch >> 8);
return false; return false;
} }
@ -490,7 +494,7 @@ template <> bool Audio::Channel::output<Audio::Channel::State::PlayingLow>() {
} }
// Output low byte. // Output low byte.
output_level = data_latch & 0xff; output_level = int8_t(data_latch & 0xff);
return false; return false;
} }

View File

@ -105,7 +105,7 @@ class Audio: public DMADevice<4> {
template <State begin, State end> bool transit(); template <State begin, State end> bool transit();
// Output state. // Output state.
uint8_t output_level = 0; int8_t output_level = 0;
uint8_t output_phase = 0; uint8_t output_phase = 0;
bool output_enabled = false; bool output_enabled = false;
} channels_[4]; } channels_[4];