From ddff6c91b1a86466e818a0328f035143916d6348 Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 26 Mar 2018 21:10:09 +0200 Subject: [PATCH] Multiple audio support: new combo and enum for udp channel mode --- sdrbase/audio/audiodevicemanager.cpp | 19 ++++++++-------- sdrbase/audio/audiodevicemanager.h | 8 +++---- sdrbase/audio/audiooutput.cpp | 19 ++++++++-------- sdrbase/audio/audiooutput.h | 12 ++++++++-- sdrgui/gui/audiodialog.cpp | 4 ++-- sdrgui/gui/audiodialog.ui | 34 ++++++++++++++++++++++------ 6 files changed, 62 insertions(+), 34 deletions(-) diff --git a/sdrbase/audio/audiodevicemanager.cpp b/sdrbase/audio/audiodevicemanager.cpp index 1e1a7157e..ddae0ba9a 100644 --- a/sdrbase/audio/audiodevicemanager.cpp +++ b/sdrbase/audio/audiodevicemanager.cpp @@ -42,13 +42,15 @@ QDataStream& operator>>(QDataStream& ds, AudioDeviceManager::InputDeviceInfo& in QDataStream& operator<<(QDataStream& ds, const AudioDeviceManager::OutputDeviceInfo& info) { - ds << info.sampleRate << info.udpAddress << info.udpPort << info.copyToUDP << info.udpStereo << info.udpUseRTP; + ds << info.sampleRate << info.udpAddress << info.udpPort << info.copyToUDP << info.udpUseRTP << (int) info.udpChannelMode; return ds; } QDataStream& operator>>(QDataStream& ds, AudioDeviceManager::OutputDeviceInfo& info) { - ds >> info.sampleRate >> info.udpAddress >> info.udpPort >> info.copyToUDP >> info.udpStereo >> info.udpUseRTP; + int intChannelMode; + ds >> info.sampleRate >> info.udpAddress >> info.udpPort >> info.copyToUDP >> info.udpUseRTP >> intChannelMode; + info.udpChannelMode = (AudioOutput::UDPChannelMode) intChannelMode; return ds; } @@ -331,8 +333,8 @@ void AudioDeviceManager::startAudioOutput(int outputDeviceIndex) QString udpAddress; quint16 udpPort; bool copyAudioToUDP; - bool udpStereo; bool udpUseRTP; + AudioOutput::UDPChannelMode udpChannelMode; QString deviceName; if (getOutputDeviceName(outputDeviceIndex, deviceName)) @@ -343,8 +345,8 @@ void AudioDeviceManager::startAudioOutput(int outputDeviceIndex) udpAddress = m_defaultUDPAddress; udpPort = m_defaultUDPPort; copyAudioToUDP = false; - udpStereo = false; udpUseRTP = false; + udpChannelMode = AudioOutput::UDPChannelLeft; } else { @@ -352,8 +354,8 @@ void AudioDeviceManager::startAudioOutput(int outputDeviceIndex) udpAddress = m_audioOutputInfos[deviceName].udpAddress; udpPort = m_audioOutputInfos[deviceName].udpPort; copyAudioToUDP = m_audioOutputInfos[deviceName].copyToUDP; - udpStereo = m_audioOutputInfos[deviceName].udpStereo; udpUseRTP = m_audioOutputInfos[deviceName].udpUseRTP; + udpChannelMode = m_audioOutputInfos[deviceName].udpChannelMode; } m_audioOutputs[outputDeviceIndex]->start(outputDeviceIndex, sampleRate); @@ -361,8 +363,8 @@ void AudioDeviceManager::startAudioOutput(int outputDeviceIndex) m_audioOutputInfos[deviceName].udpAddress = udpAddress; m_audioOutputInfos[deviceName].udpPort = udpPort; m_audioOutputInfos[deviceName].copyToUDP = copyAudioToUDP; - m_audioOutputInfos[deviceName].udpStereo = udpStereo; m_audioOutputInfos[deviceName].udpUseRTP = udpUseRTP; + m_audioOutputInfos[deviceName].udpChannelMode = udpChannelMode; } else { @@ -570,7 +572,6 @@ void AudioDeviceManager::setOutputDeviceInfo(int outputDeviceIndex, const Output audioOutput->setUdpCopyToUDP(deviceInfo.copyToUDP); audioOutput->setUdpDestination(deviceInfo.udpAddress, deviceInfo.udpPort); - audioOutput->setUdpStereo(deviceInfo.udpStereo); audioOutput->setUdpUseRTP(deviceInfo.udpUseRTP); } @@ -723,7 +724,7 @@ void AudioDeviceManager::debugAudioOutputInfos() const << " udpAddress: " << it.value().udpAddress << " udpPort: " << it.value().udpPort << " copyToUDP: " << it.value().copyToUDP - << " udpStereo: " << it.value().udpStereo - << " udpUseRTP: " << it.value().udpUseRTP; + << " udpUseRTP: " << it.value().udpUseRTP + << " udpChannelMode: " << (int) it.value().udpChannelMode; } } diff --git a/sdrbase/audio/audiodevicemanager.h b/sdrbase/audio/audiodevicemanager.h index 901e48e5f..4ee715bc6 100644 --- a/sdrbase/audio/audiodevicemanager.h +++ b/sdrbase/audio/audiodevicemanager.h @@ -58,23 +58,23 @@ public: udpAddress(m_defaultUDPAddress), udpPort(m_defaultUDPPort), copyToUDP(false), - udpStereo(false), - udpUseRTP(false) + udpUseRTP(false), + udpChannelMode(AudioOutput::UDPChannelLeft) {} void resetToDefaults() { sampleRate = m_defaultAudioSampleRate; udpAddress = m_defaultUDPAddress; udpPort = m_defaultUDPPort; copyToUDP = false; - udpStereo = false; udpUseRTP = false; + udpChannelMode = AudioOutput::UDPChannelLeft; } unsigned int sampleRate; QString udpAddress; quint16 udpPort; bool copyToUDP; - bool udpStereo; bool udpUseRTP; + AudioOutput::UDPChannelMode udpChannelMode; friend QDataStream& operator<<(QDataStream& ds, const OutputDeviceInfo& info); friend QDataStream& operator>>(QDataStream& ds, OutputDeviceInfo& info); }; diff --git a/sdrbase/audio/audiooutput.cpp b/sdrbase/audio/audiooutput.cpp index 504ec89cd..f2d1324cc 100644 --- a/sdrbase/audio/audiooutput.cpp +++ b/sdrbase/audio/audiooutput.cpp @@ -28,7 +28,7 @@ AudioOutput::AudioOutput() : m_audioOutput(0), m_audioNetSink(0), m_copyAudioToUdp(false), - m_udpStereo(false), + m_udpChannelMode(UDPChannelLeft), m_audioUsageCount(0), m_onExit(false), m_audioFifos() @@ -188,15 +188,6 @@ void AudioOutput::setUdpCopyToUDP(bool copyToUDP) m_copyAudioToUdp = copyToUDP; } -void AudioOutput::setUdpStereo(bool stereo) -{ - if (m_audioNetSink) { - m_audioNetSink->setStereo(stereo); - } - - m_udpStereo = stereo; -} - void AudioOutput::setUdpUseRTP(bool useRTP) { if (m_audioNetSink) { @@ -204,6 +195,14 @@ void AudioOutput::setUdpUseRTP(bool useRTP) } } +void AudioOutput::setUdpChannelMode(UDPChannelMode udpChannelMode) +{ + if (m_audioNetSink) { + m_audioNetSink->setStereo(udpChannelMode == UDPChannelStereo); + } + + m_udpChannelMode = udpChannelMode; +} qint64 AudioOutput::readData(char* data, qint64 maxLen) { diff --git a/sdrbase/audio/audiooutput.h b/sdrbase/audio/audiooutput.h index ec2d2c9f0..910407aa9 100644 --- a/sdrbase/audio/audiooutput.h +++ b/sdrbase/audio/audiooutput.h @@ -33,6 +33,14 @@ class AudioNetSink; class SDRBASE_API AudioOutput : QIODevice { public: + enum UDPChannelMode + { + UDPChannelLeft, + UDPChannelRight, + UDPChannelMixed, + UDPChannelStereo + }; + AudioOutput(); virtual ~AudioOutput(); @@ -48,15 +56,15 @@ public: void setUdpDestination(const QString& address, uint16_t port); void setUdpCopyToUDP(bool copyToUDP); - void setUdpStereo(bool stereo); void setUdpUseRTP(bool useRTP); + void setUdpChannelMode(UDPChannelMode udpChannelMode); private: QMutex m_mutex; QAudioOutput* m_audioOutput; AudioNetSink* m_audioNetSink; bool m_copyAudioToUdp; - bool m_udpStereo; + UDPChannelMode m_udpChannelMode; uint m_audioUsageCount; bool m_onExit; diff --git a/sdrgui/gui/audiodialog.cpp b/sdrgui/gui/audiodialog.cpp index 270cfbc3a..ff0d5ec8c 100644 --- a/sdrgui/gui/audiodialog.cpp +++ b/sdrgui/gui/audiodialog.cpp @@ -198,8 +198,8 @@ void AudioDialogX::updateOutputDisplay() ui->outputUDPAddress->setText(m_outputDeviceInfo.udpAddress); ui->outputUDPPort->setText(tr("%1").arg(m_outputDeviceInfo.udpPort)); ui->outputUDPCopy->setChecked(m_outputDeviceInfo.copyToUDP); - ui->outputUDPStereo->setChecked(m_outputDeviceInfo.udpStereo); ui->outputUDPUseRTP->setChecked(m_outputDeviceInfo.udpUseRTP); + ui->outputUDPChannelMode->setCurrentIndex((int) m_outputDeviceInfo.udpChannelMode); } void AudioDialogX::updateOutputDeviceInfo() @@ -208,7 +208,7 @@ void AudioDialogX::updateOutputDeviceInfo() m_outputDeviceInfo.udpAddress = ui->outputUDPAddress->text(); m_outputDeviceInfo.udpPort = m_outputUDPPort; m_outputDeviceInfo.copyToUDP = ui->outputUDPCopy->isChecked(); - m_outputDeviceInfo.udpStereo = ui->outputUDPStereo->isChecked(); m_outputDeviceInfo.udpUseRTP = ui->outputUDPUseRTP->isChecked(); + m_outputDeviceInfo.udpChannelMode = (AudioOutput::UDPChannelMode) ui->outputUDPChannelMode->currentIndex(); } diff --git a/sdrgui/gui/audiodialog.ui b/sdrgui/gui/audiodialog.ui index 68fdc93a4..487bf1130 100644 --- a/sdrgui/gui/audiodialog.ui +++ b/sdrgui/gui/audiodialog.ui @@ -6,7 +6,7 @@ 0 0 - 400 + 472 349 @@ -204,13 +204,33 @@ - - - Copy to UDP as stereo (no L+R mix) - - - S + + + + 80 + 0 + + + + Left + + + + + Right + + + + + Mixed + + + + + Stereo + +