diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index e2d2dd499b..1e3dc11338 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -433,21 +433,8 @@ bool adjustedFormatForAudioDevice(const QAudioDeviceInfo& audioDevice, for (int channelCount : (desiredAudioFormat.channelCount() == 1 ? inputChannels : outputChannels)) { for (int sampleRate : sampleRates) { - // int16_t samples adjustedAudioFormat.setChannelCount(channelCount); adjustedAudioFormat.setSampleRate(sampleRate); - adjustedAudioFormat.setSampleSize(16); - adjustedAudioFormat.setSampleType(QAudioFormat::SignedInt); - - if (audioDevice.isFormatSupported(adjustedAudioFormat)) { - return true; - } - - // float samples - adjustedAudioFormat.setChannelCount(channelCount); - adjustedAudioFormat.setSampleRate(sampleRate); - adjustedAudioFormat.setSampleSize(32); - adjustedAudioFormat.setSampleType(QAudioFormat::Float); if (audioDevice.isFormatSupported(adjustedAudioFormat)) { return true; @@ -1558,15 +1545,11 @@ float AudioClient::gainForSource(float distance, float volume) { return gain; } -qint64 AudioClient::AudioOutputIODevice::readData(char* data, qint64 maxSize) { - - // data can be int16_t* or float* - int sampleSize = _audio->_outputFormat.sampleSize() / 8; - bool isFloat = _audio->_outputFormat.sampleType() == QAudioFormat::SampleType::Float; +qint64 AudioClient::AudioOutputIODevice::readData(char * data, qint64 maxSize) { // samples requested from OUTPUT_CHANNEL_COUNT int deviceChannelCount = _audio->_outputFormat.channelCount(); - int samplesRequested = (int)(maxSize / sampleSize) * OUTPUT_CHANNEL_COUNT / deviceChannelCount; + int samplesRequested = (int)(maxSize / AudioConstants::SAMPLE_SIZE) * OUTPUT_CHANNEL_COUNT / deviceChannelCount; int samplesPopped; int bytesWritten; @@ -1576,24 +1559,14 @@ qint64 AudioClient::AudioOutputIODevice::readData(char* data, qint64 maxSize) { AudioRingBuffer::ConstIterator lastPopOutput = _receivedAudioStream.getLastPopOutput(); // if required, upmix or downmix to deviceChannelCount - if (isFloat) { - if (deviceChannelCount == OUTPUT_CHANNEL_COUNT) { - lastPopOutput.readSamples((float*)data, samplesPopped); - } else if (deviceChannelCount > OUTPUT_CHANNEL_COUNT) { - lastPopOutput.readSamplesWithUpmix((float*)data, samplesPopped, deviceChannelCount - OUTPUT_CHANNEL_COUNT); - } else { - lastPopOutput.readSamplesWithDownmix((float*)data, samplesPopped); - } + if (deviceChannelCount == OUTPUT_CHANNEL_COUNT) { + lastPopOutput.readSamples((int16_t*)data, samplesPopped); + } else if (deviceChannelCount > OUTPUT_CHANNEL_COUNT) { + lastPopOutput.readSamplesWithUpmix((int16_t*)data, samplesPopped, deviceChannelCount - OUTPUT_CHANNEL_COUNT); } else { - if (deviceChannelCount == OUTPUT_CHANNEL_COUNT) { - lastPopOutput.readSamples((int16_t*)data, samplesPopped); - } else if (deviceChannelCount > OUTPUT_CHANNEL_COUNT) { - lastPopOutput.readSamplesWithUpmix((int16_t*)data, samplesPopped, deviceChannelCount - OUTPUT_CHANNEL_COUNT); - } else { - lastPopOutput.readSamplesWithDownmix((int16_t*)data, samplesPopped); - } + lastPopOutput.readSamplesWithDownmix((int16_t*)data, samplesPopped); } - bytesWritten = (samplesPopped * sampleSize) * deviceChannelCount / OUTPUT_CHANNEL_COUNT; + bytesWritten = (samplesPopped * AudioConstants::SAMPLE_SIZE) * deviceChannelCount / OUTPUT_CHANNEL_COUNT; } else { // nothing on network, don't grab anything from injectors, and just return 0s // this will flood the log: qCDebug(audioclient, "empty/partial network buffer"); diff --git a/libraries/audio/src/AudioRingBuffer.h b/libraries/audio/src/AudioRingBuffer.h index 38ca319156..29e7a9e998 100644 --- a/libraries/audio/src/AudioRingBuffer.h +++ b/libraries/audio/src/AudioRingBuffer.h @@ -103,11 +103,10 @@ public: ConstIterator operator+(int i); ConstIterator operator-(int i); - // dest can be int16_t* or float* - template void readSamples(T* dest, int numSamples); - template void readSamplesWithFade(T* dest, int numSamples, float fade); - template void readSamplesWithUpmix(T* dest, int numSamples, int numExtraChannels); - template void readSamplesWithDownmix(T* dest, int numSamples); + void readSamples(int16_t* dest, int numSamples); + void readSamplesWithFade(int16_t* dest, int numSamples, float fade); + void readSamplesWithUpmix(int16_t* dest, int numSamples, int numExtraChannels); + void readSamplesWithDownmix(int16_t* dest, int numSamples); private: int16_t* atShiftedBy(int i); @@ -204,28 +203,6 @@ inline int16_t* AudioRingBuffer::ConstIterator::atShiftedBy(int i) { return _bufferFirst + i; } -inline AudioRingBuffer::ConstIterator AudioRingBuffer::nextOutput() const { - return ConstIterator(_buffer, _bufferLength, _nextOutput); -} - -inline AudioRingBuffer::ConstIterator AudioRingBuffer::lastFrameWritten() const { - return ConstIterator(_buffer, _bufferLength, _endOfLastWrite) - _numFrameSamples; -} - -// -// dest can be int16_t* or float* -// -template -inline void AudioRingBuffer::ConstIterator::readSamples(T* dest, int numSamples) { - int16_t* at = _at; - for (int i = 0; i < numSamples; i++) { - *dest++ = (T)*at; - at = (at == _bufferLast) ? _bufferFirst : at + 1; - } -} - -// fast path for int16_t* -template<> inline void AudioRingBuffer::ConstIterator::readSamples(int16_t* dest, int numSamples) { auto samplesToEnd = _bufferLast - _at + 1; @@ -241,17 +218,16 @@ inline void AudioRingBuffer::ConstIterator::readSamples(int16_t* dest, int numSa } } -template -inline void AudioRingBuffer::ConstIterator::readSamplesWithFade(T* dest, int numSamples, float fade) { +inline void AudioRingBuffer::ConstIterator::readSamplesWithFade(int16_t* dest, int numSamples, float fade) { int16_t* at = _at; for (int i = 0; i < numSamples; i++) { - *dest++ = (T)(*at * fade); + *dest = (float)*at * fade; + ++dest; at = (at == _bufferLast) ? _bufferFirst : at + 1; } } -template -inline void AudioRingBuffer::ConstIterator::readSamplesWithUpmix(T* dest, int numSamples, int numExtraChannels) { +inline void AudioRingBuffer::ConstIterator::readSamplesWithUpmix(int16_t* dest, int numSamples, int numExtraChannels) { int16_t* at = _at; for (int i = 0; i < numSamples/2; i++) { @@ -262,16 +238,15 @@ inline void AudioRingBuffer::ConstIterator::readSamplesWithUpmix(T* dest, int nu at = (at == _bufferLast) ? _bufferFirst : at + 1; // write 2 + N samples - *dest++ = (T)left; - *dest++ = (T)right; + *dest++ = left; + *dest++ = right; for (int n = 0; n < numExtraChannels; n++) { - *dest++ = (T)0; + *dest++ = 0; } } } -template -inline void AudioRingBuffer::ConstIterator::readSamplesWithDownmix(T* dest, int numSamples) { +inline void AudioRingBuffer::ConstIterator::readSamplesWithDownmix(int16_t* dest, int numSamples) { int16_t* at = _at; for (int i = 0; i < numSamples/2; i++) { @@ -282,8 +257,16 @@ inline void AudioRingBuffer::ConstIterator::readSamplesWithDownmix(T* dest, int at = (at == _bufferLast) ? _bufferFirst : at + 1; // write 1 sample - *dest++ = (T)((left + right) / 2); + *dest++ = (int16_t)((left + right) / 2); } } +inline AudioRingBuffer::ConstIterator AudioRingBuffer::nextOutput() const { + return ConstIterator(_buffer, _bufferLength, _nextOutput); +} + +inline AudioRingBuffer::ConstIterator AudioRingBuffer::lastFrameWritten() const { + return ConstIterator(_buffer, _bufferLength, _endOfLastWrite) - _numFrameSamples; +} + #endif // hifi_AudioRingBuffer_h