Skip to content

Commit 8685959

Browse files
committed
experimental chat stuff
1 parent 1d4d3e0 commit 8685959

File tree

7 files changed

+76
-11
lines changed

7 files changed

+76
-11
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ if(ANDROID)
8484
cameraman.h
8585
http.cpp
8686
http.h
87+
isendrecv.h
8788
sendrecv.cpp
8889
sendrecv.h
8990
signaling_connection.cpp

isendrecv.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#pragma once
2+
3+
#include <functional>
4+
5+
#include <QString>
6+
7+
struct ISendRecv
8+
{
9+
virtual void handleRecv(const char* data) = 0;
10+
virtual void setSendLambda(std::function<void(const QString&)> lambda) = 0;
11+
};

mainwindow.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ MainWindow::MainWindow(QWidget *parent)
4848
connect(ui->chatInput, &QLineEdit::returnPressed, this, &MainWindow::onChatInputReturnPressed);
4949
connect(ui->sendButton, &QPushButton::clicked, this, &MainWindow::onSendButtonClicked);
5050

51-
connect(this, &MainWindow::messageSent, this, &MainWindow::onMessageReceived, Qt::QueuedConnection);
51+
connect(this, &MainWindow::messageReceived, this, &MainWindow::onMessageReceived);
5252
}
5353

5454
MainWindow::~MainWindow()
@@ -59,7 +59,7 @@ MainWindow::~MainWindow()
5959

6060
void MainWindow::onRingingCall()
6161
{
62-
start_sendrecv(ui->videoArea->winId(), m_volume);
62+
start_sendrecv(ui->videoArea->winId(), m_volume, this);
6363
}
6464

6565
void MainWindow::onHangUp()
@@ -127,3 +127,14 @@ void MainWindow::sendMessage(const QString& message)
127127
// Clear the chat input
128128
ui->chatInput->clear();
129129
}
130+
131+
void MainWindow::handleRecv(const char* data)
132+
{
133+
if (data && *data)
134+
emit messageReceived(data);
135+
}
136+
137+
void MainWindow::setSendLambda(std::function<void(const QString&)> lambda)
138+
{
139+
connect(this, &MainWindow::messageSent, lambda);
140+
}

mainwindow.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#ifndef MAINWINDOW_H
22
#define MAINWINDOW_H
33

4+
#include "isendrecv.h"
5+
46
#include <QMainWindow>
57

68
QT_BEGIN_NAMESPACE
@@ -11,7 +13,7 @@ class QSlider;
1113

1214
class MainToolBar;
1315

14-
class MainWindow : public QMainWindow
16+
class MainWindow : public QMainWindow, public ISendRecv
1517
{
1618
Q_OBJECT
1719

@@ -22,7 +24,7 @@ class MainWindow : public QMainWindow
2224
signals:
2325
// A signal that is emitted when a message is sent to another user
2426
void messageSent(const QString& message);
25-
27+
void messageReceived(const QString& message);
2628

2729
private slots:
2830
void onRingingCall();
@@ -51,5 +53,9 @@ private slots:
5153

5254
MainToolBar* m_mainToolbar;
5355
QSlider* m_volume;
56+
57+
// Inherited via ISendRecv
58+
void handleRecv(const char* data) override;
59+
void setSendLambda(std::function<void(const QString&)> lambda) override;
5460
};
5561
#endif // MAINWINDOW_H

preferences.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ int getSliceDurationSecs() // zero if no slices
4545
if (index < 0)
4646
return 0;
4747

48-
const int minutes = index / std::size(sliceIntervalValues);
49-
const int valueIdx = index % std::size(sliceIntervalValues);
48+
const auto minutes = index / std::size(sliceIntervalValues);
49+
const auto valueIdx = index % std::size(sliceIntervalValues);
5050

5151
return (minutes ? 60 : 1) * sliceIntervalValues[valueIdx];
5252
}

sendrecv.cpp

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
#include "sendrecv.h"
2+
3+
#include "isendrecv.h"
4+
25
/*
36
* Demo gstreamer app for negotiating and streaming a sendrecv webrtc stream
47
* with a browser JS app.
@@ -59,6 +62,8 @@ static guintptr xwinid;
5962

6063
static QSlider* g_volume_notifier;
6164

65+
static ISendRecv* p_sendrecv = nullptr;
66+
6267
////////////////////////////////////////////////////////////////////
6368

6469

@@ -780,6 +785,7 @@ data_channel_on_error (GObject * dc, gpointer user_data)
780785
cleanup_and_quit_loop ("Data channel error", APP_STATE_UNKNOWN);
781786
}
782787

788+
/*
783789
static void
784790
data_channel_on_open (GObject * dc, gpointer user_data)
785791
{
@@ -789,6 +795,7 @@ data_channel_on_open (GObject * dc, gpointer user_data)
789795
g_signal_emit_by_name (dc, "send-data", bytes);
790796
g_bytes_unref (bytes);
791797
}
798+
*/
792799

793800
static void
794801
data_channel_on_close (GObject * dc, gpointer user_data)
@@ -799,16 +806,17 @@ data_channel_on_close (GObject * dc, gpointer user_data)
799806
static void
800807
data_channel_on_message_string (GObject * dc, gchar * str, gpointer user_data)
801808
{
802-
gst_print ("Received data channel message: %s\n", str);
809+
//gst_print ("Received data channel message: %s\n", str);
810+
if (p_sendrecv)
811+
p_sendrecv->handleRecv(str);
803812
}
804813

805814
static void
806815
connect_data_channel_signals (GObject * data_channel)
807816
{
808817
g_signal_connect (data_channel, "on-error",
809818
G_CALLBACK (data_channel_on_error), NULL);
810-
g_signal_connect (data_channel, "on-open", G_CALLBACK (data_channel_on_open),
811-
NULL);
819+
//g_signal_connect (data_channel, "on-open", G_CALLBACK (data_channel_on_open), NULL);
812820
g_signal_connect (data_channel, "on-close",
813821
G_CALLBACK (data_channel_on_close), NULL);
814822
g_signal_connect (data_channel, "on-message-string",
@@ -821,6 +829,17 @@ on_data_channel (GstElement * webrtc, GObject * data_channel,
821829
{
822830
connect_data_channel_signals (data_channel);
823831
receive_channel = data_channel;
832+
if (p_sendrecv)
833+
{
834+
auto lam = [](const QString& s) {
835+
auto line = s.toStdString();
836+
if (!line.empty() && receive_channel)
837+
g_signal_emit_by_name(receive_channel, "send-string", line.c_str());
838+
};
839+
840+
p_sendrecv->setSendLambda(lam);
841+
}
842+
824843
}
825844

826845
static void
@@ -1082,6 +1101,18 @@ start_pipeline (gboolean create_offer)
10821101
if (send_channel) {
10831102
gst_print ("Created data channel\n");
10841103
connect_data_channel_signals (send_channel);
1104+
1105+
if (p_sendrecv)
1106+
{
1107+
auto lam = [](const QString& s) {
1108+
auto line = s.toStdString();
1109+
if (!line.empty() && send_channel)
1110+
g_signal_emit_by_name(send_channel, "send-string", line.c_str());
1111+
};
1112+
1113+
p_sendrecv->setSendLambda(lam);
1114+
}
1115+
10851116
} else {
10861117
gst_print ("Could not create data channel, is usrsctp available?\n");
10871118
}
@@ -1351,14 +1382,16 @@ static gpointer glibMainLoopThreadFunc(gpointer /*unused*/)
13511382
}
13521383

13531384

1354-
bool start_sendrecv(unsigned long long winid, QSlider* volume_notifier)
1385+
bool start_sendrecv(unsigned long long winid, QSlider* volume_notifier, ISendRecv* sendrecv)
13551386
{
13561387
if (loop == nullptr) {
13571388
if (!check_plugins ())
13581389
return false;
13591390

13601391
xwinid = winid;
13611392

1393+
p_sendrecv = sendrecv;
1394+
13621395
g_volume_notifier = volume_notifier;
13631396

13641397
app_state = APP_STATE_UNKNOWN;

sendrecv.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <glib.h>
44

5+
56
enum AppState
67
{
78
APP_STATE_UNKNOWN = 0,
@@ -36,5 +37,7 @@ void on_server_message(const gchar *text);
3637
gboolean
3738
start_pipeline(gboolean create_offer);
3839

39-
bool start_sendrecv(unsigned long long winid, QSlider* volume_notifier);
40+
struct ISendRecv;
41+
42+
bool start_sendrecv(unsigned long long winid, QSlider* volume_notifier, ISendRecv* sendrecv);
4043

0 commit comments

Comments
 (0)