summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2022-08-26 14:11:39 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-08-29 11:38:59 +0000
commit8bc8a48d5371df56573e46618be97183e64d0457 (patch)
treed617820f8dcb876cb772d8393ab43b1db8ad2e73
parent924cf7a65804f3fe683696e8a9b0322076fd9350 (diff)
downloadqtmultimedia-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.cpp18
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h2
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;