Multiple audio support: Select output device in AM demod

pull/162/head
f4exb 2018-03-26 18:41:09 +02:00
rodzic 095ab14a14
commit a049e3aaa6
16 zmienionych plików z 401 dodań i 35 usunięć

Wyświetl plik

@ -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;
}

Wyświetl plik

@ -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;

Wyświetl plik

@ -76,6 +76,7 @@ private slots:
void onWidgetRolled(QWidget* widget, bool rollDown);
void onMenuDialogCalled(const QPoint& p);
void handleInputMessages();
void audioSelect();
void tick();
};

Wyświetl plik

@ -59,16 +59,7 @@
<property name="spacing">
<number>3</number>
</property>
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>2</number>
</property>
<item>
@ -171,7 +162,7 @@
<item>
<widget class="QToolButton" name="audioMute">
<property name="toolTip">
<string>Mute/Unmute audio</string>
<string>Left: Mute/Unmute audio Right: view/select audio device</string>
</property>
<property name="text">
<string>...</string>

Wyświetl plik

@ -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;
}

Wyświetl plik

@ -36,6 +36,7 @@ struct AMDemodSettings
quint32 m_rgbColor;
QString m_title;
Serializable *m_channelMarker;
QString m_audioDeviceName;
AMDemodSettings();
void resetToDefaults();

Wyświetl plik

@ -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)

Wyświetl plik

@ -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

Wyświetl plik

@ -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
{

Wyświetl plik

@ -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

Wyświetl plik

@ -23,9 +23,12 @@ AudioDialogX::AudioDialogX(AudioDeviceManager* audioDeviceManager, QWidget* pare
for(QList<QAudioDeviceInfo>::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<QAudioDeviceInfo>::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)

Wyświetl plik

@ -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 <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#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<QAudioDeviceInfo> devices = input ? m_audioDeviceManager->getInputDevices() : m_audioDeviceManager->getOutputDevices();
for(QList<QAudioDeviceInfo>::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();
}

Wyświetl plik

@ -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 <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#ifndef SDRGUI_GUI_AUDIOSELECTDIALOG_H_
#define SDRGUI_GUI_AUDIOSELECTDIALOG_H_
#include <QDialog>
#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_ */

Wyświetl plik

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AudioSelectDialog</class>
<widget class="QDialog" name="AudioSelectDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>349</height>
</rect>
</property>
<property name="font">
<font>
<family>Sans Serif</family>
<pointsize>9</pointsize>
</font>
</property>
<property name="windowTitle">
<string>Select audio device</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTreeWidget" name="audioTree">
<column>
<property name="text">
<string notr="true">Device</string>
</property>
</column>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>buttonBox</tabstop>
</tabstops>
<resources>
<include location="../resources/res.qrc"/>
</resources>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>AudioSelectDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>AudioSelectDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

Wyświetl plik

@ -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);
};

Wyświetl plik

@ -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 <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#ifndef SDRGUI_GUI_CRIGHTCLICKENABLER_H_
#define SDRGUI_GUI_CRIGHTCLICKENABLER_H_
#include <QAbstractButton>
#include <QMouseEvent>
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_ */