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#include <QtMultimedia/private/qdarwinaudiodevices_p.h>
22#ifdef Q_OS_MACOS
23# include <QtMultimedia/private/qmacosaudiodatautils_p.h>
24#else
25# include <QtMultimedia/private/qcoreaudiosessionmanager_p.h>
26#endif
27
28QT_BEGIN_NAMESPACE
29
30class QDarwinAudioSink;
31
32class QCoreAudioSinkStream final : public std::enable_shared_from_this<QCoreAudioSinkStream>,
33 public QtMultimediaPrivate::QPlatformAudioSinkStream
34{
35 using QPlatformAudioSinkStream = QtMultimediaPrivate::QPlatformAudioSinkStream;
36 using AudioEndpointRole = QtMultimediaPrivate::AudioEndpointRole;
37
38public:
39 using SinkType = QDarwinAudioSink;
40
41 explicit QCoreAudioSinkStream(QAudioDevice, const QAudioFormat &,
42 std::optional<qsizetype> ringbufferSize, QDarwinAudioSink *parent,
43 float volume, std::optional<int32_t> hardwareBufferFrames,
45 Q_DISABLE_COPY_MOVE(QCoreAudioSinkStream)
46
47 bool open();
48 bool start(QIODevice *device);
50 bool start(AudioCallback cb);
51 void stop(ShutdownPolicy policy);
53 void stopStream();
54
55 void suspend();
56 void resume();
57
58 using QPlatformAudioSinkStream::bytesFree;
59 using QPlatformAudioSinkStream::processedDuration;
60 using QPlatformAudioSinkStream::ringbufferSizeInBytes;
61 using QPlatformAudioSinkStream::setVolume;
62
63 void resumeIfNecessary();
64
65private:
66 OSStatus processRingbuffer(uint32_t numberOfFrames,
67 AudioBufferList *ioData) noexcept QT_MM_NONBLOCKING;
68 OSStatus processAudioCallback(uint32_t numberOfFrames,
69 AudioBufferList *ioData) noexcept QT_MM_NONBLOCKING;
70
71 void updateStreamIdle(bool arg) override;
72 void stopAudioUnit();
73
74#ifdef Q_OS_MACOS
75 bool addDisconnectListener(AudioObjectID id);
76 void removeDisconnectListener();
77
78 QCoreAudioUtils::DeviceDisconnectMonitor m_disconnectMonitor;
79 QFuture<void> m_stopOnDisconnected;
80#endif
81
82 std::unique_ptr<QIODevice> m_reader;
83 QCoreAudioUtils::AudioUnitHandle m_audioUnit;
84 bool m_audioUnitRunning{};
85
86 QDarwinAudioSink *m_parent;
87
88 std::optional<AudioCallback> m_audioCallback;
89};
90
91class QDarwinAudioSink final
92 : public QtMultimediaPrivate::QPlatformAudioSinkImplementation<QCoreAudioSinkStream,
93 QDarwinAudioSink>
94{
95 using BaseClass = QtMultimediaPrivate::QPlatformAudioSinkImplementation<QCoreAudioSinkStream,
96 QDarwinAudioSink>;
97
98public:
99 QDarwinAudioSink(QAudioDevice device, const QAudioFormat &format, QObject *parent);
101
103};
104
105QT_END_NAMESPACE
106
107#endif // QDARWINAUDIOSINK_P_H
QDarwinAudioSink SinkType
void stop(ShutdownPolicy policy)
bool start(AudioCallback cb)
bool start(QIODevice *device)
QCoreAudioSinkStream(QAudioDevice, const QAudioFormat &, std::optional< qsizetype > ringbufferSize, QDarwinAudioSink *parent, float volume, std::optional< int32_t > hardwareBufferFrames, AudioEndpointRole)
void updateStreamIdle(bool arg) override
QDarwinAudioSink(QAudioDevice device, const QAudioFormat &format, QObject *parent)
~QDarwinAudioSink() override