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
qcoreaaudiosource_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 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#ifndef QCOREAAUDIOSOURCE_P_H
4#define QCOREAAUDIOSOURCE_P_H
5
6//
7// W A R N I N G
8// -------------
9//
10// This file is not part of the Qt API. It exists purely as an
11// implementation detail. This header file may change from version to
12// version without notice, or even be removed.
13//
14// We mean it.
15//
16
17#include <QtMultimedia/private/qaudio_platform_implementation_support_p.h>
18#include <QtMultimedia/private/qcoreaudioutils_p.h>
19#include <QtMultimedia/private/qcoreaudiodevices_p.h>
20#ifndef Q_OS_MACOS
21# include <QtMultimedia/private/qavaudiosessionrecovery_p.h>
22#endif
23
24#include <AudioUnit/AudioUnit.h>
25#include <vector>
26
27typedef struct OpaqueAudioConverter *AudioConverterRef;
28
29QT_BEGIN_NAMESPACE
30
31class QCoreAudioSource;
32
33class QCoreAudioSourceStream final : public QtMultimediaPrivate::QPlatformAudioSourceStream
34{
35 using QPlatformAudioSourceStream = QtMultimediaPrivate::QPlatformAudioSourceStream;
36
37public:
38 using SourceType = QCoreAudioSource;
39
40 explicit QCoreAudioSourceStream(QAudioDevice, const QAudioFormat &,
41 std::optional<int> ringbufferSize, QCoreAudioSource *parent,
42 float volume, std::optional<QtMultimediaPrivate::NativePeriodFrames> nativePeriodFrames);
43 Q_DISABLE_COPY_MOVE(QCoreAudioSourceStream)
44 ~QCoreAudioSourceStream();
45
46 bool open();
47
48 bool start(QIODevice *);
50 bool start(AudioCallback &&);
51 void stop(ShutdownPolicy);
52
53 void suspend();
54 bool resume();
55
56 using QPlatformAudioSourceStream::bytesReady;
57 using QPlatformAudioSourceStream::deviceIsRingbufferReader;
58 using QPlatformAudioSourceStream::processedDuration;
59 using QPlatformAudioSourceStream::ringbufferSizeInBytes;
60 using QPlatformAudioSourceStream::setVolume;
61
62 bool resumeIfNecessary();
63
64 void reportIOError();
66
67private:
68 void updateStreamIdle(bool idle) override;
69
70 bool startAudioUnit();
71 void stopAudioUnit();
72
73 OSStatus processInput(AudioUnitRenderActionFlags *ioActionFlags,
74 const AudioTimeStamp *timeStamp, UInt32 inBusNumber,
75 UInt32 inNumberFrames,
76 AudioBufferList *ioData) noexcept Q_DECL_NONBLOCKING_FUNCTION;
77
78 OSStatus processRingbuffer(QSpan<const std::byte> inputSpan,
79 UInt32 inNumberFrames) noexcept Q_DECL_NONBLOCKING_FUNCTION;
80 OSStatus processAudioCallback(QSpan<const std::byte> inputSpan) noexcept Q_DECL_NONBLOCKING_FUNCTION;
81
82#ifdef Q_OS_MACOS
83 bool setDisconnectListener(AudioObjectID id);
84 void cancelDisconnectFutures();
85
86 QCoreAudioUtils::DeviceDisconnectMonitor m_disconnectMonitor;
87 QFuture<void> m_disconnectFuture;
88 QFuture<void> m_stopOnDisconnected;
89#endif
90
91 QCoreAudioUtils::AudioUnitHandle m_audioUnit;
92
93 std::optional<AudioCallback> m_audioCallback;
94 QCoreAudioSource *m_parent;
95
96 AudioBufferList m_bufferList{};
97 UInt32 m_bufferCapacity{};
98
99 // for run-time conversions
100 AudioConverterRef m_audioConverter{ nullptr };
101 std::vector<uint8_t> m_outputBuffer;
102 AudioBufferList m_outputBufferList{};
103
104#ifndef Q_OS_MACOS
105 // Held for as long as this stream wants the shared AVAudioSession active; acquired in
106 // start(), released in stop(). suspend()/resume() (interruption handling) must not touch
107 // it: the stream still wants the session active across a suspend/resume cycle, only the
108 // OS-level session state changed.
109 std::optional<QtMultimediaPrivate::QAVAudioSessionManager::ActivationToken> m_sessionActivation;
110#endif
111};
112
113class QCoreAudioSource final
114 : public QtMultimediaPrivate::QPlatformAudioSourceImplementationWithCallback<
115 QCoreAudioSourceStream, QCoreAudioSource>
116{
117 using BaseClass = QtMultimediaPrivate::QPlatformAudioSourceImplementationWithCallback<
118 QCoreAudioSourceStream, QCoreAudioSource>;
119
120public:
121 QCoreAudioSource(QAudioDevice device, const QAudioFormat &format, QObject *parent);
123
125
126#ifndef Q_OS_MACOS
127 void resume() override;
128
129 // Interface required by QAVAudioSessionRecovery.
130 QCoreAudioSourceStream *currentStream() const { return m_stream.get(); }
131 using BaseClass::updateStreamState;
132
133 void notifyStreamStopped() { m_recovery.streamStopped(); }
134
135private:
136 QtMultimediaPrivate::QAVAudioSessionRecovery<QCoreAudioSource> m_recovery{ *this };
137#endif
138};
139
140QT_END_NAMESPACE
141
142#endif // QCOREAAUDIOSOURCE_P_H
The QAudioDevice class provides an information about audio devices and their functionality.
bool start(AudioCallback &&)
void stop(ShutdownPolicy)
QCoreAudioSourceStream(QAudioDevice, const QAudioFormat &, std::optional< int > ringbufferSize, QCoreAudioSource *parent, float volume, std::optional< QtMultimediaPrivate::NativePeriodFrames > nativePeriodFrames)
void updateStreamIdle(bool idle) override
QCoreAudioSourceStream * currentStream() const
~QCoreAudioSource() override
QCoreAudioSource(QAudioDevice device, const QAudioFormat &format, QObject *parent)
void resume() override
Combined button and popup list for selecting options.
struct OpaqueAudioConverter * AudioConverterRef