From 6afb6c80d022fb1d66502755f40966fff9905cd0 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Mon, 14 Sep 2015 10:33:40 -0700 Subject: [PATCH 1/3] Fix the loud audio pops at startup, due to SOXR returning less than desired output samples because of internal buffering. --- libraries/audio-client/src/AudioClient.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index a3d3a72043..bb576b695f 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -418,9 +418,17 @@ soxr_error_t possibleResampling(soxr_t resampler, numSourceSamples, sourceAudioFormat, destinationAudioFormat); + unsigned int odone = 0; resampleError = soxr_process(resampler, channelConversionSamples, numChannelCoversionSamples, NULL, - destinationSamples, numDestinationSamples, NULL); + destinationSamples, numDestinationSamples, &odone); + + // return silence instead of playing garbage samples + if (odone < numDestinationSamples) { + unsigned int nBytes = (numDestinationSamples - odone) * destinationAudioFormat.channelCount() * sizeof(int16_t); + memset(&destinationSamples[odone * destinationAudioFormat.channelCount()], 0, nBytes); + qCDebug(audioclient) << "SOXR: padded with" << nBytes << "bytes of silence"; + } delete[] channelConversionSamples; } else { @@ -433,9 +441,17 @@ soxr_error_t possibleResampling(soxr_t resampler, numAdjustedDestinationSamples /= 2; } + unsigned int odone = 0; resampleError = soxr_process(resampler, sourceSamples, numAdjustedSourceSamples, NULL, - destinationSamples, numAdjustedDestinationSamples, NULL); + destinationSamples, numAdjustedDestinationSamples, &odone); + + // return silence instead of playing garbage samples + if (odone < numAdjustedDestinationSamples) { + unsigned int nBytes = (numAdjustedDestinationSamples - odone) * destinationAudioFormat.channelCount() * sizeof(int16_t); + memset(&destinationSamples[odone * destinationAudioFormat.channelCount()], 0, nBytes); + qCDebug(audioclient) << "SOXR: padded with" << nBytes << "bytes of silence"; + } } return resampleError; From bc5532bd0d224b5261ed36de01a7e2442f0246c3 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Mon, 14 Sep 2015 11:20:38 -0700 Subject: [PATCH 2/3] Style fix, and use size_t instead of unsigned int. --- libraries/audio-client/src/AudioClient.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index bb576b695f..0a971c9b55 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -418,15 +418,15 @@ soxr_error_t possibleResampling(soxr_t resampler, numSourceSamples, sourceAudioFormat, destinationAudioFormat); - unsigned int odone = 0; + size_t numDestinationSamplesActual = 0; resampleError = soxr_process(resampler, channelConversionSamples, numChannelCoversionSamples, NULL, - destinationSamples, numDestinationSamples, &odone); + destinationSamples, numDestinationSamples, &numDestinationSamplesActual); // return silence instead of playing garbage samples - if (odone < numDestinationSamples) { - unsigned int nBytes = (numDestinationSamples - odone) * destinationAudioFormat.channelCount() * sizeof(int16_t); - memset(&destinationSamples[odone * destinationAudioFormat.channelCount()], 0, nBytes); + if (numDestinationSamplesActual < numDestinationSamples) { + unsigned int nBytes = (numDestinationSamples - numDestinationSamplesActual) * destinationAudioFormat.channelCount() * sizeof(int16_t); + memset(&destinationSamples[numDestinationSamplesActual * destinationAudioFormat.channelCount()], 0, nBytes); qCDebug(audioclient) << "SOXR: padded with" << nBytes << "bytes of silence"; } @@ -441,15 +441,15 @@ soxr_error_t possibleResampling(soxr_t resampler, numAdjustedDestinationSamples /= 2; } - unsigned int odone = 0; + unsigned int numAdjustedDestinationSamplesActual = 0; resampleError = soxr_process(resampler, sourceSamples, numAdjustedSourceSamples, NULL, - destinationSamples, numAdjustedDestinationSamples, &odone); + destinationSamples, numAdjustedDestinationSamples, &numAdjustedDestinationSamplesActual); // return silence instead of playing garbage samples - if (odone < numAdjustedDestinationSamples) { - unsigned int nBytes = (numAdjustedDestinationSamples - odone) * destinationAudioFormat.channelCount() * sizeof(int16_t); - memset(&destinationSamples[odone * destinationAudioFormat.channelCount()], 0, nBytes); + if (numAdjustedDestinationSamplesActual < numAdjustedDestinationSamples) { + unsigned int nBytes = (numAdjustedDestinationSamples - numAdjustedDestinationSamplesActual) * destinationAudioFormat.channelCount() * sizeof(int16_t); + memset(&destinationSamples[numAdjustedDestinationSamplesActual * destinationAudioFormat.channelCount()], 0, nBytes); qCDebug(audioclient) << "SOXR: padded with" << nBytes << "bytes of silence"; } } From 6fe30e715646e6f32911718ddde215fb3797636e Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Mon, 14 Sep 2015 11:20:38 -0700 Subject: [PATCH 3/3] Style fix, and use size_t instead of unsigned int. --- libraries/audio-client/src/AudioClient.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index bb576b695f..0a971c9b55 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -418,15 +418,15 @@ soxr_error_t possibleResampling(soxr_t resampler, numSourceSamples, sourceAudioFormat, destinationAudioFormat); - unsigned int odone = 0; + size_t numDestinationSamplesActual = 0; resampleError = soxr_process(resampler, channelConversionSamples, numChannelCoversionSamples, NULL, - destinationSamples, numDestinationSamples, &odone); + destinationSamples, numDestinationSamples, &numDestinationSamplesActual); // return silence instead of playing garbage samples - if (odone < numDestinationSamples) { - unsigned int nBytes = (numDestinationSamples - odone) * destinationAudioFormat.channelCount() * sizeof(int16_t); - memset(&destinationSamples[odone * destinationAudioFormat.channelCount()], 0, nBytes); + if (numDestinationSamplesActual < numDestinationSamples) { + unsigned int nBytes = (numDestinationSamples - numDestinationSamplesActual) * destinationAudioFormat.channelCount() * sizeof(int16_t); + memset(&destinationSamples[numDestinationSamplesActual * destinationAudioFormat.channelCount()], 0, nBytes); qCDebug(audioclient) << "SOXR: padded with" << nBytes << "bytes of silence"; } @@ -441,15 +441,15 @@ soxr_error_t possibleResampling(soxr_t resampler, numAdjustedDestinationSamples /= 2; } - unsigned int odone = 0; + unsigned int numAdjustedDestinationSamplesActual = 0; resampleError = soxr_process(resampler, sourceSamples, numAdjustedSourceSamples, NULL, - destinationSamples, numAdjustedDestinationSamples, &odone); + destinationSamples, numAdjustedDestinationSamples, &numAdjustedDestinationSamplesActual); // return silence instead of playing garbage samples - if (odone < numAdjustedDestinationSamples) { - unsigned int nBytes = (numAdjustedDestinationSamples - odone) * destinationAudioFormat.channelCount() * sizeof(int16_t); - memset(&destinationSamples[odone * destinationAudioFormat.channelCount()], 0, nBytes); + if (numAdjustedDestinationSamplesActual < numAdjustedDestinationSamples) { + unsigned int nBytes = (numAdjustedDestinationSamples - numAdjustedDestinationSamplesActual) * destinationAudioFormat.channelCount() * sizeof(int16_t); + memset(&destinationSamples[numAdjustedDestinationSamplesActual * destinationAudioFormat.channelCount()], 0, nBytes); qCDebug(audioclient) << "SOXR: padded with" << nBytes << "bytes of silence"; } }