diff --git a/plugins/channelrx/demodam/amdemod.cpp b/plugins/channelrx/demodam/amdemod.cpp index 1590c6d1b..ee0a0c158 100644 --- a/plugins/channelrx/demodam/amdemod.cpp +++ b/plugins/channelrx/demodam/amdemod.cpp @@ -63,7 +63,7 @@ AMDemod::AMDemod(DeviceSourceAPI *deviceAPI) : m_magsq = 0.0; - DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo); + DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue()); m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort); diff --git a/plugins/channelrx/demodbfm/bfmdemod.cpp b/plugins/channelrx/demodbfm/bfmdemod.cpp index d70c045a5..e29d02e67 100644 --- a/plugins/channelrx/demodbfm/bfmdemod.cpp +++ b/plugins/channelrx/demodbfm/bfmdemod.cpp @@ -84,7 +84,7 @@ BFMDemod::BFMDemod(DeviceSourceAPI *deviceAPI) : m_audioBuffer.resize(16384); m_audioBufferFill = 0; - DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo); + DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue()); m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort); m_audioNetSink->setStereo(true); diff --git a/plugins/channelrx/demoddsd/dsddemod.cpp b/plugins/channelrx/demoddsd/dsddemod.cpp index 4295c8a99..8bb564001 100644 --- a/plugins/channelrx/demoddsd/dsddemod.cpp +++ b/plugins/channelrx/demoddsd/dsddemod.cpp @@ -72,8 +72,8 @@ DSDDemod::DSDDemod(DeviceSourceAPI *deviceAPI) : m_magsqPeak = 0.0f; m_magsqCount = 0; - DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo1); - DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo2); + DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo1, getInputMessageQueue()); + DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo2, getInputMessageQueue()); // m_udpBufferAudio = new UDPSink(this, m_udpBlockSize, m_settings.m_udpPort); // m_audioFifo1.setUDPSink(m_udpBufferAudio); diff --git a/plugins/channelrx/demodnfm/nfmdemod.cpp b/plugins/channelrx/demodnfm/nfmdemod.cpp index d2c6a82cc..b78a20522 100644 --- a/plugins/channelrx/demodnfm/nfmdemod.cpp +++ b/plugins/channelrx/demodnfm/nfmdemod.cpp @@ -80,7 +80,7 @@ NFMDemod::NFMDemod(DeviceSourceAPI *devieAPI) : m_ctcssDetector.setCoefficients(3000, 6000.0); // 0.5s / 2 Hz resolution m_afSquelch.setCoefficients(24, 600, 48000.0, 200, 0); // 0.5ms test period, 300ms average span, 48kS/s SR, 100ms attack, no decay - DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo); + DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue()); m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort); diff --git a/plugins/channelrx/demodssb/ssbdemod.cpp b/plugins/channelrx/demodssb/ssbdemod.cpp index 65e241926..a460a9a99 100644 --- a/plugins/channelrx/demodssb/ssbdemod.cpp +++ b/plugins/channelrx/demodssb/ssbdemod.cpp @@ -85,7 +85,7 @@ SSBDemod::SSBDemod(DeviceSourceAPI *deviceAPI) : SSBFilter = new fftfilt(m_LowCutoff / m_audioSampleRate, m_Bandwidth / m_audioSampleRate, ssbFftLen); DSBFilter = new fftfilt((2.0f * m_Bandwidth) / m_audioSampleRate, 2 * ssbFftLen); - DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo); + DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue()); m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort); diff --git a/plugins/channelrx/demodwfm/wfmdemod.cpp b/plugins/channelrx/demodwfm/wfmdemod.cpp index c27e28882..2c722598e 100644 --- a/plugins/channelrx/demodwfm/wfmdemod.cpp +++ b/plugins/channelrx/demodwfm/wfmdemod.cpp @@ -59,7 +59,7 @@ WFMDemod::WFMDemod(DeviceSourceAPI* deviceAPI) : m_audioBuffer.resize(16384); m_audioBufferFill = 0; - DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo); + DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue()); m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort); diff --git a/plugins/channelrx/udpsrc/udpsrc.cpp b/plugins/channelrx/udpsrc/udpsrc.cpp index 70dec15ad..fd3e1f482 100644 --- a/plugins/channelrx/udpsrc/udpsrc.cpp +++ b/plugins/channelrx/udpsrc/udpsrc.cpp @@ -543,7 +543,7 @@ void UDPSrc::applySettings(const UDPSrcSettings& settings, bool force) if (settings.m_audioActive) { m_audioBufferFill = 0; - DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo); + DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue()); } else { diff --git a/plugins/channeltx/modam/ammod.cpp b/plugins/channeltx/modam/ammod.cpp index 8789f46c6..5fbf1cd07 100644 --- a/plugins/channeltx/modam/ammod.cpp +++ b/plugins/channeltx/modam/ammod.cpp @@ -66,7 +66,7 @@ AMMod::AMMod(DeviceSinkAPI *deviceAPI) : m_magsq = 0.0; m_toneNco.setFreq(1000.0, m_settings.m_audioSampleRate); - DSPEngine::instance()->getAudioDeviceManager()->addAudioSource(&m_audioFifo); + DSPEngine::instance()->getAudioDeviceManager()->addAudioSource(&m_audioFifo, getInputMessageQueue()); // CW keyer m_cwKeyer.setSampleRate(m_settings.m_audioSampleRate); diff --git a/plugins/channeltx/modnfm/nfmmod.cpp b/plugins/channeltx/modnfm/nfmmod.cpp index 709527bf5..320f40b11 100644 --- a/plugins/channeltx/modnfm/nfmmod.cpp +++ b/plugins/channeltx/modnfm/nfmmod.cpp @@ -73,7 +73,7 @@ NFMMod::NFMMod(DeviceSinkAPI *deviceAPI) : m_toneNco.setFreq(1000.0, m_settings.m_audioSampleRate); m_ctcssNco.setFreq(88.5, m_settings.m_audioSampleRate); - DSPEngine::instance()->getAudioDeviceManager()->addAudioSource(&m_audioFifo); + DSPEngine::instance()->getAudioDeviceManager()->addAudioSource(&m_audioFifo, getInputMessageQueue()); // CW keyer m_cwKeyer.setSampleRate(m_settings.m_audioSampleRate); diff --git a/plugins/channeltx/modssb/ssbmod.cpp b/plugins/channeltx/modssb/ssbmod.cpp index 3f0790d66..51066ace9 100644 --- a/plugins/channeltx/modssb/ssbmod.cpp +++ b/plugins/channeltx/modssb/ssbmod.cpp @@ -88,7 +88,7 @@ SSBMod::SSBMod(DeviceSinkAPI *deviceAPI) : m_magsq = 0.0; m_toneNco.setFreq(1000.0, m_settings.m_audioSampleRate); - DSPEngine::instance()->getAudioDeviceManager()->addAudioSource(&m_audioFifo); + DSPEngine::instance()->getAudioDeviceManager()->addAudioSource(&m_audioFifo, getInputMessageQueue()); // CW keyer m_cwKeyer.setSampleRate(m_settings.m_audioSampleRate); diff --git a/plugins/channeltx/modwfm/wfmmod.cpp b/plugins/channeltx/modwfm/wfmmod.cpp index e1cdc90c7..b78be126c 100644 --- a/plugins/channeltx/modwfm/wfmmod.cpp +++ b/plugins/channeltx/modwfm/wfmmod.cpp @@ -75,7 +75,7 @@ WFMMod::WFMMod(DeviceSinkAPI *deviceAPI) : m_toneNco.setFreq(1000.0, m_settings.m_audioSampleRate); m_toneNcoRF.setFreq(1000.0, m_outputSampleRate); - DSPEngine::instance()->getAudioDeviceManager()->addAudioSource(&m_audioFifo); + DSPEngine::instance()->getAudioDeviceManager()->addAudioSource(&m_audioFifo, getInputMessageQueue()); // CW keyer m_cwKeyer.setSampleRate(m_outputSampleRate); diff --git a/sdrbase/audio/audiodevicemanager.cpp b/sdrbase/audio/audiodevicemanager.cpp index 6b92b406a..c6f113490 100644 --- a/sdrbase/audio/audiodevicemanager.cpp +++ b/sdrbase/audio/audiodevicemanager.cpp @@ -18,9 +18,11 @@ #include "audio/audiodevicemanager.h" #include "util/simpleserializer.h" +#include #include const float AudioDeviceManager::m_defaultAudioInputVolume = 0.15f; +const QString AudioDeviceManager::m_defaultUDPAddress = "127.0.0.1"; QDataStream& operator<<(QDataStream& ds, const AudioDeviceManager::InputDeviceInfo& info) { @@ -34,6 +36,18 @@ QDataStream& operator>>(QDataStream& ds, AudioDeviceManager::InputDeviceInfo& in return ds; } +QDataStream& operator<<(QDataStream& ds, const AudioDeviceManager::OutputDeviceInfo& info) +{ + ds << info.sampleRate << info.udpAddress << info.udpPort << info.copyToUDP << info.udpStereo << info.udpUseRTP; + return ds; +} + +QDataStream& operator>>(QDataStream& ds, AudioDeviceManager::OutputDeviceInfo& info) +{ + ds >> info.sampleRate >> info.udpAddress >> info.udpPort >> info.copyToUDP >> info.udpStereo >> info.udpUseRTP; + return ds; +} + AudioDeviceManager::AudioDeviceManager() { m_inputDevicesInfo = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); @@ -122,7 +136,7 @@ void AudioDeviceManager::serializeInputMap(QByteArray& data) const void AudioDeviceManager::serializeOutputMap(QByteArray& data) const { QDataStream *stream = new QDataStream(&data, QIODevice::WriteOnly); - *stream << m_audioOutputSampleRates; + *stream << m_audioOutputInfos; delete stream; } @@ -167,10 +181,10 @@ void AudioDeviceManager::deserializeInputMap(QByteArray& data) void AudioDeviceManager::deserializeOutputMap(QByteArray& data) { QDataStream readStream(&data, QIODevice::ReadOnly); - readStream >> m_audioOutputSampleRates; + readStream >> m_audioOutputInfos; } -void AudioDeviceManager::addAudioSink(AudioFifo* audioFifo, int outputDeviceIndex) +void AudioDeviceManager::addAudioSink(AudioFifo* audioFifo, MessageQueue *sampleSinkMessageQueue, int outputDeviceIndex) { qDebug("AudioDeviceManager::addAudioSink: %d: %p", outputDeviceIndex, audioFifo); @@ -198,6 +212,7 @@ void AudioDeviceManager::addAudioSink(AudioFifo* audioFifo, int outputDeviceInde } m_audioSinkFifos[audioFifo] = outputDeviceIndex; // register audio FIFO + m_sampleSinkMessageQueues[audioFifo] = sampleSinkMessageQueue; } void AudioDeviceManager::removeAudioSink(AudioFifo* audioFifo) @@ -218,9 +233,10 @@ void AudioDeviceManager::removeAudioSink(AudioFifo* audioFifo) } m_audioSinkFifos.remove(audioFifo); // unregister audio FIFO + m_sampleSinkMessageQueues.remove(audioFifo); } -void AudioDeviceManager::addAudioSource(AudioFifo* audioFifo, int inputDeviceIndex) +void AudioDeviceManager::addAudioSource(AudioFifo* audioFifo, MessageQueue *sampleSourceMessageQueue, int inputDeviceIndex) { qDebug("AudioDeviceManager::addAudioSource: %d: %p", inputDeviceIndex, audioFifo); @@ -248,6 +264,7 @@ void AudioDeviceManager::addAudioSource(AudioFifo* audioFifo, int inputDeviceInd } m_audioSourceFifos[audioFifo] = inputDeviceIndex; // register audio FIFO + m_sampleSourceMessageQueues[audioFifo] = sampleSourceMessageQueue; } void AudioDeviceManager::removeAudioSource(AudioFifo* audioFifo) @@ -268,23 +285,47 @@ void AudioDeviceManager::removeAudioSource(AudioFifo* audioFifo) } m_audioSourceFifos.remove(audioFifo); // unregister audio FIFO + m_sampleSourceMessageQueues.remove(audioFifo); } void AudioDeviceManager::startAudioOutput(int outputDeviceIndex) { unsigned int sampleRate; + QString udpAddress; + quint16 udpPort; + bool copyAudioToUDP; + bool udpStereo; + bool udpUseRTP; QString deviceName; if (getOutputDeviceName(outputDeviceIndex, deviceName)) { - if (m_audioOutputSampleRates.find(deviceName) == m_audioOutputSampleRates.end()) { + if (m_audioOutputInfos.find(deviceName) == m_audioOutputInfos.end()) + { sampleRate = m_defaultAudioSampleRate; - } else { - sampleRate = m_audioOutputSampleRates[deviceName]; + udpAddress = m_defaultUDPAddress; + udpPort = m_defaultUDPPort; + copyAudioToUDP = false; + udpStereo = false; + udpUseRTP = false; + } + else + { + sampleRate = m_audioOutputInfos[deviceName].sampleRate; + 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; } m_audioOutputs[outputDeviceIndex]->start(outputDeviceIndex, sampleRate); - m_audioOutputSampleRates[deviceName] = m_audioOutputs[outputDeviceIndex]->getRate(); // update with actual rate + m_audioOutputInfos[deviceName].sampleRate = m_audioOutputs[outputDeviceIndex]->getRate(); // update with actual rate + 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; } else { @@ -347,12 +388,17 @@ void AudioDeviceManager::debugAudioInputInfos() const void AudioDeviceManager::debugAudioOutputInfos() const { - QMap::const_iterator it = m_audioOutputSampleRates.begin(); + QMap::const_iterator it = m_audioOutputInfos.begin(); - for (; it != m_audioOutputSampleRates.end(); ++it) + for (; it != m_audioOutputInfos.end(); ++it) { qDebug() << "AudioDeviceManager::debugAudioOutputInfos:" << " name: " << it.key() - << " sampleRate: " << it.value(); + << " sampleRate: " << it.value().sampleRate + << " udpAddress: " << it.value().udpAddress + << " udpPort: " << it.value().udpPort + << " copyToUDP: " << it.value().copyToUDP + << " udpStereo: " << it.value().udpStereo + << " udpUseRTP: " << it.value().udpUseRTP; } } diff --git a/sdrbase/audio/audiodevicemanager.h b/sdrbase/audio/audiodevicemanager.h index 571aff25e..6a69614e2 100644 --- a/sdrbase/audio/audiodevicemanager.h +++ b/sdrbase/audio/audiodevicemanager.h @@ -22,25 +22,51 @@ #include #include #include -#include #include "audio/audioinput.h" #include "audio/audiooutput.h" #include "export.h" +class QDataStream; class AudioFifo; +class MessageQueue; class SDRBASE_API AudioDeviceManager { public: class InputDeviceInfo { public: + InputDeviceInfo() : + sampleRate(m_defaultAudioSampleRate), + volume(m_defaultAudioInputVolume) + {} unsigned int sampleRate; float volume; friend QDataStream& operator<<(QDataStream& ds, const InputDeviceInfo& info); friend QDataStream& operator>>(QDataStream& ds, InputDeviceInfo& info); }; + class OutputDeviceInfo + { + public: + OutputDeviceInfo() : + sampleRate(m_defaultAudioSampleRate), + udpAddress(m_defaultUDPAddress), + udpPort(m_defaultUDPPort), + copyToUDP(false), + udpStereo(false), + udpUseRTP(false) + {} + unsigned int sampleRate; + QString udpAddress; + quint16 udpPort; + bool copyToUDP; + bool udpStereo; + bool udpUseRTP; + friend QDataStream& operator<<(QDataStream& ds, const OutputDeviceInfo& info); + friend QDataStream& operator>>(QDataStream& ds, OutputDeviceInfo& info); + }; + AudioDeviceManager(); ~AudioDeviceManager(); @@ -51,24 +77,28 @@ public: bool getOutputDeviceName(int outputDeviceIndex, QString &deviceName) const; bool getInputDeviceName(int outputDeviceIndex, QString &deviceName) const; - void addAudioSink(AudioFifo* audioFifo, int outputDeviceIndex = -1); //!< Add the audio sink + void addAudioSink(AudioFifo* audioFifo, MessageQueue *sampleSinkMessageQueue, int outputDeviceIndex = -1); //!< Add the audio sink void removeAudioSink(AudioFifo* audioFifo); //!< Remove the audio sink - void addAudioSource(AudioFifo* audioFifo, int inputDeviceIndex = -1); //!< Add an audio source + void addAudioSource(AudioFifo* audioFifo, MessageQueue *sampleSourceMessageQueue, int inputDeviceIndex = -1); //!< Add an audio source void removeAudioSource(AudioFifo* audioFifo); //!< Remove an audio source static const unsigned int m_defaultAudioSampleRate = 48000; static const float m_defaultAudioInputVolume; -private: + static const QString m_defaultUDPAddress; + static const quint16 m_defaultUDPPort = 9998; +private: QList m_inputDevicesInfo; QList m_outputDevicesInfo; - QMap m_audioSinkFifos; //< Audio sink FIFO to audio output device index-1 map + QMap m_audioSinkFifos; //< audio sink FIFO to audio output device index-1 map + QMap m_sampleSinkMessageQueues; //!< audio sink FIFO to attached sink message queue QMap m_audioOutputs; //!< audio device index to audio output map (index -1 is default device) - QMap m_audioOutputSampleRates; //!< audio device name to audio sample rate + QMap m_audioOutputInfos; //!< audio device name to audio output info - QMap m_audioSourceFifos; //< Audio source FIFO to audio input device index-1 map + QMap m_audioSourceFifos; //< audio source FIFO to audio input device index-1 map + QMap m_sampleSourceMessageQueues; //!< audio source FIFO to attached source message queue QMap m_audioInputs; //!< audio device index to audio input map (index -1 is default device) QMap m_audioInputInfos; //!< audio device name to audio input device info @@ -94,5 +124,9 @@ private: }; QDataStream& operator<<(QDataStream& ds, const AudioDeviceManager::InputDeviceInfo& info); +QDataStream& operator>>(QDataStream& ds, AudioDeviceManager::InputDeviceInfo& info); + +QDataStream& operator<<(QDataStream& ds, const AudioDeviceManager::OutputDeviceInfo& info); +QDataStream& operator>>(QDataStream& ds, AudioDeviceManager::OutputDeviceInfo& info); #endif // INCLUDE_AUDIODEVICEMANGER_H diff --git a/sdrbase/audio/audiooutput.cpp b/sdrbase/audio/audiooutput.cpp index 2faf01993..5d798f245 100644 --- a/sdrbase/audio/audiooutput.cpp +++ b/sdrbase/audio/audiooutput.cpp @@ -19,12 +19,16 @@ #include #include #include -#include "audio/audiooutput.h" -#include "audio/audiofifo.h" +#include "audiooutput.h" +#include "audiofifo.h" +#include "audionetsink.h" AudioOutput::AudioOutput() : m_mutex(QMutex::Recursive), m_audioOutput(0), + m_audioNetSink(0), + m_copyAudioToUdp(false), + m_udpStereo(false), m_audioUsageCount(0), m_onExit(false), m_audioFifos() @@ -100,6 +104,7 @@ bool AudioOutput::start(int device, int rate) } m_audioOutput = new QAudioOutput(devInfo, m_audioFormat); + m_audioNetSink = new AudioNetSink(0); QIODevice::open(QIODevice::ReadOnly); @@ -123,6 +128,8 @@ void AudioOutput::stop() QMutexLocker mutexLocker(&m_mutex); m_audioOutput->stop(); QIODevice::close(); + delete m_audioNetSink; + m_audioNetSink = 0; delete m_audioOutput; // if (m_audioUsageCount > 0) @@ -162,6 +169,35 @@ bool AudioOutput::open(OpenMode mode) return false; }*/ +void AudioOutput::setUdpDestination(const QString& address, uint16_t port) +{ + if (m_audioNetSink) { + m_audioNetSink->setDestination(address, port); + } +} + +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) { + m_audioNetSink->selectType(useRTP ? AudioNetSink::SinkRTP : AudioNetSink::SinkUDP); + } +} + + qint64 AudioOutput::readData(char* data, qint64 maxLen) { //qDebug("AudioOutput::readData: %lld", maxLen); diff --git a/sdrbase/audio/audiooutput.h b/sdrbase/audio/audiooutput.h index 1cb540978..ec2d2c9f0 100644 --- a/sdrbase/audio/audiooutput.h +++ b/sdrbase/audio/audiooutput.h @@ -23,11 +23,13 @@ #include #include #include +#include #include "export.h" class QAudioOutput; class AudioFifo; class AudioOutputPipe; +class AudioNetSink; class SDRBASE_API AudioOutput : QIODevice { public: @@ -44,9 +46,17 @@ public: unsigned int getRate() const { return m_audioFormat.sampleRate(); } void setOnExit(bool onExit) { m_onExit = onExit; } + void setUdpDestination(const QString& address, uint16_t port); + void setUdpCopyToUDP(bool copyToUDP); + void setUdpStereo(bool stereo); + void setUdpUseRTP(bool useRTP); + private: QMutex m_mutex; QAudioOutput* m_audioOutput; + AudioNetSink* m_audioNetSink; + bool m_copyAudioToUdp; + bool m_udpStereo; uint m_audioUsageCount; bool m_onExit; diff --git a/sdrgui/gui/audiodialog.ui b/sdrgui/gui/audiodialog.ui index b38abf97f..46676be5b 100644 --- a/sdrgui/gui/audiodialog.ui +++ b/sdrgui/gui/audiodialog.ui @@ -23,9 +23,9 @@ - 1 + 0 - + Audio Output @@ -39,6 +39,176 @@ + + + + + + Rate + + + + + + + + 80 + 0 + + + + Audio output sample rate + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 8000 + + + 192000 + + + 50 + + + 48000 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 24 + 16777215 + + + + Reset values to defaults + + + R + + + + + + + + + + + Addr + + + + + + + + 140 + 16777215 + + + + UDP address + + + 000.000.000.000; + + + 127.0.0.1 + + + + + + + Port + + + + + + + + 60 + 16777215 + + + + UDP port + + + 00000; + + + 9998 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Copy audio to UDP + + + U + + + + + + + Copy to UDP as stereo (no L+R mix) + + + S + + + + + + + Use RTP protocol + + + R + + + + + @@ -57,6 +227,41 @@ + + + + Rate + + + + + + + + 80 + 0 + + + + Audio input sample rate + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 8000 + + + 192000 + + + 50 + + + 48000 + + + @@ -78,6 +283,9 @@ 24 + + Input volume + 100 @@ -118,6 +326,22 @@ + + + + + 24 + 16777215 + + + + Reset values to default + + + R + + + @@ -136,6 +360,13 @@ + + + ButtonSwitch + QToolButton +
gui/buttonswitch.h
+
+
buttonBox tabWidget