diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2022-08-26 14:11:39 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-08-29 11:38:59 +0000 |
commit | 8bc8a48d5371df56573e46618be97183e64d0457 (patch) | |
tree | d617820f8dcb876cb772d8393ab43b1db8ad2e73 | |
parent | 924cf7a65804f3fe683696e8a9b0322076fd9350 (diff) | |
download | qtmultimedia-8bc8a48d5371df56573e46618be97183e64d0457.tar.gz |
Fix sound volume editing in ffmpeg mode
1. Handle sound volume changing signal.
2. Handle muted state of audio output instead of auto-muting flag.
3. Dont't use auto-muting for playback rates out of range [0.5; 2.].
Checked: other backends don't do it as well.
Auto-muting is a user's responsibility.
Note, it's pretty hard to implement tests for it now,
since audio output is not mocked,
and ffmpeg part is to be refactored after 6.4.
Task-number: QTBUG-105619
Change-Id: I51a2f353275d4ba3c1dc4678e34f0b31f1030264
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
(cherry picked from commit c9fb537f3687e9cbe3c86c8ea8704db27007d81f)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp | 18 | ||||
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h | 2 |
2 files changed, 14 insertions, 6 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp b/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp index 0b406e5a9..ad6ddc53d 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp +++ b/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp @@ -740,6 +740,7 @@ AudioRenderer::AudioRenderer(Decoder *decoder, QAudioOutput *output) , output(output) { connect(output, &QAudioOutput::deviceChanged, this, &AudioRenderer::updateAudio); + connect(output, &QAudioOutput::volumeChanged, this, &AudioRenderer::setSoundVolume); } void AudioRenderer::syncTo(qint64 usecs) @@ -769,10 +770,9 @@ void AudioRenderer::updateOutput(const Codec *codec) format = QFFmpegMediaFormatInfo::audioFormatFromCodecParameters(audioStream->codecpar); format.setChannelConfig(dev.channelConfiguration()); - if (playbackRate() < 0.5 || playbackRate() > 2) - audioMuted = true; - audioSink = new QAudioSink(dev, format); + audioSink->setVolume(output->volume()); + audioSink->setBufferSize(format.bytesForDuration(100000)); audioDevice = audioSink->start(); latencyUSecs = format.durationForBytes(audioSink->bufferSize()); // ### ideally get full latency @@ -798,7 +798,7 @@ void AudioRenderer::freeOutput() audioSink = nullptr; audioDevice = nullptr; } - audioMuted = false; + bufferedData = {}; bufferWritten = 0; @@ -867,7 +867,7 @@ void AudioRenderer::loop() if (!paused) { auto buffer = resampler->resample(frame.avFrame()); - if (audioMuted) + if (output->isMuted()) // This is somewhat inefficient, but it'll work memset(buffer.data<char>(), 0, buffer.byteCount()); @@ -909,6 +909,14 @@ void AudioRenderer::updateAudio() deviceChanged = true; } +void AudioRenderer::setSoundVolume(float volume) +{ + QMutexLocker locker(&mutex); + + if (audioSink) + audioSink->setVolume(volume); +} + Decoder::Decoder() { } diff --git a/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h b/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h index 2993ace56..0ca069105 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h +++ b/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h @@ -470,6 +470,7 @@ public: private slots: void updateAudio(); + void setSoundVolume(float volume); private: void updateOutput(const Codec *codec); @@ -492,7 +493,6 @@ private: bool deviceChanged = false; QAudioOutput *output = nullptr; - bool audioMuted = false; qint64 writtenUSecs = 0; qint64 latencyUSecs = 0; |