Add ringer device option

This commit is contained in:
Julien Wadel 2024-10-01 11:18:31 +02:00
parent 8aefe3d800
commit e1033b9db2
7 changed files with 112 additions and 1 deletions

View file

@ -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<SettingsCore> 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<SettingsCore> 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;
}

View file

@ -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;

View file

@ -0,0 +1,3 @@
<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.75 20C13.75 20.1989 13.671 20.3897 13.5303 20.5303C13.3897 20.671 13.1989 20.75 13 20.75H7.00002C6.80111 20.75 6.61034 20.671 6.46969 20.5303C6.32904 20.3897 6.25002 20.1989 6.25002 20C6.25002 19.8011 6.32904 19.6103 6.46969 19.4697C6.61034 19.329 6.80111 19.25 7.00002 19.25H13C13.1989 19.25 13.3897 19.329 13.5303 19.4697C13.671 19.6103 13.75 19.8011 13.75 20ZM19.3178 4.65499C18.4749 3.00748 17.2092 1.61364 15.6503 0.616239C15.567 0.563035 15.4741 0.526817 15.3767 0.509668C15.2794 0.492519 15.1796 0.494776 15.0832 0.516311C14.9867 0.537846 14.8955 0.578233 14.8147 0.635151C14.7339 0.692069 14.6651 0.764396 14.6124 0.847973C14.5596 0.931549 14.5239 1.02473 14.5073 1.12215C14.4906 1.21958 14.4934 1.31933 14.5155 1.41567C14.5376 1.51201 14.5784 1.60304 14.6358 1.68353C14.6931 1.76402 14.7658 1.83238 14.8497 1.88468C16.1871 2.73546 17.2707 3.93076 17.9866 5.34499C18.0812 5.51593 18.2388 5.64321 18.4258 5.69974C18.6128 5.75628 18.8145 5.73761 18.9879 5.6477C19.1614 5.5578 19.2929 5.40376 19.3545 5.21836C19.4161 5.03296 19.403 4.83083 19.3178 4.65499ZM1.34783 5.74999C1.48523 5.74993 1.61998 5.71213 1.73736 5.64071C1.85474 5.56929 1.95025 5.46699 2.01346 5.34499C2.72933 3.93076 3.81291 2.73546 5.15033 1.88468C5.23419 1.83238 5.30689 1.76402 5.36424 1.68353C5.4216 1.60304 5.46248 1.51201 5.48454 1.41567C5.50659 1.31933 5.50939 1.21958 5.49277 1.12215C5.47615 1.02473 5.44043 0.931549 5.38768 0.847973C5.33493 0.764396 5.26617 0.692069 5.18538 0.635151C5.10458 0.578233 5.01333 0.537846 4.91687 0.516311C4.82041 0.494776 4.72065 0.492519 4.62331 0.509668C4.52598 0.526817 4.433 0.563035 4.34971 0.616239C2.79085 1.61364 1.52514 3.00748 0.682206 4.65499C0.622991 4.76929 0.594192 4.8969 0.598581 5.02556C0.602969 5.15421 0.640397 5.27957 0.707263 5.38957C0.774128 5.49956 0.868181 5.5905 0.980369 5.65363C1.09256 5.71675 1.2191 5.74994 1.34783 5.74999ZM18.7947 15.4944C18.9276 15.7222 18.998 15.9811 18.9989 16.2448C18.9998 16.5086 18.9312 16.7679 18.7999 16.9967C18.6686 17.2255 18.4793 17.4156 18.251 17.5478C18.0228 17.6801 17.7638 17.7498 17.5 17.75H2.50002C2.23641 17.7495 1.9776 17.6795 1.74965 17.5471C1.5217 17.4147 1.33266 17.2246 1.20158 16.9959C1.0705 16.7672 1.002 16.508 1.00299 16.2444C1.00398 15.9808 1.07441 15.7221 1.20721 15.4944C2.05189 14.0366 2.50002 11.9637 2.50002 9.49999C2.50002 7.51087 3.29019 5.60321 4.69672 4.19669C6.10324 2.79017 8.01089 1.99999 10 1.99999C11.9891 1.99999 13.8968 2.79017 15.3033 4.19669C16.7098 5.60321 17.5 7.51087 17.5 9.49999C17.5 11.9628 17.9481 14.0356 18.7947 15.4944ZM17.5 16.25C16.5025 14.5372 16 12.2666 16 9.49999C16 7.90869 15.3679 6.38257 14.2427 5.25735C13.1174 4.13213 11.5913 3.49999 10 3.49999C8.40872 3.49999 6.8826 4.13213 5.75738 5.25735C4.63216 6.38257 4.00002 7.90869 4.00002 9.49999C4.00002 12.2675 3.49564 14.5381 2.50002 16.25H17.5Z" fill="#000000"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -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<linphone::Core> 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<linphone::AudioDevice> &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();

View file

@ -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);

View file

@ -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 {

View file

@ -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"
}