2009-09-21 7 views
3

En tant que projet parallèle, j'implémente une matrice MIDI pour interconnecter un certain nombre de claviers MIDI avec des sources sonores. L'exigence clé ici est d'écho des données MIDI reçues sur un port d'entrée vers un port de sortie sélectionné.

Après avoir créé les déclarations P/Invoke nécessaire & wrappers, je remarque que la documentation MIDI Win32 pour MidiInProc états: « applications ne doivent pas appeler toutes les fonctions multimédia à l'intérieur de la fonction de rappel, car cela peut provoquer une impasse ». Étant donné qu'il est dangereux d'appeler midiOutShortMsg depuis un MidiInProc, ma solution actuelle consiste à écrire des données MIDI dans une file d'attente et à définir un événement. Un thread de travail attend l'événement et appelle midiOutShortMsg. L'idée générale est la suivante: -En écho en toute sécurité aux données MIDI en C#

static void InputCallback(int hMidiIn, uint wMsg, uint dwInstance, uint dwParam1, uint dwParam2) 
{ 
    if(wMsg == MM_MIM_DATA) 
    { 
     data.EnQueue(dwParam1);  //data is a Queue<uint> 
     dataReady.Set();   //dataReady is AutoResetEvent 
    } 
} 


void ThreadProc 
{ 
    while(!_done) 
    { 
     dataReady.WaitOne(); 
     midiOutShortMsg(hMidiOut, data.DeQueue()); 
    } 
} 

Cependant, tout cela a fonctionné très bien dans les tests, il semble y avoir une fenêtre d'opportunité entre l'appel à dataReady.Set() et InputCallBack retour au cours de laquelle la préemption pourrait permettre au thread de travail à appelez midiOutShortMsg (bien que dans un autre thread).

Cette approche est-elle sûre?

Répondre

1

Votre question pourrait être un peu spécifique à votre domaine pour StackOverflow. Si personne ici n'y répond, consultez: http://groups.google.com/group/mididev?hl=en&lnk=

+0

Merci. ressemble à une ressource utile. –

+0

Juste ne leur dis pas que je vous ai envoyé. J'ai tendance à mal utiliser le MIDI à chaque occasion (j'ai passé des années sur une application MIDI, donc j'ai l'impression d'avoir droit). :) – MusiGenesis

3

Cela me semble plus sûr: même si vos deux threads tournent en même temps, c'est toujours le thread de travail qui pourrait bloquer, donc cela ne bloquera pas votre entrée rappeler.

+0

Je seconde cela. Un blocage ne se produit que si un thread attend qu'il se termine - ce qu'il ne peut pas parce qu'il attend. Dans ce cas, le thread attend un autre thread. – configurator

Questions connexes