我正在开发一款可以对输入音频进行实时处理的应用。我找到了this网站,我认为我可以将其作为起点。但是,提供的所有功能都是用C ++编写的。
我首先要做的最简单的事情是将UILabel的文本更改为函数接收的一些值:
OSStatus renderCallback(void *userData, AudioUnitRenderActionFlags *actionFlags,
const AudioTimeStamp *audioTimeStamp, UInt32 busNumber,
UInt32 numFrames, AudioBufferList *buffers)
我将所有函数粘贴到我视图的@implementation中,并且可以通过将扩展名更改为.mm来编译。我创建了一个UILabel属性,但renderCallback函数无法访问它。
显然,将这些函数粘贴到@implementation中并不是正确的方法。我该怎么做正确的方法?
答案 0 :(得分:0)
尽管C ++基本上可以按原样进入.mm
文件,但这并不总是有效(例如,如果你有一个名为id
的变量,它将与Objective-C冲突)。您可以将大多数C ++代码保留在单独的文件中,并将#import
相应的C ++ .h
文件放入创建.mm
等的UILabel
中。
至于UILabel
要求的内容;您需要创建NSString*
值。一种可能性就像stringWithFormat:
,例如
int myInt = 0;
const char *myString = "string";
id myObject = @"object";
NSString* myString = [NSString stringWithFormat:@"here is a number: %d, here is a C string: %s, here is an object: %@", myInt, myString, myObject];
你可以想象从你的C ++代码中获取你想要的任何原始值,并使用如上所述的格式化字符串将它们转换为单个标签值。
答案 1 :(得分:0)
您无法直接在C / C ++方法中访问objective-c变量。将您的对象传递到void *userData
。
-(void)Method
{
renderCallback(self, &actionFlags,
&audioTimeStamp, busNumber,
numFrames, &buffers);
}
OSStatus renderCallback(void *userData, AudioUnitRenderActionFlags *actionFlags,
const AudioTimeStamp *audioTimeStamp, UInt32 busNumber,
UInt32 numFrames, AudioBufferList *buffers)
{
id obj;
if (userData)
{
obj = (id)userData;
[obj MethodB];
}
//....
}