summary refs log tree commit diff
path: root/src/dialogs
diff options
context:
space:
mode:
authortrilene <trilene@runbox.com>2020-08-05 17:56:44 -0400
committertrilene <trilene@runbox.com>2020-08-05 17:56:44 -0400
commitdf65093374c6c77f789e10b20144b3426c4358ac (patch)
tree9f0ca791eabc1adc2b931f5903707f31d8e8af0e /src/dialogs
parentConditionally compile against upcoming GStreamer release (diff)
downloadnheko-df65093374c6c77f789e10b20144b3426c4358ac.tar.xz
Add audio input device selector
Diffstat (limited to 'src/dialogs')
-rw-r--r--src/dialogs/AcceptCall.cpp44
-rw-r--r--src/dialogs/AcceptCall.h7
-rw-r--r--src/dialogs/PlaceCall.cpp42
-rw-r--r--src/dialogs/PlaceCall.h7
4 files changed, 93 insertions, 7 deletions
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 <QComboBox> #include <QLabel> -#include <QPixmap> #include <QPushButton> #include <QString> #include <QVBoxLayout> +#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<UserSettings> 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 <string> +#include <vector> + +#include <QSharedPointer> #include <QWidget> class QPushButton; class QString; +class UserSettings; namespace dialogs { @@ -16,6 +21,7 @@ public: const QString &displayName, const QString &roomName, const QString &avatarUrl, + QSharedPointer<UserSettings> settings, QWidget *parent = nullptr); signals: @@ -25,6 +31,7 @@ signals: private: QPushButton *acceptBtn_; QPushButton *rejectBtn_; + std::vector<std::string> 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 <QComboBox> #include <QLabel> #include <QPushButton> #include <QString> #include <QVBoxLayout> +#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<UserSettings> 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 <string> +#include <vector> + +#include <QSharedPointer> #include <QWidget> class QPushButton; class QString; +class UserSettings; namespace dialogs { @@ -16,6 +21,7 @@ public: const QString &displayName, const QString &roomName, const QString &avatarUrl, + QSharedPointer<UserSettings> settings, QWidget *parent = nullptr); signals: @@ -25,6 +31,7 @@ signals: private: QPushButton *voiceBtn_; QPushButton *cancelBtn_; + std::vector<std::string> audioDevices_; }; }