4#ifndef QAUDIO_PLATFORM_IMPLEMENTATION_SUPPORT_P_H
5#define QAUDIO_PLATFORM_IMPLEMENTATION_SUPPORT_P_H
18#include <QtMultimedia/private/qaudiosystem_p.h>
19#include <QtMultimedia/private/qaudiosystem_platform_stream_support_p.h>
20#include <QtMultimedia/qtmultimediaglobal.h>
63# define STREAM_TYPE_ARG QPlatformSinkStream StreamType
65# define STREAM_TYPE_ARG typename StreamType
76 void start(QIODevice *device)
override;
77 void start(AudioCallback &&)
override;
95 void setRole(AudioEndpointRole role)
override;
116 QAudioDevice device,
const QAudioFormat &format, QObject *parent)
131 setError(QAudio::IOError);
136 qWarning(
"QAudioSink::start() called while already started");
140 m_stream = std::make_shared<StreamType>(m_audioDevice, m_format, m_internalBufferSize,
141 static_cast<ConcreteSinkType *>(
this), volume(),
142 m_nativePeriodFrames, m_role);
144 if (!m_stream->open())
147 bool started = m_stream->start(device);
151 updateStreamState(QAudio::ActiveState);
158 m_stream->requestStop();
159 setError(QAudio::OpenError);
169 qWarning(
"QAudioSink::start() called while already started");
173 m_stream = std::make_shared<StreamType>(m_audioDevice, m_format, m_internalBufferSize,
174 static_cast<ConcreteSinkType *>(
this), volume(),
175 m_nativePeriodFrames, m_role);
177 if (!m_stream->open())
180 bool started = m_stream->start(std::move(audioCallback));
184 updateStreamState(QAudio::ActiveState);
191 qWarning(
"QAudioSink::start() called while already started");
195 m_stream = std::make_shared<StreamType>(m_audioDevice, m_format, m_internalBufferSize,
196 static_cast<ConcreteSinkType *>(
this), volume(),
197 m_nativePeriodFrames, m_role);
199 if (!m_stream->open()) {
204 QIODevice *device = m_stream->start();
210 QObject::connect(device, &QIODevice::readyRead,
this, [
this] {
211 updateStreamIdle(
false);
213 updateStreamIdle(
true);
214 updateStreamState(QAudio::ActiveState);
222 m_stream->stop(ShutdownPolicy::DrainRingbuffer);
224 updateStreamState(QAudio::StoppedState);
226 setError(QtAudio::NoError);
233 m_stream->stop(ShutdownPolicy::DiscardRingbuffer);
235 updateStreamState(QAudio::StoppedState);
237 setError(QtAudio::NoError);
244 if (state() == QAudio::SuspendedState)
248 updateStreamState(QAudio::SuspendedState);
256 if (state() != QAudio::SuspendedState)
259 updateStreamState(QAudio::ActiveState);
268 return m_stream->bytesFree();
275 m_internalBufferSize = value;
282 return m_stream->ringbufferSizeInBytes();
284 return QPlatformAudioIOStream::inferRingbufferBytes(m_internalBufferSize,
285 m_nativePeriodFrames, m_format);
299 return m_nativePeriodFrames;
306 return m_stream->processedDuration().count();
314 QPlatformAudioEndpointBase::setVolume(volume);
316 m_stream->setVolume(volume);
331#undef STREAM_TYPE_ARG
368# define STREAM_TYPE_ARG QPlatformSourceStream StreamType
370# define STREAM_TYPE_ARG typename StreamType
381 void start(QIODevice *device)
override;
418 QAudioDevice device,
const QAudioFormat &format, QObject *parent)
432 m_stream->requestStop();
433 setError(QAudio::OpenError);
441 setError(QAudio::IOError);
446 qWarning(
"QAudioSource::start() called while already started");
450 m_stream = std::make_shared<StreamType>(m_audioDevice, m_format, m_internalBufferSize,
451 static_cast<ConcreteSourceType *>(
this), volume(),
452 m_nativePeriodFrames);
454 if (!m_stream->open())
457 bool started = m_stream->start(device);
461 updateStreamState(QAudio::ActiveState);
468 qWarning(
"QAudioSource::start() called while already started");
472 m_stream = std::make_shared<StreamType>(m_audioDevice, m_format, m_internalBufferSize,
473 static_cast<ConcreteSourceType *>(
this), volume(),
474 m_nativePeriodFrames);
476 if (!m_stream->open()) {
481 QIODevice *device = m_stream->start();
487 QObject::connect(device, &QIODevice::readyRead,
this, [
this] {
488 updateStreamIdle(
false);
490 updateStreamIdle(
true, EmitStateSignal::False);
491 updateStreamState(QAudio::ActiveState);
501 if (m_stream->deviceIsRingbufferReader())
503 m_retiredStream = m_stream;
505 m_stream->stop(ShutdownPolicy::DrainRingbuffer);
507 setError(QtAudio::NoError);
508 updateStreamState(QAudio::StoppedState);
514 m_retiredStream = {};
519 m_stream->stop(ShutdownPolicy::DiscardRingbuffer);
521 setError(QtAudio::NoError);
522 updateStreamState(QAudio::StoppedState);
530 updateStreamState(QAudio::SuspendedState);
538 updateStreamState(QAudio::ActiveState);
546 return m_stream ? m_stream->bytesReady() : 0;
552 m_internalBufferSize = value;
559 return m_stream->ringbufferSizeInBytes();
561 return QPlatformAudioIOStream::inferRingbufferBytes(m_internalBufferSize,
562 m_nativePeriodFrames, m_format);
576 return m_nativePeriodFrames;
582 return m_stream ? m_stream->processedDuration().count() : 0;
588 QPlatformAudioEndpointBase::setVolume(volume);
590 m_stream->setVolume(volume);
605 QT_WARNING_DISABLE_CLANG(
"-Woverloaded-virtual")
613 QPlatformAudioSource::AudioCallback &&audioCallback)
617 BaseClass::m_stream = std::make_shared<StreamType>(
618 BaseClass::m_audioDevice, BaseClass::m_format, BaseClass::m_internalBufferSize,
619 static_cast<
typename BaseClass::ConcreteSourceType *>(
this), BaseClass::volume(),
620 BaseClass::m_nativePeriodFrames);
623 return BaseClass::handleStreamOpenError();
625 bool started =
BaseClass::m_stream->start(std::move(audioCallback));
627 return BaseClass::handleStreamOpenError();
629 BaseClass::updateStreamState(QAudio::ActiveState);
632#undef STREAM_TYPE_ARG