Не могу использовать dispatch_sync в классе C++ с кодом Objective-C++
Мне нужно использовать код Objective-C++ в унаследованном классе C++, который работает с записью видео с камеры iPhone (получение CMSampleBufferRef
через другой родной-объективный класс с Wrapper
с CMSampleBufferDelegate
).
AVCaptureVideoOutput
что у меня есть работы в своем собственном dispatch_queue_t callbackQueue
Итак, когда я хочу получить последний кадр из моего Wrapper
класс, мне нужно заблокировать callbackQueue
чтобы подождать, пока будет сделано копирование.
Как я знаю, это сделано с dispatch_sync
синхронизирую captureOutput.callbackQueue
, Но я не могу заставить этот код работать:
// .mm
frame_t MyCppClass::getLastFrame()
{
dispatch_sync(pCaptureVideoDataOutput.sampleBufferCallbackQueue, ^{ // error: no matching function for call to 'dispatch_sync'
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(wrapperInstance->currentBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0);
// doing copying frame data from buffer...
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
}); // error: control may reach end of non-void block
return frame;
}
// .h
@interface Wrapper : NSObject <AVCaptureVideoDataOutputSampleBufferDelegate> {
CMSampleBufferRef currentBuffer;
}
@end
// .mm
@implementation Wrapper
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
// doing copying to currentBuffer
}
@end
РЕДАКТИРОВАТЬ:
Когда я изменился на
dispatch_sync(pCaptureVideoDataOutput.sampleBufferCallbackQueue, (dispatch_block_t)^{
исправлена первая ошибка, но вторая все еще здесь..
Застрял с этим.. любая помощь приветствуется!
2 ответа
Ошибка:
ошибка: нет соответствующей функции для вызова dispatch_sync
указывает на то, что прототип функции может быть невидимым. Убедитесь, что вы включили заголовок для libdispatch в свой файл.mm...
#include <dispatch/dispatch.h>
Вторая ошибка:
ошибка: управление может достигнуть конца не пустого блока
потому что ваша функция объявлена для возврата frame_t
но у него нет возврата.
Я понял!
У меня какая-то срочная ситуация return
заявления внутри блока. Я думал, что он вернет функцию, но он возвращает блок... так что компилятор был прав.