1

我正在开发一个应用程序,它将对输入音频进行一些实时处理。我发现了这个网站,我认为我可以将其用作起点。但是,提供的所有函数都是 C++ 中的。

我想首先做的最简单的事情是将 UILabel 的文本更改为函数接收到的一些值:

OSStatus renderCallback(void *userData, AudioUnitRenderActionFlags *actionFlags,
                    const AudioTimeStamp *audioTimeStamp, UInt32 busNumber,
                    UInt32 numFrames, AudioBufferList *buffers)

我将所有函数粘贴到我的视图的@implementation 中,并且能够通过将扩展名更改为.mm 来进行编译。我创建了一个 UILabel 属性,但 renderCallback 函数无法访问它。

显然,只是将这些函数粘贴到 @implementation 中并不是正确的做法。我该如何以正确的方式做到这一点?

4

2 回答 2

0

尽管 C++ 基本上可以按原样进入.mm文件,但这并不总是有效(例如,如果你有一个变量命名id它会与 Objective-C 冲突)。您也可以将大部分 C++ 代码保留在单独的文件中,#import将适当的 C++.h文件保留.mm在您创建UILabel. 等文件的位置。

就 a 的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++ 代码中获取您想要的任何原始值,并使用上述格式化字符串将它们转换为单个标签值。

于 2012-07-20T06:05:30.673 回答
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];
   }
//....  

}
于 2012-07-20T06:10:19.863 回答