diff options
author | Jøger Hansegård <joger.hansegard@qt.io> | 2024-03-03 00:07:55 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-03-08 23:27:47 +0000 |
commit | 74c2d1e816e6753cba178f08f795a9a16e10f280 (patch) | |
tree | 37711e193b300e7787acd46fecf7be777d95234e | |
parent | 26b9e9ff69ef1858458eedd3017ed524130ac63f (diff) |
Simplify lifetime management of QPlatformAudioResampler
QPlatformMediaIntegration creates various objects, and return them as
QMaybe<Type*>. This moves responsibility of ownership to the caller.
This patch makes the createAudioResampler function return the resampler
as QMaybe<std::unique_ptr<Type>> which simplifies lifetime management.
This introduces an asymmetry with other factory functions, but this is
a step in the right direction
Pick-to: 6.5
Change-Id: Id2f67597c8d8271b184321d138e126edff5f3202
Reviewed-by: Tim Blechmann <tim@klingt.org>
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Reviewed-by: Lars Sutterud <lars.sutterud@qt.io>
Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
(cherry picked from commit 32f6952b03ba0e550db3e9dc358c366bf52c54a9)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit 0d2f051469ccabc3a9dab7d5aae9658f33525aaf)
5 files changed, 21 insertions, 15 deletions
diff --git a/src/multimedia/audio/qsoundeffect.cpp b/src/multimedia/audio/qsoundeffect.cpp index e5cb99144..4685b4671 100644 --- a/src/multimedia/audio/qsoundeffect.cpp +++ b/src/multimedia/audio/qsoundeffect.cpp @@ -127,14 +127,14 @@ void QSoundEffectPrivate::sampleReady() << audioDevice.channelConfiguration(); auto outputFormat = sampleFormat; outputFormat.setChannelConfig(audioDevice.channelConfiguration()); - if (auto maybeResampler = QPlatformMediaIntegration::instance()->createAudioResampler( - m_sample->format(), outputFormat)) { - std::unique_ptr<QPlatformAudioResampler> resampler(maybeResampler.value()); - m_audioBuffer = - resampler->resample(m_sample->data().constData(), m_sample->data().size()); - } else { + + const auto resampler = QPlatformMediaIntegration::instance()->createAudioResampler( + m_sample->format(), outputFormat); + if (resampler) + m_audioBuffer = resampler.value()->resample(m_sample->data().constData(), + m_sample->data().size()); + else qCDebug(qLcSoundEffect) << "Cannot create resampler for channels mapping"; - } } if (!m_audioBuffer.isValid()) diff --git a/src/multimedia/platform/qplatformmediaintegration.cpp b/src/multimedia/platform/qplatformmediaintegration.cpp index dcb412acf..1eb113b28 100644 --- a/src/multimedia/platform/qplatformmediaintegration.cpp +++ b/src/multimedia/platform/qplatformmediaintegration.cpp @@ -7,6 +7,7 @@ #include <qmutex.h> #include <qplatformaudioinput_p.h> #include <qplatformaudiooutput_p.h> +#include <qplatformaudioresampler_p.h> #include <qplatformvideodevices_p.h> #include <qmediadevices.h> #include <qcameradevice.h> @@ -118,6 +119,12 @@ QList<QCameraDevice> QPlatformMediaIntegration::videoInputs() return devices ? devices->videoDevices() : QList<QCameraDevice>{}; } +QMaybe<std::unique_ptr<QPlatformAudioResampler>> +QPlatformMediaIntegration::createAudioResampler(const QAudioFormat &, const QAudioFormat &) +{ + return notAvailable; +} + QMaybe<QPlatformAudioInput *> QPlatformMediaIntegration::createAudioInput(QAudioInput *q) { return new QPlatformAudioInput(q); diff --git a/src/multimedia/platform/qplatformmediaintegration_p.h b/src/multimedia/platform/qplatformmediaintegration_p.h index 4673c47b3..d47687586 100644 --- a/src/multimedia/platform/qplatformmediaintegration_p.h +++ b/src/multimedia/platform/qplatformmediaintegration_p.h @@ -71,12 +71,9 @@ public: virtual QPlatformSurfaceCapture *createWindowCapture(QWindowCapture *) { return nullptr; } virtual QMaybe<QPlatformAudioDecoder *> createAudioDecoder(QAudioDecoder *) { return notAvailable; } - virtual QMaybe<QPlatformAudioResampler *> + virtual QMaybe<std::unique_ptr<QPlatformAudioResampler>> createAudioResampler(const QAudioFormat & /*inputFormat*/, - const QAudioFormat & /*outputFormat*/) - { - return notAvailable; - } + const QAudioFormat & /*outputFormat*/); virtual QMaybe<QPlatformMediaCaptureSession *> createCaptureSession() { return notAvailable; } virtual QMaybe<QPlatformMediaPlayer *> createPlayer(QMediaPlayer *) { return notAvailable; } virtual QMaybe<QPlatformMediaRecorder *> createRecorder(QMediaRecorder *) { return notAvailable; } diff --git a/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration.cpp b/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration.cpp index 7abded14c..28c0625c7 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration.cpp +++ b/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration.cpp @@ -190,9 +190,11 @@ QMaybe<QPlatformAudioDecoder *> QFFmpegMediaIntegration::createAudioDecoder(QAud return new QFFmpegAudioDecoder(decoder); } -QMaybe<QPlatformAudioResampler *> QFFmpegMediaIntegration::createAudioResampler(const QAudioFormat &inputFormat, const QAudioFormat &outputFormat) +QMaybe<std::unique_ptr<QPlatformAudioResampler>> +QFFmpegMediaIntegration::createAudioResampler(const QAudioFormat &inputFormat, + const QAudioFormat &outputFormat) { - return new QFFmpegResampler(inputFormat, outputFormat); + return { std::make_unique<QFFmpegResampler>(inputFormat, outputFormat) }; } QMaybe<QPlatformMediaCaptureSession *> QFFmpegMediaIntegration::createCaptureSession() diff --git a/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration_p.h b/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration_p.h index 7d56b60bb..b8787bcc4 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration_p.h +++ b/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration_p.h @@ -27,7 +27,7 @@ public: QFFmpegMediaIntegration(); QMaybe<QPlatformAudioDecoder *> createAudioDecoder(QAudioDecoder *decoder) override; - QMaybe<QPlatformAudioResampler *> createAudioResampler(const QAudioFormat &inputFormat, const QAudioFormat &outputFormat) override; + QMaybe<std::unique_ptr<QPlatformAudioResampler>> createAudioResampler(const QAudioFormat &inputFormat, const QAudioFormat &outputFormat) override; QMaybe<QPlatformMediaCaptureSession *> createCaptureSession() override; QMaybe<QPlatformMediaPlayer *> createPlayer(QMediaPlayer *player) override; QMaybe<QPlatformCamera *> createCamera(QCamera *) override; |