From 972a611d0302a042e9c8b9b5d4bc172296722dee Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Tue, 4 Oct 2016 17:50:34 -0700 Subject: [PATCH] retain stereo on dead audio resampling --- libraries/audio-client/src/AudioClient.cpp | 6 +-- .../audio/src/MixedProcessedAudioStream.cpp | 40 +++++++++---------- .../audio/src/MixedProcessedAudioStream.h | 9 +++-- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 16f4c35d21..d70730380f 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -1152,9 +1152,9 @@ bool AudioClient::outputLocalInjector(bool isStereo, AudioInjector* injector) { } void AudioClient::outputFormatChanged() { - int outputFormatChannelCountTimesSampleRate = _outputFormat.channelCount() * _outputFormat.sampleRate(); - _outputFrameSize = AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL * outputFormatChannelCountTimesSampleRate / _desiredOutputFormat.sampleRate(); - _receivedAudioStream.outputFormatChanged(outputFormatChannelCountTimesSampleRate); + _outputFrameSize = (AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL * _outputFormat.channelCount() * _outputFormat.sampleRate()) / + _desiredOutputFormat.sampleRate(); + _receivedAudioStream.outputFormatChanged(_outputFormat.sampleRate(), _outputFormat.channelCount()); } bool AudioClient::switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceInfo) { diff --git a/libraries/audio/src/MixedProcessedAudioStream.cpp b/libraries/audio/src/MixedProcessedAudioStream.cpp index 88a1e071ec..6820a17a47 100644 --- a/libraries/audio/src/MixedProcessedAudioStream.cpp +++ b/libraries/audio/src/MixedProcessedAudioStream.cpp @@ -17,27 +17,27 @@ static const int STEREO_FACTOR = 2; MixedProcessedAudioStream::MixedProcessedAudioStream(int numFrameSamples, int numFramesCapacity, int numStaticJitterFrames) : InboundAudioStream(numFrameSamples, numFramesCapacity, numStaticJitterFrames) {} -void MixedProcessedAudioStream::outputFormatChanged(int outputFormatChannelCountTimesSampleRate) { - _outputFormatChannelsTimesSampleRate = outputFormatChannelCountTimesSampleRate; - int deviceOutputFrameSize = networkToDeviceSamples(AudioConstants::NETWORK_FRAME_SAMPLES_STEREO); - _ringBuffer.resizeForFrameSize(deviceOutputFrameSize); +void MixedProcessedAudioStream::outputFormatChanged(int sampleRate, int channelCount) { + _outputSampleRate = sampleRate; + _outputChannelCount = channelCount; + int deviceOutputFrameFrames = networkToDeviceFrames(AudioConstants::NETWORK_FRAME_SAMPLES_STEREO / STEREO_FACTOR); + int deviceOutputFrameSamples = deviceOutputFrameFrames * STEREO_FACTOR; + _ringBuffer.resizeForFrameSize(deviceOutputFrameSamples); } int MixedProcessedAudioStream::writeDroppableSilentSamples(int silentSamples) { - - int deviceSilentSamplesWritten = InboundAudioStream::writeDroppableSilentSamples(networkToDeviceSamples(silentSamples)); - - emit addedSilence(deviceToNetworkSamples(deviceSilentSamplesWritten) / STEREO_FACTOR); - + int deviceSilentFrames = networkToDeviceFrames(silentSamples / STEREO_FACTOR); + int deviceSilentSamples = deviceSilentFrames * STEREO_FACTOR; + int deviceSilentSamplesWritten = InboundAudioStream::writeDroppableSilentSamples(deviceSilentSamples); + emit addedSilence(deviceToNetworkFrames(deviceSilentSamplesWritten / STEREO_FACTOR)); return deviceSilentSamplesWritten; } int MixedProcessedAudioStream::writeLastFrameRepeatedWithFade(int samples) { - - int deviceSamplesWritten = InboundAudioStream::writeLastFrameRepeatedWithFade(networkToDeviceSamples(samples)); - - emit addedLastFrameRepeatedWithFade(deviceToNetworkSamples(deviceSamplesWritten) / STEREO_FACTOR); - + int deviceFrames = networkToDeviceFrames(samples / STEREO_FACTOR); + int deviceSamples = deviceFrames * STEREO_FACTOR; + int deviceSamplesWritten = InboundAudioStream::writeLastFrameRepeatedWithFade(deviceSamples); + emit addedLastFrameRepeatedWithFade(deviceToNetworkFrames(deviceSamplesWritten / STEREO_FACTOR)); return deviceSamplesWritten; } @@ -60,12 +60,12 @@ int MixedProcessedAudioStream::parseAudioData(PacketType type, const QByteArray& return packetAfterStreamProperties.size(); } -int MixedProcessedAudioStream::networkToDeviceSamples(int networkSamples) { - return (quint64)networkSamples * (quint64)_outputFormatChannelsTimesSampleRate / (quint64)(STEREO_FACTOR - * AudioConstants::SAMPLE_RATE); +int MixedProcessedAudioStream::networkToDeviceFrames(int networkFrames) { + return ((quint64)networkFrames * _outputChannelCount * _outputSampleRate) / + (quint64)(STEREO_FACTOR * AudioConstants::SAMPLE_RATE); } -int MixedProcessedAudioStream::deviceToNetworkSamples(int deviceSamples) { - return (quint64)deviceSamples * (quint64)(STEREO_FACTOR * AudioConstants::SAMPLE_RATE) - / (quint64)_outputFormatChannelsTimesSampleRate; +int MixedProcessedAudioStream::deviceToNetworkFrames(int deviceFrames) { + return (quint64)deviceFrames * (quint64)(STEREO_FACTOR * AudioConstants::SAMPLE_RATE) / + (_outputSampleRate * _outputChannelCount); } diff --git a/libraries/audio/src/MixedProcessedAudioStream.h b/libraries/audio/src/MixedProcessedAudioStream.h index f28586f484..d89ce9f7e3 100644 --- a/libraries/audio/src/MixedProcessedAudioStream.h +++ b/libraries/audio/src/MixedProcessedAudioStream.h @@ -30,7 +30,7 @@ signals: void processSamples(const QByteArray& inputBuffer, QByteArray& outputBuffer); public: - void outputFormatChanged(int outputFormatChannelCountTimesSampleRate); + void outputFormatChanged(int sampleRate, int channelCount); protected: int writeDroppableSilentSamples(int silentSamples) override; @@ -38,11 +38,12 @@ protected: int parseAudioData(PacketType type, const QByteArray& packetAfterStreamProperties) override; private: - int networkToDeviceSamples(int networkSamples); - int deviceToNetworkSamples(int deviceSamples); + int networkToDeviceFrames(int networkFrames); + int deviceToNetworkFrames(int deviceFrames); private: - int _outputFormatChannelsTimesSampleRate; + quint64 _outputSampleRate; + quint64 _outputChannelCount; }; #endif // hifi_MixedProcessedAudioStream_h