Add audio playback ability to WAV Viewer app (#1829)

This commit is contained in:
Mark Thompson
2024-01-30 13:55:32 -06:00
committed by GitHub
parent 8068517808
commit 125184f300
10 changed files with 211 additions and 35 deletions

View File

@@ -30,23 +30,31 @@
void AudioTXProcessor::execute(const buffer_c8_t& buffer) {
if (!configured) return;
int32_t audio_sample_m;
// Zero-order hold (poop)
for (size_t i = 0; i < buffer.count; i++) {
resample_acc += resample_inc;
if (resample_acc >= 0x10000) {
resample_acc -= 0x10000;
if (stream) {
stream->read(&audio_sample, 1);
bytes_read++;
audio_sample = 0;
stream->read(&audio_sample, bytes_per_sample); // assumes little endian when reading 1 byte
samples_read++;
}
}
sample = audio_sample - 0x80;
if (bytes_per_sample == 1) {
sample = audio_sample - 0x80;
audio_sample_m = sample * 256;
} else {
audio_sample_m = audio_sample;
}
// Output to speaker too
if (!tone_key_enabled) {
uint32_t imod32 = i & (AUDIO_OUTPUT_BUFFER_SIZE - 1);
audio_data[imod32] = sample * 256;
audio_data[imod32] = audio_sample_m;
if (imod32 == (AUDIO_OUTPUT_BUFFER_SIZE - 1))
audio_output.write_unprocessed(audio_buffer);
}
@@ -69,7 +77,7 @@ void AudioTXProcessor::execute(const buffer_c8_t& buffer) {
if (progress_samples >= progress_interval_samples) {
progress_samples -= progress_interval_samples;
txprogress_message.progress = bytes_read; // Inform UI about progress
txprogress_message.progress = samples_read; // Inform UI about progress
txprogress_message.done = false;
shared_memory.application_queue.push(txprogress_message);
}
@@ -83,7 +91,7 @@ void AudioTXProcessor::on_message(const Message* const message) {
case Message::ID::ReplayConfig:
configured = false;
bytes_read = 0;
samples_read = 0;
replay_config(*reinterpret_cast<const ReplayConfigMessage*>(message));
break;
@@ -105,6 +113,7 @@ void AudioTXProcessor::audio_config(const AudioTXConfigMessage& message) {
tone_gen.configure(message.tone_key_delta, message.tone_key_mix_weight);
progress_interval_samples = message.divider;
resample_acc = 0;
bytes_per_sample = message.bits_per_sample / 8;
audio_output.configure(false);
tone_key_enabled = (message.tone_key_delta != 0);

View File

@@ -48,9 +48,11 @@ class AudioTXProcessor : public BasebandProcessor {
uint32_t resample_inc{}, resample_acc{};
uint32_t fm_delta{0};
uint32_t phase{0}, sphase{0};
uint8_t audio_sample{};
uint32_t audio_sample{};
int32_t sample{0}, delta{};
int8_t re{0}, im{0};
int8_t bytes_per_sample{1};
int16_t audio_sample_s16{};
int16_t audio_data[AUDIO_OUTPUT_BUFFER_SIZE];
buffer_s16_t audio_buffer{audio_data, AUDIO_OUTPUT_BUFFER_SIZE, 48000};
@@ -59,7 +61,7 @@ class AudioTXProcessor : public BasebandProcessor {
size_t progress_interval_samples = 0, progress_samples = 0;
bool configured{false};
uint32_t bytes_read{0};
uint32_t samples_read{0};
bool tone_key_enabled{false};
void sample_rate_config(const SampleRateConfigMessage& message);