如何从 AudioUnits C 函数调用 Objective-C 方法? (iOS)

Posted

技术标签:

【中文标题】如何从 AudioUnits C 函数调用 Objective-C 方法? (iOS)【英文标题】:How to call an Objective-C method from a AudioUnits C function? (iOS) 【发布时间】:2013-04-24 17:36:56 【问题描述】:

我发现了一个很棒的关于 AudioUnits (http://www.cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html) 的教程,我已经开始在我的系统上工作了;但是,我无法从 RenderTone C 函数调用我的 Objective-C 方法。

在与RenderTone相同的m文件中,我有如下方法:

- (Float32)signalGenerator:(int)sample withSampleRate:(int)Fs andFrequency:(float)frequency

当我尝试从 RenderTone 函数调用此方法时,XCode 给我以下错误:“使用未声明的标识符 'signalGenerator'。”如果它在同一个文件中,为什么它看不到这个方法?

感谢阅读。

【问题讨论】:

Apple 建议不要在音频单元回调中发送 Objective C 消息。最好坚持使用普通的 C 函数调用。 @hotpaw2 好的,谢谢,很高兴知道。 (我希望根据用户与 UI 的交互来改变声音。) 【参考方案1】:

RenderTone()函数中,

ToneGeneratorViewController *viewController = (ToneGeneratorViewController *)inRefCon;

是你的视图控制器的实例,所以你可以调用你的方法

Float32 x = [viewController signalGenerator:13 withSampleRate:14 andFrequency:15];

来自RenderTone()。为了让编译器知道该方法, 你也可以

RenderTone() 移动到@implementation ToneGeneratorViewController 块内,或者

使用类扩展添加函数原型:

@interface ToneGeneratorViewController ()
- (Float32)signalGenerator:(int)sample withSampleRate:(int)Fs andFrequency:(float)frequency;
@end

【讨论】:

以上是关于如何从 AudioUnits C 函数调用 Objective-C 方法? (iOS)的主要内容,如果未能解决你的问题,请参考以下文章

如何从现有对象的不同类调用方法(Obj C)

如何将 Obj-C 块保存在 C 结构中?

从 Springboard 返回后导致通用跳过的 AudioUnits

C++ 类函数分组

从命令行控制 AudioUnits?

AudioUnits 和 MPMusicPlayerController