Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
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
25
QT_BEGIN_NAMESPACE
26
27
namespace
QtPipeWire
{
28
29
using
namespace
QtMultimediaPrivate
;
30
31
class
QPipewireAudioSink;
32
33
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
34
35
struct
QPipewireAudioSinkStream
final
:
QPipewireAudioStream
,
QPlatformAudioSinkStream
36
{
37
using
SampleFormat
=
QAudioFormat
::
SampleFormat
;
38
using
SinkType
= QPipewireAudioSink;
39
40
QPipewireAudioSinkStream
(
QAudioDevice
,
const
QAudioFormat &,
41
std::optional<qsizetype> ringbufferSize, QPipewireAudioSink *parent,
42
float
volume, std::optional<NativePeriodFrames> nativePeriodFrames,
43
AudioEndpointRole
);
44
Q_DISABLE_COPY_MOVE
(
QPipewireAudioSinkStream
)
45
~
QPipewireAudioSinkStream
();
46
47
bool
open
();
48
49
using
QPlatformAudioSinkStream
::
bytesFree
;
50
using
QPlatformAudioSinkStream
::
processedDuration
;
51
using
QPlatformAudioSinkStream
::
ringbufferSizeInBytes
;
52
using
QPlatformAudioSinkStream
::
setVolume
;
53
54
bool
start
(QIODevice *device);
55
QIODevice
*
start
();
56
bool
start
(
AudioCallback
);
57
58
void
stop
(
ShutdownPolicy
);
59
60
void
updateStreamIdle
(
bool
idle)
override
;
61
62
private
:
63
void
createStream(QPipewireAudioStream::StreamType);
64
std::optional<ObjectSerial> findSinkNodeSerial();
65
66
using
QPlatformAudioSinkStream
::
m_format
;
67
68
// QPipewireAudioStream overrides
69
void
handleDeviceRemoved
()
override
;
70
void
processRingbuffer
()
noexcept
Q_DECL_NONBLOCKING_FUNCTION
override
;
71
void
processCallback
()
noexcept
Q_DECL_NONBLOCKING_FUNCTION
override
;
72
void
stateChanged
(
pw_stream_state
/*old*/
, pw_stream_state state,
73
const
char
*
/*error*/
)
override
;
74
void
finalizeStream
()
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
Q_DECL_NONBLOCKING_FUNCTION
;
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
103
class
QPipewireAudioSink
final
104
:
public
QPlatformAudioSinkImplementation<QPipewireAudioSinkStream, QPipewireAudioSink>
105
{
106
using
BaseClass =
107
QPlatformAudioSinkImplementation<QPipewireAudioSinkStream, QPipewireAudioSink>;
108
109
public
:
110
QPipewireAudioSink
(
QAudioDevice
,
const
QAudioFormat &, QObject *parent);
111
~
QPipewireAudioSink
()
override
;
112
113
void
reportXRuns
(
int
);
114
};
115
116
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
117
118
}
// namespace QtPipeWire
119
120
QT_END_NAMESPACE
121
122
#
endif
QtPipeWire::QPipewireAudioSink::~QPipewireAudioSink
~QPipewireAudioSink() override
QtPipeWire::QPipewireAudioSink::QPipewireAudioSink
QPipewireAudioSink(QAudioDevice, const QAudioFormat &, QObject *parent)
Definition
qpipewire_audiosink.cpp:380
QtPipeWire::QPipewireAudioSink::reportXRuns
void reportXRuns(int)
Definition
qpipewire_audiosink.cpp:389
QtPipeWire
Definition
qpipewire_async_support.cpp:10
QtPipeWire::pipewireRealtimeTracing
static constexpr bool pipewireRealtimeTracing
Definition
qpipewire_audiosink.cpp:25
QtPipeWire::Q_STATIC_LOGGING_CATEGORY
Q_STATIC_LOGGING_CATEGORY(lcPipewireAudioSink, "qt.multimedia.pipewire.audiosink")
QtPipeWire::resolveHostBuffer
static auto resolveHostBuffer(pw_buffer *b, const QAudioFormat &format)
Definition
qpipewire_audiosink.cpp:228
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
QtPipeWire::QPipewireAudioSinkStream::SampleFormat
QAudioFormat::SampleFormat SampleFormat
Definition
qpipewire_audiosink_p.h:37
QtPipeWire::QPipewireAudioSinkStream::start
bool start(AudioCallback)
Definition
qpipewire_audiosink.cpp:116
QtPipeWire::QPipewireAudioSinkStream::updateStreamIdle
void updateStreamIdle(bool idle) override
Definition
qpipewire_audiosink.cpp:168
QtPipeWire::QPipewireAudioSinkStream::SinkType
QPipewireAudioSink SinkType
Definition
qpipewire_audiosink_p.h:38
QtPipeWire::QPipewireAudioSinkStream::processCallback
void processCallback() noexcept Q_DECL_NONBLOCKING_FUNCTION override
Definition
qpipewire_audiosink.cpp:306
QtPipeWire::QPipewireAudioSinkStream::start
bool start(QIODevice *device)
Definition
qpipewire_audiosink.cpp:75
QtPipeWire::QPipewireAudioSinkStream::processRingbuffer
void processRingbuffer() noexcept Q_DECL_NONBLOCKING_FUNCTION override
Definition
qpipewire_audiosink.cpp:263
QtPipeWire::QPipewireAudioSinkStream::stop
void stop(ShutdownPolicy)
Definition
qpipewire_audiosink.cpp:141
QtPipeWire::QPipewireAudioSinkStream::handleDeviceRemoved
void handleDeviceRemoved() override
Definition
qpipewire_audiosink.cpp:219
QtPipeWire::QPipewireAudioSinkStream::xrunOccurred
void xrunOccurred(int) override
Definition
qpipewire_audiosink_p.h:89
QtPipeWire::QPipewireAudioSinkStream::stateChanged
void stateChanged(pw_stream_state, pw_stream_state state, const char *) override
Definition
qpipewire_audiosink.cpp:322
QtPipeWire::QPipewireAudioSinkStream::finalizeStream
void finalizeStream() override
Definition
qpipewire_audiosink.cpp:342
QtPipeWire::QPipewireAudioSinkStream::QPipewireAudioSinkStream
QPipewireAudioSinkStream(QAudioDevice, const QAudioFormat &, std::optional< qsizetype > ringbufferSize, QPipewireAudioSink *parent, float volume, std::optional< NativePeriodFrames > nativePeriodFrames, AudioEndpointRole)
Definition
qpipewire_audiosink.cpp:31
QtPipeWire::QPipewireAudioSinkStream::start
QIODevice * start()
Definition
qpipewire_audiosink.cpp:104
QtPipeWire::QPipewireAudioSinkStream::open
bool open()
Definition
qpipewire_audiosink.cpp:70
qtmultimedia
src
multimedia
pipewire
qpipewire_audiosink_p.h
Generated on
for Qt by
1.18.0