5#include "private/qcameradevice_p.h"
6#include "private/qplatformmediaintegration_p.h"
29 return wasmMediaDevices ? wasmMediaDevices->
videoInputs() : QList<QCameraDevice>();
43 getOpenALAudioDevices();
49 return m_audioInputs.
values();
54 return m_audioOutputs.
values();
59 return m_cameraDevices.
values();
74void QWasmMediaDevices::parseDevices(emscripten::val
devices)
77 qWarning() <<
"Something went wrong enumerating devices";
81 QList<std::string> cameraDevicesToRemove = m_cameraDevices.
keys();
82 QList<std::string> audioOutputsToRemove;
83 QList<std::string> audioInputsToRemove;
90 audioOutputsToRemove = m_audioOutputs.
keys();
91 audioInputsToRemove = m_audioInputs.
keys();
92 m_audioInputsAdded =
false;
93 m_audioOutputsAdded =
false;
95 m_videoInputsAdded =
false;
97 bool m_videoInputsRemoved =
false;
98 bool m_audioInputsRemoved =
false;
99 bool m_audioOutputsRemoved =
false;
101 for (
int i = 0;
i <
devices[
"length"].as<
int>();
i++) {
103 emscripten::val mediaDevice =
devices[
i];
105 std::string defaultDeviceLabel =
"";
107 const std::string deviceKind = mediaDevice[
"kind"].as<std::string>();
108 const std::string
label = mediaDevice[
"label"].as<std::string>();
109 const std::string deviceId = mediaDevice[
"deviceId"].as<std::string>();
115 if (deviceKind.empty())
118 if (deviceId == std::string(
"default")) {
125 defaultDeviceLabel =
label;
129 const bool isDefault =
false;
132 if (deviceKind == std::string(
"videoinput")) {
133 if (!m_cameraDevices.
contains(deviceId)) {
137 camera->isDefault = isDefault;
140 m_videoInputsAdded =
true;
142 cameraDevicesToRemove.removeOne(deviceId);
143 }
else if (deviceKind == std::string(
"audioinput")) {
144 if (!m_audioInputs.
contains(deviceId)) {
145 m_audioInputs.
insert(deviceId,
150 m_audioInputsAdded =
true;
152 audioInputsToRemove.removeOne(deviceId);
153 }
else if (deviceKind == std::string(
"audiooutput")) {
154 if (!m_audioOutputs.
contains(deviceId)) {
155 m_audioOutputs.
insert(deviceId,
160 m_audioOutputsAdded =
true;
162 audioOutputsToRemove.removeOne(deviceId);
168 getOpenALAudioDevices();
172 for (;
j < cameraDevicesToRemove.count();
j++) {
173 m_cameraDevices.
remove(cameraDevicesToRemove.at(
j));
175 m_videoInputsRemoved = !cameraDevicesToRemove.isEmpty();
177 for (
j = 0;
j < audioInputsToRemove.count();
j++) {
178 m_audioInputs.
remove(audioInputsToRemove.at(
j));
180 m_audioInputsRemoved = !audioInputsToRemove.isEmpty();
182 for (
j = 0;
j < audioOutputsToRemove.count();
j++) {
183 m_audioOutputs.
remove(audioOutputsToRemove.at(
j));
185 m_audioOutputsRemoved = !audioOutputsToRemove.isEmpty();
187 if (m_videoInputsAdded || m_videoInputsRemoved)
189 if (m_audioInputsAdded || m_audioInputsRemoved)
191 if (m_audioOutputsAdded || m_audioOutputsRemoved)
198void QWasmMediaDevices::getMediaDevices()
200 emscripten::val navigator = emscripten::val::global(
"navigator");
201 m_jsMediaDevicesInterface = navigator[
"mediaDevices"];
203 if (m_jsMediaDevicesInterface.isNull() || m_jsMediaDevicesInterface.isUndefined()) {
204 qWarning() <<
"No media devices found";
209#ifdef QT_HAVE_EMSCRIPTEN_ASYNCIFY
210 emscripten::val devicesList = m_jsMediaDevicesInterface.call<emscripten::val>(
"enumerateDevices").
await();
211 if (devicesList.isNull() || devicesList.isUndefined()) {
216 parseDevices(devicesList);
225 [
this](emscripten::val
error) {
226 qWarning() <<
"mediadevices enumerateDevices fail"
235 std::move(enumerateDevicesCallback));
238 m_deviceChangedCallback = std::make_unique<qstdweb::EventCallback>(
239 m_jsMediaDevicesInterface,
"devicechange",
240 [
this, enumerateDevicesCallback](emscripten::val) {
243 std::move(enumerateDevicesCallback));
249void QWasmMediaDevices::getOpenALAudioDevices()
253 auto capture = alcGetString(
nullptr, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER);
255 if (capture && !m_audioOutputs.
contains(capture)) {
256 m_audioInputs.
insert(capture,
260 m_audioInputsAdded =
true;
264 auto playback = alcGetString(
nullptr, ALC_DEFAULT_DEVICE_SPECIFIER);
266 if (playback && !m_audioOutputs.
contains(capture)) {
267 m_audioOutputs.
insert(playback,
The QAudioDevice class provides an information about audio devices and their functionality.
QByteArray id
\qmlproperty string QtMultimedia::audioDevice::id
iterator insert(const Key &key, const T &value)
bool contains(const Key &key) const
size_type count(const Key &key) const
QList< T > values() const
size_type remove(const Key &key)
QList< Key > keys() const
QObject * parent() const
Returns a pointer to the parent object.
static QString fromStdString(const std::string &s)
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QList< QCameraDevice > videoDevices() const override
Combined button and popup list for selecting options.
void make(emscripten::val target, QString methodName, PromiseCallbacks callbacks, Args... args)
static QT_BEGIN_NAMESPACE bool await(IAsyncOperation< T > &&asyncInfo, T &result, uint timeout=0)
DBusConnection const char DBusError * error
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)
GLuint GLsizei const GLchar * label
[43]
#define QStringLiteral(str)
std::function< void(emscripten::val)> thenFunc