History

Reimplemented Tablet Audio screen using C++ model

Vladyslav Stelmakhovskyi committed 9 years ago

Commit d18ac6d1 parent c7ab4997 files · +208 −48Browse files

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

Unified · Split

interface/src/scripting/AudioDeviceScriptingInterface.cpp+113−2
@@ -33,11 +33,17 @@ bool AudioDeviceScriptingInterface::muted() · 32 unmodified lines
3333 return getMuted();
3434 }
3535
36−AudioDeviceScriptingInterface::AudioDeviceScriptingInterface() {
36+AudioDeviceScriptingInterface::AudioDeviceScriptingInterface(): QAbstractListModel(nullptr) {
3737 connect(DependencyManager::get<AudioClient>().data(), &AudioClient::muteToggled,
3838 this, &AudioDeviceScriptingInterface::muteToggled);
3939 connect(DependencyManager::get<AudioClient>().data(), &AudioClient::deviceChanged,
40− this, &AudioDeviceScriptingInterface::deviceChanged);
40+ this, &AudioDeviceScriptingInterface::onDeviceChanged, Qt::QueuedConnection);
41+ connect(DependencyManager::get<AudioClient>().data(), &AudioClient::currentInputDeviceChanged,
42+ this, &AudioDeviceScriptingInterface::onCurrentInputDeviceChanged, Qt::QueuedConnection);
43+ connect(DependencyManager::get<AudioClient>().data(), &AudioClient::currentOutputDeviceChanged,
44+ this, &AudioDeviceScriptingInterface::onCurrentOutputDeviceChanged, Qt::QueuedConnection);
45+ //fill up model
46+ onDeviceChanged();
4147 }
4248
4349 bool AudioDeviceScriptingInterface::setInputDevice(const QString& deviceName) {
@@ -51,13 +57,27 @@ bool AudioDeviceScriptingInterface::setInputDevice(const QString& deviceName) { · 7 unmodified lines
5157
5258 bool AudioDeviceScriptingInterface::setOutputDevice(const QString& deviceName) {
5359 bool result;
60+ QTime a; a.start();
5461 QMetaObject::invokeMethod(DependencyManager::get<AudioClient>().data(), "switchOutputToAudioDevice",
5562 Qt::BlockingQueuedConnection,
5663 Q_RETURN_ARG(bool, result),
5764 Q_ARG(const QString&, deviceName));
65+ qDebug() << "switching to" << deviceName << "elapsed" << a.elapsed();
5866 return result;
5967 }
6068
69+void AudioDeviceScriptingInterface::setInputDeviceAsync(const QString& deviceName) {
70+ QMetaObject::invokeMethod(DependencyManager::get<AudioClient>().data(), "switchInputToAudioDevice",
71+ Qt::QueuedConnection,
72+ Q_ARG(const QString&, deviceName));
73+}
74+
75+void AudioDeviceScriptingInterface::setOutputDeviceAsync(const QString& deviceName) {
76+ QMetaObject::invokeMethod(DependencyManager::get<AudioClient>().data(), "switchOutputToAudioDevice",
77+ Qt::QueuedConnection,
78+ Q_ARG(const QString&, deviceName));
79+}
80+
6181 QString AudioDeviceScriptingInterface::getInputDevice() {
6282 return DependencyManager::get<AudioClient>()->getDeviceName(QAudio::AudioInput);
6383 }
@@ -116,3 +136,94 @@ void AudioDeviceScriptingInterface::setMuted(bool muted) · 52 unmodified lines
116136 bool AudioDeviceScriptingInterface::getMuted() {
117137 return DependencyManager::get<AudioClient>()->isMuted();
118138 }
139+
140+QVariant AudioDeviceScriptingInterface::data(const QModelIndex& index, int role) const {
141+ //sanity
142+ if (!index.isValid() || index.row() >= _devices.size())
143+ return QVariant();
144+
145+
146+ if (role == Qt::DisplayRole || role == DisplayNameRole) {
147+ return _devices.at(index.row()).name;
148+ } else if (role == SelectedRole) {
149+ return _devices.at(index.row()).selected;
150+ } else if (role == AudioModeRole) {
151+ return (int)_devices.at(index.row()).mode;
152+ }
153+ return QVariant();
154+}
155+
156+int AudioDeviceScriptingInterface::rowCount(const QModelIndex& parent) const {
157+ Q_UNUSED(parent)
158+ return _devices.size();
159+}
160+
161+QHash<int, QByteArray> AudioDeviceScriptingInterface::roleNames() const {
162+ QHash<int, QByteArray> roles;
163+ roles.insert(DisplayNameRole, "devicename");
164+ roles.insert(SelectedRole, "devicechecked");
165+ roles.insert(AudioModeRole, "devicemode");
166+ return roles;
167+}
168+
169+void AudioDeviceScriptingInterface::onDeviceChanged()
170+{
171+ beginResetModel();
172+ _devices.clear();
173+ const QString &outDevice = getOutputDevice();
174+ for (QString name: getOutputDevices()) {
175+ AudioDeviceInfo di;
176+ di.name = name;
177+ di.selected = (name == outDevice);
178+ di.mode = QAudio::AudioOutput;
179+ _devices.append(di);
180+ }
181+ const QString &inDevice = getInputDevice();
182+ for (QString name: getInputDevices()) {
183+ AudioDeviceInfo di;
184+ di.name = name;
185+ di.selected = (name == inDevice);
186+ di.mode = QAudio::AudioInput;
187+ _devices.append(di);
188+ }
189+
190+ endResetModel();
191+ emit deviceChanged();
192+}
193+
194+void AudioDeviceScriptingInterface::onCurrentInputDeviceChanged()
195+{
196+ currentDeviceUpdate(getInputDevice(), QAudio::AudioInput);
197+ emit currentInputDeviceChanged();
198+}
199+
200+void AudioDeviceScriptingInterface::onCurrentOutputDeviceChanged()
201+{
202+ currentDeviceUpdate(getOutputDevice(), QAudio::AudioOutput);
203+ emit currentOutputDeviceChanged();
204+}
205+
206+void AudioDeviceScriptingInterface::currentDeviceUpdate(const QString &name, QAudio::Mode mode)
207+{
208+ QVector<int> role;
209+ role.append(SelectedRole);
210+
211+ qDebug() << "device update" << name << mode;
212+
213+ for (int i = 0; i < _devices.size(); i++) {
214+ AudioDeviceInfo di = _devices.at(i);
215+ if (di.mode != mode)
216+ continue;
217+ if (di.selected && di.name != name ) {
218+ di.selected = false;
219+ _devices[i] = di;
220+ emit dataChanged(index(i, 0), index(i, 0), role);
221+ }
222+ if (di.name == name) {
223+ di.selected = true;
224+ _devices[i] = di;
225+ emit dataChanged(index(i, 0), index(i, 0), role);
226+ qDebug() << "device updated" << di.name << i;
227+ }
228+ }
229+}