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#include "qplatformaudiodevices_p.h"
5
6#include <QtMultimedia/qaudiodevice.h>
7#include <QtMultimedia/qmediadevices.h>
8#include <QtMultimedia/private/qaudiosystem_p.h>
9
10#if defined(Q_OS_ANDROID)
11#include <qandroidaudiodevices_p.h>
12#elif defined(Q_OS_DARWIN)
13#include <qdarwinaudiodevices_p.h>
14#elif defined(Q_OS_WINDOWS) && QT_CONFIG(wmf)
15#include <qwindowsaudiodevices_p.h>
16#elif QT_CONFIG(alsa)
17#include <qalsaaudiodevices_p.h>
18#elif QT_CONFIG(pulseaudio)
19#include <qpulseaudiodevices_p.h>
20#elif defined(Q_OS_QNX)
21#include <qqnxaudiodevices_p.h>
22#elif defined(Q_OS_WASM)
23#include <private/qwasmmediadevices_p.h>
24#endif
25
26QT_BEGIN_NAMESPACE
27
28std::unique_ptr<QPlatformAudioDevices> QPlatformAudioDevices::create()
29{
30#ifdef Q_OS_DARWIN
31 return std::make_unique<QDarwinAudioDevices>();
32#elif defined(Q_OS_WINDOWS) && QT_CONFIG(wmf)
33 return std::make_unique<QWindowsAudioDevices>();
34#elif defined(Q_OS_ANDROID)
35 return std::make_unique<QAndroidAudioDevices>();
36#elif QT_CONFIG(alsa)
37 return std::make_unique<QAlsaAudioDevices>();
38#elif QT_CONFIG(pulseaudio)
39 return std::make_unique<QPulseAudioDevices>();
40#elif defined(Q_OS_QNX)
41 return std::make_unique<QQnxAudioDevices>();
42#elif defined(Q_OS_WASM)
43 return std::make_unique<QWasmMediaDevices>();
44#else
45 return std::make_unique<QPlatformAudioDevices>();
46#endif
47}
48
49QPlatformAudioDevices::QPlatformAudioDevices()
50{
51 qRegisterMetaType<PrivateTag>(); // for the case of queued connections
52}
53
54QPlatformAudioDevices::~QPlatformAudioDevices() = default;
55
56QList<QAudioDevice> QPlatformAudioDevices::audioInputs() const
57{
58 return m_audioInputs.ensure(creator: [this]() {
59 return findAudioInputs();
60 });
61}
62
63QList<QAudioDevice> QPlatformAudioDevices::audioOutputs() const
64{
65 return m_audioOutputs.ensure(creator: [this]() {
66 return findAudioOutputs();
67 });
68}
69
70void QPlatformAudioDevices::onAudioInputsChanged()
71{
72 m_audioInputs.reset();
73 emit audioInputsChanged(PrivateTag{});
74}
75
76void QPlatformAudioDevices::onAudioOutputsChanged()
77{
78 m_audioOutputs.reset();
79 emit audioOutputsChanged(PrivateTag{});
80}
81
82void QPlatformAudioDevices::updateAudioInputsCache()
83{
84 if (m_audioInputs.update(value: findAudioInputs()))
85 emit audioInputsChanged(PrivateTag{});
86}
87
88void QPlatformAudioDevices::updateAudioOutputsCache()
89{
90 if (m_audioOutputs.update(value: findAudioOutputs()))
91 emit audioOutputsChanged(PrivateTag{});
92}
93
94QPlatformAudioSource *QPlatformAudioDevices::createAudioSource(const QAudioDevice &,
95 const QAudioFormat &, QObject *)
96{
97 return nullptr;
98}
99QPlatformAudioSink *QPlatformAudioDevices::createAudioSink(const QAudioDevice &,
100 const QAudioFormat &, QObject *)
101{
102 return nullptr;
103}
104
105QPlatformAudioSource *QPlatformAudioDevices::audioInputDevice(const QAudioFormat &format,
106 const QAudioDevice &deviceInfo,
107 QObject *parent)
108{
109 QAudioDevice device = deviceInfo;
110 if (device.isNull())
111 device = QMediaDevices::defaultAudioInput();
112
113 if (device.isNull())
114 return nullptr;
115
116 return createAudioSource(device, format, parent);
117}
118
119QPlatformAudioSink *QPlatformAudioDevices::audioOutputDevice(const QAudioFormat &format,
120 const QAudioDevice &deviceInfo,
121 QObject *parent)
122{
123 QAudioDevice device = deviceInfo;
124 if (device.isNull())
125 device = QMediaDevices::defaultAudioOutput();
126
127 if (device.isNull())
128 return nullptr;
129
130 return createAudioSink(device, format, parent);
131}
132
133void QPlatformAudioDevices::prepareAudio() { }
134
135QT_END_NAMESPACE
136
137#include "moc_qplatformaudiodevices_p.cpp"
138

source code of qtmultimedia/src/multimedia/platform/qplatformaudiodevices.cpp