Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qohosaudiosink.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
4
#
include
"qohosaudiosink_p.h"
5
6
#
include
<
QtMultimedia
/
private
/
qaudiohelpers_p
.
h
>
7
8
#
include
<
QtCore
/
qloggingcategory
.
h
>
9
10
QT_BEGIN_NAMESPACE
11
12
namespace
QtOHAudio
{
13
14
Q_STATIC_LOGGING_CATEGORY(
qLcOhosAudioSink
,
"qt.multimedia.ohos.audiosink"
)
15
16
QOhosAudioSinkStream::QOhosAudioSinkStream(QAudioDevice device,
const
QAudioFormat &format,
17
std::optional<qsizetype> ringbufferSize,
18
QOhosAudioSink *parent,
float
volume,
19
std::optional<QtMultimediaPrivate::NativePeriodFrames> hardwareBufferFrames,
20
AudioEndpointRole role)
21
:
QtMultimediaPrivate
::
QPlatformAudioSinkStream
(
std
::
move
(
device
),
format
,
ringbufferSize
,
22
hardwareBufferFrames
,
volume
),
23
m_parent
(
parent
),
24
m_role
(
role
)
25
{
26
QAudioFormat
builderFormat
=
format
;
27
const
QAudioFormat
::
SampleFormat
preferredFormat
=
28
QtOHAudio
::
preferredCompatibleSampleFormat
(
format
.
sampleFormat
());
29
if
(
preferredFormat
!=
format
.
sampleFormat
()) {
30
m_hostFormat
=
format
;
31
builderFormat
.
setSampleFormat
(
preferredFormat
);
32
}
33
34
QtOHAudio
::
StreamBuilder
builder
(
builderFormat
,
AUDIOSTREAM_TYPE_RENDERER
);
35
36
qCDebug
(
qLcOhosAudioSink
) <<
"Creating sink for device id:"
<<
m_audioDevice
.
id
()
37
<<
"description:"
<<
m_audioDevice
.
description
();
38
39
switch
(
m_role
) {
40
case
QtMultimediaPrivate
::
AudioEndpointRole
::
SoundEffect
:
41
builder
.
params
.
outputUsage
=
AUDIOSTREAM_USAGE_GAME
;
42
break
;
43
case
QtMultimediaPrivate
::
AudioEndpointRole
::
Accessibility
:
44
builder
.
params
.
outputUsage
=
AUDIOSTREAM_USAGE_ACCESSIBILITY
;
45
break
;
46
case
QtMultimediaPrivate
::
AudioEndpointRole
::
MediaPlayback
:
47
case
QtMultimediaPrivate
::
AudioEndpointRole
::
Other
:
48
builder
.
params
.
outputUsage
=
AUDIOSTREAM_USAGE_MUSIC
;
49
break
;
50
}
51
52
builder
.
userData
=
this
;
53
builder
.
writeCallback
= [](
OH_AudioRenderer
*,
void
*
userData
,
void
*
audioData
,
54
int32_t
audioDataSize
) ->
OH_AudioData_Callback_Result
{
55
auto
*
stream
=
reinterpret_cast
<
QOhosAudioSinkStream
*>(
userData
);
56
Q_ASSERT
(
stream
);
57
QSpan
<
std
::
byte
>
audioSpan
=
stream
->
getHostSpan
(
audioData
,
audioDataSize
);
58
return
stream
->
m_audioCallback
?
stream
->
processCallback
(
audioSpan
)
59
:
stream
->
processRingbuffer
(
audioSpan
,
audioDataSize
);
60
};
61
62
builder
.
setupBuilder
();
63
m_stream
=
std
::
make_unique
<
QtOHAudio
::
Stream
>(
builder
);
64
}
65
66
bool
QOhosAudioSinkStream::
open
()
67
{
68
if
(!m_stream || !m_stream->isOpen()) {
69
qCWarning(qLcOhosAudioSink) <<
"Stream creation failed"
;
70
requestStop();
71
return
false
;
72
}
73
return
true
;
74
}
75
76
bool
QOhosAudioSinkStream::
start
(QIODevice *device)
77
{
78
Q_ASSERT(thread()->isCurrentThread());
79
setQIODevice(device);
80
pullFromQIODevice();
81
createQIODeviceConnections(device);
82
83
if
(!m_stream->start()) {
84
requestStop();
85
return
false
;
86
}
87
return
true
;
88
}
89
90
QIODevice
*QOhosAudioSinkStream::
start
()
91
{
92
auto
*writer = createRingbufferWriterDevice();
93
return
start(writer) ? writer :
nullptr
;
94
}
95
96
bool
QOhosAudioSinkStream::
start
(AudioCallback cb)
97
{
98
Q_ASSERT(thread()->isCurrentThread());
99
m_audioCallback = std::move(cb);
100
101
if
(!m_stream->start()) {
102
requestStop();
103
return
false
;
104
}
105
return
true
;
106
}
107
108
void
QOhosAudioSinkStream::
suspend
()
109
{
110
Q_ASSERT(thread()->isCurrentThread());
111
m_stream->pause();
112
}
113
114
void
QOhosAudioSinkStream::
resume
()
115
{
116
Q_ASSERT(thread()->isCurrentThread());
117
m_stream->start();
118
}
119
120
void
QOhosAudioSinkStream::
stop
(ShutdownPolicy policy)
121
{
122
requestStop();
123
disconnectQIODeviceConnections();
124
125
switch
(policy) {
126
case
ShutdownPolicy::DrainRingbuffer:
127
stop();
128
break
;
129
case
ShutdownPolicy::DiscardRingbuffer:
130
reset();
131
break
;
132
default
:
133
Q_UNREACHABLE_RETURN();
134
}
135
}
136
137
void
QOhosAudioSinkStream::stop()
138
{
139
if
(isIdle() || m_audioCallback)
140
return
reset();
141
142
stopIdleDetection();
143
connectIdleHandler([
this
] {
144
Q_ASSERT(thread()->isCurrentThread());
145
if
(!isIdle())
146
return
;
147
m_stream->stop();
148
m_self =
nullptr
;
149
});
150
151
m_parent =
nullptr
;
152
m_self = shared_from_this();
153
}
154
155
void
QOhosAudioSinkStream::reset()
156
{
157
// Note: reset() can be invoked on the engine's destruction thread when the
158
// owning QRtAudioEngine was moved across threads after stream construction
159
// (the stream's idle-detection notifier does not follow the sink across
160
// moveToThread). OH_AudioRenderer_Stop is documented thread-safe, so we
161
// intentionally do not assert thread()->isCurrentThread() here.
162
m_stream->stop();
163
}
164
165
void
QOhosAudioSinkStream::
updateStreamIdle
(
bool
arg)
166
{
167
if
(m_parent)
168
m_parent->updateStreamIdle(arg);
169
}
170
171
QSpan
<
std
::
byte
>
172
QOhosAudioSinkStream
::
getHostSpan
(
void
*
audioData
,
173
int32_t
numBytes
)
const
noexcept
Q_DECL_NONBLOCKING_FUNCTION
174
{
175
return
QSpan
<
std
::
byte
>{
reinterpret_cast
<
std
::
byte
*>(
audioData
),
176
static_cast
<
qsizetype
>(
numBytes
) };
177
}
178
179
OH_AudioData_Callback_Result
180
QOhosAudioSinkStream
::
processRingbuffer
(
QSpan
<
std
::
byte
>
audioSpan
,
181
int32_t
numBytes
)
noexcept
Q_DECL_NONBLOCKING_FUNCTION
182
{
183
const
QAudioFormat
&
format
=
m_hostFormat
.
value_or
(
m_format
);
184
const
int32_t
numFrames
=
numBytes
/
format
.
bytesPerFrame
();
185
186
auto
consumedFrames
=
m_hostFormat
187
?
QPlatformAudioSinkStream
::
process
(
188
audioSpan
,
numFrames
,
189
QAudioHelperInternal
::
toNativeSampleFormat
(
m_hostFormat
->
sampleFormat
()))
190
:
QPlatformAudioSinkStream
::
process
(
audioSpan
,
numFrames
);
191
192
if
(
consumedFrames
!=
static_cast
<
uint64_t
>(
numFrames
) &&
isStopRequested
())
193
return
AUDIO_DATA_CALLBACK_RESULT_INVALID
;
194
195
return
AUDIO_DATA_CALLBACK_RESULT_VALID
;
196
}
197
198
OH_AudioData_Callback_Result
199
QOhosAudioSinkStream
::
processCallback
(
QSpan
<
std
::
byte
>
audioSpan
)
noexcept
Q_DECL_NONBLOCKING_FUNCTION
200
{
201
if
(
isStopRequested
())
202
return
AUDIO_DATA_CALLBACK_RESULT_INVALID
;
203
204
if
(
m_hostFormat
)
205
QtMultimediaPrivate
::
runAudioCallback
(*
m_audioCallback
,
audioSpan
,
m_format
,
volume
(),
206
*
m_hostFormat
);
207
else
208
QtMultimediaPrivate
::
runAudioCallback
(*
m_audioCallback
,
audioSpan
,
m_format
,
volume
());
209
210
return
AUDIO_DATA_CALLBACK_RESULT_VALID
;
211
}
212
213
QOhosAudioSink
::
QOhosAudioSink
(
QAudioDevice
device
,
const
QAudioFormat
&
format
,
QObject
*
parent
)
214
:
BaseClass
(
std
::
move
(
device
),
format
,
parent
)
215
{
216
}
217
218
QOhosAudioSink
::~
QOhosAudioSink
() =
default
;
219
220
}
// namespace QtOHAudio
221
222
QT_END_NAMESPACE
QtOHAudio::QOhosAudioSinkStream::stop
void stop(ShutdownPolicy policy)
Definition
qohosaudiosink.cpp:120
QtOHAudio::QOhosAudioSinkStream::start
bool start(AudioCallback cb)
Definition
qohosaudiosink.cpp:96
QtOHAudio::QOhosAudioSinkStream::resume
void resume()
Definition
qohosaudiosink.cpp:114
QtOHAudio::QOhosAudioSinkStream::start
bool start(QIODevice *device)
Definition
qohosaudiosink.cpp:76
QtOHAudio::QOhosAudioSinkStream::open
bool open()
Definition
qohosaudiosink.cpp:66
QtOHAudio::QOhosAudioSinkStream::updateStreamIdle
void updateStreamIdle(bool arg) override
Definition
qohosaudiosink.cpp:165
QtOHAudio::QOhosAudioSinkStream::suspend
void suspend()
Definition
qohosaudiosink.cpp:108
QtOHAudio::QOhosAudioSinkStream::start
QIODevice * start()
Definition
qohosaudiosink.cpp:90
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
QtOHAudio
Definition
qohaudiostream.cpp:25
qtmultimedia
src
multimedia
ohos
qohosaudiosink.cpp
Generated on
for Qt by
1.18.0