mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-03 13:11:20 -05:00 
			
		
		
		
	Multiple audio support: Select output device in AM demod
This commit is contained in:
		
							parent
							
								
									095ab14a14
								
							
						
					
					
						commit
						a049e3aaa6
					
				@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -76,6 +76,7 @@ private slots:
 | 
			
		||||
	void onWidgetRolled(QWidget* widget, bool rollDown);
 | 
			
		||||
    void onMenuDialogCalled(const QPoint& p);
 | 
			
		||||
    void handleInputMessages();
 | 
			
		||||
    void audioSelect();
 | 
			
		||||
	void tick();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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>
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -36,6 +36,7 @@ struct AMDemodSettings
 | 
			
		||||
    quint32 m_rgbColor;
 | 
			
		||||
    QString m_title;
 | 
			
		||||
    Serializable *m_channelMarker;
 | 
			
		||||
    QString m_audioDeviceName;
 | 
			
		||||
 | 
			
		||||
    AMDemodSettings();
 | 
			
		||||
    void resetToDefaults();
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										94
									
								
								sdrgui/gui/audioselectdialog.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								sdrgui/gui/audioselectdialog.cpp
									
									
									
									
									
										Normal file
									
								
							@ -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();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										53
									
								
								sdrgui/gui/audioselectdialog.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								sdrgui/gui/audioselectdialog.h
									
									
									
									
									
										Normal file
									
								
							@ -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_ */
 | 
			
		||||
							
								
								
									
										84
									
								
								sdrgui/gui/audioselectdialog.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								sdrgui/gui/audioselectdialog.ui
									
									
									
									
									
										Normal file
									
								
							@ -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>
 | 
			
		||||
							
								
								
									
										13
									
								
								sdrgui/gui/crightclickenabler.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								sdrgui/gui/crightclickenabler.cpp
									
									
									
									
									
										Normal file
									
								
							@ -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);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										49
									
								
								sdrgui/gui/crightclickenabler.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								sdrgui/gui/crightclickenabler.h
									
									
									
									
									
										Normal file
									
								
							@ -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_ */
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user