Mélange de C et d'Objectiv-C : les instances de classes non reconnues.

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 :
<br />
<br />
//_audioManager est une instance de la classe AudioManager qui s&#39;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(&quot;TeStInG&quot;), NULL, NULL, &amp;midiclient)) {<br />
	    printf(&quot;Error trying to create MIDI Client structure: %d&#092;n&quot;, status);<br />
	    printf(&quot;%s&#092;n&quot;, GetMacOSStatusErrorString(status));<br />
	    exit(status);<br />
    }<br />
    if (status == MIDIInputPortCreate(midiclient, CFSTR(&quot;InPuT&quot;), myReadProc,<br />
									  NULL, &amp;midiin)) {<br />
	    printf(&quot;Error trying to create MIDI output port: %d&#092;n&quot;, status);<br />
	    printf(&quot;%s&#092;n&quot;, 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&#39;é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-&gt;packet;<br />
    int i, j;<br />
    int count = packetList-&gt;numPackets;<br />
    for (j=0; j&lt;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-&gt;packet;<br />
for (i = 0; i &lt; packets-&gt;numPackets; i++) {<br />
  for (j = 0; j &lt; packet-&gt;length; j++) {<br />
   if (packet-&gt;data[j] &gt;= 0xF8) continue;<br />
		   <br />
		    // Hand off the packet for processing when the next one starts<br />
		    if ((packet-&gt;data[j] &amp; 0x80) &#33;= 0 &amp;&amp; messageSize &gt; 0) {<br />
			    messageSize = 0;<br />
		    }<br />
		    message[messageSize++] = packet-&gt;data[j];   // push the data into the message<br />
		    NSLog(@&quot;MIDI message : %s&quot;, message);<br />
    //pas de problème, le MIDIData est bien affiché. La méthode marche.<br />
		   <br />
		    [_audioManager processMIDIEvent:message];<br />
  //C&#39;est cette méthode qu&#39;il me faudrait faire passer en Objectiv-C : _audioManager gère l&#39;audio Unit<br />
  }<br />
  packet = MIDIPacketNext (packet);<br />
}<br />
if (messageSize &gt; 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.

Réponses

  • Tu mets self comme 4e paramètre:



    MIDIInputPortCreate(midiclient, CFSTR("InPuT"), myReadProc,self, &midiin)



    ainsi dans myReadProc, tu fais:



    AudioManager* manager=(AudioManager*) readProcRefCon;





    c'est tout image/smile.png' class='bbc_emoticon' alt=':)' />
  • CéroceCéroce Membre, Modérateur
    Ou si ça ne ne pose pas de problème de vitesse, utilise des méthodes de classe ObjC.
  • Merci mpergand. Décidément, vous êtes hyper doués ici! En fait j'ai fait :
    <br />
    MIDIInputPortCreate(midiclient, CFSTR(&quot;InPuT&quot;), myReadProc,<br />
    									  _audioManager, &amp;midiin))<br />
    //_audioManager au lieu de self<br />
    


    et cela a marché super!!



    Merci infiniment. Je n'ai pas encore essayé la soumission à  Apple, mais à  priori...
  • Bon, pas de chance, mon problème de rejet du MAS est toujours là . Mais je suis tout de même content de m'être débarrassé du framework désuet.
  • Pour info, ceci ne compilera pas si tu utilises ARC. Il faut passer par un "bridged cast" (je rajoute directement dans la citation):


    'mpergand' a écrit:


    Tu mets self comme 4e paramètre:



    MIDIInputPortCreate(midiclient, CFSTR("InPuT"), myReadProc, (__bridge void *)self, &midiin)



    ainsi dans myReadProc, tu fais:



    AudioManager* manager=(__bridge AudioManager*) readProcRefCon;





    c'est tout image/smile.png' class='bbc_emoticon' alt=':)' />
Connectez-vous ou Inscrivez-vous pour répondre.