1// Copyright (C) 2022 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
4#ifndef QAUDIOSYSTEM_H
5#define QAUDIOSYSTEM_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtMultimedia/qtmultimediaglobal.h>
19
20#include <QtMultimedia/qaudio.h>
21#include <QtMultimedia/qaudioformat.h>
22
23#include <QtCore/qelapsedtimer.h>
24#include <QtCore/private/qglobal_p.h>
25
26QT_BEGIN_NAMESPACE
27
28class QIODevice;
29
30class Q_MULTIMEDIA_EXPORT QAudioStateChangeNotifier : public QObject
31{
32 Q_OBJECT
33
34public:
35 explicit QAudioStateChangeNotifier(QObject *parent = nullptr);
36
37signals:
38 void errorChanged(QAudio::Error error);
39 void stateChanged(QAudio::State state);
40};
41
42class Q_MULTIMEDIA_EXPORT QPlatformAudioEndpointBase : public QAudioStateChangeNotifier
43{
44public:
45 explicit QPlatformAudioEndpointBase(QObject *parent = nullptr);
46
47 // LATER: can we devirtualize these functions
48 virtual QAudio::Error error() const { return m_error; }
49 virtual QAudio::State state() const { return m_inferredState; }
50 void setError(QAudio::Error);
51
52protected:
53 enum class EmitStateSignal : uint8_t
54 {
55 True,
56 False,
57 };
58
59 void updateStreamState(QAudio::State);
60 void updateStreamIdle(bool idle, EmitStateSignal = EmitStateSignal::True);
61
62private:
63 void inferState();
64
65 QAudio::State m_streamState = QAudio::StoppedState;
66 QAudio::State m_inferredState = QAudio::StoppedState;
67 QAudio::Error m_error{};
68 bool m_streamIsIdle = false;
69};
70
71class Q_MULTIMEDIA_EXPORT QPlatformAudioSink : public QPlatformAudioEndpointBase
72{
73public:
74 explicit QPlatformAudioSink(QObject *parent);
75 virtual void start(QIODevice *device) = 0;
76 virtual QIODevice* start() = 0;
77 virtual void stop() = 0;
78 virtual void reset() = 0;
79 virtual void suspend() = 0;
80 virtual void resume() = 0;
81 virtual qsizetype bytesFree() const = 0;
82 virtual void setBufferSize(qsizetype value) = 0;
83 virtual qsizetype bufferSize() const = 0;
84 virtual qint64 processedUSecs() const = 0;
85 virtual QAudioFormat format() const = 0;
86 virtual void setVolume(qreal) {}
87 virtual qreal volume() const;
88
89 QElapsedTimer elapsedTime;
90};
91
92class Q_MULTIMEDIA_EXPORT QPlatformAudioSource : public QPlatformAudioEndpointBase
93{
94public:
95 explicit QPlatformAudioSource(QObject *parent);
96 virtual void start(QIODevice *device) = 0;
97 virtual QIODevice* start() = 0;
98 virtual void stop() = 0;
99 virtual void reset() = 0;
100 virtual void suspend() = 0;
101 virtual void resume() = 0;
102 virtual qsizetype bytesReady() const = 0;
103 virtual void setBufferSize(qsizetype value) = 0;
104 virtual qsizetype bufferSize() const = 0;
105 virtual qint64 processedUSecs() const = 0;
106 virtual QAudioFormat format() const = 0;
107 virtual void setVolume(qreal) = 0;
108 virtual qreal volume() const = 0;
109
110 QElapsedTimer elapsedTime;
111};
112
113QT_END_NAMESPACE
114
115#endif // QAUDIOSYSTEM_H
116

source code of qtmultimedia/src/multimedia/audio/qaudiosystem_p.h