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
qandroidaudiosource.cpp
Go to the documentation of this file.
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 <QtMultimedia/private/qandroidaudiosource_p.h>
5
6#include <QtCore/qcoreapplication.h>
7#include <QtCore/qpermissions.h>
8
9#include <QtMultimedia/private/qandroidaudiojnitypes_p.h>
10#include <QtMultimedia/private/qandroidaudioutil_p.h>
11
12QT_BEGIN_NAMESPACE
13
14namespace QtAAudio {
15
16Q_STATIC_LOGGING_CATEGORY(qLcAndroidAudioSource, "qt.multimedia.android.audiosource")
17
19 const QAudioFormat &format,
26{
28
29 qCDebug(qLcAndroidAudioSource) << "Creating source for device id:" << m_audioDevice.id()
30 << ", description:" << m_audioDevice.description();
31
33
34 // Set buffer parameters
36
37 // NOTE: AAudio doesn't support UINT8, so convert to INT16 if that's requested
40
41 // Set builder parameters for audio source
44
45 // TODO: Set input preset based on device
46
47 builder.userData = this;
48 builder.callback = [](AAudioStream *, void *userData, void *audioData,
49 int32_t numFrames) -> int {
50 auto *stream = reinterpret_cast<QAndroidAudioSourceStream *>(userData);
53 };
55 auto *stream = reinterpret_cast<QAndroidAudioSourceStream *>(userData);
58 };
59
61
62 if (!QtJniTypes::QtAudioDeviceManager::callStaticMethod<jboolean>("prepareAudioInput",
64 qCWarning(qLcAndroidAudioSource) << "Preparation failed for device:" << m_audioDevice.id().toInt();
65
67}
68
74
76{
78
80 if (!permitted) {
81 qWarning("Missing microphone permission!");
83 return false;
84 }
85
86 if (!m_stream->isOpen()) {
87 qCWarning(qLcAndroidAudioSource) << "Stream null";
89 return false;
90 }
91
93 qCWarning(qLcAndroidAudioSource) << "Stream parameters not correct";
94
95 return true;
96}
97
99{
103
104 if (!m_stream->start()) {
105 requestStop();
106 return false;
107 }
108
109 return true;
110}
111
117
123
129
143
149
152{
155 * numFrames)
157 QSpan<std::byte> audioSpan{ reinterpret_cast<std::byte *>(audioData), bytesForFrames };
158
159 auto framesWritten =
161
162 if (framesWritten != static_cast<uint64_t>(numFrames) && isStopRequested())
164
166}
167
169{
170 // Handle as IO error which closes the stream
171 requestStop();
172 invokeOnAppThread([this] {
173 // clang-format off
175 // clang-format on
176 });
177}
178
184
185} // namespace QtAAudio
186
187QT_END_NAMESPACE