From 0bb46833743e65fe48d6f94f387a86617e8039db Mon Sep 17 00:00:00 2001 From: aliakseis Date: Tue, 16 May 2023 15:21:19 +0300 Subject: [PATCH] audio volume --- mainwindow.cpp | 9 ++++++++- mainwindow.h | 3 +++ sendrecv.cpp | 35 ++++++++++++++++++++++++++++++----- sendrecv.h | 4 +++- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 867ddf1..5c28b19 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -7,6 +7,7 @@ #include "sendrecv.h" #include +#include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) @@ -18,6 +19,12 @@ MainWindow::MainWindow(QWidget *parent) ui->setupUi(this); ui->toolBar->addWidget(m_mainToolbar); + m_volume = new QSlider(Qt::Horizontal, this); + m_volume->setMaximumWidth(100); + m_volume->setRange(0, 100); + m_volume->setValue(100); + statusBar()->addPermanentWidget(m_volume); + connect(m_mainToolbar, &MainToolBar::ringingCall, this, &MainWindow::onRingingCall); connect(m_mainToolbar, &MainToolBar::hangUp, this, &MainWindow::onHangUp); connect(m_mainToolbar, &MainToolBar::help, this, &MainWindow::onHelp); @@ -32,7 +39,7 @@ MainWindow::~MainWindow() void MainWindow::onRingingCall() { - start_sendrecv(ui->centralwidget->winId()); + start_sendrecv(ui->centralwidget->winId(), m_volume); } void MainWindow::onHangUp() diff --git a/mainwindow.h b/mainwindow.h index c7280e7..a413725 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -7,6 +7,8 @@ QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE +class QSlider; + class MainToolBar; class MainWindow : public QMainWindow @@ -27,5 +29,6 @@ private slots: Ui::MainWindow *ui; MainToolBar* m_mainToolbar; + QSlider* m_volume; }; #endif // MAINWINDOW_H diff --git a/sendrecv.cpp b/sendrecv.cpp index 0d26b2f..3538d14 100644 --- a/sendrecv.cpp +++ b/sendrecv.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include @@ -50,14 +51,16 @@ static guint webrtcbin_get_stats_id = 0; const static gboolean remote_is_offerer = FALSE; -std::vector> ice_candidates; +static std::vector> ice_candidates; static guintptr xwinid; +static QSlider* g_volume_notifier; + //////////////////////////////////////////////////////////////////// -std::unique_ptr signaling_connection; +static std::unique_ptr signaling_connection; //////////////////////////////////////////////////////////////////// @@ -218,6 +221,15 @@ static_rtp_packet_loss_probe(GstPad *opad, GstPadProbeInfo *p_info, gpointer /*p } +static void +disconnect(gpointer data, + GObject *where_the_object_was) +{ + auto c = static_cast(data); + auto ok = QObject::disconnect(*c); + g_assert_true(ok); + delete c; +} static void handle_media_stream (GstPad * pad, GstElement * pipe, const char *convert_name, @@ -238,12 +250,23 @@ handle_media_stream (GstPad * pad, GstElement * pipe, const char *convert_name, * Will be a no-op if it's not required. */ auto resample = gst_element_factory_make ("audioresample", nullptr); g_assert_nonnull (resample); - gst_bin_add_many (GST_BIN (pipe), q, conv, resample, sink, NULL); + + + auto volume = gst_element_factory_make("volume", nullptr); + auto c = new QMetaObject::Connection( + QObject::connect(g_volume_notifier, &QSlider::valueChanged, [volume](int v) { + g_object_set(volume, "volume", v / 100., NULL); + }) + ); + g_object_weak_ref(G_OBJECT(volume), disconnect, c); + + gst_bin_add_many (GST_BIN (pipe), q, conv, resample, volume, sink, NULL); gst_element_sync_state_with_parent (q); gst_element_sync_state_with_parent (conv); gst_element_sync_state_with_parent (resample); + gst_element_sync_state_with_parent(volume); gst_element_sync_state_with_parent (sink); - gst_element_link_many (q, conv, resample, sink, NULL); + gst_element_link_many (q, conv, resample, volume, sink, NULL); } else { // adding a probe for handling loss messages from rtpbin gst_pad_add_probe(pad, @@ -1221,7 +1244,7 @@ static gpointer glibMainLoopThreadFunc(gpointer /*unused*/) } -bool start_sendrecv(unsigned long long winid) +bool start_sendrecv(unsigned long long winid, QSlider* volume_notifier) { if (loop == nullptr) { if (!check_plugins ()) @@ -1229,6 +1252,8 @@ bool start_sendrecv(unsigned long long winid) xwinid = winid; + g_volume_notifier = volume_notifier; + app_state = APP_STATE_UNKNOWN; gthread = g_thread_new(nullptr, glibMainLoopThreadFunc, nullptr); diff --git a/sendrecv.h b/sendrecv.h index 1db869f..fcfc05a 100644 --- a/sendrecv.h +++ b/sendrecv.h @@ -26,6 +26,8 @@ enum AppState extern AppState app_state; +class QSlider; + gboolean cleanup_and_quit_loop(const gchar * msg, enum AppState state); @@ -34,5 +36,5 @@ void on_server_message(const gchar *text); gboolean start_pipeline(gboolean create_offer); -bool start_sendrecv(unsigned long long winid); +bool start_sendrecv(unsigned long long winid, QSlider* volume_notifier);