Mélange de C et d'Objectiv-C : les instances de classes non reconnues.
Herve
Membre
Bonjour,
Pour contourner mon problème de framework MIDI désuet, je réécris ma classe MIDI Manager.
Elle contient des méthodes en Objectiv-C et d'autres en C : celles-ci sont appelées depuis les structures de Core MIDI, je ne vois pas comment les écrire en Objectiv-C. Mon problème est qu'il me faudrait appeler des méthodes Objectiv-C depuis les méthodes C. Le compilateur rejette cela. Je ne connais pas la solution.
Je vous montre le code en question :
Si vous aviez une piste, ce serait super! Merci d'avance.
Pour contourner mon problème de framework MIDI désuet, je réécris ma classe MIDI Manager.
Elle contient des méthodes en Objectiv-C et d'autres en C : celles-ci sont appelées depuis les structures de Core MIDI, je ne vois pas comment les écrire en Objectiv-C. Mon problème est qu'il me faudrait appeler des méthodes Objectiv-C depuis les méthodes C. Le compilateur rejette cela. Je ne connais pas la solution.
Je vous montre le code en question :
<br />
<br />
//_audioManager est une instance de la classe AudioManager qui s'occupe des Audio Unit.<br />
<br />
- (void) nouveauEndPoint: (NSPopUpButton*)myPopUp{<br />
CFStringRef entreeMIDISelected = (CFStringRef) [myPopUp titleOfSelectedItem];<br />
ItemCount indexPopUp = [myPopUp indexOfSelectedItem];<br />
<br />
<br />
<br />
// Prepare MIDI Interface Client/Port for writing MIDI data:<br />
MIDIClientRef midiclient = NULL;<br />
MIDIPortRef midiin = NULL;<br />
OSStatus status;<br />
if (status == MIDIClientCreate(CFSTR("TeStInG"), NULL, NULL, &midiclient)) {<br />
printf("Error trying to create MIDI Client structure: %d\n", status);<br />
printf("%s\n", GetMacOSStatusErrorString(status));<br />
exit(status);<br />
}<br />
if (status == MIDIInputPortCreate(midiclient, CFSTR("InPuT"), myReadProc,<br />
NULL, &midiin)) {<br />
printf("Error trying to create MIDI output port: %d\n", status);<br />
printf("%s\n", GetMacOSStatusErrorString(status));<br />
exit(status);<br />
}<br />
<br />
<br />
<br />
MIDIEndpointRef src = MIDIGetSource(indexPopUp);<br />
MIDIPortConnectSource(midiin, src, NULL);<br />
<br />
CFRunLoopRef runLoop;<br />
runLoop = CFRunLoopGetCurrent();<br />
CFRunLoopRun(); <br />
}<br />
<br />
<br />
<br />
void myReadProc(const MIDIPacketList *packetList, void* readProcRefCon,<br />
void* srcConnRefCon) {<br />
//pas moyen je pense d'écrire cette méthode, centrale dans le processus, en Objectiv-C :<br />
//elle est appelée depuis une structure C.<br />
MIDIPacket *packet = (MIDIPacket*)packetList->packet;<br />
int i, j;<br />
int count = packetList->numPackets;<br />
for (j=0; j<count; j++) {<br />
<br />
packet = MIDIPacketNext(packet);<br />
processMIDIPacketList(packetList);<br />
}<br />
}<br />
<br />
<br />
void processMIDIPacketList(const MIDIPacketList* packets){<br />
int i, j;<br />
const MIDIPacket* packet;<br />
Byte message[256];<br />
int messageSize = 0;<br />
<br />
<br />
packet = packets->packet;<br />
for (i = 0; i < packets->numPackets; i++) {<br />
for (j = 0; j < packet->length; j++) {<br />
if (packet->data[j] >= 0xF8) continue;<br />
<br />
// Hand off the packet for processing when the next one starts<br />
if ((packet->data[j] & 0x80) != 0 && messageSize > 0) {<br />
messageSize = 0;<br />
}<br />
message[messageSize++] = packet->data[j]; // push the data into the message<br />
NSLog(@"MIDI message : %s", message);<br />
//pas de problème, le MIDIData est bien affiché. La méthode marche.<br />
<br />
[_audioManager processMIDIEvent:message];<br />
//C'est cette méthode qu'il me faudrait faire passer en Objectiv-C : _audioManager gère l'audio Unit<br />
}<br />
packet = MIDIPacketNext (packet);<br />
}<br />
if (messageSize > 0){<br />
[_audioManager processMIDIEvent:message];//même problème<br />
}<br />
}<br />
<br />
<br />
<br />
Si vous aviez une piste, ce serait super! Merci d'avance.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
MIDIInputPortCreate(midiclient, CFSTR("InPuT"), myReadProc,self, &midiin)
ainsi dans myReadProc, tu fais:
AudioManager* manager=(AudioManager*) readProcRefCon;
c'est tout /smile.png' class='bbc_emoticon' alt=':)' />
et cela a marché super!!
Merci infiniment. Je n'ai pas encore essayé la soumission à Apple, mais à priori...