【发布时间】:2014-09-07 03:44:56
【问题描述】:
我正在编写一个 iOS 应用程序,它使用 Core Audio API 在 AppDelegate 中进行一些音频处理。我的 AppDelegate 中有一个 @property,它在 ViewController 中得到更新,而这个 @property 需要在我的渲染回调函数中访问,该函数是用 C++ 编写的。我发现,令我懊恼的是,你不能像在 Obj-C 方法中那样简单地使用 _propertyName 在 C++ 函数中访问 Obj-C @property,所以现在我想知道如何去做这样做。
这是我在 AppDelegate.h 中的@property:
@property float centerFreq
这是我的渲染回调函数,在 AppDelegate.m 中:
static OSStatus audioProcessingRenderCallback (
void * inRefCon,
AudioUnitRenderActionFlags * ioActionFlags,
const AudioTimeStamp * inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList * ioData
) {
//audio processing stuff that needs to access _centerFreq
}
我的第一个想法是让 audioProcessingRenderCallback 成为一个 Objective-C 方法,但是当我尝试使用以下代码将其设置为回调函数时会导致错误:
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = audioProcessingRenderCallback;
这个问题的最佳解决方案是什么?
【问题讨论】:
-
你能把你的 C++ 文件重命名为 .mm 吗?然后它将编译为 Objective-C++,您可以像在 .m 文件中一样访问它。不是答案,因为我没有解决您的“如何访问价值”问题,但您可能会发现这种方法很有用。
-
感谢您的建议,但这似乎并没有改变我的 C++ 函数对待
@propertys 的方式。当我尝试从 C++ 函数中访问它们时,它们仍然无法识别。 -
将 C++ 文件扩展名更改为 .mm 后,从 C++ 文件中包含 ViewController.h。在您的 ViewController 上放置一个方法,例如 -(ViewController*) getInstance;将实例(或通过其他机制使其可访问)返回到 C++ 文件。然后在 C++ (.mm) 文件中,你可以调用 instance.centerFreq = 1.0;但是,请注意,您只能在主线程上执行此操作。请参阅下面的答案。
标签: c++ ios objective-c core-audio