Pracujem na aplikácii, ktorá bude robiť nejaké spracovanie vstupného zvuku v reálnom čase. Našiel som toto myslím, že by som ich mohol použiť ako východiskový bod. Všetky poskytované funkcie sú však v jazyku C ++.
Najjednoduchšia vec, ktorú by som rád začal používať, je zmena textu UILabel na niektoré z hodnôt prijatých funkciou:
OSStatus renderCallback(void *userData, AudioUnitRenderActionFlags *actionFlags,
const AudioTimeStamp *audioTimeStamp, UInt32 busNumber,
UInt32 numFrames, AudioBufferList *buffers)
Všetky funkcie som vložil do @implementácie môjho pohľadu a dokázal som ich skompilovať zmenou prípony na .mm. Vytvoril som vlastnosť UILabel, ale funkcia renderCallback k nej nemôže získať prístup.
Je zrejmé, že samotné vloženie týchto funkcií do implementácie nie je správny spôsob. Ako to urobím správnym spôsobom?
odpovede:
0 pre odpoveď č. 1Aj keď C ++ môže v zásade ísť do a .mm
súbor taký, aký je, to vždy nefunguje (napr. ak ste mali premennú s názvom id
bolo by to v rozpore s cieľom C). Väčšinu svojho kódu C ++ môžete striedavo nechať v samostatnom súbore a len #import
príslušný C ++ .h
súbor do .mm
kde vytvoríte a UILabel
, atď.
Pokiaľ to, čo a UILabel
vyžaduje; musíte vytvoriť NSString*
hodnotu. Jednou z možností je niečo ako stringWithFormat:
, napr.
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];
Môžete si predstaviť, že z vášho kódu C ++ chytíte akékoľvek primitívne hodnoty, ktoré chcete, a pomocou formátovaného reťazca, ako je uvedené vyššie, ich premeniť na jednu hodnotu štítka.
0 pre odpoveď č. 2
K premennej Objective-C nemôžete priamo pristupovať v metóde C / C ++. Vložte svoj predmet dovnútra 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];
}
//....
}