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
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
4
#
include
"qohosaudiosource_p.h"
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
12
QT_BEGIN_NAMESPACE
13
14
namespace
QtOHAudio
{
15
16
Q_STATIC_LOGGING_CATEGORY(
qLcOhosAudioSource
,
"qt.multimedia.ohos.audiosource"
)
17
18
QOhosAudioSourceStream::QOhosAudioSourceStream(QAudioDevice device,
const
QAudioFormat &format,
19
std::optional<
int
> ringbufferSize,
20
QOhosAudioSource *parent,
float
volume,
21
std::optional<QtMultimediaPrivate::NativePeriodFrames> hardwareBufferFrames)
22
:
QtMultimediaPrivate
::
QPlatformAudioSourceStream
(
std
::
move
(
device
),
format
,
ringbufferSize
,
23
hardwareBufferFrames
,
volume
),
24
m_parent
(
parent
)
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_CAPTURER
);
35
36
qCDebug
(
qLcOhosAudioSource
) <<
"Creating source for device id:"
<<
m_audioDevice
.
id
()
37
<<
"description:"
<<
m_audioDevice
.
description
();
38
39
builder
.
params
.
inputSourceType
=
AUDIOSTREAM_SOURCE_TYPE_MIC
;
40
builder
.
userData
=
this
;
41
builder
.
readCallback
= [](
OH_AudioCapturer
*,
void
*
userData
,
void
*
audioData
,
42
int32_t
audioDataSize
) ->
int32_t
{
43
auto
*
stream
=
reinterpret_cast
<
QOhosAudioSourceStream
*>(
userData
);
44
Q_ASSERT
(
stream
);
45
auto
audioSpan
=
stream
->
getHostSpan
(
audioData
,
audioDataSize
);
46
return
stream
->
m_audioCallback
?
stream
->
processCallback
(
audioSpan
)
47
:
stream
->
processRingbuffer
(
audioSpan
,
audioDataSize
);
48
};
49
50
builder
.
setupBuilder
();
51
m_stream
=
std
::
make_unique
<
QtOHAudio
::
Stream
>(
builder
);
52
}
53
54
bool
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
72
bool
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
85
QIODevice
*QOhosAudioSourceStream::
start
()
86
{
87
auto
*device = createRingbufferReaderDevice();
88
return
start(device) ? device :
nullptr
;
89
}
90
91
bool
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
103
void
QOhosAudioSourceStream::
suspend
()
104
{
105
Q_ASSERT(thread()->isCurrentThread());
106
m_stream->pause();
107
}
108
109
void
QOhosAudioSourceStream::
resume
()
110
{
111
Q_ASSERT(thread()->isCurrentThread());
112
m_stream->start();
113
}
114
115
void
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
129
void
QOhosAudioSourceStream::
updateStreamIdle
(
bool
idle)
130
{
131
if
(m_parent)
132
m_parent->updateStreamIdle(idle);
133
}
134
135
QSpan
<
const
std
::
byte
>
136
QOhosAudioSourceStream
::
getHostSpan
(
void
*
audioData
,
137
int32_t
numBytes
)
const
noexcept
Q_DECL_NONBLOCKING_FUNCTION
138
{
139
return
QSpan
<
const
std
::
byte
>{
reinterpret_cast
<
const
std
::
byte
*>(
audioData
),
140
static_cast
<
qsizetype
>(
numBytes
) };
141
}
142
143
int32_t
144
QOhosAudioSourceStream
::
processRingbuffer
(
QSpan
<
const
std
::
byte
>
audioSpan
,
145
int32_t
numBytes
)
noexcept
Q_DECL_NONBLOCKING_FUNCTION
146
{
147
const
QAudioFormat
&
format
=
m_hostFormat
.
value_or
(
m_format
);
148
const
int32_t
numFrames
=
numBytes
/
format
.
bytesPerFrame
();
149
150
auto
framesWritten
=
m_hostFormat
151
?
QPlatformAudioSourceStream
::
process
(
152
audioSpan
,
numFrames
,
153
QAudioHelperInternal
::
toNativeSampleFormat
(
m_hostFormat
->
sampleFormat
()))
154
:
QPlatformAudioSourceStream
::
process
(
audioSpan
,
numFrames
);
155
156
Q_UNUSED
(
framesWritten
)
157
return
0;
158
}
159
160
int32_t
161
QOhosAudioSourceStream
::
processCallback
(
QSpan
<
const
std
::
byte
>
audioSpan
)
noexcept
Q_DECL_NONBLOCKING_FUNCTION
162
{
163
if
(
isStopRequested
())
164
return
0;
165
166
if
(
m_hostFormat
)
167
QtMultimediaPrivate
::
runAudioCallback
(*
m_audioCallback
,
audioSpan
,
m_format
,
volume
(),
168
*
m_hostFormat
);
169
else
170
QtMultimediaPrivate
::
runAudioCallback
(*
m_audioCallback
,
audioSpan
,
m_format
,
volume
());
171
172
return
0;
173
}
174
175
QOhosAudioSource
::
QOhosAudioSource
(
QAudioDevice
device
,
const
QAudioFormat
&
format
,
QObject
*
parent
)
176
:
BaseClass
(
std
::
move
(
device
),
format
,
parent
)
177
{
178
}
179
180
QOhosAudioSource
::~
QOhosAudioSource
() =
default
;
181
182
}
// namespace QtOHAudio
183
184
QT_END_NAMESPACE
QtOHAudio::QOhosAudioSourceStream::suspend
void suspend()
Definition
qohosaudiosource.cpp:103
QtOHAudio::QOhosAudioSourceStream::resume
void resume()
Definition
qohosaudiosource.cpp:109
QtOHAudio::QOhosAudioSourceStream::updateStreamIdle
void updateStreamIdle(bool idle) override
Definition
qohosaudiosource.cpp:129
QtOHAudio::QOhosAudioSourceStream::stop
void stop(ShutdownPolicy)
Definition
qohosaudiosource.cpp:115
QtOHAudio::QOhosAudioSourceStream::open
bool open()
Definition
qohosaudiosource.cpp:54
QtOHAudio::QOhosAudioSourceStream::start
bool start(AudioCallback &&)
Definition
qohosaudiosource.cpp:91
QtOHAudio::QOhosAudioSourceStream::start
bool start(QIODevice *)
Definition
qohosaudiosource.cpp:72
QtOHAudio::QOhosAudioSourceStream::start
QIODevice * start()
Definition
qohosaudiosource.cpp:85
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
QtOHAudio
Definition
qohaudiostream.cpp:25
qtmultimedia
src
multimedia
ohos
qohosaudiosource.cpp
Generated on
for Qt by
1.18.0