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
qdarwinaudiosource_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 QDARWINAUDIOSOURCE_P_H
4#define QDARWINAUDIOSOURCE_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
20#include <AudioUnit/AudioUnit.h>
21
23
24class QDarwinAudioSource;
25
26class QCoreAudioSourceStream final : QtMultimediaPrivate::QPlatformAudioSourceStream
27{
28 using QPlatformAudioSourceStream = QtMultimediaPrivate::QPlatformAudioSourceStream;
29
30public:
31 using SourceType = QDarwinAudioSource;
32
33 explicit QCoreAudioSourceStream(QAudioDevice, const QAudioFormat &,
34 std::optional<int> ringbufferSize, QDarwinAudioSource *parent,
35 float volume, std::optional<int32_t> hardwareBufferFrames);
36 Q_DISABLE_COPY_MOVE(QCoreAudioSourceStream)
37 ~QCoreAudioSourceStream();
38
39 bool open();
40
41 bool start(QIODevice *);
43 bool start(AudioCallback &&);
44 void stop(ShutdownPolicy);
45
46 void suspend();
47 void resume();
48
49 using QPlatformAudioSourceStream::bytesReady;
50 using QPlatformAudioSourceStream::deviceIsRingbufferReader;
51 using QPlatformAudioSourceStream::processedDuration;
52 using QPlatformAudioSourceStream::ringbufferSizeInBytes;
53 using QPlatformAudioSourceStream::setVolume;
54
55 void resumeIfNecessary();
56
57private:
58 void updateStreamIdle(bool idle) override;
59 void stopAudioUnit();
60
61 static OSStatus inputCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags,
62 const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber,
63 UInt32 inNumberFrames, AudioBufferList *ioData);
64
65 OSStatus processRingbuffer(AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *,
66 UInt32 inBusNumber, UInt32 inNumberFrames,
67 AudioBufferList *ioData) noexcept QT_MM_NONBLOCKING;
68
69 OSStatus processAudioCallback(AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *,
70 UInt32 inBusNumber, UInt32 inNumberFrames,
71 AudioBufferList *ioData) noexcept QT_MM_NONBLOCKING;
72
73#ifdef Q_OS_MACOS
74 bool addDisconnectListener(AudioObjectID id);
75 void removeDisconnectListener();
76
77 QCoreAudioUtils::DeviceDisconnectMonitor m_disconnectMonitor;
78 QFuture<void> m_stopOnDisconnected;
79#endif
80
81 QCoreAudioUtils::AudioUnitHandle m_audioUnit;
82 bool m_audioUnitRunning{};
83
84 std::optional<AudioCallback> m_audioCallback;
85 QDarwinAudioSource *m_parent;
86
87 AudioBufferList m_bufferList{};
88};
89
90class QDarwinAudioSource final
91 : public QtMultimediaPrivate::QPlatformAudioSourceImplementationWithCallback<
92 QCoreAudioSourceStream, QDarwinAudioSource>
93{
94 using BaseClass = QtMultimediaPrivate::QPlatformAudioSourceImplementationWithCallback<
95 QCoreAudioSourceStream, QDarwinAudioSource>;
96
97public:
98 QDarwinAudioSource(QAudioDevice device, const QAudioFormat &format, QObject *parent);
100};
101
102QT_END_NAMESPACE
103
104#endif // QDARWINAUDIOSOURCE_P_H
QDarwinAudioSource SourceType
bool start(AudioCallback &&)
void stop(ShutdownPolicy)
void updateStreamIdle(bool idle) override
QLatin1String backendName() const override
QList< QAudioDevice > findAudioOutputs() const override
QPlatformAudioSource * createAudioSource(const QAudioDevice &, const QAudioFormat &, QObject *parent) override
QPlatformAudioSink * createAudioSink(const QAudioDevice &, const QAudioFormat &, QObject *parent) override
QList< QAudioDevice > findAudioInputs() const override