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
qwasmmediadevices_p.h
Go to the documentation of this file.
1// Copyright (C) 2021 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 QWASMMEDIADEVICES_H
5#define QWASMMEDIADEVICES_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 <private/qplatformaudiodevices_p.h>
19
20#include <private/qplatformvideodevices_p.h>
21#include "qwasmjs_p.h"
22
23#include <QtCore/private/qstdweb_p.h>
24#include <qaudio.h>
25#include <qaudiodevice.h>
26#include <qcameradevice.h>
27#include <qset.h>
28#include <QtCore/qloggingcategory.h>
29
30#include <emscripten.h>
31#include <emscripten/val.h>
32#include <emscripten/bind.h>
33#include <QMapIterator>
35
36Q_DECLARE_LOGGING_CATEGORY(qWasmMediaDevices)
37
38class QWasmAudioEngine;
40
42{
44public:
46
48
49protected:
50 QList<QCameraDevice> findVideoInputs() const override;
51 void connectNotify(const QMetaMethod &signal) override;
52
53private:
54 // weak
55 QWasmMediaDevices *m_mediaDevices;
56};
57
59{
60public:
62
63 QPlatformAudioSource *createAudioSource(const QAudioDevice &, const QAudioFormat &,
64 QObject *parent) override;
65 QPlatformAudioSink *createAudioSink(const QAudioDevice &, const QAudioFormat &,
66 QObject *parent) override;
67
68 QLatin1String backendName() const override { return QLatin1String{ "WebAssembly" }; }
71
72protected:
73 QList<QAudioDevice> findAudioInputs() const override;
74 QList<QAudioDevice> findAudioOutputs() const override;
75 void connectNotify(const QMetaMethod &signal) override;
76
77};
78
80{
81public:
85
88
89 void initDevices();
90 void getMediaDevices();
91
92private:
93 void updateCameraDevices();
94 void parseDevices(emscripten::val devices);
95
96 QMap <std::string, QAudioDevice> m_audioOutputs;
97 QMap <std::string, QAudioDevice> m_audioInputs;
98 QMap <std::string, QCameraDevice> m_cameraDevices;
99
100 std::unique_ptr<qstdweb::EventCallback> m_deviceChangedCallback;
101
102 bool m_videoInputsAdded = false;
103 bool m_audioInputsAdded = false;
104 bool m_audioOutputsAdded = false;
105 emscripten::val m_jsMediaDevicesInterface = emscripten::val::undefined();
106 bool m_initDone = false;
107 emscripten::val devicesList;
108};
109
110QT_END_NAMESPACE
111
112#endif
The QAudioDevice class provides an information about audio devices and their functionality.
The QCameraDevice class provides general information about camera devices.
QPlatformAudioSink * createAudioSink(const QAudioDevice &, const QAudioFormat &, QObject *parent) override
QList< QAudioDevice > findAudioOutputs() const override
QList< QAudioDevice > findAudioInputs() const override
QPlatformAudioSource * createAudioSource(const QAudioDevice &, const QAudioFormat &, QObject *parent) override
void connectNotify(const QMetaMethod &signal) override
QLatin1String backendName() const override
void connectNotify(const QMetaMethod &signal) override
QList< QCameraDevice > findVideoInputs() const override
QList< QCameraDevice > videoInputs() const
static QWasmMediaDevices * instance()
QList< QAudioDevice > audioOutputs() const
QList< QAudioDevice > audioInputs() const
Combined button and popup list for selecting options.
EM_JS(void, setupAudioOutputSelector,(), { const overlay=document.createElement('div');overlay.style.cssText='position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0, 0, 0, 0.5);z-index:9999;display:flex;align-items:center;justify-content:center;';const dialog=document.createElement('div');dialog.style.cssText='background:white;padding:24px;border-radius:8px;text-align:center;font-family:sans-serif;min-width:240px;';const message=document.createElement('p');message.textContent='Select an audio output device to continue.';message.style.cssText='margin:0 0 16px 0;font-size:14px;';const button=document.createElement('button');button.textContent='Select Audio Output';button.style.cssText='padding:8px 16px;font-size:14px;cursor:pointer;';button.addEventListener('click', async()=> { document.body.removeChild(overlay);try { const deviceInfo=await navigator.mediaDevices.selectAudioOutput();console.log("Selected device: ", deviceInfo.label);Module._qtMediaDevicesOnAudioOutputSelected();} catch(err) { console.error(err);} }, { once:true });dialog.appendChild(message);dialog.appendChild(button);overlay.appendChild(dialog);document.body.appendChild(overlay);})
EMSCRIPTEN_KEEPALIVE void qtMediaDevicesOnAudioOutputSelected()
bool isFirefox()