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
qdarwinaudiosink_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 QDARWINAUDIOSINK_P_H
4#define QDARWINAUDIOSINK_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
19#include <AudioUnit/AudioUnit.h>
20#include <QtMultimedia/private/qcoreaudioutils_p.h>
21#ifdef Q_OS_MACOS
22# include <QtMultimedia/private/qmacosaudiodatautils_p.h>
23#else
24# include <QtMultimedia/private/qcoreaudiosessionmanager_p.h>
25#endif
26
28
29class QDarwinAudioSink;
30
31class QCoreAudioSinkStream final : public std::enable_shared_from_this<QCoreAudioSinkStream>,
32 QtMultimediaPrivate::QPlatformAudioSinkStream
33{
34 using QPlatformAudioSinkStream = QtMultimediaPrivate::QPlatformAudioSinkStream;
35 using AudioEndpointRole = QtMultimediaPrivate::AudioEndpointRole;
36
37public:
38 using SinkType = QDarwinAudioSink;
39
40 explicit QCoreAudioSinkStream(QAudioDevice, const QAudioFormat &,
41 std::optional<qsizetype> ringbufferSize, QDarwinAudioSink *parent,
42 float volume, std::optional<int32_t> hardwareBufferFrames,
43 AudioEndpointRole);
44 Q_DISABLE_COPY_MOVE(QCoreAudioSinkStream)
45
46 bool open();
47 bool start(QIODevice *device);
49 bool start(AudioCallback cb);
50 void stop(ShutdownPolicy policy);
52 void stopStream();
53
54 void suspend();
55 void resume();
56
57 using QPlatformAudioSinkStream::bytesFree;
58 using QPlatformAudioSinkStream::processedDuration;
59 using QPlatformAudioSinkStream::ringbufferSizeInBytes;
60 using QPlatformAudioSinkStream::setVolume;
61
62 void resumeIfNecessary();
63
64private:
65 OSStatus processRingbuffer(uint32_t numberOfFrames,
66 AudioBufferList *ioData) noexcept QT_MM_NONBLOCKING;
67 OSStatus processAudioCallback(uint32_t numberOfFrames,
68 AudioBufferList *ioData) noexcept QT_MM_NONBLOCKING;
69
70 void updateStreamIdle(bool arg) override;
71 void stopAudioUnit();
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 std::unique_ptr<QIODevice> m_reader;
82 QCoreAudioUtils::AudioUnitHandle m_audioUnit;
83 bool m_audioUnitRunning{};
84
85 QDarwinAudioSink *m_parent;
86
87 std::optional<AudioCallback> m_audioCallback;
88};
89
90class QDarwinAudioSink final
91 : public QtMultimediaPrivate::QPlatformAudioSinkImplementation<QCoreAudioSinkStream,
92 QDarwinAudioSink>
93{
94 using BaseClass = QtMultimediaPrivate::QPlatformAudioSinkImplementation<QCoreAudioSinkStream,
95 QDarwinAudioSink>;
96
97public:
98 QDarwinAudioSink(QAudioDevice device, const QAudioFormat &format, QObject *parent);
100};
101
102QT_END_NAMESPACE
103
104#endif // QDARWINAUDIOSINK_P_H
QDarwinAudioSink SinkType
void stop(ShutdownPolicy policy)
bool start(AudioCallback cb)
bool start(QIODevice *device)
void updateStreamIdle(bool arg) override
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