6#include <camera/avfcamerasession_p.h>
8#include <QtCore/qdebug.h>
9#include <QtCore/private/qcore_mac_p.h>
13@implementation AVFAudioPreviewDelegate
16 AVSampleBufferAudioRenderer *m_audioRenderer;
17 AVFCameraSession *m_session;
18 AVSampleBufferRenderSynchronizer *m_audioBufferSynchronizer;
19 dispatch_queue_t m_audioPreviewQueue;
24 if (self = [super init]) {
25 m_audioBufferSynchronizer = [[AVSampleBufferRenderSynchronizer alloc] init];
26 m_audioRenderer = [[AVSampleBufferAudioRenderer alloc] init];
27 [m_audioBufferSynchronizer addRenderer:m_audioRenderer];
33- (
void)captureOutput:(AVCaptureOutput *)captureOutput
34 didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
35 fromConnection:(AVCaptureConnection *)connection
40 if (!CMSampleBufferDataIsReady(sampleBuffer)) {
41 qWarning() << Q_FUNC_INFO <<
"sample buffer is not ready, skipping.";
45 auto buffer = QCFType<CMSampleBufferRef>::constructFromGet(sampleBuffer);
47 dispatch_async(m_audioPreviewQueue, ^{
48 [self renderAudioSampleBuffer:buffer];
53- (
void)renderAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer
55 Q_ASSERT(sampleBuffer);
58 if (m_audioBufferSynchronizer && m_audioRenderer) {
59 [m_audioRenderer enqueueSampleBuffer:sampleBuffer];
60 if (m_audioBufferSynchronizer.rate == 0)
61 [m_audioBufferSynchronizer setRate:1 time:CMSampleBufferGetPresentationTimeStamp(sampleBuffer)];
65- (
void)resetAudioPreviewDelegate
67 [m_session->audioOutput() setSampleBufferDelegate:self queue:m_audioPreviewQueue];
70- (
void)setupWithCaptureSession: (AVFCameraSession*)session
71 audioOutputDevice: (NSString*)deviceId
75 m_audioPreviewQueue = dispatch_queue_create(
"audio-preview-queue",
nullptr);
76 [m_session->audioOutput() setSampleBufferDelegate:self queue:m_audioPreviewQueue];
78 m_audioRenderer.audioOutputDeviceUniqueID = deviceId;
82- (
void)setVolume: (
float)volume
84 m_audioRenderer.volume = volume;
87- (
void)setMuted: (
bool)muted
89 m_audioRenderer.muted = muted;
94 [m_audioRenderer release];
95 [m_audioBufferSynchronizer release];
96 dispatch_release(m_audioPreviewQueue);