mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-07-14 14:55:23 -04:00
Multiple audio support: New audio preferences dialog (3). Application to AM demod
This commit is contained in:
parent
677c598347
commit
095ab14a14
@ -64,6 +64,7 @@ AMDemod::AMDemod(DeviceSourceAPI *deviceAPI) :
|
|||||||
m_magsq = 0.0;
|
m_magsq = 0.0;
|
||||||
|
|
||||||
DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue());
|
DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue());
|
||||||
|
m_audioSampleRate = DSPEngine::instance()->getAudioDeviceManager()->getOutputSampleRate();
|
||||||
m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically
|
m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically
|
||||||
m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort);
|
m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort);
|
||||||
|
|
||||||
@ -205,12 +206,45 @@ bool AMDemod::handleMessage(const Message& cmd)
|
|||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (DSPConfigureAudio::match(cmd))
|
||||||
|
{
|
||||||
|
DSPConfigureAudio& cfg = (DSPConfigureAudio&) cmd;
|
||||||
|
uint32_t sampleRate = cfg.getSampleRate();
|
||||||
|
|
||||||
|
qDebug() << "AMDemod::handleMessage: DSPConfigureAudio:"
|
||||||
|
<< " sampleRate: " << sampleRate;
|
||||||
|
|
||||||
|
if (sampleRate != m_audioSampleRate) {
|
||||||
|
applyAudioSampleRate(sampleRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
AMDemodSettings settings = m_settings;
|
||||||
|
applyAudioSampleRate(cfg.getSampleRate());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AMDemod::applyAudioSampleRate(int sampleRate)
|
||||||
|
{
|
||||||
|
MsgConfigureChannelizer* channelConfigMsg = MsgConfigureChannelizer::create(
|
||||||
|
sampleRate, m_settings.m_inputFrequencyOffset);
|
||||||
|
m_inputMessageQueue.push(channelConfigMsg);
|
||||||
|
|
||||||
|
m_settingsMutex.lock();
|
||||||
|
m_interpolator.create(16, m_inputSampleRate, m_settings.m_rfBandwidth / 2.2f);
|
||||||
|
m_interpolatorDistanceRemain = 0;
|
||||||
|
m_interpolatorDistance = (Real) m_inputSampleRate / (Real) sampleRate;
|
||||||
|
m_bandpass.create(301, sampleRate, 300.0, m_settings.m_rfBandwidth / 2.0f);
|
||||||
|
m_settingsMutex.unlock();
|
||||||
|
|
||||||
|
m_audioSampleRate = sampleRate;
|
||||||
|
}
|
||||||
|
|
||||||
void AMDemod::applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force)
|
void AMDemod::applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force)
|
||||||
{
|
{
|
||||||
qDebug() << "AMDemod::applyChannelSettings:"
|
qDebug() << "AMDemod::applyChannelSettings:"
|
||||||
@ -228,7 +262,7 @@ void AMDemod::applyChannelSettings(int inputSampleRate, int inputFrequencyOffset
|
|||||||
m_settingsMutex.lock();
|
m_settingsMutex.lock();
|
||||||
m_interpolator.create(16, inputSampleRate, m_settings.m_rfBandwidth / 2.2f);
|
m_interpolator.create(16, inputSampleRate, m_settings.m_rfBandwidth / 2.2f);
|
||||||
m_interpolatorDistanceRemain = 0;
|
m_interpolatorDistanceRemain = 0;
|
||||||
m_interpolatorDistance = (Real) inputSampleRate / (Real) m_settings.m_audioSampleRate;
|
m_interpolatorDistance = (Real) inputSampleRate / (Real) m_audioSampleRate;
|
||||||
m_settingsMutex.unlock();
|
m_settingsMutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,14 +286,13 @@ void AMDemod::applySettings(const AMDemodSettings& settings, bool force)
|
|||||||
<< " force: " << force;
|
<< " force: " << force;
|
||||||
|
|
||||||
if((m_settings.m_rfBandwidth != settings.m_rfBandwidth) ||
|
if((m_settings.m_rfBandwidth != settings.m_rfBandwidth) ||
|
||||||
(m_settings.m_audioSampleRate != settings.m_audioSampleRate) ||
|
|
||||||
(m_settings.m_bandpassEnable != settings.m_bandpassEnable) || force)
|
(m_settings.m_bandpassEnable != settings.m_bandpassEnable) || force)
|
||||||
{
|
{
|
||||||
m_settingsMutex.lock();
|
m_settingsMutex.lock();
|
||||||
m_interpolator.create(16, m_inputSampleRate, settings.m_rfBandwidth / 2.2f);
|
m_interpolator.create(16, m_inputSampleRate, settings.m_rfBandwidth / 2.2f);
|
||||||
m_interpolatorDistanceRemain = 0;
|
m_interpolatorDistanceRemain = 0;
|
||||||
m_interpolatorDistance = (Real) m_inputSampleRate / (Real) settings.m_audioSampleRate;
|
m_interpolatorDistance = (Real) m_inputSampleRate / (Real) m_audioSampleRate;
|
||||||
m_bandpass.create(301, settings.m_audioSampleRate, 300.0, settings.m_rfBandwidth / 2.0f);
|
m_bandpass.create(301, m_audioSampleRate, 300.0, settings.m_rfBandwidth / 2.0f);
|
||||||
m_settingsMutex.unlock();
|
m_settingsMutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -341,9 +374,6 @@ int AMDemod::webapiSettingsPutPatch(
|
|||||||
if (channelSettingsKeys.contains("audioMute")) {
|
if (channelSettingsKeys.contains("audioMute")) {
|
||||||
settings.m_audioMute = response.getAmDemodSettings()->getAudioMute() != 0;
|
settings.m_audioMute = response.getAmDemodSettings()->getAudioMute() != 0;
|
||||||
}
|
}
|
||||||
if (channelSettingsKeys.contains("audioSampleRate")) {
|
|
||||||
settings.m_audioSampleRate = response.getAmDemodSettings()->getAudioSampleRate();
|
|
||||||
}
|
|
||||||
if (channelSettingsKeys.contains("copyAudioToUDP")) {
|
if (channelSettingsKeys.contains("copyAudioToUDP")) {
|
||||||
settings.m_copyAudioToUDP = response.getAmDemodSettings()->getCopyAudioToUdp() != 0;
|
settings.m_copyAudioToUDP = response.getAmDemodSettings()->getCopyAudioToUdp() != 0;
|
||||||
}
|
}
|
||||||
@ -383,7 +413,7 @@ int AMDemod::webapiSettingsPutPatch(
|
|||||||
if (frequencyOffsetChanged)
|
if (frequencyOffsetChanged)
|
||||||
{
|
{
|
||||||
MsgConfigureChannelizer* channelConfigMsg = MsgConfigureChannelizer::create(
|
MsgConfigureChannelizer* channelConfigMsg = MsgConfigureChannelizer::create(
|
||||||
48000, settings.m_inputFrequencyOffset);
|
m_audioSampleRate, settings.m_inputFrequencyOffset);
|
||||||
m_inputMessageQueue.push(channelConfigMsg);
|
m_inputMessageQueue.push(channelConfigMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -415,7 +445,6 @@ int AMDemod::webapiReportGet(
|
|||||||
void AMDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const AMDemodSettings& settings)
|
void AMDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const AMDemodSettings& settings)
|
||||||
{
|
{
|
||||||
response.getAmDemodSettings()->setAudioMute(settings.m_audioMute ? 1 : 0);
|
response.getAmDemodSettings()->setAudioMute(settings.m_audioMute ? 1 : 0);
|
||||||
response.getAmDemodSettings()->setAudioSampleRate(settings.m_audioSampleRate);
|
|
||||||
response.getAmDemodSettings()->setCopyAudioToUdp(settings.m_copyAudioToUDP ? 1 : 0);
|
response.getAmDemodSettings()->setCopyAudioToUdp(settings.m_copyAudioToUDP ? 1 : 0);
|
||||||
response.getAmDemodSettings()->setCopyAudioUseRtp(settings.m_copyAudioUseRTP ? 1 : 0);
|
response.getAmDemodSettings()->setCopyAudioUseRtp(settings.m_copyAudioUseRTP ? 1 : 0);
|
||||||
response.getAmDemodSettings()->setInputFrequencyOffset(settings.m_inputFrequencyOffset);
|
response.getAmDemodSettings()->setInputFrequencyOffset(settings.m_inputFrequencyOffset);
|
||||||
@ -447,5 +476,6 @@ void AMDemod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)
|
|||||||
|
|
||||||
response.getAmDemodReport()->setChannelPowerDb(CalcDb::dbPower(magsqAvg));
|
response.getAmDemodReport()->setChannelPowerDb(CalcDb::dbPower(magsqAvg));
|
||||||
response.getAmDemodReport()->setSquelch(m_squelchOpen ? 1 : 0);
|
response.getAmDemodReport()->setSquelch(m_squelchOpen ? 1 : 0);
|
||||||
|
response.getAmDemodReport()->setAudioSampleRate(m_audioSampleRate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,6 +115,7 @@ public:
|
|||||||
SWGSDRangel::SWGChannelReport& response,
|
SWGSDRangel::SWGChannelReport& response,
|
||||||
QString& errorMessage);
|
QString& errorMessage);
|
||||||
|
|
||||||
|
uint32_t getAudioSampleRate() const { return m_audioSampleRate; }
|
||||||
double getMagSq() const { return m_magsq; }
|
double getMagSq() const { return m_magsq; }
|
||||||
bool getSquelchOpen() const { return m_squelchOpen; }
|
bool getSquelchOpen() const { return m_squelchOpen; }
|
||||||
|
|
||||||
@ -146,6 +147,7 @@ private:
|
|||||||
int m_inputSampleRate;
|
int m_inputSampleRate;
|
||||||
int m_inputFrequencyOffset;
|
int m_inputFrequencyOffset;
|
||||||
AMDemodSettings m_settings;
|
AMDemodSettings m_settings;
|
||||||
|
uint32_t m_audioSampleRate;
|
||||||
bool m_running;
|
bool m_running;
|
||||||
|
|
||||||
NCO m_nco;
|
NCO m_nco;
|
||||||
@ -176,6 +178,7 @@ private:
|
|||||||
|
|
||||||
void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force = false);
|
void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force = false);
|
||||||
void applySettings(const AMDemodSettings& settings, bool force = false);
|
void applySettings(const AMDemodSettings& settings, bool force = false);
|
||||||
|
void applyAudioSampleRate(int sampleRate);
|
||||||
void webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const AMDemodSettings& settings);
|
void webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const AMDemodSettings& settings);
|
||||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||||
|
|
||||||
@ -197,7 +200,7 @@ private:
|
|||||||
|
|
||||||
if (m_magsq >= m_squelchLevel)
|
if (m_magsq >= m_squelchLevel)
|
||||||
{
|
{
|
||||||
if (m_squelchCount <= m_settings.m_audioSampleRate / 10)
|
if (m_squelchCount <= m_audioSampleRate / 10)
|
||||||
{
|
{
|
||||||
m_squelchCount++;
|
m_squelchCount++;
|
||||||
}
|
}
|
||||||
@ -212,7 +215,7 @@ private:
|
|||||||
|
|
||||||
qint16 sample;
|
qint16 sample;
|
||||||
|
|
||||||
if ((m_squelchCount >= m_settings.m_audioSampleRate / 20) && !m_settings.m_audioMute)
|
if ((m_squelchCount >= m_audioSampleRate / 20) && !m_settings.m_audioMute)
|
||||||
{
|
{
|
||||||
Real demod = sqrt(magsq);
|
Real demod = sqrt(magsq);
|
||||||
m_volumeAGC.feed(demod);
|
m_volumeAGC.feed(demod);
|
||||||
@ -224,7 +227,7 @@ private:
|
|||||||
demod /= 301.0f;
|
demod /= 301.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
Real attack = (m_squelchCount - 0.05f * m_settings.m_audioSampleRate) / (0.05f * m_settings.m_audioSampleRate);
|
Real attack = (m_squelchCount - 0.05f * m_audioSampleRate) / (0.05f * m_audioSampleRate);
|
||||||
sample = demod * attack * 2048 * m_settings.m_volume;
|
sample = demod * attack * 2048 * m_settings.m_volume;
|
||||||
if (m_settings.m_copyAudioToUDP) {
|
if (m_settings.m_copyAudioToUDP) {
|
||||||
m_audioNetSink->write(demod * attack * 32768.0f);
|
m_audioNetSink->write(demod * attack * 32768.0f);
|
||||||
|
@ -281,7 +281,7 @@ void AMDemodGUI::applySettings(bool force)
|
|||||||
if (m_doApplySettings)
|
if (m_doApplySettings)
|
||||||
{
|
{
|
||||||
AMDemod::MsgConfigureChannelizer* channelConfigMsg = AMDemod::MsgConfigureChannelizer::create(
|
AMDemod::MsgConfigureChannelizer* channelConfigMsg = AMDemod::MsgConfigureChannelizer::create(
|
||||||
48000, m_channelMarker.getCenterFrequency());
|
m_amDemod->getAudioSampleRate(), m_channelMarker.getCenterFrequency());
|
||||||
m_amDemod->getInputMessageQueue()->push(channelConfigMsg);
|
m_amDemod->getInputMessageQueue()->push(channelConfigMsg);
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,7 +33,6 @@ void AMDemodSettings::resetToDefaults()
|
|||||||
m_rfBandwidth = 5000;
|
m_rfBandwidth = 5000;
|
||||||
m_squelch = -40.0;
|
m_squelch = -40.0;
|
||||||
m_volume = 2.0;
|
m_volume = 2.0;
|
||||||
m_audioSampleRate = DSPEngine::instance()->getDefaultAudioSampleRate();
|
|
||||||
m_audioMute = false;
|
m_audioMute = false;
|
||||||
m_bandpassEnable = false;
|
m_bandpassEnable = false;
|
||||||
m_copyAudioToUDP = false;
|
m_copyAudioToUDP = false;
|
||||||
|
@ -27,7 +27,6 @@ struct AMDemodSettings
|
|||||||
Real m_rfBandwidth;
|
Real m_rfBandwidth;
|
||||||
Real m_squelch;
|
Real m_squelch;
|
||||||
Real m_volume;
|
Real m_volume;
|
||||||
quint32 m_audioSampleRate;
|
|
||||||
bool m_audioMute;
|
bool m_audioMute;
|
||||||
bool m_bandpassEnable;
|
bool m_bandpassEnable;
|
||||||
bool m_copyAudioToUDP;
|
bool m_copyAudioToUDP;
|
||||||
|
@ -17,12 +17,16 @@
|
|||||||
|
|
||||||
#include "audio/audiodevicemanager.h"
|
#include "audio/audiodevicemanager.h"
|
||||||
#include "util/simpleserializer.h"
|
#include "util/simpleserializer.h"
|
||||||
|
#include "util/messagequeue.h"
|
||||||
|
#include "dsp/dspcommands.h"
|
||||||
|
|
||||||
#include <QDataStream>
|
#include <QDataStream>
|
||||||
|
#include <QSet>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
const float AudioDeviceManager::m_defaultAudioInputVolume = 0.15f;
|
const float AudioDeviceManager::m_defaultAudioInputVolume = 0.15f;
|
||||||
const QString AudioDeviceManager::m_defaultUDPAddress = "127.0.0.1";
|
const QString AudioDeviceManager::m_defaultUDPAddress = "127.0.0.1";
|
||||||
|
const QString AudioDeviceManager::m_defaultDeviceName = "System default device";
|
||||||
|
|
||||||
QDataStream& operator<<(QDataStream& ds, const AudioDeviceManager::InputDeviceInfo& info)
|
QDataStream& operator<<(QDataStream& ds, const AudioDeviceManager::InputDeviceInfo& info)
|
||||||
{
|
{
|
||||||
@ -67,7 +71,7 @@ bool AudioDeviceManager::getOutputDeviceName(int outputDeviceIndex, QString &dev
|
|||||||
{
|
{
|
||||||
if (outputDeviceIndex < 0)
|
if (outputDeviceIndex < 0)
|
||||||
{
|
{
|
||||||
deviceName = "System default device";
|
deviceName = m_defaultDeviceName;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -88,7 +92,7 @@ bool AudioDeviceManager::getInputDeviceName(int inputDeviceIndex, QString &devic
|
|||||||
{
|
{
|
||||||
if (inputDeviceIndex < 0)
|
if (inputDeviceIndex < 0)
|
||||||
{
|
{
|
||||||
deviceName = "System default device";
|
deviceName = m_defaultDeviceName;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -212,7 +216,8 @@ void AudioDeviceManager::addAudioSink(AudioFifo* audioFifo, MessageQueue *sample
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_audioSinkFifos[audioFifo] = outputDeviceIndex; // register audio FIFO
|
m_audioSinkFifos[audioFifo] = outputDeviceIndex; // register audio FIFO
|
||||||
m_sampleSinkMessageQueues[audioFifo] = sampleSinkMessageQueue;
|
m_audioFifoToSinkMessageQueues[audioFifo] = sampleSinkMessageQueue;
|
||||||
|
m_outputDeviceSinkMessageQueues[outputDeviceIndex].append(sampleSinkMessageQueue);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioDeviceManager::removeAudioSink(AudioFifo* audioFifo)
|
void AudioDeviceManager::removeAudioSink(AudioFifo* audioFifo)
|
||||||
@ -233,7 +238,8 @@ void AudioDeviceManager::removeAudioSink(AudioFifo* audioFifo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_audioSinkFifos.remove(audioFifo); // unregister audio FIFO
|
m_audioSinkFifos.remove(audioFifo); // unregister audio FIFO
|
||||||
m_sampleSinkMessageQueues.remove(audioFifo);
|
m_outputDeviceSinkMessageQueues[audioOutputDeviceIndex].removeOne(m_audioFifoToSinkMessageQueues[audioFifo]);
|
||||||
|
m_audioFifoToSinkMessageQueues.remove(audioFifo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioDeviceManager::addAudioSource(AudioFifo* audioFifo, MessageQueue *sampleSourceMessageQueue, int inputDeviceIndex)
|
void AudioDeviceManager::addAudioSource(AudioFifo* audioFifo, MessageQueue *sampleSourceMessageQueue, int inputDeviceIndex)
|
||||||
@ -264,7 +270,8 @@ void AudioDeviceManager::addAudioSource(AudioFifo* audioFifo, MessageQueue *samp
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_audioSourceFifos[audioFifo] = inputDeviceIndex; // register audio FIFO
|
m_audioSourceFifos[audioFifo] = inputDeviceIndex; // register audio FIFO
|
||||||
m_sampleSourceMessageQueues[audioFifo] = sampleSourceMessageQueue;
|
m_audioFifoToSourceMessageQueues[audioFifo] = sampleSourceMessageQueue;
|
||||||
|
m_outputDeviceSinkMessageQueues[inputDeviceIndex].append(sampleSourceMessageQueue);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioDeviceManager::removeAudioSource(AudioFifo* audioFifo)
|
void AudioDeviceManager::removeAudioSource(AudioFifo* audioFifo)
|
||||||
@ -285,7 +292,8 @@ void AudioDeviceManager::removeAudioSource(AudioFifo* audioFifo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_audioSourceFifos.remove(audioFifo); // unregister audio FIFO
|
m_audioSourceFifos.remove(audioFifo); // unregister audio FIFO
|
||||||
m_sampleSourceMessageQueues.remove(audioFifo);
|
m_inputDeviceSourceMessageQueues[audioInputDeviceIndex].removeOne(m_audioFifoToSourceMessageQueues[audioFifo]);
|
||||||
|
m_audioFifoToSourceMessageQueues.remove(audioFifo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioDeviceManager::startAudioOutput(int outputDeviceIndex)
|
void AudioDeviceManager::startAudioOutput(int outputDeviceIndex)
|
||||||
@ -373,6 +381,294 @@ void AudioDeviceManager::stopAudioInput(int inputDeviceIndex)
|
|||||||
m_audioInputs[inputDeviceIndex]->stop();
|
m_audioInputs[inputDeviceIndex]->stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AudioDeviceManager::getInputDeviceInfo(const QString& deviceName, InputDeviceInfo& deviceInfo) const
|
||||||
|
{
|
||||||
|
if (m_audioInputInfos.find(deviceName) == m_audioInputInfos.end())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
deviceInfo = m_audioInputInfos[deviceName];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AudioDeviceManager::getOutputDeviceInfo(const QString& deviceName, OutputDeviceInfo& deviceInfo) const
|
||||||
|
{
|
||||||
|
if (m_audioOutputInfos.find(deviceName) == m_audioOutputInfos.end())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
deviceInfo = m_audioOutputInfos[deviceName];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int AudioDeviceManager::getInputSampleRate(int inputDeviceIndex)
|
||||||
|
{
|
||||||
|
QString deviceName;
|
||||||
|
|
||||||
|
if (!getInputDeviceName(inputDeviceIndex, deviceName))
|
||||||
|
{
|
||||||
|
qDebug("AudioDeviceManager::getInputSampleRate: unknown device index %d", inputDeviceIndex);
|
||||||
|
return m_defaultAudioSampleRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
InputDeviceInfo deviceInfo;
|
||||||
|
|
||||||
|
if (!getInputDeviceInfo(deviceName, deviceInfo))
|
||||||
|
{
|
||||||
|
qDebug("AudioDeviceManager::getInputSampleRate: unknown device %s", qPrintable(deviceName));
|
||||||
|
return m_defaultAudioSampleRate;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return deviceInfo.sampleRate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int AudioDeviceManager::getOutputSampleRate(int outputDeviceIndex)
|
||||||
|
{
|
||||||
|
QString deviceName;
|
||||||
|
|
||||||
|
if (!getOutputDeviceName(outputDeviceIndex, deviceName))
|
||||||
|
{
|
||||||
|
qDebug("AudioDeviceManager::getOutputSampleRate: unknown device index %d", outputDeviceIndex);
|
||||||
|
return m_defaultAudioSampleRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
OutputDeviceInfo deviceInfo;
|
||||||
|
|
||||||
|
if (!getOutputDeviceInfo(deviceName, deviceInfo))
|
||||||
|
{
|
||||||
|
qDebug("AudioDeviceManager::getOutputSampleRate: unknown device %s", qPrintable(deviceName));
|
||||||
|
return m_defaultAudioSampleRate;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return deviceInfo.sampleRate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AudioDeviceManager::setInputDeviceInfo(int inputDeviceIndex, const InputDeviceInfo& deviceInfo)
|
||||||
|
{
|
||||||
|
QString deviceName;
|
||||||
|
|
||||||
|
if (!getInputDeviceName(inputDeviceIndex, deviceName))
|
||||||
|
{
|
||||||
|
qWarning("AudioDeviceManager::setInputDeviceInfo: unknown device index %d", inputDeviceIndex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
InputDeviceInfo oldDeviceInfo;
|
||||||
|
|
||||||
|
if (!getInputDeviceInfo(deviceName, oldDeviceInfo))
|
||||||
|
{
|
||||||
|
qDebug("AudioDeviceManager::setInputDeviceInfo: unknown device %s", qPrintable(deviceName));
|
||||||
|
}
|
||||||
|
|
||||||
|
m_audioInputInfos[deviceName] = deviceInfo;
|
||||||
|
|
||||||
|
if (m_audioInputs.find(inputDeviceIndex) == m_audioInputs.end()) { // no FIFO registered yet hence no audio input has been allocated yet
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioInput *audioInput = m_audioInputs[inputDeviceIndex];
|
||||||
|
|
||||||
|
if (oldDeviceInfo.sampleRate != deviceInfo.sampleRate)
|
||||||
|
{
|
||||||
|
audioInput->stop();
|
||||||
|
audioInput->start(inputDeviceIndex, deviceInfo.sampleRate);
|
||||||
|
m_audioInputInfos[deviceName].sampleRate = audioInput->getRate(); // store actual sample rate
|
||||||
|
|
||||||
|
// send message to attached channels
|
||||||
|
QList<MessageQueue *>::const_iterator it = m_inputDeviceSourceMessageQueues[inputDeviceIndex].begin();
|
||||||
|
|
||||||
|
for (; it != m_inputDeviceSourceMessageQueues[inputDeviceIndex].end(); ++it)
|
||||||
|
{
|
||||||
|
DSPConfigureAudio *msg = new DSPConfigureAudio(m_audioInputInfos[deviceName].sampleRate);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
audioInput->setVolume(deviceInfo.volume);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioDeviceManager::setOutputDeviceInfo(int outputDeviceIndex, const OutputDeviceInfo& deviceInfo)
|
||||||
|
{
|
||||||
|
QString deviceName;
|
||||||
|
|
||||||
|
if (!getOutputDeviceName(outputDeviceIndex, deviceName))
|
||||||
|
{
|
||||||
|
qWarning("AudioDeviceManager::setOutputDeviceInfo: unknown device index %d", outputDeviceIndex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OutputDeviceInfo oldDeviceInfo;
|
||||||
|
|
||||||
|
if (!getOutputDeviceInfo(deviceName, oldDeviceInfo))
|
||||||
|
{
|
||||||
|
qDebug("AudioDeviceManager::setOutputDeviceInfo: unknown device %s", qPrintable(deviceName));
|
||||||
|
}
|
||||||
|
|
||||||
|
m_audioOutputInfos[deviceName] = deviceInfo;
|
||||||
|
|
||||||
|
if (m_audioOutputs.find(outputDeviceIndex) == m_audioOutputs.end()) { // no FIFO registered yet hence no audio output has been allocated yet
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioOutput *audioOutput = m_audioOutputs[outputDeviceIndex];
|
||||||
|
|
||||||
|
if (oldDeviceInfo.sampleRate != deviceInfo.sampleRate)
|
||||||
|
{
|
||||||
|
audioOutput->stop();
|
||||||
|
audioOutput->start(outputDeviceIndex, deviceInfo.sampleRate);
|
||||||
|
m_audioOutputInfos[deviceName].sampleRate = audioOutput->getRate(); // store actual sample rate
|
||||||
|
|
||||||
|
// send message to attached channels
|
||||||
|
QList<MessageQueue *>::const_iterator it = m_outputDeviceSinkMessageQueues[outputDeviceIndex].begin();
|
||||||
|
|
||||||
|
for (; it != m_outputDeviceSinkMessageQueues[outputDeviceIndex].end(); ++it)
|
||||||
|
{
|
||||||
|
DSPConfigureAudio *msg = new DSPConfigureAudio(m_audioOutputInfos[deviceName].sampleRate);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
audioOutput->setUdpCopyToUDP(deviceInfo.copyToUDP);
|
||||||
|
audioOutput->setUdpDestination(deviceInfo.udpAddress, deviceInfo.udpPort);
|
||||||
|
audioOutput->setUdpStereo(deviceInfo.udpStereo);
|
||||||
|
audioOutput->setUdpUseRTP(deviceInfo.udpUseRTP);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioDeviceManager::unsetOutputDeviceInfo(int outputDeviceIndex)
|
||||||
|
{
|
||||||
|
QString deviceName;
|
||||||
|
|
||||||
|
if (!getOutputDeviceName(outputDeviceIndex, deviceName))
|
||||||
|
{
|
||||||
|
qWarning("AudioDeviceManager::unsetOutputDeviceInfo: unknown device index %d", outputDeviceIndex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OutputDeviceInfo oldDeviceInfo;
|
||||||
|
|
||||||
|
if (!getOutputDeviceInfo(deviceName, oldDeviceInfo))
|
||||||
|
{
|
||||||
|
qDebug("AudioDeviceManager::unsetOutputDeviceInfo: unregistered device %s", qPrintable(deviceName));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_audioOutputInfos.remove(deviceName);
|
||||||
|
|
||||||
|
if (m_audioOutputs.find(outputDeviceIndex) == m_audioOutputs.end()) { // no FIFO registered yet hence no audio output has been allocated yet
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
stopAudioOutput(outputDeviceIndex);
|
||||||
|
startAudioOutput(outputDeviceIndex);
|
||||||
|
|
||||||
|
if (oldDeviceInfo.sampleRate != m_audioOutputInfos[deviceName].sampleRate)
|
||||||
|
{
|
||||||
|
// send message to attached channels
|
||||||
|
QList<MessageQueue *>::const_iterator it = m_outputDeviceSinkMessageQueues[outputDeviceIndex].begin();
|
||||||
|
|
||||||
|
for (; it != m_outputDeviceSinkMessageQueues[outputDeviceIndex].end(); ++it)
|
||||||
|
{
|
||||||
|
DSPConfigureAudio *msg = new DSPConfigureAudio(m_audioOutputInfos[deviceName].sampleRate);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioDeviceManager::unsetInputDeviceInfo(int inputDeviceIndex)
|
||||||
|
{
|
||||||
|
QString deviceName;
|
||||||
|
|
||||||
|
if (!getInputDeviceName(inputDeviceIndex, deviceName))
|
||||||
|
{
|
||||||
|
qWarning("AudioDeviceManager::unsetInputDeviceInfo: unknown device index %d", inputDeviceIndex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
InputDeviceInfo oldDeviceInfo;
|
||||||
|
|
||||||
|
if (!getInputDeviceInfo(deviceName, oldDeviceInfo))
|
||||||
|
{
|
||||||
|
qDebug("AudioDeviceManager::unsetInputDeviceInfo: unregistered device %s", qPrintable(deviceName));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_audioInputInfos.remove(deviceName);
|
||||||
|
|
||||||
|
if (m_audioInputs.find(inputDeviceIndex) == m_audioInputs.end()) { // no FIFO registered yet hence no audio input has been allocated yet
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
stopAudioInput(inputDeviceIndex);
|
||||||
|
startAudioInput(inputDeviceIndex);
|
||||||
|
|
||||||
|
if (oldDeviceInfo.sampleRate != m_audioInputInfos[deviceName].sampleRate)
|
||||||
|
{
|
||||||
|
// send message to attached channels
|
||||||
|
QList<MessageQueue *>::const_iterator it = m_inputDeviceSourceMessageQueues[inputDeviceIndex].begin();
|
||||||
|
|
||||||
|
for (; it != m_inputDeviceSourceMessageQueues[inputDeviceIndex].end(); ++it)
|
||||||
|
{
|
||||||
|
DSPConfigureAudio *msg = new DSPConfigureAudio(m_audioInputInfos[deviceName].sampleRate);
|
||||||
|
(*it)->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioDeviceManager::inputInfosCleanup()
|
||||||
|
{
|
||||||
|
QSet<QString> deviceNames;
|
||||||
|
deviceNames.insert(m_defaultDeviceName);
|
||||||
|
QList<QAudioDeviceInfo>::const_iterator itd = m_inputDevicesInfo.begin();
|
||||||
|
|
||||||
|
for (; itd != m_inputDevicesInfo.end(); ++itd) {
|
||||||
|
deviceNames.insert(itd->deviceName());
|
||||||
|
}
|
||||||
|
|
||||||
|
QMap<QString, InputDeviceInfo>::iterator itm = m_audioInputInfos.begin();
|
||||||
|
|
||||||
|
for (; itm != m_audioInputInfos.end(); ++itm)
|
||||||
|
{
|
||||||
|
if (!deviceNames.contains(itm.key()))
|
||||||
|
{
|
||||||
|
qDebug("AudioDeviceManager::inputInfosCleanup: removing key: %s", qPrintable(itm.key()));
|
||||||
|
m_audioInputInfos.remove(itm.key());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioDeviceManager::outputInfosCleanup()
|
||||||
|
{
|
||||||
|
QSet<QString> deviceNames;
|
||||||
|
deviceNames.insert(m_defaultDeviceName);
|
||||||
|
QList<QAudioDeviceInfo>::const_iterator itd = m_outputDevicesInfo.begin();
|
||||||
|
|
||||||
|
for (; itd != m_outputDevicesInfo.end(); ++itd) {
|
||||||
|
deviceNames.insert(itd->deviceName());
|
||||||
|
}
|
||||||
|
|
||||||
|
QMap<QString, OutputDeviceInfo>::iterator itm = m_audioOutputInfos.begin();
|
||||||
|
|
||||||
|
for (; itm != m_audioOutputInfos.end(); ++itm)
|
||||||
|
{
|
||||||
|
if (!deviceNames.contains(itm.key()))
|
||||||
|
{
|
||||||
|
qDebug("AudioDeviceManager::outputInfosCleanup: removing key: %s", qPrintable(itm.key()));
|
||||||
|
m_audioOutputInfos.remove(itm.key());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AudioDeviceManager::debugAudioInputInfos() const
|
void AudioDeviceManager::debugAudioInputInfos() const
|
||||||
{
|
{
|
||||||
QMap<QString, InputDeviceInfo>::const_iterator it = m_audioInputInfos.begin();
|
QMap<QString, InputDeviceInfo>::const_iterator it = m_audioInputInfos.begin();
|
||||||
|
@ -40,6 +40,10 @@ public:
|
|||||||
sampleRate(m_defaultAudioSampleRate),
|
sampleRate(m_defaultAudioSampleRate),
|
||||||
volume(m_defaultAudioInputVolume)
|
volume(m_defaultAudioInputVolume)
|
||||||
{}
|
{}
|
||||||
|
void resetToDefaults() {
|
||||||
|
sampleRate = m_defaultAudioSampleRate;
|
||||||
|
volume = m_defaultAudioInputVolume;
|
||||||
|
}
|
||||||
unsigned int sampleRate;
|
unsigned int sampleRate;
|
||||||
float volume;
|
float volume;
|
||||||
friend QDataStream& operator<<(QDataStream& ds, const InputDeviceInfo& info);
|
friend QDataStream& operator<<(QDataStream& ds, const InputDeviceInfo& info);
|
||||||
@ -57,6 +61,14 @@ public:
|
|||||||
udpStereo(false),
|
udpStereo(false),
|
||||||
udpUseRTP(false)
|
udpUseRTP(false)
|
||||||
{}
|
{}
|
||||||
|
void resetToDefaults() {
|
||||||
|
sampleRate = m_defaultAudioSampleRate;
|
||||||
|
udpAddress = m_defaultUDPAddress;
|
||||||
|
udpPort = m_defaultUDPPort;
|
||||||
|
copyToUDP = false;
|
||||||
|
udpStereo = false;
|
||||||
|
udpUseRTP = false;
|
||||||
|
}
|
||||||
unsigned int sampleRate;
|
unsigned int sampleRate;
|
||||||
QString udpAddress;
|
QString udpAddress;
|
||||||
quint16 udpPort;
|
quint16 udpPort;
|
||||||
@ -70,12 +82,11 @@ public:
|
|||||||
AudioDeviceManager();
|
AudioDeviceManager();
|
||||||
~AudioDeviceManager();
|
~AudioDeviceManager();
|
||||||
|
|
||||||
|
|
||||||
const QList<QAudioDeviceInfo>& getInputDevices() const { return m_inputDevicesInfo; }
|
const QList<QAudioDeviceInfo>& getInputDevices() const { return m_inputDevicesInfo; }
|
||||||
const QList<QAudioDeviceInfo>& getOutputDevices() const { return m_outputDevicesInfo; }
|
const QList<QAudioDeviceInfo>& getOutputDevices() const { return m_outputDevicesInfo; }
|
||||||
|
|
||||||
bool getOutputDeviceName(int outputDeviceIndex, QString &deviceName) const;
|
bool getOutputDeviceName(int outputDeviceIndex, QString &deviceName) const;
|
||||||
bool getInputDeviceName(int outputDeviceIndex, QString &deviceName) const;
|
bool getInputDeviceName(int inputDeviceIndex, QString &deviceName) const;
|
||||||
|
|
||||||
void addAudioSink(AudioFifo* audioFifo, MessageQueue *sampleSinkMessageQueue, 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 removeAudioSink(AudioFifo* audioFifo); //!< Remove the audio sink
|
||||||
@ -83,22 +94,36 @@ public:
|
|||||||
void addAudioSource(AudioFifo* audioFifo, MessageQueue *sampleSourceMessageQueue, 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
|
void removeAudioSource(AudioFifo* audioFifo); //!< Remove an audio source
|
||||||
|
|
||||||
|
bool getInputDeviceInfo(const QString& deviceName, InputDeviceInfo& deviceInfo) const;
|
||||||
|
bool getOutputDeviceInfo(const QString& deviceName, OutputDeviceInfo& deviceInfo) const;
|
||||||
|
int getInputSampleRate(int inputDeviceIndex = -1);
|
||||||
|
int getOutputSampleRate(int outputDeviceIndex = -1);
|
||||||
|
void setInputDeviceInfo(int inputDeviceIndex, const InputDeviceInfo& deviceInfo);
|
||||||
|
void setOutputDeviceInfo(int outputDeviceIndex, const OutputDeviceInfo& deviceInfo);
|
||||||
|
void unsetInputDeviceInfo(int inputDeviceIndex);
|
||||||
|
void unsetOutputDeviceInfo(int outputDeviceIndex);
|
||||||
|
void inputInfosCleanup(); //!< Remove input info from map for input devices not present
|
||||||
|
void outputInfosCleanup(); //!< Remove output info from map for output devices not present
|
||||||
|
|
||||||
static const unsigned int m_defaultAudioSampleRate = 48000;
|
static const unsigned int m_defaultAudioSampleRate = 48000;
|
||||||
static const float m_defaultAudioInputVolume;
|
static const float m_defaultAudioInputVolume;
|
||||||
static const QString m_defaultUDPAddress;
|
static const QString m_defaultUDPAddress;
|
||||||
static const quint16 m_defaultUDPPort = 9998;
|
static const quint16 m_defaultUDPPort = 9998;
|
||||||
|
static const QString m_defaultDeviceName;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList<QAudioDeviceInfo> m_inputDevicesInfo;
|
QList<QAudioDeviceInfo> m_inputDevicesInfo;
|
||||||
QList<QAudioDeviceInfo> m_outputDevicesInfo;
|
QList<QAudioDeviceInfo> m_outputDevicesInfo;
|
||||||
|
|
||||||
QMap<AudioFifo*, int> m_audioSinkFifos; //< audio sink FIFO to audio output device index-1 map
|
QMap<AudioFifo*, int> m_audioSinkFifos; //< audio sink FIFO to audio output device index-1 map
|
||||||
QMap<AudioFifo*, MessageQueue*> m_sampleSinkMessageQueues; //!< audio sink FIFO to attached sink message queue
|
QMap<AudioFifo*, MessageQueue*> m_audioFifoToSinkMessageQueues; //!< audio sink FIFO to attached sink message queue
|
||||||
|
QMap<int, QList<MessageQueue*> > m_outputDeviceSinkMessageQueues; //!< sink message queues attached to device
|
||||||
QMap<int, AudioOutput*> m_audioOutputs; //!< audio device index to audio output map (index -1 is default device)
|
QMap<int, AudioOutput*> m_audioOutputs; //!< audio device index to audio output map (index -1 is default device)
|
||||||
QMap<QString, OutputDeviceInfo> m_audioOutputInfos; //!< audio device name to audio output info
|
QMap<QString, OutputDeviceInfo> m_audioOutputInfos; //!< audio device name to audio output info
|
||||||
|
|
||||||
QMap<AudioFifo*, int> m_audioSourceFifos; //< audio source FIFO to audio input device index-1 map
|
QMap<AudioFifo*, int> m_audioSourceFifos; //< audio source FIFO to audio input device index-1 map
|
||||||
QMap<AudioFifo*, MessageQueue*> m_sampleSourceMessageQueues; //!< audio source FIFO to attached source message queue
|
QMap<AudioFifo*, MessageQueue*> m_audioFifoToSourceMessageQueues; //!< audio source FIFO to attached source message queue
|
||||||
|
QMap<int, QList<MessageQueue*> > m_inputDeviceSourceMessageQueues; //!< sink message queues attached to device
|
||||||
QMap<int, AudioInput*> m_audioInputs; //!< audio device index to audio input map (index -1 is default device)
|
QMap<int, AudioInput*> m_audioInputs; //!< audio device index to audio input map (index -1 is default device)
|
||||||
QMap<QString, InputDeviceInfo> m_audioInputInfos; //!< audio device name to audio input device info
|
QMap<QString, InputDeviceInfo> m_audioInputInfos; //!< audio device name to audio input device info
|
||||||
|
|
||||||
|
@ -46,3 +46,4 @@ MESSAGE_CLASS_DEFINITION(DSPEngineReport, Message)
|
|||||||
MESSAGE_CLASS_DEFINITION(DSPConfigureScopeVis, Message)
|
MESSAGE_CLASS_DEFINITION(DSPConfigureScopeVis, Message)
|
||||||
MESSAGE_CLASS_DEFINITION(DSPSignalNotification, Message)
|
MESSAGE_CLASS_DEFINITION(DSPSignalNotification, Message)
|
||||||
MESSAGE_CLASS_DEFINITION(DSPConfigureChannelizer, Message)
|
MESSAGE_CLASS_DEFINITION(DSPConfigureChannelizer, Message)
|
||||||
|
MESSAGE_CLASS_DEFINITION(DSPConfigureAudio, Message)
|
||||||
|
@ -371,4 +371,17 @@ private:
|
|||||||
int m_centerFrequency;
|
int m_centerFrequency;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SDRBASE_API DSPConfigureAudio : public Message {
|
||||||
|
MESSAGE_CLASS_DECLARATION
|
||||||
|
|
||||||
|
public:
|
||||||
|
DSPConfigureAudio(int sampleRate) : m_sampleRate(sampleRate)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
int getSampleRate() const { return m_sampleRate; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_sampleRate;
|
||||||
|
};
|
||||||
|
|
||||||
#endif // INCLUDE_DSPCOMMANDS_H
|
#endif // INCLUDE_DSPCOMMANDS_H
|
||||||
|
@ -18,11 +18,11 @@
|
|||||||
#ifndef INCLUDE_DSPENGINE_H
|
#ifndef INCLUDE_DSPENGINE_H
|
||||||
#define INCLUDE_DSPENGINE_H
|
#define INCLUDE_DSPENGINE_H
|
||||||
|
|
||||||
#include <audio/audiodevicemanager.h>
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "audio/audiodevicemanager.h"
|
||||||
#include "audio/audiooutput.h"
|
#include "audio/audiooutput.h"
|
||||||
#include "audio/audioinput.h"
|
#include "audio/audioinput.h"
|
||||||
#include "export.h"
|
#include "export.h"
|
||||||
|
@ -706,6 +706,9 @@ margin-bottom: 20px;
|
|||||||
"squelch" : {
|
"squelch" : {
|
||||||
"type" : "integer",
|
"type" : "integer",
|
||||||
"description" : "squelch status (1 if open else 0)"
|
"description" : "squelch status (1 if open else 0)"
|
||||||
|
},
|
||||||
|
"audioSampleRate" : {
|
||||||
|
"type" : "integer"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description" : "AMDemod"
|
"description" : "AMDemod"
|
||||||
@ -731,9 +734,6 @@ margin-bottom: 20px;
|
|||||||
"type" : "number",
|
"type" : "number",
|
||||||
"format" : "float"
|
"format" : "float"
|
||||||
},
|
},
|
||||||
"audioSampleRate" : {
|
|
||||||
"type" : "integer"
|
|
||||||
},
|
|
||||||
"audioMute" : {
|
"audioMute" : {
|
||||||
"type" : "integer"
|
"type" : "integer"
|
||||||
},
|
},
|
||||||
@ -18063,7 +18063,7 @@ except ApiException as e:
|
|||||||
</div>
|
</div>
|
||||||
<div id="generator">
|
<div id="generator">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
Generated 2018-03-22T05:08:39.552+01:00
|
Generated 2018-03-26T10:23:40.336+02:00
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -16,8 +16,6 @@ AMDemodSettings:
|
|||||||
volume:
|
volume:
|
||||||
type: number
|
type: number
|
||||||
format: float
|
format: float
|
||||||
audioSampleRate:
|
|
||||||
type: integer
|
|
||||||
audioMute:
|
audioMute:
|
||||||
type: integer
|
type: integer
|
||||||
bandpassEnable:
|
bandpassEnable:
|
||||||
@ -46,3 +44,6 @@ AMDemodReport:
|
|||||||
squelch:
|
squelch:
|
||||||
description: squelch status (1 if open else 0)
|
description: squelch status (1 if open else 0)
|
||||||
type: integer
|
type: integer
|
||||||
|
audioSampleRate:
|
||||||
|
type: integer
|
||||||
|
|
@ -11,66 +11,44 @@ AudioDialogX::AudioDialogX(AudioDeviceManager* audioDeviceManager, QWidget* pare
|
|||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
QTreeWidgetItem* treeItem;
|
QTreeWidgetItem* treeItem;
|
||||||
int i;
|
|
||||||
|
|
||||||
// out panel
|
// out panel
|
||||||
|
|
||||||
QAudioDeviceInfo defaultOutputDeviceInfo = QAudioDeviceInfo::defaultOutputDevice();
|
QAudioDeviceInfo defaultOutputDeviceInfo = QAudioDeviceInfo::defaultOutputDevice();
|
||||||
treeItem = new QTreeWidgetItem(ui->audioOutTree);
|
treeItem = new QTreeWidgetItem(ui->audioOutTree);
|
||||||
treeItem->setText(0, tr("System default output device"));
|
treeItem->setText(0, AudioDeviceManager::m_defaultDeviceName);
|
||||||
|
ui->audioOutTree->setCurrentItem(treeItem);
|
||||||
|
|
||||||
const QList<QAudioDeviceInfo>& outputDevices = m_audioDeviceManager->getOutputDevices();
|
const QList<QAudioDeviceInfo>& outputDevices = m_audioDeviceManager->getOutputDevices();
|
||||||
i = 0;
|
|
||||||
|
|
||||||
for(QList<QAudioDeviceInfo>::const_iterator it = outputDevices.begin(); it != outputDevices.end(); ++it)
|
for(QList<QAudioDeviceInfo>::const_iterator it = outputDevices.begin(); it != outputDevices.end(); ++it)
|
||||||
{
|
{
|
||||||
bool isDefaultDevice = it->deviceName() == defaultOutputDeviceInfo.deviceName();
|
bool isDefaultDevice = it->deviceName() == defaultOutputDeviceInfo.deviceName();
|
||||||
treeItem = new QTreeWidgetItem(ui->audioOutTree);
|
treeItem = new QTreeWidgetItem(ui->audioOutTree);
|
||||||
treeItem->setText(0, it->deviceName() + (isDefaultDevice ? "(*)" : ""));
|
treeItem->setText(0, it->deviceName() + (isDefaultDevice ? "(*)" : ""));
|
||||||
|
|
||||||
if (i == 0)
|
|
||||||
{
|
|
||||||
ui->audioOutTree->setCurrentItem(treeItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// in panel
|
// in panel
|
||||||
|
|
||||||
QAudioDeviceInfo defaultInputDeviceInfo = QAudioDeviceInfo::defaultInputDevice();
|
QAudioDeviceInfo defaultInputDeviceInfo = QAudioDeviceInfo::defaultInputDevice();
|
||||||
treeItem = new QTreeWidgetItem(ui->audioInTree);
|
treeItem = new QTreeWidgetItem(ui->audioInTree);
|
||||||
treeItem->setText(0, tr("System default input device"));
|
treeItem->setText(0, AudioDeviceManager::m_defaultDeviceName);
|
||||||
|
ui->audioInTree->setCurrentItem(treeItem);
|
||||||
|
|
||||||
const QList<QAudioDeviceInfo>& inputDevices = m_audioDeviceManager->getInputDevices();
|
const QList<QAudioDeviceInfo>& inputDevices = m_audioDeviceManager->getInputDevices();
|
||||||
i = 0;
|
|
||||||
|
|
||||||
for(QList<QAudioDeviceInfo>::const_iterator it = inputDevices.begin(); it != inputDevices.end(); ++it)
|
for(QList<QAudioDeviceInfo>::const_iterator it = inputDevices.begin(); it != inputDevices.end(); ++it)
|
||||||
{
|
{
|
||||||
bool isDefaultDevice = it->deviceName() == defaultInputDeviceInfo.deviceName();
|
bool isDefaultDevice = it->deviceName() == defaultInputDeviceInfo.deviceName();
|
||||||
treeItem = new QTreeWidgetItem(ui->audioInTree);
|
treeItem = new QTreeWidgetItem(ui->audioInTree);
|
||||||
treeItem->setText(0, it->deviceName() + (isDefaultDevice ? "(*)" : ""));
|
treeItem->setText(0, it->deviceName() + (isDefaultDevice ? "(*)" : ""));
|
||||||
|
|
||||||
if (i == 0)
|
|
||||||
{
|
|
||||||
ui->audioInTree->setCurrentItem(treeItem);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
i++;
|
m_outputUDPPort = 9998;
|
||||||
}
|
m_outIndex = -1;
|
||||||
|
m_inIndex = -1;
|
||||||
if(ui->audioOutTree->currentItem() == 0) {
|
|
||||||
ui->audioOutTree->setCurrentItem(ui->audioOutTree->topLevelItem(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(ui->audioInTree->currentItem() == 0) {
|
|
||||||
ui->audioInTree->setCurrentItem(ui->audioInTree->topLevelItem(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
ui->tabWidget->setCurrentIndex(0);
|
ui->tabWidget->setCurrentIndex(0);
|
||||||
|
|
||||||
ui->inputVolume->setValue((int) (m_inputVolume * 100.0f));
|
|
||||||
ui->inputVolumeText->setText(QString("%1").arg(m_inputVolume, 0, 'f', 2));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioDialogX::~AudioDialogX()
|
AudioDialogX::~AudioDialogX()
|
||||||
@ -80,11 +58,152 @@ AudioDialogX::~AudioDialogX()
|
|||||||
|
|
||||||
void AudioDialogX::accept()
|
void AudioDialogX::accept()
|
||||||
{
|
{
|
||||||
|
m_inIndex = ui->audioInTree->indexOfTopLevelItem(ui->audioInTree->currentItem());
|
||||||
|
m_outIndex = ui->audioOutTree->indexOfTopLevelItem(ui->audioOutTree->currentItem());
|
||||||
|
|
||||||
|
if (ui->tabWidget->currentIndex() == 0) // output
|
||||||
|
{
|
||||||
|
updateOutputDeviceInfo();
|
||||||
|
|
||||||
|
if (ui->outputResetKey->isChecked()) {
|
||||||
|
m_audioDeviceManager->unsetOutputDeviceInfo(m_outIndex-1);
|
||||||
|
} else {
|
||||||
|
m_audioDeviceManager->setOutputDeviceInfo(m_outIndex-1, m_outputDeviceInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ui->tabWidget->currentIndex() == 1) // input
|
||||||
|
{
|
||||||
|
updateInputDeviceInfo();
|
||||||
|
|
||||||
|
if (ui->inputResetKey->isChecked()) {
|
||||||
|
m_audioDeviceManager->unsetInputDeviceInfo(m_inIndex-1);
|
||||||
|
} else {
|
||||||
|
m_audioDeviceManager->setInputDeviceInfo(m_inIndex-1, m_inputDeviceInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QDialog::accept();
|
QDialog::accept();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioDialogX::reject()
|
||||||
|
{
|
||||||
|
QDialog::reject();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioDialogX::on_audioInTree_currentItemChanged(
|
||||||
|
QTreeWidgetItem* currentItem,
|
||||||
|
QTreeWidgetItem* previousItem)
|
||||||
|
{
|
||||||
|
AudioDeviceManager::InputDeviceInfo inDeviceInfo;
|
||||||
|
QString inDeviceName = currentItem->text(0);
|
||||||
|
int newIndex = ui->audioInTree->indexOfTopLevelItem(currentItem);
|
||||||
|
int oldIndex = ui->audioInTree->indexOfTopLevelItem(previousItem);
|
||||||
|
//qDebug("AudioDialogX::on_audioInTree_currentItemChanged: %s", qPrintable(inDeviceName));
|
||||||
|
|
||||||
|
if (newIndex != oldIndex) {
|
||||||
|
ui->inputResetKey->setChecked(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool found = m_audioDeviceManager->getInputDeviceInfo(inDeviceName, inDeviceInfo);
|
||||||
|
m_inputDeviceInfo = inDeviceInfo;
|
||||||
|
ui->inputDefaultText->setText(found ? "" : "D");
|
||||||
|
|
||||||
|
updateInputDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioDialogX::on_audioOutTree_currentItemChanged(
|
||||||
|
QTreeWidgetItem* currentItem,
|
||||||
|
QTreeWidgetItem* previousItem)
|
||||||
|
{
|
||||||
|
AudioDeviceManager::OutputDeviceInfo outDeviceInfo;
|
||||||
|
QString outDeviceName = currentItem->text(0);
|
||||||
|
int newIndex = ui->audioOutTree->indexOfTopLevelItem(currentItem);
|
||||||
|
int oldIndex = ui->audioOutTree->indexOfTopLevelItem(previousItem);
|
||||||
|
|
||||||
|
if (newIndex != oldIndex) {
|
||||||
|
ui->outputResetKey->setChecked(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool found = m_audioDeviceManager->getOutputDeviceInfo(outDeviceName, outDeviceInfo);
|
||||||
|
m_outputDeviceInfo = outDeviceInfo;
|
||||||
|
ui->outputDefaultText->setText(found ? "" : "D");
|
||||||
|
|
||||||
|
updateOutputDisplay();
|
||||||
|
|
||||||
|
//qDebug("AudioDialogX::on_audioOutTree_currentItemChanged: %d:%s", outIndex, qPrintable(outDeviceName));
|
||||||
|
}
|
||||||
|
|
||||||
void AudioDialogX::on_inputVolume_valueChanged(int value)
|
void AudioDialogX::on_inputVolume_valueChanged(int value)
|
||||||
{
|
{
|
||||||
m_inputVolume = (float) value / 100.0f;
|
float volume = value / 100.0f;
|
||||||
ui->inputVolumeText->setText(QString("%1").arg(m_inputVolume, 0, 'f', 2));
|
ui->inputVolumeText->setText(QString("%1").arg(volume, 0, 'f', 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioDialogX::on_inputReset_clicked(bool checked __attribute__((unused)))
|
||||||
|
{
|
||||||
|
m_inputDeviceInfo.resetToDefaults();
|
||||||
|
updateInputDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioDialogX::on_inputCleanup_clicked(bool checked __attribute__((unused)))
|
||||||
|
{
|
||||||
|
m_audioDeviceManager->inputInfosCleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioDialogX::updateInputDisplay()
|
||||||
|
{
|
||||||
|
ui->inputSampleRate->setValue(m_inputDeviceInfo.sampleRate);
|
||||||
|
ui->inputVolume->setValue(roundf(m_inputDeviceInfo.volume * 100.0f));
|
||||||
|
ui->inputVolumeText->setText(QString("%1").arg(m_inputDeviceInfo.volume, 0, 'f', 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioDialogX::updateInputDeviceInfo()
|
||||||
|
{
|
||||||
|
m_inputDeviceInfo.sampleRate = ui->inputSampleRate->value();
|
||||||
|
m_inputDeviceInfo.volume = ui->inputVolume->value() / 100.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioDialogX::on_outputUDPPort_editingFinished()
|
||||||
|
{
|
||||||
|
bool ok;
|
||||||
|
quint16 udpPort = ui->outputUDPPort->text().toInt(&ok);
|
||||||
|
|
||||||
|
if((!ok) || (udpPort < 1024)) {
|
||||||
|
udpPort = 9999;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_outputUDPPort = udpPort;
|
||||||
|
ui->outputUDPPort->setText(tr("%1").arg(m_outputDeviceInfo.udpPort));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioDialogX::on_outputReset_clicked(bool checked __attribute__((unused)))
|
||||||
|
{
|
||||||
|
m_outputDeviceInfo.resetToDefaults();
|
||||||
|
updateOutputDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioDialogX::on_outputCleanup_clicked(bool checked __attribute__((unused)))
|
||||||
|
{
|
||||||
|
m_audioDeviceManager->outputInfosCleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioDialogX::updateOutputDisplay()
|
||||||
|
{
|
||||||
|
ui->outputSampleRate->setValue(m_outputDeviceInfo.sampleRate);
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioDialogX::updateOutputDeviceInfo()
|
||||||
|
{
|
||||||
|
m_outputDeviceInfo.sampleRate = ui->outputSampleRate->value();
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -4,8 +4,9 @@
|
|||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
|
|
||||||
#include "export.h"
|
#include "export.h"
|
||||||
|
#include "audio/audiodevicemanager.h"
|
||||||
|
|
||||||
class AudioDeviceManager;
|
class QTreeWidgetItem;
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class AudioDialog;
|
class AudioDialog;
|
||||||
@ -18,15 +19,33 @@ public:
|
|||||||
explicit AudioDialogX(AudioDeviceManager* audioDeviceManager, QWidget* parent = 0);
|
explicit AudioDialogX(AudioDeviceManager* audioDeviceManager, QWidget* parent = 0);
|
||||||
~AudioDialogX();
|
~AudioDialogX();
|
||||||
|
|
||||||
|
int m_inIndex;
|
||||||
|
int m_outIndex;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void updateInputDisplay();
|
||||||
|
void updateOutputDisplay();
|
||||||
|
void updateInputDeviceInfo();
|
||||||
|
void updateOutputDeviceInfo();
|
||||||
|
|
||||||
Ui::AudioDialog* ui;
|
Ui::AudioDialog* ui;
|
||||||
|
|
||||||
AudioDeviceManager* m_audioDeviceManager;
|
AudioDeviceManager* m_audioDeviceManager;
|
||||||
float m_inputVolume;
|
AudioDeviceManager::InputDeviceInfo m_inputDeviceInfo;
|
||||||
|
AudioDeviceManager::OutputDeviceInfo m_outputDeviceInfo;
|
||||||
|
quint16 m_outputUDPPort;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void accept();
|
void accept();
|
||||||
|
void reject();
|
||||||
|
void on_audioInTree_currentItemChanged(QTreeWidgetItem* currentItem, QTreeWidgetItem* previousItem);
|
||||||
|
void on_audioOutTree_currentItemChanged(QTreeWidgetItem* currentItem, QTreeWidgetItem* previousItem);
|
||||||
void on_inputVolume_valueChanged(int value);
|
void on_inputVolume_valueChanged(int value);
|
||||||
|
void on_inputReset_clicked(bool checked);
|
||||||
|
void on_inputCleanup_clicked(bool checked);
|
||||||
|
void on_outputUDPPort_editingFinished();
|
||||||
|
void on_outputReset_clicked(bool checked);
|
||||||
|
void on_outputCleanup_clicked(bool checked);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INCLUDE_AUDIODIALOG_H
|
#endif // INCLUDE_AUDIODIALOG_H
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>400</width>
|
<width>400</width>
|
||||||
<height>300</height>
|
<height>349</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="font">
|
<property name="font">
|
||||||
@ -69,7 +69,7 @@
|
|||||||
<number>192000</number>
|
<number>192000</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="singleStep">
|
<property name="singleStep">
|
||||||
<number>50</number>
|
<number>1000</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<number>48000</number>
|
<number>48000</number>
|
||||||
@ -89,6 +89,22 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="outputDefaultText">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>16</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Default values indicator</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>D</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="outputReset">
|
<widget class="QPushButton" name="outputReset">
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
@ -108,16 +124,16 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="udpLayout">
|
<layout class="QHBoxLayout" name="outputUDPLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="udpAddressLabel">
|
<widget class="QLabel" name="outputUDPAddressLabel">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Addr</string>
|
<string>Addr</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLineEdit" name="udpAddress">
|
<widget class="QLineEdit" name="outputUDPAddress">
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>140</width>
|
<width>140</width>
|
||||||
@ -136,14 +152,14 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="udpPortLabel">
|
<widget class="QLabel" name="outputUDPPortLabel">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Port</string>
|
<string>Port</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLineEdit" name="udpPort">
|
<widget class="QLineEdit" name="outputUDPPort">
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>60</width>
|
<width>60</width>
|
||||||
@ -178,7 +194,7 @@
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="ButtonSwitch" name="udpCopy">
|
<widget class="ButtonSwitch" name="outputUDPCopy">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Copy audio to UDP</string>
|
<string>Copy audio to UDP</string>
|
||||||
</property>
|
</property>
|
||||||
@ -188,7 +204,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="udpStereo">
|
<widget class="QCheckBox" name="outputUDPStereo">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Copy to UDP as stereo (no L+R mix)</string>
|
<string>Copy to UDP as stereo (no L+R mix)</string>
|
||||||
</property>
|
</property>
|
||||||
@ -198,7 +214,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="udpUseRTP">
|
<widget class="QCheckBox" name="outputUDPUseRTP">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Use RTP protocol</string>
|
<string>Use RTP protocol</string>
|
||||||
</property>
|
</property>
|
||||||
@ -209,6 +225,51 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="outputGeneralLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="outputCleanup">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Remove references to devices not listed</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../resources/res.qrc">
|
||||||
|
<normaloff>:/recycle.png</normaloff>:/recycle.png</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="ButtonSwitch" name="outputResetKey">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Remove settings for this device and return to defaults</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../resources/res.qrc">
|
||||||
|
<normaloff>:/bin.png</normaloff>:/bin.png</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_4">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="tabInput">
|
<widget class="QWidget" name="tabInput">
|
||||||
@ -255,7 +316,7 @@
|
|||||||
<number>192000</number>
|
<number>192000</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="singleStep">
|
<property name="singleStep">
|
||||||
<number>50</number>
|
<number>1000</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<number>48000</number>
|
<number>48000</number>
|
||||||
@ -326,6 +387,22 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="inputDefaultText">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>16</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Default values indicator</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>D</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="inputReset">
|
<widget class="QPushButton" name="inputReset">
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
@ -344,6 +421,51 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="inputGeneralLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="inputCleanup">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Remove references to devices not listed</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../resources/res.qrc">
|
||||||
|
<normaloff>:/recycle.png</normaloff>:/recycle.png</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="ButtonSwitch" name="inputResetKey">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Remove settings for this device and return to defaults</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../resources/res.qrc">
|
||||||
|
<normaloff>:/bin.png</normaloff>:/bin.png</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_5">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
@ -372,7 +494,9 @@
|
|||||||
<tabstop>tabWidget</tabstop>
|
<tabstop>tabWidget</tabstop>
|
||||||
<tabstop>audioOutTree</tabstop>
|
<tabstop>audioOutTree</tabstop>
|
||||||
</tabstops>
|
</tabstops>
|
||||||
<resources/>
|
<resources>
|
||||||
|
<include location="../resources/res.qrc"/>
|
||||||
|
</resources>
|
||||||
<connections>
|
<connections>
|
||||||
<connection>
|
<connection>
|
||||||
<sender>buttonBox</sender>
|
<sender>buttonBox</sender>
|
||||||
|
@ -16,8 +16,6 @@ AMDemodSettings:
|
|||||||
volume:
|
volume:
|
||||||
type: number
|
type: number
|
||||||
format: float
|
format: float
|
||||||
audioSampleRate:
|
|
||||||
type: integer
|
|
||||||
audioMute:
|
audioMute:
|
||||||
type: integer
|
type: integer
|
||||||
bandpassEnable:
|
bandpassEnable:
|
||||||
@ -46,3 +44,6 @@ AMDemodReport:
|
|||||||
squelch:
|
squelch:
|
||||||
description: squelch status (1 if open else 0)
|
description: squelch status (1 if open else 0)
|
||||||
type: integer
|
type: integer
|
||||||
|
audioSampleRate:
|
||||||
|
type: integer
|
||||||
|
|
@ -706,6 +706,9 @@ margin-bottom: 20px;
|
|||||||
"squelch" : {
|
"squelch" : {
|
||||||
"type" : "integer",
|
"type" : "integer",
|
||||||
"description" : "squelch status (1 if open else 0)"
|
"description" : "squelch status (1 if open else 0)"
|
||||||
|
},
|
||||||
|
"audioSampleRate" : {
|
||||||
|
"type" : "integer"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description" : "AMDemod"
|
"description" : "AMDemod"
|
||||||
@ -731,9 +734,6 @@ margin-bottom: 20px;
|
|||||||
"type" : "number",
|
"type" : "number",
|
||||||
"format" : "float"
|
"format" : "float"
|
||||||
},
|
},
|
||||||
"audioSampleRate" : {
|
|
||||||
"type" : "integer"
|
|
||||||
},
|
|
||||||
"audioMute" : {
|
"audioMute" : {
|
||||||
"type" : "integer"
|
"type" : "integer"
|
||||||
},
|
},
|
||||||
@ -18063,7 +18063,7 @@ except ApiException as e:
|
|||||||
</div>
|
</div>
|
||||||
<div id="generator">
|
<div id="generator">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
Generated 2018-03-22T05:08:39.552+01:00
|
Generated 2018-03-26T10:23:40.336+02:00
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -32,6 +32,8 @@ SWGAMDemodReport::SWGAMDemodReport() {
|
|||||||
m_channel_power_db_isSet = false;
|
m_channel_power_db_isSet = false;
|
||||||
squelch = 0;
|
squelch = 0;
|
||||||
m_squelch_isSet = false;
|
m_squelch_isSet = false;
|
||||||
|
audio_sample_rate = 0;
|
||||||
|
m_audio_sample_rate_isSet = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
SWGAMDemodReport::~SWGAMDemodReport() {
|
SWGAMDemodReport::~SWGAMDemodReport() {
|
||||||
@ -44,12 +46,15 @@ SWGAMDemodReport::init() {
|
|||||||
m_channel_power_db_isSet = false;
|
m_channel_power_db_isSet = false;
|
||||||
squelch = 0;
|
squelch = 0;
|
||||||
m_squelch_isSet = false;
|
m_squelch_isSet = false;
|
||||||
|
audio_sample_rate = 0;
|
||||||
|
m_audio_sample_rate_isSet = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SWGAMDemodReport::cleanup() {
|
SWGAMDemodReport::cleanup() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SWGAMDemodReport*
|
SWGAMDemodReport*
|
||||||
@ -67,6 +72,8 @@ SWGAMDemodReport::fromJsonObject(QJsonObject &pJson) {
|
|||||||
|
|
||||||
::SWGSDRangel::setValue(&squelch, pJson["squelch"], "qint32", "");
|
::SWGSDRangel::setValue(&squelch, pJson["squelch"], "qint32", "");
|
||||||
|
|
||||||
|
::SWGSDRangel::setValue(&audio_sample_rate, pJson["audioSampleRate"], "qint32", "");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString
|
QString
|
||||||
@ -89,6 +96,9 @@ SWGAMDemodReport::asJsonObject() {
|
|||||||
if(m_squelch_isSet){
|
if(m_squelch_isSet){
|
||||||
obj->insert("squelch", QJsonValue(squelch));
|
obj->insert("squelch", QJsonValue(squelch));
|
||||||
}
|
}
|
||||||
|
if(m_audio_sample_rate_isSet){
|
||||||
|
obj->insert("audioSampleRate", QJsonValue(audio_sample_rate));
|
||||||
|
}
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
@ -113,6 +123,16 @@ SWGAMDemodReport::setSquelch(qint32 squelch) {
|
|||||||
this->m_squelch_isSet = true;
|
this->m_squelch_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qint32
|
||||||
|
SWGAMDemodReport::getAudioSampleRate() {
|
||||||
|
return audio_sample_rate;
|
||||||
|
}
|
||||||
|
void
|
||||||
|
SWGAMDemodReport::setAudioSampleRate(qint32 audio_sample_rate) {
|
||||||
|
this->audio_sample_rate = audio_sample_rate;
|
||||||
|
this->m_audio_sample_rate_isSet = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
SWGAMDemodReport::isSet(){
|
SWGAMDemodReport::isSet(){
|
||||||
@ -120,6 +140,7 @@ SWGAMDemodReport::isSet(){
|
|||||||
do{
|
do{
|
||||||
if(m_channel_power_db_isSet){ isObjectUpdated = true; break;}
|
if(m_channel_power_db_isSet){ isObjectUpdated = true; break;}
|
||||||
if(m_squelch_isSet){ isObjectUpdated = true; break;}
|
if(m_squelch_isSet){ isObjectUpdated = true; break;}
|
||||||
|
if(m_audio_sample_rate_isSet){ isObjectUpdated = true; break;}
|
||||||
}while(false);
|
}while(false);
|
||||||
return isObjectUpdated;
|
return isObjectUpdated;
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,9 @@ public:
|
|||||||
qint32 getSquelch();
|
qint32 getSquelch();
|
||||||
void setSquelch(qint32 squelch);
|
void setSquelch(qint32 squelch);
|
||||||
|
|
||||||
|
qint32 getAudioSampleRate();
|
||||||
|
void setAudioSampleRate(qint32 audio_sample_rate);
|
||||||
|
|
||||||
|
|
||||||
virtual bool isSet() override;
|
virtual bool isSet() override;
|
||||||
|
|
||||||
@ -57,6 +60,9 @@ private:
|
|||||||
qint32 squelch;
|
qint32 squelch;
|
||||||
bool m_squelch_isSet;
|
bool m_squelch_isSet;
|
||||||
|
|
||||||
|
qint32 audio_sample_rate;
|
||||||
|
bool m_audio_sample_rate_isSet;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -36,8 +36,6 @@ SWGAMDemodSettings::SWGAMDemodSettings() {
|
|||||||
m_squelch_isSet = false;
|
m_squelch_isSet = false;
|
||||||
volume = 0.0f;
|
volume = 0.0f;
|
||||||
m_volume_isSet = false;
|
m_volume_isSet = false;
|
||||||
audio_sample_rate = 0;
|
|
||||||
m_audio_sample_rate_isSet = false;
|
|
||||||
audio_mute = 0;
|
audio_mute = 0;
|
||||||
m_audio_mute_isSet = false;
|
m_audio_mute_isSet = false;
|
||||||
bandpass_enable = 0;
|
bandpass_enable = 0;
|
||||||
@ -70,8 +68,6 @@ SWGAMDemodSettings::init() {
|
|||||||
m_squelch_isSet = false;
|
m_squelch_isSet = false;
|
||||||
volume = 0.0f;
|
volume = 0.0f;
|
||||||
m_volume_isSet = false;
|
m_volume_isSet = false;
|
||||||
audio_sample_rate = 0;
|
|
||||||
m_audio_sample_rate_isSet = false;
|
|
||||||
audio_mute = 0;
|
audio_mute = 0;
|
||||||
m_audio_mute_isSet = false;
|
m_audio_mute_isSet = false;
|
||||||
bandpass_enable = 0;
|
bandpass_enable = 0;
|
||||||
@ -100,7 +96,6 @@ SWGAMDemodSettings::cleanup() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(udp_address != nullptr) {
|
if(udp_address != nullptr) {
|
||||||
delete udp_address;
|
delete udp_address;
|
||||||
}
|
}
|
||||||
@ -130,8 +125,6 @@ SWGAMDemodSettings::fromJsonObject(QJsonObject &pJson) {
|
|||||||
|
|
||||||
::SWGSDRangel::setValue(&volume, pJson["volume"], "float", "");
|
::SWGSDRangel::setValue(&volume, pJson["volume"], "float", "");
|
||||||
|
|
||||||
::SWGSDRangel::setValue(&audio_sample_rate, pJson["audioSampleRate"], "qint32", "");
|
|
||||||
|
|
||||||
::SWGSDRangel::setValue(&audio_mute, pJson["audioMute"], "qint32", "");
|
::SWGSDRangel::setValue(&audio_mute, pJson["audioMute"], "qint32", "");
|
||||||
|
|
||||||
::SWGSDRangel::setValue(&bandpass_enable, pJson["bandpassEnable"], "qint32", "");
|
::SWGSDRangel::setValue(&bandpass_enable, pJson["bandpassEnable"], "qint32", "");
|
||||||
@ -176,9 +169,6 @@ SWGAMDemodSettings::asJsonObject() {
|
|||||||
if(m_volume_isSet){
|
if(m_volume_isSet){
|
||||||
obj->insert("volume", QJsonValue(volume));
|
obj->insert("volume", QJsonValue(volume));
|
||||||
}
|
}
|
||||||
if(m_audio_sample_rate_isSet){
|
|
||||||
obj->insert("audioSampleRate", QJsonValue(audio_sample_rate));
|
|
||||||
}
|
|
||||||
if(m_audio_mute_isSet){
|
if(m_audio_mute_isSet){
|
||||||
obj->insert("audioMute", QJsonValue(audio_mute));
|
obj->insert("audioMute", QJsonValue(audio_mute));
|
||||||
}
|
}
|
||||||
@ -247,16 +237,6 @@ SWGAMDemodSettings::setVolume(float volume) {
|
|||||||
this->m_volume_isSet = true;
|
this->m_volume_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
qint32
|
|
||||||
SWGAMDemodSettings::getAudioSampleRate() {
|
|
||||||
return audio_sample_rate;
|
|
||||||
}
|
|
||||||
void
|
|
||||||
SWGAMDemodSettings::setAudioSampleRate(qint32 audio_sample_rate) {
|
|
||||||
this->audio_sample_rate = audio_sample_rate;
|
|
||||||
this->m_audio_sample_rate_isSet = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
qint32
|
qint32
|
||||||
SWGAMDemodSettings::getAudioMute() {
|
SWGAMDemodSettings::getAudioMute() {
|
||||||
return audio_mute;
|
return audio_mute;
|
||||||
@ -346,7 +326,6 @@ SWGAMDemodSettings::isSet(){
|
|||||||
if(m_rf_bandwidth_isSet){ isObjectUpdated = true; break;}
|
if(m_rf_bandwidth_isSet){ isObjectUpdated = true; break;}
|
||||||
if(m_squelch_isSet){ isObjectUpdated = true; break;}
|
if(m_squelch_isSet){ isObjectUpdated = true; break;}
|
||||||
if(m_volume_isSet){ isObjectUpdated = true; break;}
|
if(m_volume_isSet){ isObjectUpdated = true; break;}
|
||||||
if(m_audio_sample_rate_isSet){ isObjectUpdated = true; break;}
|
|
||||||
if(m_audio_mute_isSet){ isObjectUpdated = true; break;}
|
if(m_audio_mute_isSet){ isObjectUpdated = true; break;}
|
||||||
if(m_bandpass_enable_isSet){ isObjectUpdated = true; break;}
|
if(m_bandpass_enable_isSet){ isObjectUpdated = true; break;}
|
||||||
if(m_copy_audio_to_udp_isSet){ isObjectUpdated = true; break;}
|
if(m_copy_audio_to_udp_isSet){ isObjectUpdated = true; break;}
|
||||||
|
@ -54,9 +54,6 @@ public:
|
|||||||
float getVolume();
|
float getVolume();
|
||||||
void setVolume(float volume);
|
void setVolume(float volume);
|
||||||
|
|
||||||
qint32 getAudioSampleRate();
|
|
||||||
void setAudioSampleRate(qint32 audio_sample_rate);
|
|
||||||
|
|
||||||
qint32 getAudioMute();
|
qint32 getAudioMute();
|
||||||
void setAudioMute(qint32 audio_mute);
|
void setAudioMute(qint32 audio_mute);
|
||||||
|
|
||||||
@ -97,9 +94,6 @@ private:
|
|||||||
float volume;
|
float volume;
|
||||||
bool m_volume_isSet;
|
bool m_volume_isSet;
|
||||||
|
|
||||||
qint32 audio_sample_rate;
|
|
||||||
bool m_audio_sample_rate_isSet;
|
|
||||||
|
|
||||||
qint32 audio_mute;
|
qint32 audio_mute;
|
||||||
bool m_audio_mute_isSet;
|
bool m_audio_mute_isSet;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user