我正在为 XCode 中的 Blackmagic Design AV 设备编写设备驱动程序,并且在将 BMD 的 SyncController 类从他们的缩写示例代码(如下)中包含到我的纯 Objective-C 项目中时遇到了麻烦。
他们的 DecklinkAPI.h 文件包含丰富的 C++ 代码,所以当我尝试将这个头文件原样包含在一个 Objective-C 类中时,编译器在 API 深处窒息包括:未知类型名称“类”;您指的是 'Class' 吗?
我试图将 C++ 位捆绑到一个 Obj-C 类扩展中,如此处所述,但没有太大成功。我从未做过任何 C++ 编程(也从未使用过 Obj-C 类扩展),所以这对我来说是一个新领域。
我不确定是否需要为我的 SyncController 对象创建一个额外的包装类,或者我是否可以在这个对象上做一个类扩展并将 C++ 位洗牌到 .mm 文件中。
我希望能够#include "SyncController.h"
在没有编译器阻塞的情况下在 Objective-C 类中做一个(或其包装器)。
对此的任何帮助将不胜感激。
首先,这是我当前的 SyncController.h 文件:
#import <Cocoa/Cocoa.h>
#import "DeckLinkAPI.h" // this is rich in C++ code
class PlaybackDelegate;
@interface SyncController : NSObject {
PlaybackDelegate* playerDelegate;
IDeckLink* deckLink;
IDeckLinkOutput* deckLinkOutput;
}
- (void)scheduleNextFrame:(BOOL)prerolling;
- (void)writeNextAudioSamples;
@end
class PlaybackDelegate : public IDeckLinkVideoOutputCallback, public IDeckLinkAudioOutputCallback
{
SyncController* mController;
IDeckLinkOutput* mDeckLinkOutput;
public:
PlaybackDelegate (SyncController* owner, IDeckLinkOutput* deckLinkOutput);
// IUnknown needs only a dummy implementation
virtual HRESULT QueryInterface (REFIID iid, LPVOID *ppv) {return E_NOINTERFACE;}
virtual ULONG AddRef () {return 1;}
virtual ULONG Release () {return 1;}
virtual HRESULT ScheduledFrameCompleted (IDeckLinkVideoFrame* completedFrame, BMDOutputFrameCompletionResult result);
virtual HRESULT ScheduledPlaybackHasStopped ();
virtual HRESULT RenderAudioSamples (bool preroll);
};
void ScheduleNextVideoFrame (void);
接下来,这是我的(简化的)SyncController.mm 文件:
#import <CoreFoundation/CFString.h>
#import "SyncController.h"
@implementation SyncController
- (instancetype)init
{
self = [super init];
return self;
}
- (void)dealloc
{
}
- (void)scheduleNextFrame:(BOOL)prerolling
{
}
- (void)writeNextAudioSamples
{
}
@end
PlaybackDelegate::PlaybackDelegate (SyncController* owner, IDeckLinkOutput* deckLinkOutput)
{
mController = owner;
mDeckLinkOutput = deckLinkOutput;
}
HRESULT PlaybackDelegate::ScheduledFrameCompleted (IDeckLinkVideoFrame* completedFrame, BMDOutputFrameCompletionResult result)
{
[mController scheduleNextFrame:NO];
return S_OK;
}
HRESULT PlaybackDelegate::ScheduledPlaybackHasStopped ()
{
return S_OK;
}
HRESULT PlaybackDelegate::RenderAudioSamples (bool preroll)
{
[mController writeNextAudioSamples];
if (preroll)
mDeckLinkOutput->StartScheduledPlayback(0, 100, 1.0);
return S_OK;
}