Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
avfaudiopreviewdelegate.mm
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
6
7#include <QtCore/qdebug.h>
8
9QT_USE_NAMESPACE
10
11@implementation AVFAudioPreviewDelegate
12{
13@private
14 AVSampleBufferAudioRenderer *m_audioRenderer;
15 AVFCameraSession *m_session;
16 AVSampleBufferRenderSynchronizer *m_audioBufferSynchronizer;
17 dispatch_queue_t m_audioPreviewQueue;
18}
19
20- (id)init
21{
22 if (self = [super init]) {
23 m_session = nil;
24 m_audioBufferSynchronizer = [[AVSampleBufferRenderSynchronizer alloc] init];
25 m_audioRenderer = [[AVSampleBufferAudioRenderer alloc] init];
26 [m_audioBufferSynchronizer addRenderer:m_audioRenderer];
27 return self;
28 }
29 return nil;
30}
31
32- (void)captureOutput:(AVCaptureOutput *)captureOutput
33 didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
34 fromConnection:(AVCaptureConnection *)connection
35{
36 Q_UNUSED(connection);
37 Q_ASSERT(m_session);
38
39 if (!CMSampleBufferDataIsReady(sampleBuffer)) {
40 qWarning() << Q_FUNC_INFO << "sample buffer is not ready, skipping.";
41 return;
42 }
43
44 CFRetain(sampleBuffer);
45
46 dispatch_async(m_audioPreviewQueue, ^{
47 [self renderAudioSampleBuffer:sampleBuffer];
48 CFRelease(sampleBuffer);
49 });
50}
51
52- (void)renderAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer
53{
54 Q_ASSERT(sampleBuffer);
55 Q_ASSERT(m_session);
56
57 if (m_audioBufferSynchronizer && m_audioRenderer) {
58 [m_audioRenderer enqueueSampleBuffer:sampleBuffer];
59 if (m_audioBufferSynchronizer.rate == 0)
60 [m_audioBufferSynchronizer setRate:1 time:CMSampleBufferGetPresentationTimeStamp(sampleBuffer)];
61 }
62}
63
64- (void)resetAudioPreviewDelegate
65{
66 [m_session->audioOutput() setSampleBufferDelegate:self queue:m_audioPreviewQueue];
67}
68
69- (void)setupWithCaptureSession: (AVFCameraSession*)session
70 audioOutputDevice: (NSString*)deviceId
71{
72 m_session = session;
73
74 m_audioPreviewQueue = dispatch_queue_create("audio-preview-queue", nullptr);
75 [m_session->audioOutput() setSampleBufferDelegate:self queue:m_audioPreviewQueue];
76#ifdef Q_OS_MACOS
77 m_audioRenderer.audioOutputDeviceUniqueID = deviceId;
78#endif
79}
80
81- (void)setVolume: (float)volume
82{
83 m_audioRenderer.volume = volume;
84}
85
86- (void)setMuted: (bool)muted
87{
88 m_audioRenderer.muted = muted;
89}
90
91-(void)dealloc {
92 m_session = nil;
93 [m_audioRenderer release];
94 [m_audioBufferSynchronizer release];
95 dispatch_release(m_audioPreviewQueue);
96
97 [super dealloc];
98}
99
100@end