summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoris Verria <doris.verria@qt.io>2023-02-14 16:37:41 +0100
committerDoris Verria <doris.verria@qt.io>2023-02-28 18:10:24 +0100
commita84280c74193b0f8a54e60e6fc3448bda8250754 (patch)
treed60161c79b682115f4ffedbbee6e711b08eb8b03
parentede9835bbbf752366aaab4f14b20e1fb38017814 (diff)
AVFMediaEncoder: Set channel count from audio device when recording
When recording audio, we are setting the audio channel count to the one specified in the encoder settings. If this is not set, we were setting it to 2 channels by default. However, this was causing sometimes problems as the internal AudioConverter could not always convert from the audio capture device's actual format to one with 2 channels. To avoid this, we should default to setting the channel count based on that of the audio device. Note that in a40b9fed50ef75504cec128d4acfb1062e90df98 we set the channel layout configuration instead of the count, but that information is not available in 6.2. Fixes: QTBUG-110844 Change-Id: I3d78ec8b37d6780c7d96147f81ce15bd6425b448 Reviewed-by: Artem Dyomin <artem.dyomin@qt.io> Reviewed-by: Lars Knoll <lars@knoll.priv.no> (cherry picked from commit a40b9fed50ef75504cec128d4acfb1062e90df98)
-rw-r--r--src/multimedia/platform/darwin/camera/avfmediaencoder.mm15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/multimedia/platform/darwin/camera/avfmediaencoder.mm b/src/multimedia/platform/darwin/camera/avfmediaencoder.mm
index 8b5f49508..adab52582 100644
--- a/src/multimedia/platform/darwin/camera/avfmediaencoder.mm
+++ b/src/multimedia/platform/darwin/camera/avfmediaencoder.mm
@@ -52,6 +52,7 @@
#include "private/qmediarecorder_p.h"
#include "private/qdarwinformatsinfo_p.h"
#include "private/qplatformaudiooutput_p.h"
+#include <private/qplatformaudioinput_p.h>
#include <QtCore/qmath.h>
#include <QtCore/qdebug.h>
@@ -135,7 +136,7 @@ void AVFMediaEncoder::updateDuration(qint64 duration)
durationChanged(m_duration);
}
-static NSDictionary *avfAudioSettings(const QMediaEncoderSettings &encoderSettings)
+static NSDictionary *avfAudioSettings(const QMediaEncoderSettings &encoderSettings, const QAudioFormat &format)
{
NSMutableDictionary *settings = [NSMutableDictionary dictionary];
@@ -204,6 +205,10 @@ static NSDictionary *avfAudioSettings(const QMediaEncoderSettings &encoderSettin
// Channels
int channelCount = encoderSettings.audioChannelCount();
+ // if no channel count is set in the encoder settings,
+ // set it to the device's format channel count
+ if (channelCount <= 0)
+ channelCount = format.channelCount();
bool isChannelCountSupported = false;
if (channelCount > 0) {
std::optional<QList<UInt32>> channelCounts = qt_supported_channel_counts_for_format(codecId);
@@ -221,7 +226,7 @@ static NSDictionary *avfAudioSettings(const QMediaEncoderSettings &encoderSettin
}
}
-if (isChannelCountSupported && channelCount > 2) {
+ if (isChannelCountSupported && channelCount > 2) {
AudioChannelLayout channelLayout;
memset(&channelLayout, 0, sizeof(AudioChannelLayout));
auto channelLayoutTags = qt_supported_channel_layout_tags_for_format(codecId, channelCount);
@@ -233,7 +238,7 @@ if (isChannelCountSupported && channelCount > 2) {
}
}
if (!isChannelCountSupported)
- channelCount = 2;
+ channelCount = 1;
[settings setObject:[NSNumber numberWithInt:channelCount] forKey:AVNumberOfChannelsKey];
if (codecId == kAudioFormatAppleLossless)
@@ -421,7 +426,9 @@ void AVFMediaEncoder::applySettings(QMediaEncoderSettings &settings)
AVFCameraSession *session = m_service->session();
// audio settings
- m_audioSettings = avfAudioSettings(settings);
+ const auto audioInput = m_service->audioInput();
+ const QAudioFormat audioFormat = audioInput ? audioInput->device.preferredFormat() : QAudioFormat();
+ m_audioSettings = avfAudioSettings(settings, audioFormat);
if (m_audioSettings)
[m_audioSettings retain];