48 std::optional<qsizetype> ringbufferSize, QWindowsAudioSource *parent,
49 float volume, std::optional<int32_t> hardwareBufferFrames);
59 bool open() {
return true; }
60 bool start(QIODevice *);
62 bool start(AudioCallback &&);
71 bool openAudioClient(ComPtr<IMMDevice> device);
72 bool startAudioClient();
74 template <
typename Functor>
75 bool visitAudioClientBuffer(Functor &&);
77 void runProcessLoop();
80 void handleAudioClientError();
81 void joinWorkerThread();
83 ComPtr<IAudioClient3> m_audioClient;
84 ComPtr<IAudioCaptureClient> m_captureClient;
86 QWindowsAudioUtils::reference_time m_periodSize;
87 qsizetype m_audioClientFrames;
89 std::atomic_bool m_suspended{};
91 QAutoResetEvent m_ringbufferDrained;
93 const QUniqueWin32NullHandle m_wasapiHandle;
94 std::unique_ptr<QThread> m_workerThread;
96 std::optional<AudioCallback> m_audioCallback;
97 QWindowsAudioSource *m_parent;
99 QAudioFormat m_hostFormat;
100 std::unique_ptr<std::pmr::memory_resource> m_memoryResource;
101 std::unique_ptr<QWindowsResampler> m_resampler;