33 static constexpr struct pw_node_events nodeEvents{
34 .version = PW_VERSION_NODE_EVENTS,
35 .info = NodeEventListener::onInfo,
36 .param = NodeEventListener::onParam,
39 int status = pw_node_add_listener(m_node.get(), &m_listenerHook, &nodeEvents,
this);
54 int status = pw_node_enum_params(m_node.get(), m_sequenceNumber, type, 0, 0,
nullptr);
56 qCritical() <<
"pw_node_enum_params failed:" <<
make_error_code(-status
).message();
59void NodeEventListener::onInfo(
void *data,
const pw_node_info *info)
61 NodeEventListener *self =
reinterpret_cast<NodeEventListener *>(data);
62 if (self->m_handler.infoHandler)
63 self->m_handler.infoHandler(info);
66void NodeEventListener::onParam(
void *data,
int seq, uint32_t id, uint32_t index, uint32_t next,
69 NodeEventListener *self =
reinterpret_cast<NodeEventListener *>(data);
70 if (self->m_handler.paramHandler)
71 self->m_handler.paramHandler(seq, id, index, next, param);
94 coreEvents.done = [](
void *self, uint32_t id,
int seq) {
97 if (id == PW_ID_CORE && listener->m_seqnum == seq) {
98 listener->m_seqnum = -1;
99 if (listener->m_handler)
100 listener->m_handler();
106 std::function<
void()> handler)
108 m_handler = std::move(handler);
110 return QAudioContextManager::withEventLoopLock([&]() -> q23::expected<
void,
int> {
111 int status = pw_core_add_listener(coreConnection, &m_listenerHook, &coreEvents,
this);
113 qFatal() <<
"pw_core_add_listener failed" << make_error_code(-status).message();
114 return q23::unexpected(status);
117 Q_ASSERT(m_seqnum == -1);
118 status = pw_core_sync(coreConnection, PW_ID_CORE, 0);
120 return q23::unexpected(status);
131 std::optional<std::chrono::nanoseconds> timeout)
133 auto voidOrError = CoreEventDoneListener::asyncWait(coreConnection, [&] {
134 m_semaphore.release();
138 return m_semaphore.try_acquire_for(*timeout);
140 m_semaphore.acquire();
143 return voidOrError.error();
static bool isInPwThreadLoop()