Qt 6.x
The Qt SDK
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 IOSAUDIOOUTPUT_H
4#define IOSAUDIOOUTPUT_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 <private/qaudiosystem_p.h>
18
19#if defined(Q_OS_MACOS)
20# include <CoreAudio/CoreAudio.h>
21#endif
22#include <AudioUnit/AudioUnit.h>
23#include <CoreAudio/CoreAudioTypes.h>
24
25#include <QtCore/QIODevice>
26#include <QtCore/QWaitCondition>
27#include <QtCore/QMutex>
29
31
33class QTimer;
36
38{
40
41public:
42 QDarwinAudioSinkBuffer(int bufferSize, int maxPeriodSize, QAudioFormat const& audioFormat);
44
45 qint64 readFrames(char *data, qint64 maxFrames);
46 qint64 writeBytes(const char *data, qint64 maxSize);
47
48 int available() const;
49 void reset();
50
52
53 void startFillTimer();
54 void stopFillTimer();
55
57 void readyRead();
58
59private slots:
60 void fillBuffer();
61
62private:
63 bool m_deviceError;
64 int m_maxPeriodSize;
65 int m_bytesPerFrame;
66 int m_periodTime;
67 QIODevice *m_device;
68 QTimer *m_fillTimer;
69 CoreAudioRingBuffer *m_buffer;
70};
71
73{
74public:
76
78 qint64 writeData(const char *data, qint64 len);
79
80 bool isSequential() const { return true; }
81
82private:
83 QDarwinAudioSinkBuffer *m_audioBuffer;
84};
85
86
88{
90
91public:
94
95 void start(QIODevice *device);
97 void stop();
98 void reset();
99 void suspend();
100 void resume();
101 qsizetype bytesFree() const;
103 qsizetype bufferSize() const;
104 qint64 processedUSecs() const;
105 QAudio::Error error() const;
106 QAudio::State state() const;
107 void setFormat(const QAudioFormat &format);
108 QAudioFormat format() const;
109
110 void setVolume(qreal volume);
111 qreal volume() const;
112
113private slots:
114 void deviceStopped();
115 void inputReady();
116
117private:
118 enum {
119 Running,
120 Draining,
121 Stopped
122 };
123
124 static OSStatus renderCallback(void *inRefCon,
125 AudioUnitRenderActionFlags *ioActionFlags,
126 const AudioTimeStamp *inTimeStamp,
127 UInt32 inBusNumber,
128 UInt32 inNumberFrames,
129 AudioBufferList *ioData);
130
131 bool open();
132 void close();
133 void audioThreadStart();
134 void audioThreadStop();
135 void audioThreadDrain();
136 void audioDeviceStart();
137 void audioDeviceStop();
138 void audioDeviceIdle();
139 void audioDeviceError();
140
141 void startTimers();
142 void stopTimers();
143
144 QAudioDevice m_audioDeviceInfo;
145 QByteArray m_device;
146
147 static constexpr int DEFAULT_BUFFER_SIZE = 8 * 1024;
148
149 bool m_isOpen = false;
150 int m_internalBufferSize = DEFAULT_BUFFER_SIZE;
151 int m_periodSizeBytes = 0;
152 qint64 m_totalFrames = 0;
153 QAudioFormat m_audioFormat;
154 QIODevice *m_audioIO = nullptr;
155#if defined(Q_OS_MACOS)
156 AudioDeviceID m_audioDeviceId;
157#endif
158 AudioUnit m_audioUnit = 0;
159 Float64 m_clockFrequency = 0;
160 AudioStreamBasicDescription m_streamFormat;
161 QDarwinAudioSinkBuffer *m_audioBuffer = nullptr;
162 QAtomicInt m_audioThreadState;
163 QWaitCondition m_threadFinished;
164 QMutex m_mutex;
165 qreal m_cachedVolume = 1.;
166#if defined(Q_OS_MACOS)
167 qreal m_volume = 1.;
168#endif
169 bool m_pullMode = false;
170
171 QAudio::Error m_errorCode = QAudio::NoError;
173 QAudio::State m_suspendedInStateCode = QAudio::SuspendedState;
174};
175
177
178#endif // IOSAUDIOOUTPUT_H
IOBluetoothDevice * device
\inmodule QtCore
Definition qatomic.h:112
The QAudioDevice class provides an information about audio devices and their functionality.
The QAudioFormat class stores audio stream parameter information.
\inmodule QtCore
Definition qbytearray.h:57
qint64 readFrames(char *data, qint64 maxFrames)
qint64 writeBytes(const char *data, qint64 maxSize)
void setPrefetchDevice(QIODevice *device)
bool isSequential() const
Returns true if this device is sequential; otherwise returns false.
qint64 writeData(const char *data, qint64 len)
Writes up to maxSize bytes from data to the device.
void setFormat(const QAudioFormat &format)
qint64 processedUSecs() const
QAudioFormat format() const
void setBufferSize(qsizetype value)
QAudio::State state() const
QAudio::Error error() const
void setVolume(qreal volume)
qsizetype bytesFree() const
qsizetype bufferSize() const
\inmodule QtCore \reentrant
Definition qiodevice.h:34
\inmodule QtCore
Definition qmutex.h:285
\inmodule QtCore
Definition qobject.h:90
QObject * parent() const
Returns a pointer to the parent object.
Definition qobject.h:311
\inmodule QtCore
Definition qtimer.h:20
State
\value ActiveState Audio data is being processed, this state is set after start() is called and while...
Definition qaudio.h:25
@ StoppedState
Definition qaudio.h:25
@ SuspendedState
Definition qaudio.h:25
Error
\value NoError No errors have occurred \value OpenError An error occurred opening the audio device \v...
Definition qaudio.h:24
@ NoError
Definition qaudio.h:24
Combined button and popup list for selecting options.
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLint GLsizei GLsizei GLenum format
GLenum GLsizei len
#define Q_OBJECT
#define slots
#define signals
ptrdiff_t qsizetype
Definition qtypes.h:70
long long qint64
Definition qtypes.h:55
double qreal
Definition qtypes.h:92
QByteArray readData()