diff --git a/plugins/channelrx/demodam/amdemod.cpp b/plugins/channelrx/demodam/amdemod.cpp
index 5333a03f5..33dd1e750 100644
--- a/plugins/channelrx/demodam/amdemod.cpp
+++ b/plugins/channelrx/demodam/amdemod.cpp
@@ -218,9 +218,6 @@ bool AMDemod::handleMessage(const Message& cmd)
applyAudioSampleRate(sampleRate);
}
- AMDemodSettings settings = m_settings;
- applyAudioSampleRate(cfg.getSampleRate());
-
return true;
}
else
@@ -283,6 +280,7 @@ void AMDemod::applySettings(const AMDemodSettings& settings, bool force)
<< " m_copyAudioUseRTP: " << settings.m_copyAudioUseRTP
<< " m_udpAddress: " << settings.m_udpAddress
<< " m_udpPort: " << settings.m_udpPort
+ << " m_audioDeviceName: " << settings.m_audioDeviceName
<< " force: " << force;
if((m_settings.m_rfBandwidth != settings.m_rfBandwidth) ||
@@ -312,21 +310,34 @@ void AMDemod::applySettings(const AMDemodSettings& settings, bool force)
if (settings.m_copyAudioUseRTP)
{
if (m_audioNetSink->selectType(AudioNetSink::SinkRTP)) {
- qDebug("NFMDemod::applySettings: set audio sink to RTP mode");
+ qDebug("AMDemod::applySettings: set audio sink to RTP mode");
} else {
- qWarning("NFMDemod::applySettings: RTP support for audio sink not available. Fall back too UDP");
+ qWarning("AMDemod::applySettings: RTP support for audio sink not available. Fall back too UDP");
}
}
else
{
if (m_audioNetSink->selectType(AudioNetSink::SinkUDP)) {
- qDebug("NFMDemod::applySettings: set audio sink to UDP mode");
+ qDebug("AMDemod::applySettings: set audio sink to UDP mode");
} else {
- qWarning("NFMDemod::applySettings: failed to set audio sink to UDP mode");
+ qWarning("AMDemod::applySettings: failed to set audio sink to UDP mode");
}
}
}
+ if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)
+ {
+ AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager();
+ int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName);
+ //qDebug("AMDemod::applySettings: audioDeviceName: %s audioDeviceIndex: %d", qPrintable(settings.m_audioDeviceName), audioDeviceIndex);
+ audioDeviceManager->addAudioSink(&m_audioFifo, getInputMessageQueue(), audioDeviceIndex);
+ uint32_t audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex);
+
+ if (m_audioSampleRate != audioSampleRate) {
+ applyAudioSampleRate(audioSampleRate);
+ }
+ }
+
m_settings = settings;
}
diff --git a/plugins/channelrx/demodam/amdemodgui.cpp b/plugins/channelrx/demodam/amdemodgui.cpp
index 3a26230c7..9fed72589 100644
--- a/plugins/channelrx/demodam/amdemodgui.cpp
+++ b/plugins/channelrx/demodam/amdemodgui.cpp
@@ -22,7 +22,7 @@
#include "device/devicesourceapi.h"
#include "device/deviceuiset.h"
#include "dsp/downchannelizer.h"
-
+#include "dsp/dspengine.h"
#include "dsp/threadedbasebandsamplesink.h"
#include "ui_amdemodgui.h"
#include "plugin/pluginapi.h"
@@ -31,6 +31,8 @@
#include "gui/basicchannelsettingsdialog.h"
#include "dsp/dspengine.h"
#include "mainwindow.h"
+#include "gui/crightclickenabler.h"
+#include "gui/audioselectdialog.h"
#include "amdemod.h"
@@ -230,6 +232,9 @@ AMDemodGUI::AMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS
connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); // 50 ms
+ CRightClickEnabler *audioMuteRightClickEnabler = new CRightClickEnabler(ui->audioMute);
+ connect(audioMuteRightClickEnabler, SIGNAL(rightClick()), this, SLOT(audioSelect()));
+
ui->deltaFrequencyLabel->setText(QString("%1f").arg(QChar(0x94, 0x03)));
ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold));
ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999);
@@ -343,6 +348,19 @@ void AMDemodGUI::enterEvent(QEvent*)
m_channelMarker.setHighlighted(true);
}
+void AMDemodGUI::audioSelect()
+{
+ qDebug("AMDemodGUI::audioSelect");
+ AudioSelectDialog audioSelect(DSPEngine::instance()->getAudioDeviceManager(), m_settings.m_audioDeviceName);
+ audioSelect.exec();
+
+ if (audioSelect.m_selected)
+ {
+ m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName;
+ applySettings();
+ }
+}
+
void AMDemodGUI::tick()
{
double magsqAvg, magsqPeak;
diff --git a/plugins/channelrx/demodam/amdemodgui.h b/plugins/channelrx/demodam/amdemodgui.h
index 24a84e7ba..2fb6974fb 100644
--- a/plugins/channelrx/demodam/amdemodgui.h
+++ b/plugins/channelrx/demodam/amdemodgui.h
@@ -76,6 +76,7 @@ private slots:
void onWidgetRolled(QWidget* widget, bool rollDown);
void onMenuDialogCalled(const QPoint& p);
void handleInputMessages();
+ void audioSelect();
void tick();
};
diff --git a/plugins/channelrx/demodam/amdemodgui.ui b/plugins/channelrx/demodam/amdemodgui.ui
index deb8182dc..ee4538366 100644
--- a/plugins/channelrx/demodam/amdemodgui.ui
+++ b/plugins/channelrx/demodam/amdemodgui.ui
@@ -59,16 +59,7 @@
3
-
- 2
-
-
- 2
-
-
- 2
-
-
+
2
-
@@ -171,7 +162,7 @@
-
- Mute/Unmute audio
+ Left: Mute/Unmute audio Right: view/select audio device
...
diff --git a/plugins/channelrx/demodam/amdemodsettings.cpp b/plugins/channelrx/demodam/amdemodsettings.cpp
index f1d94a1d6..5d50a9c80 100644
--- a/plugins/channelrx/demodam/amdemodsettings.cpp
+++ b/plugins/channelrx/demodam/amdemodsettings.cpp
@@ -41,6 +41,7 @@ void AMDemodSettings::resetToDefaults()
m_udpPort = 9999;
m_rgbColor = QColor(255, 255, 0).rgb();
m_title = "AM Demodulator";
+ m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName;
}
QByteArray AMDemodSettings::serialize() const
@@ -59,6 +60,7 @@ QByteArray AMDemodSettings::serialize() const
s.writeBool(8, m_bandpassEnable);
s.writeString(9, m_title);
s.writeBool(10, m_copyAudioUseRTP);
+ s.writeString(11, m_audioDeviceName);
return s.final();
}
@@ -95,6 +97,7 @@ bool AMDemodSettings::deserialize(const QByteArray& data)
d.readBool(8, &m_bandpassEnable, false);
d.readString(9, &m_title, "AM Demodulator");
d.readBool(10, &m_copyAudioUseRTP, false);
+ d.readString(11, &m_audioDeviceName, AudioDeviceManager::m_defaultDeviceName);
return true;
}
diff --git a/plugins/channelrx/demodam/amdemodsettings.h b/plugins/channelrx/demodam/amdemodsettings.h
index 129ef810d..f676e25a5 100644
--- a/plugins/channelrx/demodam/amdemodsettings.h
+++ b/plugins/channelrx/demodam/amdemodsettings.h
@@ -36,6 +36,7 @@ struct AMDemodSettings
quint32 m_rgbColor;
QString m_title;
Serializable *m_channelMarker;
+ QString m_audioDeviceName;
AMDemodSettings();
void resetToDefaults();
diff --git a/sdrbase/audio/audiodevicemanager.cpp b/sdrbase/audio/audiodevicemanager.cpp
index f88a8da6c..1e1a7157e 100644
--- a/sdrbase/audio/audiodevicemanager.cpp
+++ b/sdrbase/audio/audiodevicemanager.cpp
@@ -109,6 +109,33 @@ bool AudioDeviceManager::getInputDeviceName(int inputDeviceIndex, QString &devic
}
}
+int AudioDeviceManager::getOutputDeviceIndex(const QString &deviceName) const
+{
+ for (int i = 0; i < m_outputDevicesInfo.size(); i++)
+ {
+ //qDebug("AudioDeviceManager::getOutputDeviceIndex: %d: %s|%s", i, qPrintable(deviceName), qPrintable(m_outputDevicesInfo[i].deviceName()));
+ if (deviceName == m_outputDevicesInfo[i].deviceName()) {
+ return i;
+ }
+ }
+
+ return -1; // system default
+}
+
+int AudioDeviceManager::getInputDeviceIndex(const QString &deviceName) const
+{
+ for (int i = 0; i < m_inputDevicesInfo.size(); i++)
+ {
+ //qDebug("AudioDeviceManager::getInputDeviceIndex: %d: %s|%s", i, qPrintable(deviceName), qPrintable(m_inputDevicesInfo[i].deviceName()));
+ if (deviceName == m_inputDevicesInfo[i].deviceName()) {
+ return i;
+ }
+ }
+
+ return -1; // system default
+}
+
+
void AudioDeviceManager::resetToDefaults()
{
}
@@ -203,6 +230,9 @@ void AudioDeviceManager::addAudioSink(AudioFifo* audioFifo, MessageQueue *sample
if (m_audioSinkFifos.find(audioFifo) == m_audioSinkFifos.end()) // new FIFO
{
m_audioOutputs[outputDeviceIndex]->addFifo(audioFifo);
+ m_audioSinkFifos[audioFifo] = outputDeviceIndex; // register audio FIFO
+ m_audioFifoToSinkMessageQueues[audioFifo] = sampleSinkMessageQueue;
+ m_outputDeviceSinkMessageQueues[outputDeviceIndex].append(sampleSinkMessageQueue);
}
else
{
@@ -212,12 +242,11 @@ void AudioDeviceManager::addAudioSink(AudioFifo* audioFifo, MessageQueue *sample
{
removeAudioSink(audioFifo); // remove from current
m_audioOutputs[outputDeviceIndex]->addFifo(audioFifo); // add to new
+ m_audioSinkFifos[audioFifo] = outputDeviceIndex; // new index
+ m_outputDeviceSinkMessageQueues[audioOutputDeviceIndex].removeOne(sampleSinkMessageQueue);
+ m_outputDeviceSinkMessageQueues[outputDeviceIndex].append(sampleSinkMessageQueue);
}
}
-
- m_audioSinkFifos[audioFifo] = outputDeviceIndex; // register audio FIFO
- m_audioFifoToSinkMessageQueues[audioFifo] = sampleSinkMessageQueue;
- m_outputDeviceSinkMessageQueues[outputDeviceIndex].append(sampleSinkMessageQueue);
}
void AudioDeviceManager::removeAudioSink(AudioFifo* audioFifo)
diff --git a/sdrbase/audio/audiodevicemanager.h b/sdrbase/audio/audiodevicemanager.h
index 6cb24d456..901e48e5f 100644
--- a/sdrbase/audio/audiodevicemanager.h
+++ b/sdrbase/audio/audiodevicemanager.h
@@ -87,6 +87,8 @@ public:
bool getOutputDeviceName(int outputDeviceIndex, QString &deviceName) const;
bool getInputDeviceName(int inputDeviceIndex, QString &deviceName) const;
+ int getOutputDeviceIndex(const QString &deviceName) const;
+ int getInputDeviceIndex(const QString &deviceName) const;
void addAudioSink(AudioFifo* audioFifo, MessageQueue *sampleSinkMessageQueue, int outputDeviceIndex = -1); //!< Add the audio sink
void removeAudioSink(AudioFifo* audioFifo); //!< Remove the audio sink
diff --git a/sdrbase/audio/audiooutput.cpp b/sdrbase/audio/audiooutput.cpp
index 5d798f245..504ec89cd 100644
--- a/sdrbase/audio/audiooutput.cpp
+++ b/sdrbase/audio/audiooutput.cpp
@@ -60,7 +60,7 @@ bool AudioOutput::start(int device, int rate)
if (device < 0)
{
devInfo = QAudioDeviceInfo::defaultOutputDevice();
- qWarning("AudioOutput::start: using default device %s", qPrintable(devInfo.defaultOutputDevice().deviceName()));
+ qWarning("AudioOutput::start: using system default device %s", qPrintable(devInfo.defaultOutputDevice().deviceName()));
}
else
{
@@ -69,12 +69,12 @@ bool AudioOutput::start(int device, int rate)
if (device < devicesInfo.size())
{
devInfo = devicesInfo[device];
- qWarning("AudioOutput::start: using audio device #%d: %s", device, qPrintable(devInfo.defaultOutputDevice().deviceName()));
+ qWarning("AudioOutput::start: using audio device #%d: %s", device, qPrintable(devInfo.deviceName()));
}
else
{
devInfo = QAudioDeviceInfo::defaultOutputDevice();
- qWarning("AudioOutput::start: audio device #%d does not exist. Using default device %s", device, qPrintable(devInfo.defaultOutputDevice().deviceName()));
+ qWarning("AudioOutput::start: audio device #%d does not exist. Using system default device %s", device, qPrintable(devInfo.defaultOutputDevice().deviceName()));
}
}
@@ -90,7 +90,14 @@ bool AudioOutput::start(int device, int rate)
if (!devInfo.isFormatSupported(m_audioFormat))
{
m_audioFormat = devInfo.nearestFormat(m_audioFormat);
- qWarning("AudioOutput::start: %d Hz S16_LE audio format not supported. New rate: %d", rate, m_audioFormat.sampleRate());
+ std::ostringstream os;
+ os << " sampleRate: " << m_audioFormat.sampleRate()
+ << " channelCount: " << m_audioFormat.channelCount()
+ << " sampleSize: " << m_audioFormat.sampleSize()
+ << " codec: " << m_audioFormat.codec().toStdString()
+ << " byteOrder: " << (m_audioFormat.byteOrder() == QAudioFormat::BigEndian ? "BE" : "LE")
+ << " sampleType: " << (int) m_audioFormat.sampleType();
+ qWarning("AudioOutput::start: format %d Hz 2xS16LE audio/pcm not supported. Using: %s", rate, os.str().c_str());
}
else
{
diff --git a/sdrgui/CMakeLists.txt b/sdrgui/CMakeLists.txt
index 149fff50a..4da2e430e 100644
--- a/sdrgui/CMakeLists.txt
+++ b/sdrgui/CMakeLists.txt
@@ -4,6 +4,8 @@ set(sdrgui_SOURCES
mainwindow.cpp
gui/aboutdialog.cpp
gui/addpresetdialog.cpp
+ gui/audiodialog.cpp
+ gui/audioselectdialog.cpp
gui/basicchannelsettingsdialog.cpp
gui/buttonswitch.cpp
gui/channelwindow.cpp
@@ -12,6 +14,7 @@ set(sdrgui_SOURCES
gui/commanditem.cpp
gui/commandkeyreceiver.cpp
gui/commandoutputdialog.cpp
+ gui/crightclickenabler.cpp
gui/cwkeyergui.cpp
gui/editcommanddialog.cpp
gui/externalclockbutton.cpp
@@ -32,7 +35,6 @@ set(sdrgui_SOURCES
gui/loggingdialog.cpp
gui/mypositiondialog.cpp
gui/pluginsdialog.cpp
- gui/audiodialog.cpp
gui/presetitem.cpp
gui/rollupwidget.cpp
gui/samplingdevicecontrol.cpp
@@ -62,6 +64,8 @@ set(sdrgui_HEADERS
mainwindow.h
gui/aboutdialog.h
gui/addpresetdialog.h
+ gui/audiodialog.h
+ gui/audioselectdialog.h
gui/basicchannelsettingsdialog.h
gui/buttonswitch.h
gui/channelwindow.h
@@ -69,6 +73,7 @@ set(sdrgui_HEADERS
gui/commanditem.h
gui/commandkeyreceiver.h
gui/commandoutputdialog.h
+ gui/crightclickenabler.h
gui/cwkeyergui.h
gui/editcommanddialog.h
gui/externalclockbutton.h
@@ -90,7 +95,6 @@ set(sdrgui_HEADERS
gui/mypositiondialog.h
gui/physicalunit.h
gui/pluginsdialog.h
- gui/audiodialog.h
gui/presetitem.h
gui/rollupwidget.h
gui/samplingdevicecontrol.h
@@ -136,6 +140,7 @@ set(sdrgui_FORMS
gui/glspectrumgui.ui
gui/pluginsdialog.ui
gui/audiodialog.ui
+ gui/audioselectdialog.ui
gui/samplingdevicecontrol.ui
gui/samplingdevicedialog.ui
gui/myposdialog.ui
diff --git a/sdrgui/gui/audiodialog.cpp b/sdrgui/gui/audiodialog.cpp
index 8aa9cac5b..270cfbc3a 100644
--- a/sdrgui/gui/audiodialog.cpp
+++ b/sdrgui/gui/audiodialog.cpp
@@ -23,9 +23,12 @@ AudioDialogX::AudioDialogX(AudioDeviceManager* audioDeviceManager, QWidget* pare
for(QList::const_iterator it = outputDevices.begin(); it != outputDevices.end(); ++it)
{
- bool isDefaultDevice = it->deviceName() == defaultOutputDeviceInfo.deviceName();
treeItem = new QTreeWidgetItem(ui->audioOutTree);
- treeItem->setText(0, it->deviceName() + (isDefaultDevice ? "(*)" : ""));
+ treeItem->setText(0, it->deviceName());
+
+ if (it->deviceName() == defaultOutputDeviceInfo.deviceName()) {
+ treeItem->setBackground(0, QBrush(qRgb(96,96,96)));
+ }
}
// in panel
@@ -39,9 +42,12 @@ AudioDialogX::AudioDialogX(AudioDeviceManager* audioDeviceManager, QWidget* pare
for(QList::const_iterator it = inputDevices.begin(); it != inputDevices.end(); ++it)
{
- bool isDefaultDevice = it->deviceName() == defaultInputDeviceInfo.deviceName();
treeItem = new QTreeWidgetItem(ui->audioInTree);
- treeItem->setText(0, it->deviceName() + (isDefaultDevice ? "(*)" : ""));
+ treeItem->setText(0, it->deviceName());
+
+ if (it->deviceName() == defaultInputDeviceInfo.deviceName()) {
+ treeItem->setBackground(0, QBrush(qRgb(96,96,96)));
+ }
}
m_outputUDPPort = 9998;
@@ -124,13 +130,12 @@ void AudioDialogX::on_audioOutTree_currentItemChanged(
ui->outputResetKey->setChecked(false);
}
+ //qDebug("AudioDialogX::on_audioOutTree_currentItemChanged: %s", qPrintable(outDeviceName));
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)
diff --git a/sdrgui/gui/audioselectdialog.cpp b/sdrgui/gui/audioselectdialog.cpp
new file mode 100644
index 000000000..82b3a9301
--- /dev/null
+++ b/sdrgui/gui/audioselectdialog.cpp
@@ -0,0 +1,94 @@
+///////////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 2018 F4EXB //
+// written by Edouard Griffiths //
+// //
+// This program is free software; you can redistribute it and/or modify //
+// it under the terms of the GNU General Public License as published by //
+// the Free Software Foundation as version 3 of the License, or //
+// //
+// This program is distributed in the hope that it will be useful, //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
+// GNU General Public License V3 for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program. If not, see . //
+///////////////////////////////////////////////////////////////////////////////////
+
+#include "audioselectdialog.h"
+#include "ui_audioselectdialog.h"
+
+AudioSelectDialog::AudioSelectDialog(AudioDeviceManager* audioDeviceManager, const QString& deviceName, bool input, QWidget* parent) :
+ QDialog(parent),
+ m_selected(false),
+ ui(new Ui::AudioSelectDialog),
+ m_audioDeviceManager(audioDeviceManager),
+ m_input(input)
+{
+ ui->setupUi(this);
+ QTreeWidgetItem *treeItem, *defaultItem, *selectedItem = 0;
+
+ // panel
+
+ QAudioDeviceInfo defaultDeviceInfo = input ? QAudioDeviceInfo::defaultInputDevice() : QAudioDeviceInfo::defaultOutputDevice();
+ defaultItem = new QTreeWidgetItem(ui->audioTree);
+ defaultItem->setText(0, AudioDeviceManager::m_defaultDeviceName);
+
+ QList devices = input ? m_audioDeviceManager->getInputDevices() : m_audioDeviceManager->getOutputDevices();
+
+ for(QList::const_iterator it = devices.begin(); it != devices.end(); ++it)
+ {
+ treeItem = new QTreeWidgetItem(ui->audioTree);
+ treeItem->setText(0, it->deviceName());
+
+ if (it->deviceName() == defaultDeviceInfo.deviceName()) {
+ treeItem->setBackground(0, QBrush(qRgb(96,96,96)));
+ }
+
+ if (deviceName == it->deviceName()) {
+ selectedItem = treeItem;
+ }
+ }
+
+ if (selectedItem) {
+ ui->audioTree->setCurrentItem(selectedItem);
+ } else {
+ ui->audioTree->setCurrentItem(defaultItem);
+ }
+}
+
+AudioSelectDialog::~AudioSelectDialog()
+{
+ delete ui;
+}
+
+void AudioSelectDialog::accept()
+{
+ int deviceIndex = ui->audioTree->indexOfTopLevelItem(ui->audioTree->currentItem()) - 1;
+
+ if (m_input)
+ {
+ if (!m_audioDeviceManager->getInputDeviceName(deviceIndex, m_audioDeviceName)) {
+ m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName;
+ }
+ }
+ else
+ {
+ if (!m_audioDeviceManager->getOutputDeviceName(deviceIndex, m_audioDeviceName)) {
+ m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName;
+ }
+
+ qDebug("AudioSelectDialog::accept: output: %d (%s)", deviceIndex, qPrintable(m_audioDeviceName));
+ }
+
+ m_selected = true;
+ QDialog::accept();
+}
+
+void AudioSelectDialog::reject()
+{
+ QDialog::reject();
+}
+
+
+
diff --git a/sdrgui/gui/audioselectdialog.h b/sdrgui/gui/audioselectdialog.h
new file mode 100644
index 000000000..371d7c4e1
--- /dev/null
+++ b/sdrgui/gui/audioselectdialog.h
@@ -0,0 +1,53 @@
+///////////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 2018 F4EXB //
+// written by Edouard Griffiths //
+// //
+// This program is free software; you can redistribute it and/or modify //
+// it under the terms of the GNU General Public License as published by //
+// the Free Software Foundation as version 3 of the License, or //
+// //
+// This program is distributed in the hope that it will be useful, //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
+// GNU General Public License V3 for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program. If not, see . //
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef SDRGUI_GUI_AUDIOSELECTDIALOG_H_
+#define SDRGUI_GUI_AUDIOSELECTDIALOG_H_
+
+#include
+
+#include "export.h"
+#include "audio/audiodevicemanager.h"
+
+class QTreeWidgetItem;
+
+namespace Ui {
+ class AudioSelectDialog;
+}
+
+class SDRGUI_API AudioSelectDialog : public QDialog {
+ Q_OBJECT
+public:
+ explicit AudioSelectDialog(AudioDeviceManager* audioDeviceManager, const QString& deviceName, bool input = false, QWidget* parent = 0);
+ ~AudioSelectDialog();
+
+ QString m_audioDeviceName;
+ bool m_selected;
+
+private:
+ Ui::AudioSelectDialog* ui;
+ AudioDeviceManager* m_audioDeviceManager;
+ bool m_input;
+
+private slots:
+ void accept();
+ void reject();
+ //void on_audioInTree_currentItemChanged(QTreeWidgetItem* currentItem, QTreeWidgetItem* previousItem);
+
+};
+
+#endif /* SDRGUI_GUI_AUDIOSELECTDIALOG_H_ */
diff --git a/sdrgui/gui/audioselectdialog.ui b/sdrgui/gui/audioselectdialog.ui
new file mode 100644
index 000000000..4b80685f8
--- /dev/null
+++ b/sdrgui/gui/audioselectdialog.ui
@@ -0,0 +1,84 @@
+
+
+ AudioSelectDialog
+
+
+
+ 0
+ 0
+ 400
+ 349
+
+
+
+
+ Sans Serif
+ 9
+
+
+
+ Select audio device
+
+
+
-
+
+
+
+ Device
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+
+
+
+ buttonBox
+
+
+
+
+
+
+ buttonBox
+ accepted()
+ AudioSelectDialog
+ accept()
+
+
+ 248
+ 254
+
+
+ 157
+ 274
+
+
+
+
+ buttonBox
+ rejected()
+ AudioSelectDialog
+ reject()
+
+
+ 316
+ 260
+
+
+ 286
+ 274
+
+
+
+
+
diff --git a/sdrgui/gui/crightclickenabler.cpp b/sdrgui/gui/crightclickenabler.cpp
new file mode 100644
index 000000000..f464fad88
--- /dev/null
+++ b/sdrgui/gui/crightclickenabler.cpp
@@ -0,0 +1,13 @@
+/*
+ * crightclickenabler.cpp
+ *
+ * Created on: Mar 26, 2018
+ * Author: f4exb
+ */
+
+#include "crightclickenabler.h"
+
+CRightClickEnabler::CRightClickEnabler(QAbstractButton *button): QObject(button), _button(button) {
+ button->installEventFilter(this);
+};
+
diff --git a/sdrgui/gui/crightclickenabler.h b/sdrgui/gui/crightclickenabler.h
new file mode 100644
index 000000000..bfa05dfb4
--- /dev/null
+++ b/sdrgui/gui/crightclickenabler.h
@@ -0,0 +1,49 @@
+///////////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 2018 F4EXB //
+// written by Edouard Griffiths //
+// //
+// This program is free software; you can redistribute it and/or modify //
+// it under the terms of the GNU General Public License as published by //
+// the Free Software Foundation as version 3 of the License, or //
+// //
+// This program is distributed in the hope that it will be useful, //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
+// GNU General Public License V3 for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program. If not, see . //
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef SDRGUI_GUI_CRIGHTCLICKENABLER_H_
+#define SDRGUI_GUI_CRIGHTCLICKENABLER_H_
+
+#include
+#include
+
+class CRightClickEnabler : public QObject {
+ Q_OBJECT
+public:
+ CRightClickEnabler(QAbstractButton *button);
+
+signals:
+ void rightClick();
+
+protected:
+ inline bool eventFilter(QObject *watched __attribute__((unused)), QEvent *event) override {
+ if (event->type() == QEvent::MouseButtonPress)
+ {
+ auto mouseEvent = (QMouseEvent*)event;
+ if (mouseEvent->button() == Qt::RightButton) {
+ //_button->click();
+ emit rightClick();
+ }
+ }
+ return false;
+ }
+
+private:
+ QAbstractButton* _button;
+};
+
+#endif /* SDRGUI_GUI_CRIGHTCLICKENABLER_H_ */