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
qpipewire_audiosink_p.h
Go to the documentation of this file.
1// Copyright (C) 2025 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 QPIPEWIRE_AUDIOSINK_P_H
5#define QPIPEWIRE_AUDIOSINK_P_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/private/qaudio_platform_implementation_support_p.h>
19#include <QtMultimedia/private/qaudiosystem_p.h>
20#include <QtMultimedia/private/qaudiosystem_platform_stream_support_p.h>
21#include <QtMultimedia/private/qpipewire_audiostream_p.h>
22#include <QtCore/qsemaphore.h>
23#include <QtCore/qtclasshelpermacros.h>
24
25QT_BEGIN_NAMESPACE
26
27namespace QtPipeWire {
28
29using namespace QtMultimediaPrivate;
30
31class QPipewireAudioSink;
32
33////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
34
36{
38 using SinkType = QPipewireAudioSink;
39
40 QPipewireAudioSinkStream(QAudioDevice, const QAudioFormat &,
41 std::optional<qsizetype> ringbufferSize, QPipewireAudioSink *parent,
42 float volume, std::optional<int32_t> hardwareBufferFrames,
46
47 bool open();
48
53
54 bool start(QIODevice *device);
56 bool start(AudioCallback);
57
58 void stop(ShutdownPolicy);
59
60 void updateStreamIdle(bool idle) override;
61
62private:
63 void createStream(QPipewireAudioStream::StreamType);
64 std::optional<ObjectSerial> findSinkNodeSerial();
65
67
68 // QPipewireAudioStream overrides
72 void stateChanged(pw_stream_state /*old*/, pw_stream_state state,
73 const char * /*error*/) override;
75
76 template <typename Functor>
77 void processHelper(Functor &&f);
78
79 void disconnectStream();
80 QSemaphore m_disconnectSemaphore;
81
82 std::atomic<ShutdownPolicy> m_shutdownPolicy{ ShutdownPolicy::DiscardRingbuffer };
83 QAutoResetEvent m_ringbufferDrained;
84
85 // process helpers
86 void queueBuffer(struct pw_buffer *b, uint64_t samplesWritten) noexcept QT_MM_NONBLOCKING;
87
88 // xrun detection
89 void xrunOccurred(int /*xrunCount*/) override { m_xrunOccurred.set(); }
90 QtPrivate::QAutoResetEvent m_xrunOccurred;
91 QMetaObject::Connection m_xrunNotification;
92
93 [[maybe_unused]] static void fakeXRun();
94
95 AudioEndpointRole m_role;
96 std::optional<AudioCallback> m_audioCallback;
97
98 QPipewireAudioSink *m_parent;
99};
100
101////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
102
103class QPipewireAudioSink final
104 : public QPlatformAudioSinkImplementation<QPipewireAudioSinkStream, QPipewireAudioSink>
105{
106 using BaseClass =
107 QPlatformAudioSinkImplementation<QPipewireAudioSinkStream, QPipewireAudioSink>;
108
109public:
110 QPipewireAudioSink(QAudioDevice, const QAudioFormat &, QObject *parent);
112
113 void reportXRuns(int);
114};
115
116////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
117
118} // namespace QtPipeWire
119
120QT_END_NAMESPACE
121
122#endif
QPipewireAudioSink(QAudioDevice, const QAudioFormat &, QObject *parent)
static constexpr bool pipewireRealtimeTracing
Q_STATIC_LOGGING_CATEGORY(lcPipewireAudioSink, "qt.multimedia.pipewire.audiosink")
static auto resolveHostBuffer(pw_buffer *b, const QAudioFormat &format)
QPipewireAudioSinkStream(QAudioDevice, const QAudioFormat &, std::optional< qsizetype > ringbufferSize, QPipewireAudioSink *parent, float volume, std::optional< int32_t > hardwareBufferFrames, AudioEndpointRole)
void processRingbuffer() noexcept QT_MM_NONBLOCKING override
void stateChanged(pw_stream_state, pw_stream_state state, const char *) override
void processCallback() noexcept QT_MM_NONBLOCKING override