gpt4 book ai didi

c++ - 从 C++ 函数访问 Obj-C 属性 (iOS)

转载 作者:太空宇宙 更新时间:2023-11-04 11:28:43 25 4
gpt4 key购买 nike

我正在编写一个 iOS 应用程序,它使用 Core Audio API 在 AppDelegate 中进行一些音频处理。我的 AppDelegate 中有一个 @property,它在 ViewController 中得到更新,这个 @property 需要在我的渲染回调函数中访问,它是用 C++ 编写的。令我懊恼的是,我发现您无法像在 Obj-C 方法中那样通过简单地使用 _propertyName 访问 C++ 函数中的 Obj-C @property ,所以现在我想知道如何去做。

这是我的 @property,在 AppDelegate.h 中:

@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(即 AudioProcessor.mm)。这将启用 Objective-C++,然后您可以传递您的对象并从 C++ 文件对其进行调用。这可能是最简单的。

如果你不能改变C++文件的扩展名,那么你需要做一个桥接函数。

在您的 ViewController(.m 文件)中,创建一个 C 函数,如下所示:

void updateCenterFreq( float value ) {
myViewControllerInstance.centerFreq = value;
}

显然,您必须找到一种方法使 ViewController 实例对 C 函数可见。一种方法是在 .m 文件中分配一个静态指针。仅当您有一个实例并且您不担心线程时才有用,但这可能对您有用。如果您有多个 View Controller 实例,则必须找到一种方法来定位该实例。如何做到这一点超出了我在这里的回答范围。我将对此进行修改,如果您计划在非主线程上调用 updateCenterFreq(),那么您需要在设置 centerFreq 之前使用 performSelectorOnMainThread 进入主线程(我是假设因为它在 View Controller 中,您计划更新 UI,这必须在主线程上完成)。

现在在您的 AudioProcessor.h 文件(C++ 文件的 header )中执行:

extern "C" {
void updateCenterFreq( float value );
}

然后您可以在需要时调用 updateCenterFreq()。

同样,这不考虑线程安全或您如何定位您的实例,但这是您可以做到的。

关于c++ - 从 C++ 函数访问 Obj-C 属性 (iOS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25706887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com