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
qohosaudiosource.cpp
Go to the documentation of this file.
1// Copyright (C) 2026 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
5
6#include <QtMultimedia/private/qaudiohelpers_p.h>
7
8#include <QtCore/qcoreapplication.h>
9#include <QtCore/qloggingcategory.h>
10#include <QtCore/qpermissions.h>
11
13
14namespace QtOHAudio {
15
16Q_STATIC_LOGGING_CATEGORY(qLcOhosAudioSource, "qt.multimedia.ohos.audiosource")
17
18QOhosAudioSourceStream::QOhosAudioSourceStream(QAudioDevice device, const QAudioFormat &format,
19 std::optional<int> ringbufferSize,
20 QOhosAudioSource *parent, float volume,
21 std::optional<QtMultimediaPrivate::NativePeriodFrames> hardwareBufferFrames)
25{
32 }
33
35
36 qCDebug(qLcOhosAudioSource) << "Creating source for device id:" << m_audioDevice.id()
37 << "description:" << m_audioDevice.description();
38
40 builder.userData = this;
43 auto *stream = reinterpret_cast<QOhosAudioSourceStream *>(userData);
48 };
49
52}
53
54bool QOhosAudioSourceStream::open()
55{
56 QMicrophonePermission permission;
57 const bool permitted = qApp->checkPermission(permission) == Qt::PermissionStatus::Granted;
58 if (!permitted) {
59 qCWarning(qLcOhosAudioSource) << "Missing microphone permission";
60 requestStop();
61 return false;
62 }
63
64 if (!m_stream || !m_stream->isOpen()) {
65 qCWarning(qLcOhosAudioSource) << "Stream creation failed";
66 requestStop();
67 return false;
68 }
69 return true;
70}
71
72bool QOhosAudioSourceStream::start(QIODevice *device)
73{
74 Q_ASSERT(thread()->isCurrentThread());
75 setQIODevice(device);
76 createQIODeviceConnections(device);
77
78 if (!m_stream->start()) {
79 requestStop();
80 return false;
81 }
82 return true;
83}
84
85QIODevice *QOhosAudioSourceStream::start()
86{
87 auto *device = createRingbufferReaderDevice();
88 return start(device) ? device : nullptr;
89}
90
91bool QOhosAudioSourceStream::start(AudioCallback &&callback)
92{
93 Q_ASSERT(thread()->isCurrentThread());
94 m_audioCallback = std::move(callback);
95
96 if (!m_stream->start()) {
97 requestStop();
98 return false;
99 }
100 return true;
101}
102
103void QOhosAudioSourceStream::suspend()
104{
105 Q_ASSERT(thread()->isCurrentThread());
106 m_stream->pause();
107}
108
109void QOhosAudioSourceStream::resume()
110{
111 Q_ASSERT(thread()->isCurrentThread());
112 m_stream->start();
113}
114
115void QOhosAudioSourceStream::stop(ShutdownPolicy policy)
116{
117 Q_ASSERT(thread()->isCurrentThread());
118 requestStop();
119
120 m_stream->stop();
121
122 disconnectQIODeviceConnections();
123 finalizeQIODevice(policy);
124
125 if (policy == ShutdownPolicy::DiscardRingbuffer)
126 emptyRingbuffer();
127}
128
129void QOhosAudioSourceStream::updateStreamIdle(bool idle)
130{
131 if (m_parent)
132 m_parent->updateStreamIdle(idle);
133}
134
135QSpan<const std::byte>
138{
139 return QSpan<const std::byte>{ reinterpret_cast<const std::byte *>(audioData),
140 static_cast<qsizetype>(numBytes) };
141}
142
146{
149
155
157 return 0;
158}
159
162{
163 if (isStopRequested())
164 return 0;
165
166 if (m_hostFormat)
168 *m_hostFormat);
169 else
171
172 return 0;
173}
174
179
181
182} // namespace QtOHAudio
183
184QT_END_NAMESPACE
void updateStreamIdle(bool idle) override
Combined button and popup list for selecting options.