example/audio_duplex: avoid noise on start

This commit is contained in:
Matthias Ringwald 2021-12-28 21:38:41 +01:00
parent f5cfc39fc2
commit 82b4f8a589

View File

@ -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");