mirror of https://github.com/f4exb/sdrangel.git
Multiple audio support: new combo and enum for udp channel mode
This commit is contained in:
parent
a049e3aaa6
commit
ddff6c91b1
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue