55 std::optional<qsizetype> ringbufferSize, QWindowsAudioSink *parent,
56 float volume, std::optional<int32_t> hardwareBufferSize,
68 bool start(QIODevice *);
79 bool openAudioClient(ComPtr<IMMDevice>, AudioEndpointRole);
82 template <
typename Functor>
83 bool visitAudioClientBuffer(Functor &&f);
85 void fillInitialHostBuffer();
86 void runProcessRingbufferLoop();
87 void runProcessCallbackLoop();
91 void handleAudioClientError();
93 ComPtr<IAudioClient3> m_audioClient;
94 ComPtr<IAudioRenderClient> m_renderClient;
96 QWindowsAudioUtils::reference_time m_periodSize;
97 qsizetype m_audioClientFrames;
99 std::atomic_bool m_suspended{};
101 QAutoResetEvent m_ringbufferDrained;
103 const AudioEndpointRole m_role;
105 const QUniqueWin32NullHandle m_wasapiHandle;
106 std::unique_ptr<QThread> m_workerThread;
108 AudioCallback m_audioCallback;
110 QWindowsAudioSink *m_parent;
112 QAudioFormat m_hostFormat;
113 std::unique_ptr<
char[]> m_preallocatedBuffer;
114 std::unique_ptr<std::pmr::memory_resource> m_memoryResource;
115 std::unique_ptr<QWindowsResampler> m_resampler;
QWASAPIAudioSinkStream(QAudioDevice, const QAudioFormat &, std::optional< qsizetype > ringbufferSize, QWindowsAudioSink *parent, float volume, std::optional< int32_t > hardwareBufferSize, AudioEndpointRole)