retain stereo on dead audio resampling

This commit is contained in:
Zach Pomerantz 2016-10-04 17:50:34 -07:00
parent 4974c88880
commit 972a611d03
3 changed files with 28 additions and 27 deletions

View file

@ -1152,9 +1152,9 @@ bool AudioClient::outputLocalInjector(bool isStereo, AudioInjector* injector) {
} }
void AudioClient::outputFormatChanged() { void AudioClient::outputFormatChanged() {
int outputFormatChannelCountTimesSampleRate = _outputFormat.channelCount() * _outputFormat.sampleRate(); _outputFrameSize = (AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL * _outputFormat.channelCount() * _outputFormat.sampleRate()) /
_outputFrameSize = AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL * outputFormatChannelCountTimesSampleRate / _desiredOutputFormat.sampleRate(); _desiredOutputFormat.sampleRate();
_receivedAudioStream.outputFormatChanged(outputFormatChannelCountTimesSampleRate); _receivedAudioStream.outputFormatChanged(_outputFormat.sampleRate(), _outputFormat.channelCount());
} }
bool AudioClient::switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceInfo) { bool AudioClient::switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceInfo) {

View file

@ -17,27 +17,27 @@ static const int STEREO_FACTOR = 2;
MixedProcessedAudioStream::MixedProcessedAudioStream(int numFrameSamples, int numFramesCapacity, int numStaticJitterFrames) MixedProcessedAudioStream::MixedProcessedAudioStream(int numFrameSamples, int numFramesCapacity, int numStaticJitterFrames)
: InboundAudioStream(numFrameSamples, numFramesCapacity, numStaticJitterFrames) {} : InboundAudioStream(numFrameSamples, numFramesCapacity, numStaticJitterFrames) {}
void MixedProcessedAudioStream::outputFormatChanged(int outputFormatChannelCountTimesSampleRate) { void MixedProcessedAudioStream::outputFormatChanged(int sampleRate, int channelCount) {
_outputFormatChannelsTimesSampleRate = outputFormatChannelCountTimesSampleRate; _outputSampleRate = sampleRate;
int deviceOutputFrameSize = networkToDeviceSamples(AudioConstants::NETWORK_FRAME_SAMPLES_STEREO); _outputChannelCount = channelCount;
_ringBuffer.resizeForFrameSize(deviceOutputFrameSize); int deviceOutputFrameFrames = networkToDeviceFrames(AudioConstants::NETWORK_FRAME_SAMPLES_STEREO / STEREO_FACTOR);
int deviceOutputFrameSamples = deviceOutputFrameFrames * STEREO_FACTOR;
_ringBuffer.resizeForFrameSize(deviceOutputFrameSamples);
} }
int MixedProcessedAudioStream::writeDroppableSilentSamples(int silentSamples) { int MixedProcessedAudioStream::writeDroppableSilentSamples(int silentSamples) {
int deviceSilentFrames = networkToDeviceFrames(silentSamples / STEREO_FACTOR);
int deviceSilentSamplesWritten = InboundAudioStream::writeDroppableSilentSamples(networkToDeviceSamples(silentSamples)); int deviceSilentSamples = deviceSilentFrames * STEREO_FACTOR;
int deviceSilentSamplesWritten = InboundAudioStream::writeDroppableSilentSamples(deviceSilentSamples);
emit addedSilence(deviceToNetworkSamples(deviceSilentSamplesWritten) / STEREO_FACTOR); emit addedSilence(deviceToNetworkFrames(deviceSilentSamplesWritten / STEREO_FACTOR));
return deviceSilentSamplesWritten; return deviceSilentSamplesWritten;
} }
int MixedProcessedAudioStream::writeLastFrameRepeatedWithFade(int samples) { int MixedProcessedAudioStream::writeLastFrameRepeatedWithFade(int samples) {
int deviceFrames = networkToDeviceFrames(samples / STEREO_FACTOR);
int deviceSamplesWritten = InboundAudioStream::writeLastFrameRepeatedWithFade(networkToDeviceSamples(samples)); int deviceSamples = deviceFrames * STEREO_FACTOR;
int deviceSamplesWritten = InboundAudioStream::writeLastFrameRepeatedWithFade(deviceSamples);
emit addedLastFrameRepeatedWithFade(deviceToNetworkSamples(deviceSamplesWritten) / STEREO_FACTOR); emit addedLastFrameRepeatedWithFade(deviceToNetworkFrames(deviceSamplesWritten / STEREO_FACTOR));
return deviceSamplesWritten; return deviceSamplesWritten;
} }
@ -60,12 +60,12 @@ int MixedProcessedAudioStream::parseAudioData(PacketType type, const QByteArray&
return packetAfterStreamProperties.size(); return packetAfterStreamProperties.size();
} }
int MixedProcessedAudioStream::networkToDeviceSamples(int networkSamples) { int MixedProcessedAudioStream::networkToDeviceFrames(int networkFrames) {
return (quint64)networkSamples * (quint64)_outputFormatChannelsTimesSampleRate / (quint64)(STEREO_FACTOR return ((quint64)networkFrames * _outputChannelCount * _outputSampleRate) /
* AudioConstants::SAMPLE_RATE); (quint64)(STEREO_FACTOR * AudioConstants::SAMPLE_RATE);
} }
int MixedProcessedAudioStream::deviceToNetworkSamples(int deviceSamples) { int MixedProcessedAudioStream::deviceToNetworkFrames(int deviceFrames) {
return (quint64)deviceSamples * (quint64)(STEREO_FACTOR * AudioConstants::SAMPLE_RATE) return (quint64)deviceFrames * (quint64)(STEREO_FACTOR * AudioConstants::SAMPLE_RATE) /
/ (quint64)_outputFormatChannelsTimesSampleRate; (_outputSampleRate * _outputChannelCount);
} }

View file

@ -30,7 +30,7 @@ signals:
void processSamples(const QByteArray& inputBuffer, QByteArray& outputBuffer); void processSamples(const QByteArray& inputBuffer, QByteArray& outputBuffer);
public: public:
void outputFormatChanged(int outputFormatChannelCountTimesSampleRate); void outputFormatChanged(int sampleRate, int channelCount);
protected: protected:
int writeDroppableSilentSamples(int silentSamples) override; int writeDroppableSilentSamples(int silentSamples) override;
@ -38,11 +38,12 @@ protected:
int parseAudioData(PacketType type, const QByteArray& packetAfterStreamProperties) override; int parseAudioData(PacketType type, const QByteArray& packetAfterStreamProperties) override;
private: private:
int networkToDeviceSamples(int networkSamples); int networkToDeviceFrames(int networkFrames);
int deviceToNetworkSamples(int deviceSamples); int deviceToNetworkFrames(int deviceFrames);
private: private:
int _outputFormatChannelsTimesSampleRate; quint64 _outputSampleRate;
quint64 _outputChannelCount;
}; };
#endif // hifi_MixedProcessedAudioStream_h #endif // hifi_MixedProcessedAudioStream_h