42 static bool isAvailable();
47 bool setup(
const QAudioFormat &in,
const QAudioFormat &out);
48 void setStartTimeOffset(std::chrono::microseconds);
50 QByteArray resample(QByteArray);
51 QByteArray resample(
const QByteArrayView &);
52 QByteArray resample(
const ComPtr<IMFSample> &);
54 QAudioBuffer resample(
const char *data, size_t size) override;
58 std::pmr::vector<std::byte> resample(QSpan<
const std::byte>, std::pmr::memory_resource *);
60 QAudioFormat inputFormat()
const {
return m_inputFormat; }
61 QAudioFormat outputFormat()
const {
return m_outputFormat; }
63 quint64 outputBufferSize(quint64 inputBufferSize)
const;
64 quint64 inputBufferSize(quint64 outputBufferSize)
const;
66 quint64 totalInputBytes()
const {
return m_totalInputBytes; }
67 quint64 totalOutputBytes()
const {
return m_totalOutputBytes; }
70 qsizetype overAllocatedOutputBufferSize();
71 template <
typename Functor>
72 auto processOutput(ComPtr<IMFMediaBuffer> buffer, Functor &&f)
73 -> std::invoke_result_t<Functor,
const ComPtr<IMFMediaBuffer> &>;
75 q23::expected<QByteArray, HRESULT> processOutput();
77 QComInitializer m_comInitializer;
78 QWindowsMediaFoundation *m_wmf{ QWindowsMediaFoundation::instance() };
79 QMFRuntimeInit m_wmfRuntime{ m_wmf };
80 ComPtr<IMFTransform> m_resampler;
81 ComPtr<IMFSample> m_inputSample;
82 ComPtr<IMFSample> m_outputSample;
84 quint64 m_totalInputBytes = 0;
85 quint64 m_totalOutputBytes = 0;
86 QAudioFormat m_inputFormat;
87 QAudioFormat m_outputFormat;
89 DWORD m_inputStreamID = 0;
91 std::chrono::microseconds m_startTimeOffset;