Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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 IOSAUDIOINPUT_H
4#define IOSAUDIOINPUT_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>
19
20#include <AudioUnit/AudioUnit.h>
21#include <CoreAudio/CoreAudioTypes.h>
22#include <AudioToolbox/AudioToolbox.h>
23
24#include <QtCore/QIODevice>
25#include <QtCore/QWaitCondition>
26#include <QtCore/QMutex>
27#include <QtCore/QTimer>
28
30
35
37{
38public:
39 QCoreAudioBufferList(AudioStreamBasicDescription const& streamFormat);
40 QCoreAudioBufferList(AudioStreamBasicDescription const& streamFormat, char *buffer, int bufferSize);
41 QCoreAudioBufferList(AudioStreamBasicDescription const& streamFormat, int framesToBuffer);
42
44
45 AudioBufferList* audioBufferList() const { return m_bufferList; }
46 char *data(int buffer = 0) const;
47 qint64 bufferSize(int buffer = 0) const;
48 int frameCount(int buffer = 0) const;
49 int packetCount(int buffer = 0) const;
50 int packetSize() const;
51 void reset();
52
53private:
54 bool m_owner;
55 int m_dataSize;
56 AudioStreamBasicDescription m_streamDescription;
57 AudioBufferList *m_bufferList;
58};
59
61{
62public:
64
65 bool feed(AudioBufferList& dst, UInt32& packetCount);
66 bool empty() const;
67
68private:
69 UInt32 m_totalPackets;
70 UInt32 m_position;
71 QCoreAudioBufferList *m_audioBufferList;
72};
73
75{
77
78public:
79 QDarwinAudioSourceBuffer(int bufferSize,
80 int maxPeriodSize,
81 AudioStreamBasicDescription const& inputFormat,
82 AudioStreamBasicDescription const& outputFormat,
84
86
87 qreal volume() const;
88 void setVolume(qreal v);
89
90 qint64 renderFromDevice(AudioUnit audioUnit,
91 AudioUnitRenderActionFlags *ioActionFlags,
92 const AudioTimeStamp *inTimeStamp,
93 UInt32 inBusNumber,
94 UInt32 inNumberFrames);
95
97
99
100 void startFlushTimer();
101 void stopFlushTimer();
102
103 void flush(bool all = false);
104 void reset();
105 int available() const;
106 int used() const;
107
108 void lock() { m_mutex.lock(); }
109 void unlock() { m_mutex.unlock(); }
110
111 void wait() { m_threadFinished.wait(&m_mutex); }
112 void wake() { m_threadFinished.wakeOne(); }
113
114signals:
115 void readyRead();
116
117private slots:
118 void flushBuffer();
119
120private:
121 QMutex m_mutex;
122 QWaitCondition m_threadFinished;
123
124 bool m_deviceError;
125 int m_maxPeriodSize;
126 int m_periodTime;
127 QIODevice *m_device;
128 QTimer *m_flushTimer;
129 CoreAudioRingBuffer *m_buffer;
130 QCoreAudioBufferList *m_inputBufferList;
131 AudioConverterRef m_audioConverter;
132 AudioStreamBasicDescription m_inputFormat;
133 AudioStreamBasicDescription m_outputFormat;
134 QAudioFormat m_qFormat;
135 qreal m_volume;
136
137 const static OSStatus as_empty = 'qtem';
138
139 // Converter callback
140 static OSStatus converterCallback(AudioConverterRef inAudioConverter,
141 UInt32 *ioNumberDataPackets,
142 AudioBufferList *ioData,
143 AudioStreamPacketDescription **outDataPacketDescription,
144 void *inUserData);
145};
146
148{
150
151public:
153
154 qint64 readData(char *data, qint64 len);
155 qint64 writeData(const char *data, qint64 len);
156
157 bool isSequential() const { return true; }
158
159private:
160 QDarwinAudioSourceBuffer *m_audioBuffer;
161};
162
164{
166
167public:
170
171 void start(QIODevice *device);
172 QIODevice *start();
173 void stop();
174 void reset();
175 void suspend();
176 void resume();
177 qsizetype bytesReady() const;
179 qsizetype bufferSize() const;
180 qint64 processedUSecs() const;
181 QAudio::Error error() const;
182 QAudio::State state() const;
183 void setFormat(const QAudioFormat &format);
184 QAudioFormat format() const;
185
186 void setVolume(qreal volume);
187 qreal volume() const;
188
189private slots:
190 void deviceStoppped();
191
192private:
193 enum {
194 Running,
195 Stopped
196 };
197
198 bool open();
199 void close();
200
201 void audioThreadStart();
202 void audioThreadStop();
203
204 void audioDeviceStop();
205 void audioDeviceActive();
206 void audioDeviceFull();
207 void audioDeviceError();
208
209 void startTimers();
210 void stopTimers();
211
212 // Input callback
213 static OSStatus inputCallback(void *inRefCon,
214 AudioUnitRenderActionFlags *ioActionFlags,
215 const AudioTimeStamp *inTimeStamp,
216 UInt32 inBusNumber,
217 UInt32 inNumberFrames,
218 AudioBufferList *ioData);
219
220 QAudioDevice m_audioDeviceInfo;
221 QByteArray m_device;
222 bool m_isOpen;
223 int m_periodSizeBytes;
224 int m_internalBufferSize;
225 qint64 m_totalFrames;
226 QAudioFormat m_audioFormat;
227 QIODevice *m_audioIO;
228 AudioUnit m_audioUnit;
229#if defined(Q_OS_MACOS)
230 AudioDeviceID m_audioDeviceId;
231#endif
232 Float64 m_clockFrequency;
233 QAudio::Error m_errorCode;
234 QAudio::State m_stateCode;
235 QDarwinAudioSourceBuffer *m_audioBuffer;
236 QAtomicInt m_audioThreadState;
237 AudioStreamBasicDescription m_streamFormat;
238 AudioStreamBasicDescription m_deviceFormat;
239 qreal m_volume;
240};
241
243
244#endif // IOSAUDIOINPUT_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
QCoreAudioBufferList(AudioStreamBasicDescription const &streamFormat)
AudioBufferList * audioBufferList() const
int frameCount(int buffer=0) const
qint64 bufferSize(int buffer=0) const
int packetCount(int buffer=0) const
QCoreAudioPacketFeeder(QCoreAudioBufferList *abl)
bool feed(AudioBufferList &dst, UInt32 &packetCount)
qint64 renderFromDevice(AudioUnit audioUnit, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames)
qint64 readBytes(char *data, qint64 len)
QDarwinAudioSourceBuffer(int bufferSize, int maxPeriodSize, AudioStreamBasicDescription const &inputFormat, AudioStreamBasicDescription const &outputFormat, QObject *parent)
void setFlushDevice(QIODevice *device)
bool isSequential() const
Returns true if this device is sequential; otherwise returns false.
QDarwinAudioSourceDevice(QDarwinAudioSourceBuffer *audioBuffer, QObject *parent)
qint64 writeData(const char *data, qint64 len)
Writes up to maxSize bytes from data to the device.
QDarwinAudioSource(const QAudioDevice &device, QObject *parent)
qsizetype bufferSize() const
void setVolume(qreal volume)
qint64 processedUSecs() const
qsizetype bytesReady() const
QAudio::Error error() const
void setBufferSize(qsizetype value)
void setFormat(const QAudioFormat &format)
QAudioFormat format() const
QAudio::State state() const
\inmodule QtCore \reentrant
Definition qiodevice.h:34
\inmodule QtCore
Definition qmutex.h:281
void unlock() noexcept
Unlocks the mutex.
Definition qmutex.h:289
void lock() noexcept
Locks the mutex.
Definition qmutex.h:286
\inmodule QtCore
Definition qobject.h:103
QObject * parent() const
Returns a pointer to the parent object.
Definition qobject.h:346
\inmodule QtCore
Definition qtimer.h:20
bool wait(QMutex *, QDeadlineTimer=QDeadlineTimer(QDeadlineTimer::Forever))
State
Definition qaudio.h:29
Error
Definition qaudio.h:28
Combined button and popup list for selecting options.
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLsizei const GLfloat * v
[13]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint buffer
GLenum GLenum dst
GLint GLsizei GLsizei GLenum format
GLenum GLsizei len
#define Q_OBJECT
#define slots
#define signals
ptrdiff_t qsizetype
Definition qtypes.h:165
long long qint64
Definition qtypes.h:60
double qreal
Definition qtypes.h:187
QByteArray readData()