Не могу использовать 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 заявления внутри блока. Я думал, что он вернет функцию, но он возвращает блок... так что компилятор был прав.

Другие вопросы по тегам