Files
utun2/tools/chatgui/src/stream_publish_engine.h
T

70 lines
2.3 KiB
C++

/* Desktop publisher: GUI управляет источниками и AudioDevice, workers кодируют видео/Opus.
* Окно не владеет трансляцией. Stop закрывает callbacks, joins workers и отправляет FIN.
* Captured video/preview хранят только последний кадр; публикация использует общий C actor. */
#pragma once
#include <QObject>
#include <QTimer>
#include <QVariant>
#include <QImage>
#include <QList>
#include <memory>
#include "live_video_encoder.h"
#include "audio_device.h"
#include "audio_capture_lease.h"
#include "../../../src/stream/stream_publisher.h"
struct StreamVideoSource {
enum Kind { Camera, Screen, Window };
Kind kind = Camera;
QString name;
QByteArray id;
QVariant window;
};
struct StreamPublishConfig {
StreamVideoSource source;
LiveVideoConfig video;
QString microphone;
bool audio = true;
};
class StreamPublishEngine : public QObject {
Q_OBJECT
public:
explicit StreamPublishEngine(QObject* parent = nullptr);
~StreamPublishEngine() override;
bool start(uint64_t group, const StreamPublishConfig& config);
bool reconfigure(const StreamPublishConfig& config);
void stop();
bool active() const;
bool running() const;
uint64_t group() const;
StreamPublishConfig config() const;
QList<int> codecs() const;
static QList<StreamVideoSource> sources();
static bool supported();
void setMuted(bool muted);
signals:
void codecsChanged();
void stateChanged(const QString& state);
void configurationChanged();
void previewVideoChanged(const QVariant& frame);
void telemetryChanged(const stream_publisher_status& status);
void errorOccurred(const QString& error);
void audioChannelsChanged(int channels);
private:
struct Impl;
std::unique_ptr<Impl> m;
AudioDevice m_capture;
AudioCaptureLease m_microphone{AudioCaptureLease::Mode::Exclusive};
QTimer m_timer;
QTimer m_previewTimer;
bool openSource(const StreamPublishConfig& config);
void closeSource();
bool openMicrophone();
void sourceFailed(uint64_t generation, const QString& error);
void publicationFailed(uint64_t id, const QString& error);
void tick();
void videoLoop();
void audioLoop();
void captureAudio(const void* pcm, unsigned frames);
};