Condividi tramite


Gestione di blocchi di dati MIDI

Le applicazioni che usano blocchi di dati per il passaggio di messaggi esclusivi del sistema (usando le funzioni midiOutLongMsg e midiInAddBuffer ) e i buffer di flusso (usando la funzione midiStreamOut ) devono fornire continuamente il driver del dispositivo con blocchi di dati fino al completamento della riproduzione o della registrazione.

Anche se viene usato un singolo blocco di dati, un'applicazione deve essere in grado di determinare quando un driver di dispositivo viene completato con il blocco di dati in modo che possa liberare la memoria associata alla struttura del blocco di dati e dell'intestazione. È possibile usare tre metodi per determinare quando un driver di dispositivo viene completato con un blocco di dati:

  • Specificare una funzione di callback per ricevere un messaggio inviato dal driver al termine di un blocco di dati. Per ottenere i dati di input MIDI con timestamp, è necessario usare una funzione di callback.
  • Usare un callback dell'evento (solo per l'output).
  • Usare un callback di finestra o thread per ricevere un messaggio inviato dal driver al termine di un blocco di dati.

Se un'applicazione non ottiene un blocco di dati al driver del dispositivo quando è necessario, può verificarsi un gap udibile nella riproduzione o una perdita di informazioni registrate in ingresso. Almeno un'applicazione deve usare uno schema di buffer doppio per rimanere almeno un blocco di dati davanti al driver del dispositivo.

Uso di una funzione di callback per elaborare i messaggi del driver

È possibile scrivere una funzione di callback personalizzata per elaborare i messaggi inviati dal driver del dispositivo. Per usare una funzione di callback, specificare il flag CALLBACK_FUNCTION nel parametro dwFlags e l'indirizzo della funzione di callback nel parametro dwCallback della funzione midiInOpen o midiOutOpen.

I messaggi inviati a una funzione di callback sono simili ai messaggi inviati a una finestra, ad eccezione dei due parametri doubleword anziché un parametro integer senza segno e un parametro doubleword. Per altre informazioni su questi messaggi, vedere Invio di messaggi System-Exclusive e gestione della registrazione MIDI.

Usare una delle tecniche seguenti per passare i dati dell'istanza da un'applicazione a una funzione di callback:

  • Usare il parametro dwCallbackInstance della funzione che apre il driver del dispositivo.
  • Usare il membro dwUser della struttura MIDIHDR che identifica un blocco di dati inviato a un driver di dispositivo MIDI.

Se sono necessari più di 32 bit di dati dell'istanza, passare un indirizzo di una struttura contenente le informazioni aggiuntive.

Uso di un callback evento per elaborare i messaggi del driver

Per usare un callback eventi, usare la funzione CreateEvent per recuperare l'handle di un evento e specificare CALLBACK_EVENT nella chiamata alla funzione midiOutOpen .

Un callback evento viene impostato da qualsiasi elemento che potrebbe causare il callback di una funzione. A differenza delle funzioni di callback e delle finestre o dei callback del thread, i callback degli eventi non ricevono notifiche specifiche di chiusura, fine o apertura. Pertanto, un'applicazione potrebbe dover controllare lo stato del processo in attesa dopo che si verifica l'evento.

Per altre informazioni sui callback degli eventi, vedere Uso di un callback eventi per gestire la riproduzione con buffer.

Uso di una finestra o di un callback thread per elaborare i messaggi del driver

Per usare un callback della finestra, specificare il flag CALLBACK_WINDOW nel parametro dwFlags e un handle di finestra nella parola a basso ordine del parametro dwCallback della funzione midiInOpen o midiOutOpen . I messaggi del driver verranno inviati alla funzione della routine della finestra per la finestra identificata dall'handle in dwCallback.

Analogamente, per usare un callback thread, specificare il flag di CALLBACK_THREAD e un identificatore di thread nella chiamata a midiInOpen o midiOutOpen. In questo caso, i messaggi verranno inviati al thread specificato anziché a una finestra.

I messaggi inviati a una finestra o un callback thread sono specifici del dispositivo MIDI usato. Per altre informazioni su questi messaggi, vedere Invio di messaggi System-Exclusive e gestione della registrazione MIDI.

Servizi MIDI