41 static bool isAvailable();
46 bool setup(
const QAudioFormat &in,
const QAudioFormat &out);
47 void setStartTimeOffset(std::chrono::microseconds);
49 QByteArray resample(QByteArray);
50 QByteArray resample(
const QByteArrayView &);
51 QByteArray resample(
const ComPtr<IMFSample> &);
53 QAudioBuffer resample(
const char *data, size_t size) override;
57 std::pmr::vector<std::byte> resample(QSpan<
const std::byte>, std::pmr::memory_resource *);
59 QAudioFormat inputFormat()
const {
return m_inputFormat; }
60 QAudioFormat outputFormat()
const {
return m_outputFormat; }
62 quint64 outputBufferSize(quint64 inputBufferSize)
const;
63 quint64 inputBufferSize(quint64 outputBufferSize)
const;
65 quint64 totalInputBytes()
const {
return m_totalInputBytes; }
66 quint64 totalOutputBytes()
const {
return m_totalOutputBytes; }
69 qsizetype overAllocatedOutputBufferSize();
70 template <
typename Functor>
71 auto processOutput(ComPtr<IMFMediaBuffer> buffer, Functor &&f)
72 -> std::invoke_result_t<Functor,
const ComPtr<IMFMediaBuffer> &>;
74 q23::expected<QByteArray, HRESULT> processOutput();
76 QWindowsMediaFoundation *m_wmf{ QWindowsMediaFoundation::instance() };
77 QMFRuntimeInit m_wmfRuntime{ m_wmf };
78 ComPtr<IMFTransform> m_resampler;
79 ComPtr<IMFSample> m_inputSample;
80 ComPtr<IMFSample> m_outputSample;
82 quint64 m_totalInputBytes = 0;
83 quint64 m_totalOutputBytes = 0;
84 QAudioFormat m_inputFormat;
85 QAudioFormat m_outputFormat;
87 DWORD m_inputStreamID = 0;
89 std::chrono::microseconds m_startTimeOffset;