From df65093374c6c77f789e10b20144b3426c4358ac Mon Sep 17 00:00:00 2001 From: trilene Date: Wed, 5 Aug 2020 17:56:44 -0400 Subject: Add audio input device selector --- src/dialogs/AcceptCall.cpp | 44 ++++++++++++++++++++++++++++++++++++++++---- src/dialogs/AcceptCall.h | 7 +++++++ src/dialogs/PlaceCall.cpp | 42 +++++++++++++++++++++++++++++++++++++++--- src/dialogs/PlaceCall.h | 7 +++++++ 4 files changed, 93 insertions(+), 7 deletions(-) (limited to 'src/dialogs') diff --git a/src/dialogs/AcceptCall.cpp b/src/dialogs/AcceptCall.cpp index fd6565e2..be1eb0c9 100644 --- a/src/dialogs/AcceptCall.cpp +++ b/src/dialogs/AcceptCall.cpp @@ -1,11 +1,14 @@ +#include #include -#include #include #include #include +#include "ChatPage.h" #include "Config.h" +#include "UserSettingsPage.h" #include "Utils.h" +#include "WebRTCSession.h" #include "dialogs/AcceptCall.h" #include "ui/Avatar.h" @@ -15,9 +18,25 @@ AcceptCall::AcceptCall(const QString &caller, const QString &displayName, const QString &roomName, const QString &avatarUrl, + QSharedPointer settings, QWidget *parent) : QWidget(parent) { + std::string errorMessage; + if (!WebRTCSession::instance().init(&errorMessage)) { + emit ChatPage::instance()->showNotification(QString::fromStdString(errorMessage)); + emit close(); + return; + } + audioDevices_ = WebRTCSession::instance().getAudioSourceNames( + settings->defaultAudioSource().toStdString()); + if (audioDevices_.empty()) { + emit ChatPage::instance()->showNotification( + "Incoming call: No audio sources found."); + emit close(); + return; + } + setAutoFillBackground(true); setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint); setWindowModality(Qt::WindowModal); @@ -55,7 +74,7 @@ AcceptCall::AcceptCall(const QString &caller, else avatar->setLetter(utils::firstChar(roomName)); - const int iconSize = 24; + const int iconSize = 22; QLabel *callTypeIndicator = new QLabel(this); callTypeIndicator->setPixmap( QIcon(":/icons/icons/ui/place-call.png").pixmap(QSize(iconSize * 2, iconSize * 2))); @@ -66,7 +85,7 @@ AcceptCall::AcceptCall(const QString &caller, callTypeLabel->setAlignment(Qt::AlignCenter); auto buttonLayout = new QHBoxLayout; - buttonLayout->setSpacing(20); + buttonLayout->setSpacing(18); acceptBtn_ = new QPushButton(tr("Accept"), this); acceptBtn_->setDefault(true); acceptBtn_->setIcon(QIcon(":/icons/icons/ui/place-call.png")); @@ -78,6 +97,19 @@ AcceptCall::AcceptCall(const QString &caller, buttonLayout->addWidget(acceptBtn_); buttonLayout->addWidget(rejectBtn_); + auto deviceLayout = new QHBoxLayout; + auto audioLabel = new QLabel(this); + audioLabel->setPixmap( + QIcon(":/icons/icons/ui/microphone-unmute.png").pixmap(QSize(iconSize, iconSize))); + + auto deviceList = new QComboBox(this); + for (const auto &d : audioDevices_) + deviceList->addItem(QString::fromStdString(d)); + + deviceLayout->addStretch(); + deviceLayout->addWidget(audioLabel); + deviceLayout->addWidget(deviceList); + if (displayNameLabel) layout->addWidget(displayNameLabel, 0, Qt::AlignCenter); layout->addWidget(callerLabel, 0, Qt::AlignCenter); @@ -85,8 +117,12 @@ AcceptCall::AcceptCall(const QString &caller, layout->addWidget(callTypeIndicator, 0, Qt::AlignCenter); layout->addWidget(callTypeLabel, 0, Qt::AlignCenter); layout->addLayout(buttonLayout); + layout->addLayout(deviceLayout); - connect(acceptBtn_, &QPushButton::clicked, this, [this]() { + connect(acceptBtn_, &QPushButton::clicked, this, [this, deviceList, settings]() { + WebRTCSession::instance().setAudioSource(deviceList->currentIndex()); + settings->setDefaultAudioSource( + QString::fromStdString(audioDevices_[deviceList->currentIndex()])); emit accept(); emit close(); }); diff --git a/src/dialogs/AcceptCall.h b/src/dialogs/AcceptCall.h index 5d2251fd..909605d0 100644 --- a/src/dialogs/AcceptCall.h +++ b/src/dialogs/AcceptCall.h @@ -1,9 +1,14 @@ #pragma once +#include +#include + +#include #include class QPushButton; class QString; +class UserSettings; namespace dialogs { @@ -16,6 +21,7 @@ public: const QString &displayName, const QString &roomName, const QString &avatarUrl, + QSharedPointer settings, QWidget *parent = nullptr); signals: @@ -25,6 +31,7 @@ signals: private: QPushButton *acceptBtn_; QPushButton *rejectBtn_; + std::vector audioDevices_; }; } diff --git a/src/dialogs/PlaceCall.cpp b/src/dialogs/PlaceCall.cpp index 0fda1794..4e70370a 100644 --- a/src/dialogs/PlaceCall.cpp +++ b/src/dialogs/PlaceCall.cpp @@ -1,10 +1,14 @@ +#include #include #include #include #include +#include "ChatPage.h" #include "Config.h" +#include "UserSettingsPage.h" #include "Utils.h" +#include "WebRTCSession.h" #include "dialogs/PlaceCall.h" #include "ui/Avatar.h" @@ -14,9 +18,24 @@ PlaceCall::PlaceCall(const QString &callee, const QString &displayName, const QString &roomName, const QString &avatarUrl, + QSharedPointer settings, QWidget *parent) : QWidget(parent) { + std::string errorMessage; + if (!WebRTCSession::instance().init(&errorMessage)) { + emit ChatPage::instance()->showNotification(QString::fromStdString(errorMessage)); + emit close(); + return; + } + audioDevices_ = WebRTCSession::instance().getAudioSourceNames( + settings->defaultAudioSource().toStdString()); + if (audioDevices_.empty()) { + emit ChatPage::instance()->showNotification("No audio sources found."); + emit close(); + return; + } + setAutoFillBackground(true); setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint); setWindowModality(Qt::WindowModal); @@ -37,25 +56,42 @@ PlaceCall::PlaceCall(const QString &callee, avatar->setImage(avatarUrl); else avatar->setLetter(utils::firstChar(roomName)); - const int iconSize = 24; + const int iconSize = 18; voiceBtn_ = new QPushButton(tr("Voice"), this); voiceBtn_->setIcon(QIcon(":/icons/icons/ui/place-call.png")); voiceBtn_->setIconSize(QSize(iconSize, iconSize)); voiceBtn_->setDefault(true); cancelBtn_ = new QPushButton(tr("Cancel"), this); - buttonLayout->addStretch(1); buttonLayout->addWidget(avatar); + buttonLayout->addStretch(); buttonLayout->addWidget(voiceBtn_); buttonLayout->addWidget(cancelBtn_); QString name = displayName.isEmpty() ? callee : displayName; QLabel *label = new QLabel("Place a call to " + name + "?", this); + auto deviceLayout = new QHBoxLayout; + auto audioLabel = new QLabel(this); + audioLabel->setPixmap(QIcon(":/icons/icons/ui/microphone-unmute.png") + .pixmap(QSize(iconSize * 1.2, iconSize * 1.2))); + + auto deviceList = new QComboBox(this); + for (const auto &d : audioDevices_) + deviceList->addItem(QString::fromStdString(d)); + + deviceLayout->addStretch(); + deviceLayout->addWidget(audioLabel); + deviceLayout->addWidget(deviceList); + layout->addWidget(label); layout->addLayout(buttonLayout); + layout->addLayout(deviceLayout); - connect(voiceBtn_, &QPushButton::clicked, this, [this]() { + connect(voiceBtn_, &QPushButton::clicked, this, [this, deviceList, settings]() { + WebRTCSession::instance().setAudioSource(deviceList->currentIndex()); + settings->setDefaultAudioSource( + QString::fromStdString(audioDevices_[deviceList->currentIndex()])); emit voice(); emit close(); }); diff --git a/src/dialogs/PlaceCall.h b/src/dialogs/PlaceCall.h index f6db9ab5..5a1e982c 100644 --- a/src/dialogs/PlaceCall.h +++ b/src/dialogs/PlaceCall.h @@ -1,9 +1,14 @@ #pragma once +#include +#include + +#include #include class QPushButton; class QString; +class UserSettings; namespace dialogs { @@ -16,6 +21,7 @@ public: const QString &displayName, const QString &roomName, const QString &avatarUrl, + QSharedPointer settings, QWidget *parent = nullptr); signals: @@ -25,6 +31,7 @@ signals: private: QPushButton *voiceBtn_; QPushButton *cancelBtn_; + std::vector audioDevices_; }; } -- cgit 1.5.1