From e1033b9db2e89eeb5e463bcfbe15c34d65f0017c Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Tue, 1 Oct 2024 11:18:31 +0200 Subject: [PATCH] Add ringer device option --- Linphone/core/setting/SettingsCore.cpp | 26 ++++++++++++++ Linphone/core/setting/SettingsCore.hpp | 10 ++++++ Linphone/data/image/bell-ringer.svg | 3 ++ Linphone/model/setting/SettingsModel.cpp | 36 ++++++++++++++++++- Linphone/model/setting/SettingsModel.hpp | 6 ++++ .../Layout/Settings/CallSettingsLayout.qml | 31 ++++++++++++++++ Linphone/view/Style/AppIcons.qml | 1 + 7 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 Linphone/data/image/bell-ringer.svg diff --git a/Linphone/core/setting/SettingsCore.cpp b/Linphone/core/setting/SettingsCore.cpp index 70a54930e..9f4a3e210 100644 --- a/Linphone/core/setting/SettingsCore.cpp +++ b/Linphone/core/setting/SettingsCore.cpp @@ -53,6 +53,7 @@ SettingsCore::SettingsCore(QObject *parent) : QObject(parent) { // Audio mCaptureDevices = mSettingsModel->getCaptureDevices(); mPlaybackDevices = mSettingsModel->getPlaybackDevices(); + mRingerDevices = mSettingsModel->getRingerDevices(); mCaptureDevice = mSettingsModel->getCaptureDevice(); mPlaybackDevice = mSettingsModel->getPlaybackDevice(); @@ -176,6 +177,16 @@ void SettingsCore::setSelf(QSharedPointer me) { emit playbackDeviceChanged(device); }); }); + mSettingsModelConnection->makeConnectToCore(&SettingsCore::lSetRingerDevice, [this](const QString id) { + mSettingsModelConnection->invokeToModel([this, id]() { mSettingsModel->setRingerDevice(id); }); + }); + + mSettingsModelConnection->makeConnectToModel(&SettingsModel::ringerDeviceChanged, [this](const QString device) { + mSettingsModelConnection->invokeToCore([this, device]() { + mRingerDevice = device; + emit ringerDeviceChanged(device); + }); + }); mSettingsModelConnection->makeConnectToCore(&SettingsCore::lSetPlaybackGain, [this](const float value) { mSettingsModelConnection->invokeToModel([this, value]() { mSettingsModel->setPlaybackGain(value); }); @@ -218,6 +229,13 @@ void SettingsCore::setSelf(QSharedPointer me) { emit playbackDevicesChanged(devices); }); }); + mSettingsModelConnection->makeConnectToModel(&SettingsModel::ringerDevicesChanged, + [this](const QStringList devices) { + mSettingsModelConnection->invokeToCore([this, devices]() { + mRingerDevices = devices; + emit ringerDevicesChanged(devices); + }); + }); // Video device(s) mSettingsModelConnection->makeConnectToCore(&SettingsCore::lSetVideoDevice, [this](const QString id) { @@ -346,6 +364,10 @@ QStringList SettingsCore::getPlaybackDevices() const { return mPlaybackDevices; } +QStringList SettingsCore::getRingerDevices() const { + return mRingerDevices; +} + int SettingsCore::getVideoDeviceIndex() const { return mVideoDevices.indexOf(mVideoDevice); } @@ -374,6 +396,10 @@ QString SettingsCore::getPlaybackDevice() const { return mPlaybackDevice; } +QString SettingsCore::getRingerDevice() const { + return mRingerDevice; +} + int SettingsCore::getEchoCancellationCalibration() const { return mEchoCancellationCalibration; } diff --git a/Linphone/core/setting/SettingsCore.hpp b/Linphone/core/setting/SettingsCore.hpp index cdd6e5220..e3417e7c9 100644 --- a/Linphone/core/setting/SettingsCore.hpp +++ b/Linphone/core/setting/SettingsCore.hpp @@ -48,12 +48,14 @@ class SettingsCore : public QObject, public AbstractObject { Q_PROPERTY(QStringList captureDevices READ getCaptureDevices NOTIFY captureDevicesChanged) Q_PROPERTY(QStringList playbackDevices READ getPlaybackDevices NOTIFY playbackDevicesChanged) + Q_PROPERTY(QStringList ringerDevices READ getRingerDevices NOTIFY ringerDevicesChanged) Q_PROPERTY(float playbackGain READ getPlaybackGain WRITE lSetPlaybackGain NOTIFY playbackGainChanged) Q_PROPERTY(float captureGain READ getCaptureGain WRITE lSetCaptureGain NOTIFY captureGainChanged) Q_PROPERTY(QString captureDevice READ getCaptureDevice WRITE lSetCaptureDevice NOTIFY captureDeviceChanged) Q_PROPERTY(QString playbackDevice READ getPlaybackDevice WRITE lSetPlaybackDevice NOTIFY playbackDeviceChanged) + Q_PROPERTY(QString ringerDevice READ getRingerDevice WRITE lSetRingerDevice NOTIFY ringerDeviceChanged) Q_PROPERTY(QStringList videoDevices READ getVideoDevices NOTIFY videoDevicesChanged) Q_PROPERTY(QString videoDevice READ getVideoDevice WRITE lSetVideoDevice NOTIFY videoDeviceChanged) @@ -109,10 +111,12 @@ public: QStringList getCaptureDevices() const; QStringList getPlaybackDevices() const; + QStringList getRingerDevices() const; QString getCaptureDevice() const; QString getPlaybackDevice() const; + QString getRingerDevice() const; QString getVideoDevice() const { return mVideoDevice; @@ -188,6 +192,7 @@ signals: void captureDevicesChanged(const QStringList &devices); void playbackDevicesChanged(const QStringList &devices); + void ringerDevicesChanged(const QStringList &devices); void lSetCaptureDevice(const QString &device); void captureDeviceChanged(const QString &device); @@ -195,6 +200,9 @@ signals: void lSetPlaybackDevice(const QString &device); void playbackDeviceChanged(const QString &device); + void lSetRingerDevice(const QString &device); + void ringerDeviceChanged(const QString &device); + void lSetVideoDevice(const QString &device); void videoDeviceChanged(); void videoDevicesChanged(); @@ -242,8 +250,10 @@ private: // Audio QStringList mCaptureDevices; QStringList mPlaybackDevices; + QStringList mRingerDevices; QString mCaptureDevice; QString mPlaybackDevice; + QString mRingerDevice; // Video QStringList mVideoDevices; diff --git a/Linphone/data/image/bell-ringer.svg b/Linphone/data/image/bell-ringer.svg new file mode 100644 index 000000000..c234da3ce --- /dev/null +++ b/Linphone/data/image/bell-ringer.svg @@ -0,0 +1,3 @@ + + + diff --git a/Linphone/model/setting/SettingsModel.cpp b/Linphone/model/setting/SettingsModel.cpp index a9cb03edc..abe28714e 100644 --- a/Linphone/model/setting/SettingsModel.cpp +++ b/Linphone/model/setting/SettingsModel.cpp @@ -158,6 +158,8 @@ void SettingsModel::accessCallSettings() { emit captureDevicesChanged(getCaptureDevices()); emit playbackDevicesChanged(getPlaybackDevices()); emit playbackDeviceChanged(getPlaybackDevice()); + emit ringerDevicesChanged(getRingerDevices()); + emit ringerDeviceChanged(getRingerDevice()); emit captureDeviceChanged(getCaptureDevice()); emit playbackGainChanged(getPlaybackGain()); emit captureGainChanged(getCaptureGain()); @@ -252,6 +254,19 @@ QStringList SettingsModel::getPlaybackDevices() const { return list; } +QStringList SettingsModel::getRingerDevices() const { + mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); + shared_ptr core = CoreModel::getInstance()->getCore(); + QStringList list; + + for (const auto &device : core->getExtendedAudioDevices()) { + if (device->hasCapability(linphone::AudioDevice::Capabilities::CapabilityPlay)) + list << Utils::coreStringToAppString(device->getId()); + } + + return list; +} + // ----------------------------------------------------------------------------- QString SettingsModel::getCaptureDevice() const { @@ -296,7 +311,6 @@ void SettingsModel::setPlaybackDevice(const QString &device) { if (audioDevice != list.cend()) { CoreModel::getInstance()->getCore()->setDefaultOutputAudioDevice(*audioDevice); CoreModel::getInstance()->getCore()->setOutputAudioDevice(*audioDevice); - CoreModel::getInstance()->getCore()->setRingerDevice(devId); emit playbackDeviceChanged(device); resetCaptureGraph(); } else qWarning() << "Cannot set Playback device. The ID cannot be matched with an existant device : " << device; @@ -304,6 +318,26 @@ void SettingsModel::setPlaybackDevice(const QString &device) { // ----------------------------------------------------------------------------- +QString SettingsModel::getRingerDevice() const { + mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); + return Utils::coreStringToAppString(CoreModel::getInstance()->getCore()->getRingerDevice()); +} + +void SettingsModel::setRingerDevice(const QString &device) { + mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); + std::string devId = Utils::appStringToCoreString(device); + + auto list = CoreModel::getInstance()->getCore()->getExtendedAudioDevices(); + auto audioDevice = + find_if(list.cbegin(), list.cend(), + [&](const std::shared_ptr &audioItem) { return audioItem->getId() == devId; }); + if (audioDevice != list.cend()) { + CoreModel::getInstance()->getCore()->setRingerDevice(devId); + emit ringerDeviceChanged(device); + } else qWarning() << "Cannot set Ringer device. The ID cannot be matched with an existant device : " << device; +} + +// ----------------------------------------------------------------------------- bool SettingsModel::getVideoEnabled() const { mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); return CoreModel::getInstance()->getCore()->videoEnabled(); diff --git a/Linphone/model/setting/SettingsModel.hpp b/Linphone/model/setting/SettingsModel.hpp index 86257af0b..88c78816c 100644 --- a/Linphone/model/setting/SettingsModel.hpp +++ b/Linphone/model/setting/SettingsModel.hpp @@ -81,6 +81,7 @@ public: QStringList getCaptureDevices() const; QStringList getPlaybackDevices() const; + QStringList getRingerDevices() const; QString getCaptureDevice() const; void setCaptureDevice(const QString &device); @@ -88,6 +89,9 @@ public: QString getPlaybackDevice() const; void setPlaybackDevice(const QString &device); + QString getRingerDevice() const; + void setRingerDevice(const QString &device); + void startEchoCancellerCalibration(); int getEchoCancellationCalibration() const; @@ -159,9 +163,11 @@ signals: void captureDevicesChanged(const QStringList &devices); void playbackDevicesChanged(const QStringList &devices); + void ringerDevicesChanged(const QStringList &devices); void captureDeviceChanged(const QString &device); void playbackDeviceChanged(const QString &device); + void ringerDeviceChanged(const QString &device); void showAudioCodecsChanged(bool status); diff --git a/Linphone/view/Page/Layout/Settings/CallSettingsLayout.qml b/Linphone/view/Page/Layout/Settings/CallSettingsLayout.qml index 03bb72800..c25acb98d 100644 --- a/Linphone/view/Page/Layout/Settings/CallSettingsLayout.qml +++ b/Linphone/view/Page/Layout/Settings/CallSettingsLayout.qml @@ -75,6 +75,37 @@ AbstractSettingsLayout { Layout.topMargin: 20 * DefaultStyle.dp Layout.leftMargin: 64 * DefaultStyle.dp + ColumnLayout { + spacing: 0 + RowLayout { + EffectImage { + imageSource: AppIcons.bellRinger + colorizationColor: DefaultStyle.main1_500_main + Layout.preferredWidth: 24 * DefaultStyle.dp + Layout.preferredHeight: 24 * DefaultStyle.dp + imageWidth: 24 * DefaultStyle.dp + imageHeight: 24 * DefaultStyle.dp + } + Text { + text: qsTr("Sonnerie - Appels entrants") + Layout.leftMargin: 9 + font: Typography.p2l + color: DefaultStyle.main2_600 + Layout.fillWidth: true + } + } + ComboSetting { + Layout.fillWidth: true + Layout.topMargin: 12 * DefaultStyle.dp + Layout.preferredWidth: parent.width + entries: SettingsCpp.ringerDevices + propertyName: "ringerDevice" + propertyOwner: SettingsCpp + } + Item { + Layout.fillHeight: true + } + } ColumnLayout { spacing: 0 RowLayout { diff --git a/Linphone/view/Style/AppIcons.qml b/Linphone/view/Style/AppIcons.qml index dff6bd669..c6f52313d 100644 --- a/Linphone/view/Style/AppIcons.qml +++ b/Linphone/view/Style/AppIcons.qml @@ -115,5 +115,6 @@ QtObject { property string desktop: "image://internal/desktop.svg" property string calendar: "image://internal/calendar.svg" property string bellDnd: "image://internal/bell-dnd.svg" + property string bellRinger: "image://internal/bell-ringer.svg" property string voicemail: "image://internal/voicemail.svg" }