Skip to content

Commit

Permalink
audio volume
Browse files Browse the repository at this point in the history
aliakseis committed May 16, 2023
1 parent a9de344 commit 0bb4683
Showing 4 changed files with 44 additions and 7 deletions.
9 changes: 8 additions & 1 deletion mainwindow.cpp
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@
#include "sendrecv.h"

#include <QMessageBox>
#include <QSlider>

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()
3 changes: 3 additions & 0 deletions mainwindow.h
Original file line number Diff line number Diff line change
@@ -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
35 changes: 30 additions & 5 deletions sendrecv.cpp
Original file line number Diff line number Diff line change
@@ -27,6 +27,7 @@
#include <QSettings>
#include <QDateTime>
#include <QFile>
#include <QSlider>

#include <cstring>

@@ -50,14 +51,16 @@ static guint webrtcbin_get_stats_id = 0;

const static gboolean remote_is_offerer = FALSE;

std::vector<std::pair<int, std::string>> ice_candidates;
static std::vector<std::pair<int, std::string>> ice_candidates;

static guintptr xwinid;

static QSlider* g_volume_notifier;

////////////////////////////////////////////////////////////////////


std::unique_ptr<ISignalingConnection> signaling_connection;
static std::unique_ptr<ISignalingConnection> 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<QMetaObject::Connection*>(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,14 +1244,16 @@ 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 ())
return false;

xwinid = winid;

g_volume_notifier = volume_notifier;

app_state = APP_STATE_UNKNOWN;

gthread = g_thread_new(nullptr, glibMainLoopThreadFunc, nullptr);
4 changes: 3 additions & 1 deletion sendrecv.h
Original file line number Diff line number Diff line change
@@ -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);

0 comments on commit 0bb4683

Please sign in to comment.