From 82b4f8a58951dd41776b0d9e4ccdd9cd4f319cda Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Tue, 28 Dec 2021 21:38:41 +0100 Subject: [PATCH] example/audio_duplex: avoid noise on start --- example/audio_duplex.c | 88 ++++++++++++++++++++++-------------------- 1 file changed, 47 insertions(+), 41 deletions(-) diff --git a/example/audio_duplex.c b/example/audio_duplex.c index d5f48fa50..3286d4d53 100644 --- a/example/audio_duplex.c +++ b/example/audio_duplex.c @@ -71,7 +71,7 @@ static btstack_ring_buffer_t audio_buffer; static int16_t transfer_buffer[TRANSFER_SAMPLES * NUM_INPUT_CHANNELS]; // playback starts after audio_buffer is half full -static int playback_started; +static bool playback_started; // sample couners static int count_recording; @@ -87,51 +87,57 @@ static void audio_recording(const int16_t * pcm_buffer, uint16_t num_samples_to_ static void audio_playback(int16_t * pcm_buffer, uint16_t num_samples_to_write){ int num_samples_in_buffer = btstack_ring_buffer_bytes_available(&audio_buffer) / BYTES_PER_SAMPLE; - if (playback_started == 0){ - if ( num_samples_in_buffer < (BUFFER_SAMPLES / 2)) return; - playback_started = 1; + if (playback_started == false){ + if ( num_samples_in_buffer >= (BUFFER_SAMPLES / 2)){ + playback_started = true; + } } count_playback += num_samples_to_write; - while (num_samples_to_write){ - num_samples_in_buffer = btstack_ring_buffer_bytes_available(&audio_buffer) / BYTES_PER_SAMPLE; - int num_samples_ready = btstack_min(num_samples_in_buffer, num_samples_to_write); - // limit by transfer_buffer - int num_samples_from_buffer = btstack_min(num_samples_ready, TRANSFER_SAMPLES); - if (!num_samples_from_buffer) break; - uint32_t bytes_read; - btstack_ring_buffer_read(&audio_buffer, (uint8_t *) transfer_buffer, num_samples_from_buffer * BYTES_PER_SAMPLE, &bytes_read); -#if (NUM_INPUT_CHANNELS == 1) - // duplicate samples for stereo output - int i; - for (i=0; i < num_samples_from_buffer;i++) { - *pcm_buffer++ = transfer_buffer[i]; - *pcm_buffer++ = transfer_buffer[i]; - num_samples_to_write--; - } -#endif -#if (NUM_INPUT_CHANNELS == 2) - // copy samples - int i; - int j = 0; - for (i=0; i < num_samples_from_buffer;i++) { - *pcm_buffer++ = transfer_buffer[j++]; - *pcm_buffer++ = transfer_buffer[j++]; - num_samples_to_write--; - } -#endif - } - // warn about underrun - if (num_samples_to_write){ - printf("Buffer underrun - recording %u, playback %u - delta %d!\n", count_recording, count_playback, count_recording - count_playback); + if (playback_started){ + + while (num_samples_to_write){ + + num_samples_in_buffer = btstack_ring_buffer_bytes_available(&audio_buffer) / BYTES_PER_SAMPLE; + int num_samples_ready = btstack_min(num_samples_in_buffer, num_samples_to_write); + // limit by transfer_buffer + int num_samples_from_buffer = btstack_min(num_samples_ready, TRANSFER_SAMPLES); + if (!num_samples_from_buffer) break; + uint32_t bytes_read; + btstack_ring_buffer_read(&audio_buffer, (uint8_t *) transfer_buffer, num_samples_from_buffer * BYTES_PER_SAMPLE, &bytes_read); + +#if (NUM_INPUT_CHANNELS == 1) + // duplicate samples for stereo output + int i; + for (i=0; i < num_samples_from_buffer;i++) { + *pcm_buffer++ = transfer_buffer[i]; + *pcm_buffer++ = transfer_buffer[i]; + num_samples_to_write--; + } +#endif + +#if (NUM_INPUT_CHANNELS == 2) + // copy samples + int i; + int j = 0; + for (i=0; i < num_samples_from_buffer;i++) { + *pcm_buffer++ = transfer_buffer[j++]; + *pcm_buffer++ = transfer_buffer[j++]; + num_samples_to_write--; + } +#endif + + } + + // warn about underrun + if (num_samples_to_write){ + printf("Buffer underrun - recording %u, playback %u - delta %d!\n", count_recording, count_playback, count_recording - count_playback); + } + } // fill rest with silence - while (num_samples_to_write){ - *pcm_buffer++ = 0; - *pcm_buffer++ = 0; - num_samples_to_write--; - } + memset(pcm_buffer, 0, num_samples_to_write * 4); } static void start_loopback(btstack_timer_source_t * ts){ @@ -174,7 +180,7 @@ static void stop_loopback(btstack_timer_source_t * ts){ audio_sink->close(); audio_source->close(); - playback_started = 0; + playback_started = false; printf("Stop Audio Loopback\n");