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
4//
5// W A R N I N G
6// -------------
7//
8// This file is not part of the Qt API. It exists for the convenience
9// of other Qt classes. This header file may change from version to
10// version without notice, or even be removed.
11//
12// We mean it.
13//
14
15#ifndef QAUDIOINPUTPULSE_H
16#define QAUDIOINPUTPULSE_H
17
18#include <QtCore/qfile.h>
19#include <QtCore/qtimer.h>
20#include <QtCore/qstring.h>
21#include <QtCore/qstringlist.h>
22#include <QtCore/qelapsedtimer.h>
23#include <QtCore/qiodevice.h>
24
25#include "qaudio.h"
26#include "qaudiodevice.h"
27#include <QtMultimedia/private/qpulsehelpers_p.h>
28#include <QtMultimedia/private/qaudiosystem_p.h>
29#include <QtMultimedia/private/qaudiostatemachine_p.h>
30
31#include <pulse/pulseaudio.h>
32
33QT_BEGIN_NAMESPACE
34
35class PulseInputPrivate;
36
37class QPulseAudioSource : public QPlatformAudioSource
38{
39 Q_OBJECT
40
41public:
42 QPulseAudioSource(const QByteArray &device, QObject *parent);
43 ~QPulseAudioSource() override;
44
45 qint64 read(char *data, qint64 len);
46
47 void start(QIODevice *device) override;
48 QIODevice *start() override;
49 void stop() override;
50 void reset() override;
51 void suspend() override;
52 void resume() override;
53 qsizetype bytesReady() const override;
54 void setBufferSize(qsizetype value) override;
55 qsizetype bufferSize() const override;
56 qint64 processedUSecs() const override;
57 QAudio::Error error() const override;
58 QAudio::State state() const override;
59 void setFormat(const QAudioFormat &format);
60 QAudioFormat format() const override;
61
62 void setVolume(qreal volume) override;
63 qreal volume() const override;
64
65 qint64 m_totalTimeValue;
66 QIODevice *m_audioSource;
67 QAudioFormat m_format;
68 qreal m_volume;
69
70protected:
71 void timerEvent(QTimerEvent *event) override;
72
73private slots:
74 void userFeed();
75 void onPulseContextFailed();
76
77private:
78 void applyVolume(const void *src, void *dest, int len) const;
79
80 bool open();
81 void close();
82
83 using PAOperationHandle = QPulseAudioInternal::PAOperationHandle;
84 using PAStreamHandle = QPulseAudioInternal::PAStreamHandle;
85
86 bool m_pullMode;
87 bool m_opened;
88 int m_bufferSize;
89 int m_periodSize;
90 unsigned int m_periodTime;
91 QBasicTimer m_timer;
92 qint64 m_elapsedTimeOffset;
93 PAStreamHandle m_stream;
94 QByteArray m_streamName;
95 QByteArray m_device;
96 QByteArray m_tempBuffer;
97 pa_sample_spec m_spec;
98
99 QAudioStateMachine m_stateMachine;
100
101};
102
103class PulseInputPrivate : public QIODevice
104{
105 Q_OBJECT
106public:
107 PulseInputPrivate(QPulseAudioSource *audio);
108 ~PulseInputPrivate() override = default;
109
110 qint64 bytesAvailable() const override;
111 qint64 readData(char *data, qint64 len) override;
112 qint64 writeData(const char *data, qint64 len) override;
113
114 void trigger();
115
116private:
117 QPulseAudioSource *m_audioDevice;
118};
119
120QT_END_NAMESPACE
121
122#endif
123

source code of qtmultimedia/src/multimedia/pulseaudio/qpulseaudiosource_p.h