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

UILabelが必要とする限り。価値を創造する必要がありNSString*ます。1つの可能性は、次のようなものです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++ メソッドで直接目的の 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 に答える