From 4d5327776309694b9480ddfb87ed5186015cefe7 Mon Sep 17 00:00:00 2001 From: "michal.szwaj" Date: Sun, 25 Mar 2018 17:30:57 +0200 Subject: [PATCH] Add settings for selection of audio output backend --- .../Configuration/AudioOutputBackendType.hpp | 39 +++++++++++++++ .../autoapp/Configuration/Configuration.hpp | 4 ++ .../autoapp/Configuration/IConfiguration.hpp | 3 ++ .../autoapp/Projection/ServiceFactory.hpp | 1 + src/autoapp/Configuration/Configuration.cpp | 14 ++++++ src/autoapp/Projection/ServiceFactory.cpp | 47 +++++++++++-------- src/autoapp/UI/SettingsWindow.cpp | 5 ++ src/autoapp/UI/settingswindow.ui | 41 ++++++++++++++++ 8 files changed, 135 insertions(+), 19 deletions(-) create mode 100644 include/f1x/openauto/autoapp/Configuration/AudioOutputBackendType.hpp diff --git a/include/f1x/openauto/autoapp/Configuration/AudioOutputBackendType.hpp b/include/f1x/openauto/autoapp/Configuration/AudioOutputBackendType.hpp new file mode 100644 index 0000000..e954874 --- /dev/null +++ b/include/f1x/openauto/autoapp/Configuration/AudioOutputBackendType.hpp @@ -0,0 +1,39 @@ +/* +* This file is part of openauto project. +* Copyright (C) 2018 f1x.studio (Michal Szwaj) +* +* openauto 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; either version 3 of the License, or +* (at your option) any later version. + +* openauto 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 for more details. +* +* You should have received a copy of the GNU General Public License +* along with openauto. If not, see . +*/ + +#pragma once + +namespace f1x +{ +namespace openauto +{ +namespace autoapp +{ +namespace configuration +{ + +enum class AudioOutputBackendType +{ + RTAUDIO, + QT +}; + +} +} +} +} diff --git a/include/f1x/openauto/autoapp/Configuration/Configuration.hpp b/include/f1x/openauto/autoapp/Configuration/Configuration.hpp index 93d44b3..f4a0649 100644 --- a/include/f1x/openauto/autoapp/Configuration/Configuration.hpp +++ b/include/f1x/openauto/autoapp/Configuration/Configuration.hpp @@ -69,6 +69,8 @@ public: void setMusicAudioChannelEnabled(bool value) override; bool speechAudioChannelEnabled() const override; void setSpeechAudioChannelEnabled(bool value) override; + AudioOutputBackendType getAudioOutputBackendType() const override; + void setAudioOutputBackendType(AudioOutputBackendType value) override; private: void readButtonCodes(boost::property_tree::ptree& iniConfig); @@ -88,6 +90,7 @@ private: std::string bluetoothRemoteAdapterAddress_; bool musicAudioChannelEnabled_; bool speechAudiochannelEnabled_; + AudioOutputBackendType audioOutputBackendType_; static const std::string cConfigFileName; @@ -103,6 +106,7 @@ private: static const std::string cAudioMusicAudioChannelEnabled; static const std::string cAudioSpeechAudioChannelEnabled; + static const std::string cAudioOutputBackendType; static const std::string cBluetoothAdapterTypeKey; static const std::string cBluetoothRemoteAdapterAddressKey; diff --git a/include/f1x/openauto/autoapp/Configuration/IConfiguration.hpp b/include/f1x/openauto/autoapp/Configuration/IConfiguration.hpp index 2f086cd..2165a68 100644 --- a/include/f1x/openauto/autoapp/Configuration/IConfiguration.hpp +++ b/include/f1x/openauto/autoapp/Configuration/IConfiguration.hpp @@ -25,6 +25,7 @@ #include #include #include +#include namespace f1x { @@ -77,6 +78,8 @@ public: virtual void setMusicAudioChannelEnabled(bool value) = 0; virtual bool speechAudioChannelEnabled() const = 0; virtual void setSpeechAudioChannelEnabled(bool value) = 0; + virtual AudioOutputBackendType getAudioOutputBackendType() const = 0; + virtual void setAudioOutputBackendType(AudioOutputBackendType value) = 0; }; } diff --git a/include/f1x/openauto/autoapp/Projection/ServiceFactory.hpp b/include/f1x/openauto/autoapp/Projection/ServiceFactory.hpp index 0d929b6..f7fdbd2 100644 --- a/include/f1x/openauto/autoapp/Projection/ServiceFactory.hpp +++ b/include/f1x/openauto/autoapp/Projection/ServiceFactory.hpp @@ -40,6 +40,7 @@ private: IService::Pointer createVideoService(aasdk::messenger::IMessenger::Pointer messenger); IService::Pointer createBluetoothService(aasdk::messenger::IMessenger::Pointer messenger); IService::Pointer createInputService(aasdk::messenger::IMessenger::Pointer messenger); + void createAudioServices(ServiceList& serviceList, aasdk::messenger::IMessenger::Pointer messenger); boost::asio::io_service& ioService_; configuration::IConfiguration::Pointer configuration_; diff --git a/src/autoapp/Configuration/Configuration.cpp b/src/autoapp/Configuration/Configuration.cpp index 72e51e1..0e79129 100644 --- a/src/autoapp/Configuration/Configuration.cpp +++ b/src/autoapp/Configuration/Configuration.cpp @@ -42,6 +42,7 @@ const std::string Configuration::cVideoMarginHeight = "Video.MarginHeight"; const std::string Configuration::cAudioMusicAudioChannelEnabled = "Audio.MusicAudioChannelEnabled"; const std::string Configuration::cAudioSpeechAudioChannelEnabled = "Audio.SpeechAudioChannelEnabled"; +const std::string Configuration::cAudioOutputBackendType = "Audio.OutputBackendType"; const std::string Configuration::cBluetoothAdapterTypeKey = "Bluetooth.AdapterType"; const std::string Configuration::cBluetoothRemoteAdapterAddressKey = "Bluetooth.RemoteAdapterAddress"; @@ -101,6 +102,7 @@ void Configuration::load() musicAudioChannelEnabled_ = iniConfig.get(cAudioMusicAudioChannelEnabled, true); speechAudiochannelEnabled_ = iniConfig.get(cAudioSpeechAudioChannelEnabled, true); + audioOutputBackendType_ = static_cast(iniConfig.get(cAudioOutputBackendType, static_cast(AudioOutputBackendType::RTAUDIO))); } catch(const boost::property_tree::ini_parser_error& e) { @@ -126,6 +128,7 @@ void Configuration::reset() bluetoothRemoteAdapterAddress_ = ""; musicAudioChannelEnabled_ = true; speechAudiochannelEnabled_ = true; + audioOutputBackendType_ = AudioOutputBackendType::RTAUDIO; } void Configuration::save() @@ -149,6 +152,7 @@ void Configuration::save() iniConfig.put(cAudioMusicAudioChannelEnabled, musicAudioChannelEnabled_); iniConfig.put(cAudioSpeechAudioChannelEnabled, speechAudiochannelEnabled_); + iniConfig.put(cAudioOutputBackendType, static_cast(audioOutputBackendType_)); boost::property_tree::ini_parser::write_ini(cConfigFileName, iniConfig); } @@ -282,6 +286,16 @@ void Configuration::setSpeechAudioChannelEnabled(bool value) speechAudiochannelEnabled_ = value; } +AudioOutputBackendType Configuration::getAudioOutputBackendType() const +{ + return audioOutputBackendType_; +} + +void Configuration::setAudioOutputBackendType(AudioOutputBackendType value) +{ + audioOutputBackendType_ = value; +} + void Configuration::readButtonCodes(boost::property_tree::ptree& iniConfig) { this->insertButtonCode(iniConfig, cInputPlayButtonKey, aasdk::proto::enums::ButtonCode::PLAY); diff --git a/src/autoapp/Projection/ServiceFactory.cpp b/src/autoapp/Projection/ServiceFactory.cpp index 82ede87..d10ddff 100644 --- a/src/autoapp/Projection/ServiceFactory.cpp +++ b/src/autoapp/Projection/ServiceFactory.cpp @@ -62,25 +62,7 @@ ServiceList ServiceFactory::create(aasdk::messenger::IMessenger::Pointer messeng IAudioInput::Pointer audioInput(new QtAudioInput(1, 16, 16000), std::bind(&QObject::deleteLater, std::placeholders::_1)); serviceList.emplace_back(std::make_shared(ioService_, messenger, std::move(audioInput))); - - if(configuration_->musicAudioChannelEnabled()) - { - //IAudioOutput::Pointer mediaAudioOutput(new QtAudioOutput(2, 16, 48000), std::bind(&QObject::deleteLater, std::placeholders::_1)); - auto mediaAudioOutput(std::make_shared(2, 16, 48000)); - serviceList.emplace_back(std::make_shared(ioService_, messenger, std::move(mediaAudioOutput))); - } - - if(configuration_->speechAudioChannelEnabled()) - { - //IAudioOutput::Pointer speechAudioOutput(new QtAudioOutput(1, 16, 16000), std::bind(&QObject::deleteLater, std::placeholders::_1)); - auto speechAudioOutput(std::make_shared(1, 16, 16000)); - serviceList.emplace_back(std::make_shared(ioService_, messenger, std::move(speechAudioOutput))); - } - - //IAudioOutput::Pointer systemAudioOutput(new QtAudioOutput(1, 16, 16000), std::bind(&QObject::deleteLater, std::placeholders::_1)); - auto systemAudioOutput(std::make_shared(1, 16, 16000)); - serviceList.emplace_back(std::make_shared(ioService_, messenger, std::move(systemAudioOutput))); - + this->createAudioServices(serviceList, messenger); serviceList.emplace_back(std::make_shared(ioService_, messenger)); serviceList.emplace_back(this->createVideoService(messenger)); serviceList.emplace_back(this->createBluetoothService(messenger)); @@ -145,6 +127,33 @@ IService::Pointer ServiceFactory::createInputService(aasdk::messenger::IMessenge return std::make_shared(ioService_, messenger, std::move(inputDevice)); } +void ServiceFactory::createAudioServices(ServiceList& serviceList, aasdk::messenger::IMessenger::Pointer messenger) +{ + if(configuration_->musicAudioChannelEnabled()) + { + auto mediaAudioOutput = configuration_->getAudioOutputBackendType() == configuration::AudioOutputBackendType::RTAUDIO ? + std::make_shared(2, 16, 48000) : + IAudioOutput::Pointer(new QtAudioOutput(2, 16, 48000), std::bind(&QObject::deleteLater, std::placeholders::_1)); + + serviceList.emplace_back(std::make_shared(ioService_, messenger, std::move(mediaAudioOutput))); + } + + if(configuration_->speechAudioChannelEnabled()) + { + auto speechAudioOutput = configuration_->getAudioOutputBackendType() == configuration::AudioOutputBackendType::RTAUDIO ? + std::make_shared(1, 16, 16000) : + IAudioOutput::Pointer(new QtAudioOutput(1, 16, 16000), std::bind(&QObject::deleteLater, std::placeholders::_1)); + + serviceList.emplace_back(std::make_shared(ioService_, messenger, std::move(speechAudioOutput))); + } + + auto systemAudioOutput = configuration_->getAudioOutputBackendType() == configuration::AudioOutputBackendType::RTAUDIO ? + std::make_shared(1, 16, 16000) : + IAudioOutput::Pointer(new QtAudioOutput(1, 16, 16000), std::bind(&QObject::deleteLater, std::placeholders::_1)); + + serviceList.emplace_back(std::make_shared(ioService_, messenger, std::move(systemAudioOutput))); +} + } } } diff --git a/src/autoapp/UI/SettingsWindow.cpp b/src/autoapp/UI/SettingsWindow.cpp index 3117cf3..5f64b3e 100644 --- a/src/autoapp/UI/SettingsWindow.cpp +++ b/src/autoapp/UI/SettingsWindow.cpp @@ -97,6 +97,7 @@ void SettingsWindow::onSave() configuration_->setMusicAudioChannelEnabled(ui_->checkBoxMusicAudioChannel->isChecked()); configuration_->setSpeechAudioChannelEnabled(ui_->checkBoxSpeechAudioChannel->isChecked()); + configuration_->setAudioOutputBackendType(ui_->radioButtonRtAudio->isChecked() ? configuration::AudioOutputBackendType::RTAUDIO : configuration::AudioOutputBackendType::QT); configuration_->save(); this->close(); @@ -149,6 +150,10 @@ void SettingsWindow::load() ui_->checkBoxMusicAudioChannel->setChecked(configuration_->musicAudioChannelEnabled()); ui_->checkBoxSpeechAudioChannel->setChecked(configuration_->speechAudioChannelEnabled()); + + const auto& audioOutputBackendType = configuration_->getAudioOutputBackendType(); + ui_->radioButtonRtAudio->setChecked(audioOutputBackendType == configuration::AudioOutputBackendType::RTAUDIO); + ui_->radioButtonQtAudio->setChecked(audioOutputBackendType == configuration::AudioOutputBackendType::QT); } void SettingsWindow::loadButtonCheckBoxes() diff --git a/src/autoapp/UI/settingswindow.ui b/src/autoapp/UI/settingswindow.ui index b066a78..4028487 100644 --- a/src/autoapp/UI/settingswindow.ui +++ b/src/autoapp/UI/settingswindow.ui @@ -486,6 +486,45 @@ color: rgb(238, 238, 236); + + + + 0 + 130 + 621 + 61 + + + + Output backend + + + + + 10 + 30 + 112 + 23 + + + + RT audio + + + + + + 140 + 30 + 112 + 23 + + + + Qt + + + @@ -969,6 +1008,8 @@ color: rgb(238, 238, 236); horizontalSliderScreenDPI checkBoxMusicAudioChannel checkBoxSpeechAudioChannel + radioButtonRtAudio + radioButtonQtAudio checkBoxEnableTouchscreen listWidgetButtons checkBoxPlayButton