Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qwasmjs_p.h
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QWASMJS_P_H
5#define QWASMJS_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QObject>
19#include <QSize>
20
21#include <emscripten.h>
22#include <emscripten/val.h>
23#include <emscripten/bind.h>
24#include <private/qstdweb_p.h>
25#include <private/qplatformmediarecorder_p.h>
26
27QT_BEGIN_NAMESPACE
28
29class QIODevice;
30
31class JsMediaRecorder final : public QIODevice
32{
34public:
36 JsMediaRecorder(const QIODevice *outputDevice);
37
38 void pauseStream();
39 void resumeStream();
40 void stopStream();
41 void startStreaming();
42
43 bool open(QIODeviceBase::OpenMode mode) override;
44 bool isSequential() const override;
45 qint64 size() const override;
46 bool seek(qint64 pos) override;
47 void setStream(emscripten::val stream);
48 qint64 bytesAvailable() const override;
49
50 void setNeedsCamera(bool hasCamera) { m_needsCamera = hasCamera; }
51 void setNeedsAudio(bool hasAudio) { m_needsAudio = hasAudio; }
52
53 QMediaRecorder::RecorderState currentState() { return m_currentState; }
54
56 void started();
57 void stopped();
58 void paused();
59 void resumed();
60 void streamError(QMediaRecorder::Error error, const QString &errorMessage);
61 void stateChanged(QMediaRecorder::RecorderState state);
62
63protected:
64 qint64 readData(char *data, qint64 maxSize) override;
65 qint64 writeData(const char *, qint64) override;
66
67private:
68 void audioDataAvailable(emscripten::val Blob, double timeCodeDifference);
69 void setTrackContraints(QMediaEncoderSettings &settings, emscripten::val stream);
70
71 emscripten::val m_mediaRecorder = emscripten::val::undefined();
72 emscripten::val m_mediaStream = emscripten::val::undefined();
73 QMediaEncoderSettings m_mediaSettings;
74 bool m_needsCamera = false;
75 bool m_needsAudio = false;
76
77 QMediaRecorder::RecorderState m_currentState = QMediaRecorder::StoppedState;
78 QByteArray m_buffer;
79
80 QScopedPointer<qstdweb::EventCallback> m_mediaStreamDataAvailable;
81 QScopedPointer<qstdweb::EventCallback> m_mediaStreamStopped;
82 QScopedPointer<qstdweb::EventCallback> m_mediaStreamError;
83 QScopedPointer<qstdweb::EventCallback> m_mediaStreamStart;
84 QScopedPointer<qstdweb::EventCallback> m_mediaStreamPause;
85 QScopedPointer<qstdweb::EventCallback> m_mediaStreamResume;
86};
87
89{
91public:
92 explicit JsMediaInputStream(QObject *parent = nullptr);
94 static JsMediaInputStream *instance(const std::string &deviceId);
95 static void releaseInstance(const std::string &deviceId);
96 static void replaceAudioStreamDevice(const std::string &audioDeviceId);
97
98 bool isActive() { return m_active; }
99
100 void setUseAudio(bool useAudio) { m_needsAudio = useAudio; }
101 void setUseVideo(bool useVideo) { m_needsVideo = useVideo; }
102 void setStreamDevice(const std::string &id);
103 void setVideoConstraints(QSize resolution, float minFrameRate, float maxFrameRate);
104
105 void setAudioStreamDevice(const std::string &id);
106 void replaceMediaTrack(const std::string &id);
107 emscripten::val setDeviceConstraints(const std::string &id);
108
109 emscripten::val getMediaStream() { return m_mediaStream; }
110 void stopMediaStream(emscripten::val stream);
111
112 // Active-consumer tracking: a single MediaStream may be shared by several
113 // displays of the same camera. Only the last consumer stops the stream.
114 void registerConsumer() { ++m_consumerCount; }
115 void unregisterConsumer();
116
117signals:
121 void activated(bool active);
122
123private:
124 void setupMediaStream(emscripten::val mStream);
125 emscripten::val m_mediaStream = emscripten::val::undefined();
126 bool m_needsAudio = false;
127 bool m_needsVideo = false;
128 bool m_active = false;
129 int m_consumerCount = 0;
130 QSize m_videoResolution;
131 float m_minFrameRate = 0;
132 float m_maxFrameRate = 0;
133
134 QScopedPointer<qstdweb::EventCallback> m_activeStreamEvent;
135 QScopedPointer<qstdweb::EventCallback> m_inactiveStreamEvent;
136};
137
138#endif // QWASMJS_P_H
void mediaVideoStreamReady()
void replaceMediaTrack(const std::string &id)
Definition qwasmjs.cpp:428
void unregisterConsumer()
Definition qwasmjs.cpp:392
static void releaseInstance(const std::string &deviceId)
Definition qwasmjs.cpp:381
emscripten::val getMediaStream()
Definition qwasmjs_p.h:109
void setStreamDevice(const std::string &id)
Definition qwasmjs.cpp:528
void stopMediaStream(emscripten::val stream)
Definition qwasmjs.cpp:602
static void replaceAudioStreamDevice(const std::string &audioDeviceId)
Definition qwasmjs.cpp:400
void setVideoConstraints(QSize resolution, float minFrameRate, float maxFrameRate)
Definition qwasmjs.cpp:409
void registerConsumer()
Definition qwasmjs_p.h:114
void mediaAudioStreamReady()
void setUseAudio(bool useAudio)
Definition qwasmjs_p.h:100
void setUseVideo(bool useVideo)
Definition qwasmjs_p.h:101
void setAudioStreamDevice(const std::string &id)
Definition qwasmjs.cpp:416
void activated(bool active)
static JsMediaInputStream * instance(const std::string &deviceId)
Definition qwasmjs.cpp:372
emscripten::val setDeviceConstraints(const std::string &id)
Definition qwasmjs.cpp:483
qint64 writeData(const char *, qint64) override
Writes up to maxSize bytes from data to the device.
Definition qwasmjs.cpp:57
void streamError(QMediaRecorder::Error error, const QString &errorMessage)
void startStreaming()
Definition qwasmjs.cpp:195
bool isSequential() const override
Returns true if this device is sequential; otherwise returns false.
Definition qwasmjs.cpp:32
qint64 size() const override
For open random-access devices, this function returns the size of the device.
Definition qwasmjs.cpp:37
void stopStream()
Definition qwasmjs.cpp:184
bool seek(qint64 pos) override
For random-access devices, this function sets the current position to pos, returning true on success,...
Definition qwasmjs.cpp:42
void setNeedsCamera(bool hasCamera)
Definition qwasmjs_p.h:50
qint64 bytesAvailable() const override
Returns the number of bytes that are available for reading.
Definition qwasmjs.cpp:359
void setStream(emscripten::val stream)
Definition qwasmjs.cpp:207
void stateChanged(QMediaRecorder::RecorderState state)
JsMediaRecorder(const QIODevice *outputDevice)
bool open(QIODeviceBase::OpenMode mode) override
Opens the device and sets its OpenMode to mode.
Definition qwasmjs.cpp:25
void resumeStream()
Definition qwasmjs.cpp:174
qint64 readData(char *data, qint64 maxSize) override
Reads up to maxSize bytes from the device into data, and returns the number of bytes read or -1 if an...
Definition qwasmjs.cpp:49
void pauseStream()
Definition qwasmjs.cpp:165
QMediaRecorder::RecorderState currentState()
Definition qwasmjs_p.h:53
void setNeedsAudio(bool hasAudio)
Definition qwasmjs_p.h:51
Combined button and popup list for selecting options.
Q_GLOBAL_STATIC(QReadWriteLock, g_updateMutex)