diff --git a/tools/chatgui/CMakeLists.txt b/tools/chatgui/CMakeLists.txt index 31d7756a..65c556cb 100644 --- a/tools/chatgui/CMakeLists.txt +++ b/tools/chatgui/CMakeLists.txt @@ -195,6 +195,7 @@ add_executable(vibechat src/media_blocks.cpp src/videoplayer_engine.cpp src/videoplayer_window.cpp + src/streamplayer_window.cpp src/imageviewer_window.cpp src/member_files/browser.cpp src/member_files/batch.cpp @@ -216,6 +217,7 @@ add_executable(vibechat transport/node_config.cpp transport/config_updater.cpp transport/gui_bridge_impl.cpp + transport/stream_bridge.cpp transport/miniaudio_impl.c transport/audio_diagnostics.cpp db/db_manager.cpp diff --git a/tools/chatgui/src/mainwindow.cpp b/tools/chatgui/src/mainwindow.cpp index e98a8c25..1f0dd8f0 100644 --- a/tools/chatgui/src/mainwindow.cpp +++ b/tools/chatgui/src/mainwindow.cpp @@ -1,5 +1,6 @@ #include #include "mainwindow.h" +#include "streamplayer_window.h" #include "channellist.h" #include "messagelist.h" #include "messagedelegate.h" @@ -197,6 +198,8 @@ MainWindow::MainWindow(QWidget *parent, DbManager* db, const QString& cfgPath, } MainWindow::~MainWindow() { + if (m_streamPlayer) delete m_streamPlayer.data(); + gui_bridge_set_stream_sources_cb(nullptr); s_mainWindow = nullptr; m_cpuLoadTimer->stop(); gui_bridge_set_cpu_load_cb(nullptr); @@ -585,8 +588,11 @@ void MainWindow::setupBridgeCallbacks() { s_mainWindow->m_channelList->setCpuLoad(0); s_mainWindow->m_accountList->model()->setRadioState(0, false, false); s_mainWindow->m_messageList->clearDmCallRoute(); + s_mainWindow->m_messageList->clearStreams(); + if (s_mainWindow->m_streamPlayer) s_mainWindow->m_streamPlayer->close(); s_mainWindow->m_channelList->clearDmPresence(); } else { + if (type == 12) s_mainWindow->m_messageList->watchStreams(); s_mainWindow->m_channelList->refreshDmPresence(); } }); @@ -599,12 +605,21 @@ void MainWindow::setupBridgeCallbacks() { if (s_mainWindow) s_mainWindow->m_messageList->onDmMessages(data, len); }); + gui_bridge_set_stream_sources_cb([](const uint8_t* data, int len) { + if (s_mainWindow) s_mainWindow->m_messageList->onStreamSources(data, len); + }); gui_bridge_set_attachment_preparation_cb([](const uint8_t* data, int len) { if (s_mainWindow) s_mainWindow->m_messageList->onAttachmentPreparation(data, len); }); } void MainWindow::setupConnects() { + connect(m_messageList, &MessageList::streamRequested, this, + [this](quint64 group, quint64 source, quint64 epoch, const QString& name) { + if (m_streamPlayer) delete m_streamPlayer.data(); + m_streamPlayer = new StreamPlayerWindow(group, source, epoch, name); + m_streamPlayer->setAttribute(Qt::WA_DeleteOnClose); m_streamPlayer->show(); + }); connect(RadioAudioEngine::instance(), &RadioAudioEngine::stateChanged, this, [this] { auto* engine = RadioAudioEngine::instance(); m_accountList->model()->setRadioState(engine->groupId(), engine->isActive(), engine->isTransmitting()); diff --git a/tools/chatgui/src/mainwindow.h b/tools/chatgui/src/mainwindow.h index 2cc23eb5..dda791d8 100644 --- a/tools/chatgui/src/mainwindow.h +++ b/tools/chatgui/src/mainwindow.h @@ -21,6 +21,7 @@ class UtunNode; class AudioRecorder; class ConnMonitorWindow; class VideoPlayerWindow; +class StreamPlayerWindow; class ImageViewerWindow; class CallWindow; class CallAudioEngine; @@ -124,6 +125,7 @@ private: AudioRecorder *m_recorder = nullptr; ConnMonitorWindow *m_connMonitor = nullptr; VideoPlayerWindow *m_videoPlayer = nullptr; + QPointer m_streamPlayer; ImageViewerWindow *m_imageViewer = nullptr; QPointer m_fileBrowser;