1
/****************************************************************************
2
* Copyright (C) 2013-2014 by Savoir-Faire Linux *
3
* Author : Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> *
5
* This library is free software; you can redistribute it and/or *
6
* modify it under the terms of the GNU Lesser General Public *
7
* License as published by the Free Software Foundation; either *
8
* version 2.1 of the License, or (at your option) any later version. *
10
* This library is distributed in the hope that it will be useful, *
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
13
* Lesser General Public License for more details. *
15
* You should have received a copy of the GNU General Public License *
16
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
17
***************************************************************************/
18
#include "audiosettingsmodel.h"
19
#include "dbus/configurationmanager.h"
20
#include "dbus/callmanager.h"
22
AudioSettingsModel* AudioSettingsModel::m_spInstance = nullptr;
25
AudioSettingsModel::AudioSettingsModel() : QObject(),m_EnableRoomTone(false),
26
m_pAlsaPluginModel (nullptr), m_pInputDeviceModel (nullptr),
27
m_pAudioManagerModel(nullptr), m_pRingtoneDeviceModel(nullptr),
28
m_pOutputDeviceModel(nullptr)
30
m_pRingtoneDeviceModel = new RingtoneDeviceModel (this);
34
AudioSettingsModel::~AudioSettingsModel()
36
delete m_pAlsaPluginModel ;
37
delete m_pInputDeviceModel ;
38
delete m_pOutputDeviceModel ;
39
delete m_pAudioManagerModel ;
40
delete m_pRingtoneDeviceModel;
44
AudioSettingsModel* AudioSettingsModel::instance()
47
m_spInstance = new AudioSettingsModel();
51
///Return plugin model (alsa only for the time being)
52
AlsaPluginModel* AudioSettingsModel::alsaPluginModel()
54
if (!m_pAlsaPluginModel)
55
m_pAlsaPluginModel = new AlsaPluginModel(this);
56
return m_pAlsaPluginModel;
59
///Return the input device model
60
InputDeviceModel* AudioSettingsModel::inputDeviceModel()
62
if (!m_pInputDeviceModel)
63
m_pInputDeviceModel = new InputDeviceModel(this);
64
return m_pInputDeviceModel;
67
///Return the output device model
68
OutputDeviceModel* AudioSettingsModel::outputDeviceModel()
70
if (!m_pOutputDeviceModel)
71
m_pOutputDeviceModel = new OutputDeviceModel(this);
72
return m_pOutputDeviceModel;
75
///Return audio manager
76
AudioManagerModel* AudioSettingsModel::audioManagerModel()
78
if (!m_pAudioManagerModel)
79
m_pAudioManagerModel = new AudioManagerModel(this);
80
return m_pAudioManagerModel;
83
///Return the ringtone device model
84
RingtoneDeviceModel* AudioSettingsModel::ringtoneDeviceModel()
86
if (!m_pRingtoneDeviceModel)
87
m_pRingtoneDeviceModel = new RingtoneDeviceModel (this);
88
return m_pRingtoneDeviceModel;
91
///Is the room tone (globally) enabled
92
bool AudioSettingsModel::isRoomToneEnabled()
94
return m_EnableRoomTone;
98
void AudioSettingsModel::reload()
100
m_pAlsaPluginModel->reload();
101
m_pInputDeviceModel->reload();
102
m_pOutputDeviceModel->reload();
103
// m_pAudioManagerModel->reload();
104
m_pRingtoneDeviceModel->reload();
108
AudioSettingsModel::ToneType AudioSettingsModel::playRoomTone() const
110
CallManagerInterface& callManager = DBus::CallManager::instance();
111
callManager.startTone(true,static_cast<int>(AudioSettingsModel::ToneType::WITHOUT_MESSAGE));
112
//TODO support voicemail
113
return AudioSettingsModel::ToneType::WITHOUT_MESSAGE;
116
///Stop room tone if it is playing
117
void AudioSettingsModel::stopRoomTone() const
119
CallManagerInterface& callManager = DBus::CallManager::instance();
120
callManager.startTone(false,0);
123
///Set if the roomtone is (globally) enabled
124
void AudioSettingsModel::setEnableRoomTone(bool enable)
126
m_EnableRoomTone = enable;
129
///Enable noise suppress code, may make things worst
130
void AudioSettingsModel::setNoiseSuppressState(bool enabled)
132
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
133
configurationManager.setNoiseSuppressState(enabled);
136
///Enable noise suppress code, may make things worst
137
bool AudioSettingsModel::isNoiseSuppressEnabled() const
139
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
140
return configurationManager.getNoiseSuppressState();
144
void AudioSettingsModel::mutePlayback(bool m)
146
DBus::ConfigurationManager::instance().mutePlayback(m);
147
emit playbackMuted(m);
151
void AudioSettingsModel::muteCapture(bool m)
153
DBus::ConfigurationManager::instance().muteCapture(m);
154
emit captureMuted(m);
158
bool AudioSettingsModel::isPlaybackMuted() const
160
return DBus::ConfigurationManager::instance().isPlaybackMuted();
164
bool AudioSettingsModel::isCaptureMuted() const
166
return DBus::ConfigurationManager::instance().isCaptureMuted();
169
int AudioSettingsModel::playbackVolume() const
171
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
172
return configurationManager.getVolume(DeviceKey::PLAYBACK)*100;
175
int AudioSettingsModel::captureVolume() const
177
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
178
return configurationManager.getVolume(DeviceKey::CAPTURE)*100;
181
void AudioSettingsModel::setPlaybackVolume(int volume)
183
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
184
configurationManager.setVolume(DeviceKey::PLAYBACK,volume/100.0f);
185
emit playbackVolumeChanged(volume);
188
void AudioSettingsModel::setCaptureVolume(int volume)
190
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
191
configurationManager.setVolume(DeviceKey::CAPTURE,volume/100.0f);
192
emit captureVolumeChanged(volume);
195
void AudioSettingsModel::setDTMFMuted(bool muted)
198
DBus::ConfigurationManager::instance().muteDtmf(muted);
199
emit DTMFMutedChanged(muted);
202
bool AudioSettingsModel::areDTMFMuted() const
204
return DBus::ConfigurationManager::instance().isDtmfMuted();
207
/****************************************************************
211
***************************************************************/
213
AlsaPluginModel::AlsaPluginModel(QObject* parent) : QAbstractListModel(parent)
215
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
216
m_lDeviceList = configurationManager.getAudioPluginList();
220
AlsaPluginModel::~AlsaPluginModel()
225
///Re-implement QAbstractListModel data
226
QVariant AlsaPluginModel::data( const QModelIndex& index, int role) const
228
if (!index.isValid())
231
case Qt::DisplayRole:
232
return m_lDeviceList[index.row()];
237
///Re-implement QAbstractListModel rowCount
238
int AlsaPluginModel::rowCount( const QModelIndex& parent ) const
240
if (parent.isValid())
242
return m_lDeviceList.size();
245
///Re-implement QAbstractListModel flags
246
Qt::ItemFlags AlsaPluginModel::flags( const QModelIndex& index ) const
249
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
252
///Setting data is disabled
253
bool AlsaPluginModel::setData( const QModelIndex& index, const QVariant &value, int role)
261
///Return the current index
262
QModelIndex AlsaPluginModel::currentPlugin() const
264
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
265
const int idx = m_lDeviceList.indexOf(configurationManager.getCurrentAudioOutputPlugin());
266
qDebug() << "Invalid current audio plugin";
268
return QModelIndex();
270
return index(idx,0,QModelIndex());
273
///Set the current index
274
void AlsaPluginModel::setCurrentPlugin(const QModelIndex& idx)
278
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
279
configurationManager.setAudioPlugin(m_lDeviceList[idx.row()]);
282
///Set the current index (qcombobox compatibility shim)
283
void AlsaPluginModel::setCurrentPlugin(int idx)
285
setCurrentPlugin(index(idx,0));
288
///Reload to current daemon state
289
void AlsaPluginModel::reload()
291
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
292
m_lDeviceList = configurationManager.getAudioPluginList();
293
emit layoutChanged();
294
emit dataChanged(index(0,0),index(m_lDeviceList.size()-1,0));
298
/****************************************************************
302
***************************************************************/
305
InputDeviceModel::InputDeviceModel(QObject* parent) : QAbstractListModel(parent)
307
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
308
m_lDeviceList = configurationManager.getAudioInputDeviceList ();
312
InputDeviceModel::~InputDeviceModel()
317
///Re-implement QAbstractListModel data
318
QVariant InputDeviceModel::data( const QModelIndex& index, int role) const
320
if (!index.isValid())
323
case Qt::DisplayRole:
324
return m_lDeviceList[index.row()];
329
///Re-implement QAbstractListModel rowCount
330
int InputDeviceModel::rowCount( const QModelIndex& parent ) const
332
if (parent.isValid())
334
return m_lDeviceList.size();
337
///Re-implement QAbstractListModel flags
338
Qt::ItemFlags InputDeviceModel::flags( const QModelIndex& index ) const
341
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
344
///This model does not support setting data
345
bool InputDeviceModel::setData( const QModelIndex& index, const QVariant &value, int role)
353
///Return the current input device index
354
QModelIndex InputDeviceModel::currentDevice() const
356
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
357
const QStringList currentDevices = configurationManager.getCurrentAudioDevicesIndex();
358
const int idx = currentDevices[AudioSettingsModel::DeviceIndex::INPUT].toInt();
359
if (idx >= m_lDeviceList.size())
360
return QModelIndex();
364
///Set the current input device
365
void InputDeviceModel::setCurrentDevice(const QModelIndex& index)
367
if (index.isValid()) {
368
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
369
configurationManager.setAudioInputDevice(index.row());
373
///QCombobox signals -> QModelIndex shim
374
void InputDeviceModel::setCurrentDevice(int idx)
376
setCurrentDevice(index(idx,0));
379
///Reload input device list
380
void InputDeviceModel::reload()
382
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
383
m_lDeviceList = configurationManager.getAudioInputDeviceList ();
384
emit layoutChanged();
385
emit dataChanged(index(0,0),index(m_lDeviceList.size()-1,0));
389
/****************************************************************
391
* OutputDeviceModel *
393
***************************************************************/
396
OutputDeviceModel::OutputDeviceModel(QObject* parent) : QAbstractListModel(parent)
398
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
399
m_lDeviceList = configurationManager.getAudioOutputDeviceList();
403
OutputDeviceModel::~OutputDeviceModel()
408
///Re-implement QAbstractListModel data
409
QVariant OutputDeviceModel::data( const QModelIndex& index, int role) const
411
if (!index.isValid())
414
case Qt::DisplayRole:
415
return m_lDeviceList[index.row()];
420
///Re-implement QAbstractListModel rowCount
421
int OutputDeviceModel::rowCount( const QModelIndex& parent ) const
423
if (parent.isValid())
425
return m_lDeviceList.size();
428
///Re-implement QAbstractListModel flags
429
Qt::ItemFlags OutputDeviceModel::flags( const QModelIndex& index ) const
432
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
435
///This model is read only
436
bool OutputDeviceModel::setData( const QModelIndex& index, const QVariant &value, int role)
444
///Return the current output device
445
QModelIndex OutputDeviceModel::currentDevice() const
447
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
448
const QStringList currentDevices = configurationManager.getCurrentAudioDevicesIndex();
449
const int idx = currentDevices[AudioSettingsModel::DeviceIndex::OUTPUT].toInt();
451
if (idx >= m_lDeviceList.size())
452
return QModelIndex();
456
///Set the current output device
457
void OutputDeviceModel::setCurrentDevice(const QModelIndex& index)
459
if (index.isValid()) {
460
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
461
configurationManager.setAudioOutputDevice(index.row());
465
///QCombobox index -> QModelIndex shim
466
void OutputDeviceModel::setCurrentDevice(int idx)
468
setCurrentDevice(index(idx,0));
471
///reload output devices list
472
void OutputDeviceModel::reload()
474
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
475
m_lDeviceList = configurationManager.getAudioOutputDeviceList();
476
emit layoutChanged();
477
emit dataChanged(index(0,0),index(m_lDeviceList.size()-1,0));
480
/****************************************************************
482
* AudioManagerModel *
484
***************************************************************/
487
AudioManagerModel::AudioManagerModel(QObject* parent) : QAbstractListModel(parent)
489
m_lDeviceList << "ALSA" << "Pulse Audio";
493
AudioManagerModel::~AudioManagerModel()
495
m_lDeviceList.clear();
498
///Re-implement QAbstractListModel data
499
QVariant AudioManagerModel::data( const QModelIndex& index, int role) const
501
if (!index.isValid())
504
case Qt::DisplayRole:
505
return m_lDeviceList[index.row()];
510
///Re-implement QAbstractListModel rowCount
511
int AudioManagerModel::rowCount( const QModelIndex& parent ) const
513
if (parent.isValid())
515
return m_lDeviceList.size();
518
///Re-implement QAbstractListModel flags
519
Qt::ItemFlags AudioManagerModel::flags( const QModelIndex& index ) const
522
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
525
///This model is read only
526
bool AudioManagerModel::setData( const QModelIndex& index, const QVariant &value, int role)
535
* Return the current audio manager
536
* @warning Changes to the current index model will invalid Input/Output/Ringtone devices models
538
QModelIndex AudioManagerModel::currentManager() const
540
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
541
const QString manager = configurationManager.getAudioManager();
542
if (manager == ManagerName::PULSEAUDIO)
543
return index((int)Manager::PULSE,0);
544
else if (manager == ManagerName::ALSA)
545
return index((int)Manager::ALSA,0);
546
return QModelIndex();
549
///Set current audio manager
550
void AudioManagerModel::setCurrentManager(const QModelIndex& idx)
555
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
556
switch (static_cast<Manager>(idx.row())) {
558
configurationManager.setAudioManager(ManagerName::PULSEAUDIO);
559
AudioSettingsModel::instance()->reload();
562
configurationManager.setAudioManager(ManagerName::ALSA);
563
AudioSettingsModel::instance()->reload();
568
///QCombobox -> QModelIndex shim
569
void AudioManagerModel::setCurrentManager(int idx)
571
setCurrentManager(index(idx,0));
574
/****************************************************************
576
* RingtoneDeviceModel *
578
***************************************************************/
581
RingtoneDeviceModel::RingtoneDeviceModel(QObject* parent) : QAbstractListModel(parent)
583
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
584
m_lDeviceList = configurationManager.getAudioOutputDeviceList();
588
RingtoneDeviceModel::~RingtoneDeviceModel()
593
///Re-implement QAbstractListModel data
594
QVariant RingtoneDeviceModel::data( const QModelIndex& index, int role) const
596
if (!index.isValid())
599
case Qt::DisplayRole:
600
return m_lDeviceList[index.row()];
605
///Re-implement QAbstractListModel rowCount
606
int RingtoneDeviceModel::rowCount( const QModelIndex& parent ) const
608
if (parent.isValid())
610
return m_lDeviceList.size();
613
///Re-implement QAbstractListModel flags
614
Qt::ItemFlags RingtoneDeviceModel::flags( const QModelIndex& index ) const
617
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
620
///RingtoneDeviceModel is read only
621
bool RingtoneDeviceModel::setData( const QModelIndex& index, const QVariant &value, int role)
629
///Return the current ringtone device
630
QModelIndex RingtoneDeviceModel::currentDevice() const
632
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
633
const QStringList currentDevices = configurationManager.getCurrentAudioDevicesIndex();
634
const int idx = currentDevices[AudioSettingsModel::DeviceIndex::RINGTONE].toInt();
635
if (idx >= m_lDeviceList.size())
636
return QModelIndex();
640
///Set the current ringtone device
641
void RingtoneDeviceModel::setCurrentDevice(const QModelIndex& index)
643
if (index.isValid()) {
644
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
645
configurationManager.setAudioRingtoneDevice(index.row());
649
///QCombobox -> QModelIndex shim
650
void RingtoneDeviceModel::setCurrentDevice(int idx)
652
setCurrentDevice(index(idx,0));
655
///Reload ringtone device list
656
void RingtoneDeviceModel::reload()
658
ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance();
659
m_lDeviceList = configurationManager.getAudioOutputDeviceList();
660
emit layoutChanged();
661
emit dataChanged(index(0,0),index(m_lDeviceList.size()-1,0));