History

Move most of the logic to C++ model, speed up initialization. Reduce number of AudioClient blocking calls to minimum

Vladyslav Stelmakhovskyi committed 9 years ago

Commit 2d46f9d1 parent 7ab69097 files · +109 −142Browse files

Showing the changes to interface/src/scripting/AudioDeviceScriptingInterface.cpp (1 of 7 files). Show all

Unified · Split

interface/src/scripting/AudioDeviceScriptingInterface.cpp+66−20
@@ -11,21 +11,19 @@ · 10 unmodified lines
1111
1212 #include "AudioClient.h"
1313 #include "AudioDeviceScriptingInterface.h"
14−
14+#include "SettingsScriptingInterface.h"
1515
1616 AudioDeviceScriptingInterface* AudioDeviceScriptingInterface::getInstance() {
1717 static AudioDeviceScriptingInterface sharedInstance;
1818 return &sharedInstance;
1919 }
2020
21−QStringList AudioDeviceScriptingInterface::inputAudioDevices() const
22−{
23− return DependencyManager::get<AudioClient>()->getDeviceNames(QAudio::AudioInput).toList();;
21+QStringList AudioDeviceScriptingInterface::inputAudioDevices() const {
22+ return _inputAudioDevices;
2423 }
2524
26−QStringList AudioDeviceScriptingInterface::outputAudioDevices() const
27−{
28− return DependencyManager::get<AudioClient>()->getDeviceNames(QAudio::AudioOutput).toList();;
25+QStringList AudioDeviceScriptingInterface::outputAudioDevices() const {
26+ return _outputAudioDevices;
2927 }
3028
3129 bool AudioDeviceScriptingInterface::muted()
@@ -44,6 +42,16 @@ AudioDeviceScriptingInterface::AudioDeviceScriptingInterface(): QAbstractListMod · 12 unmodified lines
4442 this, &AudioDeviceScriptingInterface::onCurrentOutputDeviceChanged, Qt::QueuedConnection);
4543 //fill up model
4644 onDeviceChanged();
45+ //set up previously saved device
46+ SettingsScriptingInterface *settings = SettingsScriptingInterface::getInstance();
47+ const QString inDevice = settings->getValue("audio_input_device").toString();
48+ if (inDevice != _currentInputDevice) {
49+ setInputDeviceAsync(inDevice);
50+ }
51+ const QString outDevice = settings->getValue("audio_output_device").toString();
52+ if (outDevice != _currentOutputDevice) {
53+ setOutputDeviceAsync(outDevice);
54+ }
4755 }
4856
4957 bool AudioDeviceScriptingInterface::setInputDevice(const QString& deviceName) {
@@ -64,6 +72,31 @@ bool AudioDeviceScriptingInterface::setOutputDevice(const QString& deviceName) { · 14 unmodified lines
6472 return result;
6573 }
6674
75+bool AudioDeviceScriptingInterface::setDeviceFromMenu(const QString &deviceMenuName) {
76+ QAudio::Mode mode;
77+
78+ if (deviceMenuName.indexOf("for Output") != -1) {
79+ mode = QAudio::AudioOutput;
80+ } else if (deviceMenuName.indexOf("for Input") != -1) {
81+ mode = QAudio::AudioInput;
82+ } else {
83+ return false;
84+ }
85+
86+ for (ScriptingAudioDeviceInfo di: _devices) {
87+ if (mode == di.mode && deviceMenuName.contains(di.name)) {
88+ if (mode == QAudio::AudioOutput) {
89+ setOutputDeviceAsync(di.name);
90+ } else {
91+ setInputDeviceAsync(di.name);
92+ }
93+ return true;
94+ }
95+ }
96+
97+ return false;
98+}
99+
67100 void AudioDeviceScriptingInterface::setInputDeviceAsync(const QString& deviceName) {
68101 QMetaObject::invokeMethod(DependencyManager::get<AudioClient>().data(), "switchInputToAudioDevice",
69102 Qt::QueuedConnection,
@@ -167,38 +200,51 @@ QHash<int, QByteArray> AudioDeviceScriptingInterface::roleNames() const { · 97 unmodified lines
167200 void AudioDeviceScriptingInterface::onDeviceChanged()
168201 {
169202 beginResetModel();
203+ _outputAudioDevices.clear();
170204 _devices.clear();
171− const QString &outDevice = getOutputDevice();
205+ _currentOutputDevice = getOutputDevice();
172206 for (QString name: getOutputDevices()) {
173− AudioDeviceInfo di;
207+ ScriptingAudioDeviceInfo di;
174208 di.name = name;
175− di.selected = (name == outDevice);
209+ di.selected = (name == _currentOutputDevice);
176210 di.mode = QAudio::AudioOutput;
177211 _devices.append(di);
212+ _outputAudioDevices.append(name);
178213 }
179− const QString &inDevice = getInputDevice();
214+ emit outputAudioDevicesChanged(_outputAudioDevices);
215+
216+ _inputAudioDevices.clear();
217+ _currentInputDevice = getInputDevice();
180218 for (QString name: getInputDevices()) {
181− AudioDeviceInfo di;
219+ ScriptingAudioDeviceInfo di;
182220 di.name = name;
183− di.selected = (name == inDevice);
221+ di.selected = (name == _currentInputDevice);
184222 di.mode = QAudio::AudioInput;
185223 _devices.append(di);
224+ _inputAudioDevices.append(name);
186225 }
226+ emit inputAudioDevicesChanged(_inputAudioDevices);
187227
188228 endResetModel();
189229 emit deviceChanged();
190230 }
191231
192−void AudioDeviceScriptingInterface::onCurrentInputDeviceChanged()
232+void AudioDeviceScriptingInterface::onCurrentInputDeviceChanged(const QString &name)
193233 {
194− currentDeviceUpdate(getInputDevice(), QAudio::AudioInput);
195− emit currentInputDeviceChanged();
234+ currentDeviceUpdate(name, QAudio::AudioInput);
235+ //we got a signal that device changed. Save it now
236+ SettingsScriptingInterface *settings = SettingsScriptingInterface::getInstance();
237+ settings->setValue("audio_input_device", name);
238+ emit currentInputDeviceChanged(name);
196239 }
197240
198−void AudioDeviceScriptingInterface::onCurrentOutputDeviceChanged()
241+void AudioDeviceScriptingInterface::onCurrentOutputDeviceChanged(const QString &name)
199242 {
200− currentDeviceUpdate(getOutputDevice(), QAudio::AudioOutput);
201− emit currentOutputDeviceChanged();
243+ currentDeviceUpdate(name, QAudio::AudioOutput);
244+ //we got a signal that device changed. Save it now
245+ SettingsScriptingInterface *settings = SettingsScriptingInterface::getInstance();
246+ settings->setValue("audio_output_device", name);
247+ emit currentOutputDeviceChanged(name);
202248 }
203249
204250 void AudioDeviceScriptingInterface::currentDeviceUpdate(const QString &name, QAudio::Mode mode)
@@ -207,7 +253,7 @@ void AudioDeviceScriptingInterface::currentDeviceUpdate(const QString &name, QAu · 2 unmodified lines
207253 role.append(SelectedRole);
208254
209255 for (int i = 0; i < _devices.size(); i++) {
210− AudioDeviceInfo di = _devices.at(i);
256+ ScriptingAudioDeviceInfo di = _devices.at(i);
211257 if (di.mode != mode)
212258 continue;
213259 if (di.selected && di.name != name ) {