7#include <QtCore/qdebug.h>
11@implementation AVFAudioPreviewDelegate
14 AVSampleBufferAudioRenderer *m_audioRenderer;
15 AVFCameraSession *m_session;
16 AVSampleBufferRenderSynchronizer *m_audioBufferSynchronizer;
17 dispatch_queue_t m_audioPreviewQueue;
22 if (self = [super init]) {
24 m_audioBufferSynchronizer = [[AVSampleBufferRenderSynchronizer alloc] init];
25 m_audioRenderer = [[AVSampleBufferAudioRenderer alloc] init];
26 [m_audioBufferSynchronizer addRenderer:m_audioRenderer];
32- (
void)captureOutput:(AVCaptureOutput *)captureOutput
33 didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
34 fromConnection:(AVCaptureConnection *)connection
39 if (!CMSampleBufferDataIsReady(sampleBuffer)) {
40 qWarning() << Q_FUNC_INFO <<
"sample buffer is not ready, skipping.";
44 CFRetain(sampleBuffer);
46 dispatch_async(m_audioPreviewQueue, ^{
47 [self renderAudioSampleBuffer:sampleBuffer];
48 CFRelease(sampleBuffer);
52- (
void)renderAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer
54 Q_ASSERT(sampleBuffer);
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)];
64- (
void)resetAudioPreviewDelegate
66 [m_session->audioOutput() setSampleBufferDelegate:self queue:m_audioPreviewQueue];
69- (
void)setupWithCaptureSession: (AVFCameraSession*)session
70 audioOutputDevice: (NSString*)deviceId
74 m_audioPreviewQueue = dispatch_queue_create(
"audio-preview-queue",
nullptr);
75 [m_session->audioOutput() setSampleBufferDelegate:self queue:m_audioPreviewQueue];
77 m_audioRenderer.audioOutputDeviceUniqueID = deviceId;
81- (
void)setVolume: (
float)volume
83 m_audioRenderer.volume = volume;
86- (
void)setMuted: (
bool)muted
88 m_audioRenderer.muted = muted;
93 [m_audioRenderer release];
94 [m_audioBufferSynchronizer release];
95 dispatch_release(m_audioPreviewQueue);