summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform/darwin/camera/avfmediaassetwriter.mm
diff options
context:
space:
mode:
Diffstat (limited to 'src/multimedia/platform/darwin/camera/avfmediaassetwriter.mm')
-rw-r--r--src/multimedia/platform/darwin/camera/avfmediaassetwriter.mm30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/multimedia/platform/darwin/camera/avfmediaassetwriter.mm b/src/multimedia/platform/darwin/camera/avfmediaassetwriter.mm
index 0523a7931..394825fe1 100644
--- a/src/multimedia/platform/darwin/camera/avfmediaassetwriter.mm
+++ b/src/multimedia/platform/darwin/camera/avfmediaassetwriter.mm
@@ -99,6 +99,9 @@ using AVFAtomicInt64 = QAtomicInteger<qint64>;
AVFScopedPointer<AVAssetWriter> m_assetWriter;
+ AVFScopedPointer<AVSampleBufferRenderSynchronizer> m_bufferSynchronizer;
+ AVFScopedPointer<AVSampleBufferAudioRenderer> m_audioRenderer;
+
AVFMediaEncoder *m_delegate;
bool m_setStartTime;
@@ -342,6 +345,13 @@ using AVFAtomicInt64 = QAtomicInteger<qint64>;
}
}
+ if (m_audioRenderer && m_bufferSynchronizer) {
+ [m_audioRenderer enqueueSampleBuffer:sampleBuffer];
+ if (m_bufferSynchronizer.data().rate == 0)
+ [m_bufferSynchronizer setRate:1
+ time:CMSampleBufferGetPresentationTimeStamp(sampleBuffer)];
+ }
+
CFRelease(sampleBuffer);
}
@@ -479,4 +489,24 @@ using AVFAtomicInt64 = QAtomicInteger<qint64>;
return m_durationInMs.loadAcquire();
}
+- (void)updateAudioOutput:(NSString *)deviceId
+{
+ if (!m_bufferSynchronizer)
+ m_bufferSynchronizer.reset([[AVSampleBufferRenderSynchronizer alloc] init]);
+ if (!m_audioRenderer)
+ m_audioRenderer.reset([[AVSampleBufferAudioRenderer alloc] init]);
+
+ if (![m_bufferSynchronizer.data().renderers containsObject:m_audioRenderer.data()])
+ [m_bufferSynchronizer addRenderer:m_audioRenderer];
+
+#ifdef Q_OS_MACOS
+ m_audioRenderer.data().audioOutputDeviceUniqueID = deviceId;
+#endif
+
+ if (!deviceId) {
+ m_bufferSynchronizer.data().rate = 0.0;
+ [m_audioRenderer flush];
+ }
+}
+
@end