Multiple audio support: new combo and enum for udp channel mode

This commit is contained in:
f4exb 2018-03-26 21:10:09 +02:00
parent a049e3aaa6
commit ddff6c91b1
6 changed files with 62 additions and 34 deletions

View File

@ -42,13 +42,15 @@ QDataStream& operator>>(QDataStream& ds, AudioDeviceManager::InputDeviceInfo& in
QDataStream& operator<<(QDataStream& ds, const AudioDeviceManager::OutputDeviceInfo& info) 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; return ds;
} }
QDataStream& operator>>(QDataStream& ds, AudioDeviceManager::OutputDeviceInfo& info) 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; return ds;
} }
@ -331,8 +333,8 @@ void AudioDeviceManager::startAudioOutput(int outputDeviceIndex)
QString udpAddress; QString udpAddress;
quint16 udpPort; quint16 udpPort;
bool copyAudioToUDP; bool copyAudioToUDP;
bool udpStereo;
bool udpUseRTP; bool udpUseRTP;
AudioOutput::UDPChannelMode udpChannelMode;
QString deviceName; QString deviceName;
if (getOutputDeviceName(outputDeviceIndex, deviceName)) if (getOutputDeviceName(outputDeviceIndex, deviceName))
@ -343,8 +345,8 @@ void AudioDeviceManager::startAudioOutput(int outputDeviceIndex)
udpAddress = m_defaultUDPAddress; udpAddress = m_defaultUDPAddress;
udpPort = m_defaultUDPPort; udpPort = m_defaultUDPPort;
copyAudioToUDP = false; copyAudioToUDP = false;
udpStereo = false;
udpUseRTP = false; udpUseRTP = false;
udpChannelMode = AudioOutput::UDPChannelLeft;
} }
else else
{ {
@ -352,8 +354,8 @@ void AudioDeviceManager::startAudioOutput(int outputDeviceIndex)
udpAddress = m_audioOutputInfos[deviceName].udpAddress; udpAddress = m_audioOutputInfos[deviceName].udpAddress;
udpPort = m_audioOutputInfos[deviceName].udpPort; udpPort = m_audioOutputInfos[deviceName].udpPort;
copyAudioToUDP = m_audioOutputInfos[deviceName].copyToUDP; copyAudioToUDP = m_audioOutputInfos[deviceName].copyToUDP;
udpStereo = m_audioOutputInfos[deviceName].udpStereo;
udpUseRTP = m_audioOutputInfos[deviceName].udpUseRTP; udpUseRTP = m_audioOutputInfos[deviceName].udpUseRTP;
udpChannelMode = m_audioOutputInfos[deviceName].udpChannelMode;
} }
m_audioOutputs[outputDeviceIndex]->start(outputDeviceIndex, sampleRate); m_audioOutputs[outputDeviceIndex]->start(outputDeviceIndex, sampleRate);
@ -361,8 +363,8 @@ void AudioDeviceManager::startAudioOutput(int outputDeviceIndex)
m_audioOutputInfos[deviceName].udpAddress = udpAddress; m_audioOutputInfos[deviceName].udpAddress = udpAddress;
m_audioOutputInfos[deviceName].udpPort = udpPort; m_audioOutputInfos[deviceName].udpPort = udpPort;
m_audioOutputInfos[deviceName].copyToUDP = copyAudioToUDP; m_audioOutputInfos[deviceName].copyToUDP = copyAudioToUDP;
m_audioOutputInfos[deviceName].udpStereo = udpStereo;
m_audioOutputInfos[deviceName].udpUseRTP = udpUseRTP; m_audioOutputInfos[deviceName].udpUseRTP = udpUseRTP;
m_audioOutputInfos[deviceName].udpChannelMode = udpChannelMode;
} }
else else
{ {
@ -570,7 +572,6 @@ void AudioDeviceManager::setOutputDeviceInfo(int outputDeviceIndex, const Output
audioOutput->setUdpCopyToUDP(deviceInfo.copyToUDP); audioOutput->setUdpCopyToUDP(deviceInfo.copyToUDP);
audioOutput->setUdpDestination(deviceInfo.udpAddress, deviceInfo.udpPort); audioOutput->setUdpDestination(deviceInfo.udpAddress, deviceInfo.udpPort);
audioOutput->setUdpStereo(deviceInfo.udpStereo);
audioOutput->setUdpUseRTP(deviceInfo.udpUseRTP); audioOutput->setUdpUseRTP(deviceInfo.udpUseRTP);
} }
@ -723,7 +724,7 @@ void AudioDeviceManager::debugAudioOutputInfos() const
<< " udpAddress: " << it.value().udpAddress << " udpAddress: " << it.value().udpAddress
<< " udpPort: " << it.value().udpPort << " udpPort: " << it.value().udpPort
<< " copyToUDP: " << it.value().copyToUDP << " copyToUDP: " << it.value().copyToUDP
<< " udpStereo: " << it.value().udpStereo << " udpUseRTP: " << it.value().udpUseRTP
<< " udpUseRTP: " << it.value().udpUseRTP; << " udpChannelMode: " << (int) it.value().udpChannelMode;
} }
} }

View File

@ -58,23 +58,23 @@ public:
udpAddress(m_defaultUDPAddress), udpAddress(m_defaultUDPAddress),
udpPort(m_defaultUDPPort), udpPort(m_defaultUDPPort),
copyToUDP(false), copyToUDP(false),
udpStereo(false), udpUseRTP(false),
udpUseRTP(false) udpChannelMode(AudioOutput::UDPChannelLeft)
{} {}
void resetToDefaults() { void resetToDefaults() {
sampleRate = m_defaultAudioSampleRate; sampleRate = m_defaultAudioSampleRate;
udpAddress = m_defaultUDPAddress; udpAddress = m_defaultUDPAddress;
udpPort = m_defaultUDPPort; udpPort = m_defaultUDPPort;
copyToUDP = false; copyToUDP = false;
udpStereo = false;
udpUseRTP = false; udpUseRTP = false;
udpChannelMode = AudioOutput::UDPChannelLeft;
} }
unsigned int sampleRate; unsigned int sampleRate;
QString udpAddress; QString udpAddress;
quint16 udpPort; quint16 udpPort;
bool copyToUDP; bool copyToUDP;
bool udpStereo;
bool udpUseRTP; bool udpUseRTP;
AudioOutput::UDPChannelMode udpChannelMode;
friend QDataStream& operator<<(QDataStream& ds, const OutputDeviceInfo& info); friend QDataStream& operator<<(QDataStream& ds, const OutputDeviceInfo& info);
friend QDataStream& operator>>(QDataStream& ds, OutputDeviceInfo& info); friend QDataStream& operator>>(QDataStream& ds, OutputDeviceInfo& info);
}; };

View File

@ -28,7 +28,7 @@ AudioOutput::AudioOutput() :
m_audioOutput(0), m_audioOutput(0),
m_audioNetSink(0), m_audioNetSink(0),
m_copyAudioToUdp(false), m_copyAudioToUdp(false),
m_udpStereo(false), m_udpChannelMode(UDPChannelLeft),
m_audioUsageCount(0), m_audioUsageCount(0),
m_onExit(false), m_onExit(false),
m_audioFifos() m_audioFifos()
@ -188,15 +188,6 @@ void AudioOutput::setUdpCopyToUDP(bool copyToUDP)
m_copyAudioToUdp = copyToUDP; m_copyAudioToUdp = copyToUDP;
} }
void AudioOutput::setUdpStereo(bool stereo)
{
if (m_audioNetSink) {
m_audioNetSink->setStereo(stereo);
}
m_udpStereo = stereo;
}
void AudioOutput::setUdpUseRTP(bool useRTP) void AudioOutput::setUdpUseRTP(bool useRTP)
{ {
if (m_audioNetSink) { 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) qint64 AudioOutput::readData(char* data, qint64 maxLen)
{ {

View File

@ -33,6 +33,14 @@ class AudioNetSink;
class SDRBASE_API AudioOutput : QIODevice { class SDRBASE_API AudioOutput : QIODevice {
public: public:
enum UDPChannelMode
{
UDPChannelLeft,
UDPChannelRight,
UDPChannelMixed,
UDPChannelStereo
};
AudioOutput(); AudioOutput();
virtual ~AudioOutput(); virtual ~AudioOutput();
@ -48,15 +56,15 @@ public:
void setUdpDestination(const QString& address, uint16_t port); void setUdpDestination(const QString& address, uint16_t port);
void setUdpCopyToUDP(bool copyToUDP); void setUdpCopyToUDP(bool copyToUDP);
void setUdpStereo(bool stereo);
void setUdpUseRTP(bool useRTP); void setUdpUseRTP(bool useRTP);
void setUdpChannelMode(UDPChannelMode udpChannelMode);
private: private:
QMutex m_mutex; QMutex m_mutex;
QAudioOutput* m_audioOutput; QAudioOutput* m_audioOutput;
AudioNetSink* m_audioNetSink; AudioNetSink* m_audioNetSink;
bool m_copyAudioToUdp; bool m_copyAudioToUdp;
bool m_udpStereo; UDPChannelMode m_udpChannelMode;
uint m_audioUsageCount; uint m_audioUsageCount;
bool m_onExit; bool m_onExit;

View File

@ -198,8 +198,8 @@ void AudioDialogX::updateOutputDisplay()
ui->outputUDPAddress->setText(m_outputDeviceInfo.udpAddress); ui->outputUDPAddress->setText(m_outputDeviceInfo.udpAddress);
ui->outputUDPPort->setText(tr("%1").arg(m_outputDeviceInfo.udpPort)); ui->outputUDPPort->setText(tr("%1").arg(m_outputDeviceInfo.udpPort));
ui->outputUDPCopy->setChecked(m_outputDeviceInfo.copyToUDP); ui->outputUDPCopy->setChecked(m_outputDeviceInfo.copyToUDP);
ui->outputUDPStereo->setChecked(m_outputDeviceInfo.udpStereo);
ui->outputUDPUseRTP->setChecked(m_outputDeviceInfo.udpUseRTP); ui->outputUDPUseRTP->setChecked(m_outputDeviceInfo.udpUseRTP);
ui->outputUDPChannelMode->setCurrentIndex((int) m_outputDeviceInfo.udpChannelMode);
} }
void AudioDialogX::updateOutputDeviceInfo() void AudioDialogX::updateOutputDeviceInfo()
@ -208,7 +208,7 @@ void AudioDialogX::updateOutputDeviceInfo()
m_outputDeviceInfo.udpAddress = ui->outputUDPAddress->text(); m_outputDeviceInfo.udpAddress = ui->outputUDPAddress->text();
m_outputDeviceInfo.udpPort = m_outputUDPPort; m_outputDeviceInfo.udpPort = m_outputUDPPort;
m_outputDeviceInfo.copyToUDP = ui->outputUDPCopy->isChecked(); m_outputDeviceInfo.copyToUDP = ui->outputUDPCopy->isChecked();
m_outputDeviceInfo.udpStereo = ui->outputUDPStereo->isChecked();
m_outputDeviceInfo.udpUseRTP = ui->outputUDPUseRTP->isChecked(); m_outputDeviceInfo.udpUseRTP = ui->outputUDPUseRTP->isChecked();
m_outputDeviceInfo.udpChannelMode = (AudioOutput::UDPChannelMode) ui->outputUDPChannelMode->currentIndex();
} }

View File

@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>400</width> <width>472</width>
<height>349</height> <height>349</height>
</rect> </rect>
</property> </property>
@ -204,13 +204,33 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="outputUDPStereo"> <widget class="QComboBox" name="outputUDPChannelMode">
<property name="toolTip"> <property name="minimumSize">
<string>Copy to UDP as stereo (no L+R mix)</string> <size>
</property> <width>80</width>
<property name="text"> <height>0</height>
<string>S</string> </size>
</property> </property>
<item>
<property name="text">
<string>Left</string>
</property>
</item>
<item>
<property name="text">
<string>Right</string>
</property>
</item>
<item>
<property name="text">
<string>Mixed</string>
</property>
</item>
<item>
<property name="text">
<string>Stereo</string>
</property>
</item>
</widget> </widget>
</item> </item>
<item> <item>