From fb3e6dc90db2ffc126bf22bc3e97b4719998b248 Mon Sep 17 00:00:00 2001 From: f4exb Date: Fri, 6 Jan 2017 18:56:46 +0100 Subject: [PATCH] New audio devices dialog and handling: make settings persistent using main settings --- sdrbase/audio/audiodeviceinfo.cpp | 46 +++++++++++++++++++++++++++++-- sdrbase/audio/audiodeviceinfo.h | 13 ++++++--- sdrbase/mainwindow.cpp | 2 ++ sdrbase/settings/mainsettings.cpp | 10 +++++++ sdrbase/settings/mainsettings.h | 5 ++++ 5 files changed, 69 insertions(+), 7 deletions(-) diff --git a/sdrbase/audio/audiodeviceinfo.cpp b/sdrbase/audio/audiodeviceinfo.cpp index b827cee7d..477e80f20 100644 --- a/sdrbase/audio/audiodeviceinfo.cpp +++ b/sdrbase/audio/audiodeviceinfo.cpp @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2012 maintech GmbH, Otto-Hahn-Str. 15, 97204 Hoechberg, Germany // -// written by Christian Daniel // +// Copyright (C) 2017 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 // @@ -16,12 +16,52 @@ /////////////////////////////////////////////////////////////////////////////////// #include "audio/audiodeviceinfo.h" +#include "util/simpleserializer.h" AudioDeviceInfo::AudioDeviceInfo() : m_inputDeviceIndex(-1), // default device m_outputDeviceIndex(-1), // default device - m_inputVolume(0.5f) + m_inputVolume(1.0f) { m_inputDevicesInfo = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); m_outputDevicesInfo = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); } + +void AudioDeviceInfo::resetToDefaults() +{ + m_inputDeviceIndex = -1; + m_outputDeviceIndex = -1; + m_inputVolume = 1.0f; +} + +QByteArray AudioDeviceInfo::serialize() const +{ + SimpleSerializer s(1); + s.writeS32(1, m_inputDeviceIndex); + s.writeS32(2, m_outputDeviceIndex); + s.writeFloat(3, m_inputVolume); + return s.final(); +} + +bool AudioDeviceInfo::deserialize(const QByteArray& data) +{ + SimpleDeserializer d(data); + + if(!d.isValid()) { + resetToDefaults(); + return false; + } + + if(d.getVersion() == 1) + { + d.readS32(1, &m_inputDeviceIndex, -1); + d.readS32(2, &m_outputDeviceIndex, -1); + d.readFloat(3, &m_inputVolume, 1.0f); + return true; + } + else + { + resetToDefaults(); + return false; + } +} diff --git a/sdrbase/audio/audiodeviceinfo.h b/sdrbase/audio/audiodeviceinfo.h index 455e6d728..b0d713ade 100644 --- a/sdrbase/audio/audiodeviceinfo.h +++ b/sdrbase/audio/audiodeviceinfo.h @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2012 maintech GmbH, Otto-Hahn-Str. 15, 97204 Hoechberg, Germany // -// written by Christian Daniel // +// Copyright (C) 2017 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 // @@ -35,13 +35,18 @@ public: float getInputVolume() const { return m_inputVolume; } private: - QList m_inputDevicesInfo = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); - QList m_outputDevicesInfo = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); + QList m_inputDevicesInfo; + QList m_outputDevicesInfo; int m_inputDeviceIndex; int m_outputDeviceIndex; float m_inputVolume; + void resetToDefaults(); + QByteArray serialize() const; + bool deserialize(const QByteArray& data); + friend class AudioDialog; + friend class MainSettings; }; #endif // INCLUDE_AUDIODEVICEINFO_H diff --git a/sdrbase/mainwindow.cpp b/sdrbase/mainwindow.cpp index 2249eddd0..272e1f59c 100644 --- a/sdrbase/mainwindow.cpp +++ b/sdrbase/mainwindow.cpp @@ -69,6 +69,8 @@ MainWindow::MainWindow(QWidget* parent) : { qDebug() << "MainWindow::MainWindow: start"; + m_settings.setAudioDeviceInfo(m_audioDeviceInfo); + ui->setupUi(this); createStatusBar(); diff --git a/sdrbase/settings/mainsettings.cpp b/sdrbase/settings/mainsettings.cpp index 2c6948585..3c772d445 100644 --- a/sdrbase/settings/mainsettings.cpp +++ b/sdrbase/settings/mainsettings.cpp @@ -23,6 +23,11 @@ void MainSettings::load() m_preferences.deserialize(qUncompress(QByteArray::fromBase64(s.value("preferences").toByteArray()))); m_workingPreset.deserialize(qUncompress(QByteArray::fromBase64(s.value("current").toByteArray()))); + if (m_audioDeviceInfo) + { + m_audioDeviceInfo->deserialize(qUncompress(QByteArray::fromBase64(s.value("audio").toByteArray()))); + } + QStringList groups = s.childGroups(); for(int i = 0; i < groups.size(); ++i) @@ -53,6 +58,11 @@ void MainSettings::save() const s.setValue("preferences", qCompress(m_preferences.serialize()).toBase64()); s.setValue("current", qCompress(m_workingPreset.serialize()).toBase64()); + if (m_audioDeviceInfo) + { + s.setValue("audio", qCompress(m_audioDeviceInfo->serialize()).toBase64()); + } + QStringList groups = s.childGroups(); for(int i = 0; i < groups.size(); ++i) diff --git a/sdrbase/settings/mainsettings.h b/sdrbase/settings/mainsettings.h index dacaced07..d5659745b 100644 --- a/sdrbase/settings/mainsettings.h +++ b/sdrbase/settings/mainsettings.h @@ -4,6 +4,7 @@ #include #include "preferences.h" #include "preset.h" +#include "audio/audiodeviceinfo.h" class MainSettings { public: @@ -30,8 +31,12 @@ public: float getLatitude() const { return m_preferences.getLatitude(); } float getLongitude() const { return m_preferences.getLongitude(); } + const AudioDeviceInfo *getAudioDeviceInfo() const { return m_audioDeviceInfo; } + void setAudioDeviceInfo(AudioDeviceInfo *audioDeviceInfo) { m_audioDeviceInfo = audioDeviceInfo; } + protected: Preferences m_preferences; + AudioDeviceInfo *m_audioDeviceInfo; Preset m_workingPreset; typedef QList Presets; Presets m_presets;