Compartilhar via


Gerenciando blocos de dados MIDI

Os aplicativos que usam blocos de dados para passar mensagens exclusivas do sistema (usando as funções midiOutLongMsg e midiInAddBuffer ) e buffers de fluxo (usando a função midiStreamOut ) devem fornecer continuamente ao driver do dispositivo blocos de dados até que a reprodução ou gravação seja concluída.

Mesmo que um único bloco de dados seja usado, um aplicativo deve ser capaz de determinar quando um driver de dispositivo é concluído com o bloco de dados para que ele possa liberar a memória associada ao bloco de dados e à estrutura de cabeçalho. Três métodos podem ser usados para determinar quando um driver de dispositivo é concluído com um bloco de dados:

  • Especifique uma função de retorno de chamada para receber uma mensagem enviada pelo driver quando ela for concluída com um bloco de dados. Para obter dados de entrada MIDI com carimbo de data/hora, você deve usar uma função de retorno de chamada.
  • Use um retorno de chamada de evento (somente para saída).
  • Use uma janela ou um retorno de chamada de thread para receber uma mensagem enviada pelo driver quando ela for concluída com um bloco de dados.

Se um aplicativo não receber um bloco de dados para o driver do dispositivo quando for necessário, poderá ocorrer uma lacuna audível na reprodução ou uma perda de informações registradas de entrada. No mínimo, um aplicativo deve usar um esquema de buffer duplo para permanecer pelo menos um bloco de dados à frente do driver do dispositivo.

Usando uma função de retorno de chamada para processar mensagens de driver

Você pode escrever sua própria função de retorno de chamada para processar mensagens enviadas pelo driver do dispositivo. Para usar uma função de retorno de chamada, especifique o sinalizador CALLBACK_FUNCTION no parâmetro dwFlags e o endereço da função de retorno de chamada no parâmetro dwCallback da função midiInOpen ou midiOutOpen .

As mensagens enviadas para uma função de retorno de chamada são semelhantes às mensagens enviadas a uma janela, exceto que elas têm dois parâmetros de palavra dupla em vez de um parâmetro inteiro sem sinal e um parâmetro de palavra dupla. Para obter mais informações sobre essas mensagens, consulte Enviando mensagens de System-Exclusive e Gerenciando gravação MIDI.

Use uma das seguintes técnicas para passar dados de instância de um aplicativo para uma função de retorno de chamada:

  • Use o parâmetro dwCallbackInstance da função que abre o driver do dispositivo.
  • Use o membro dwUser da estrutura MIDIHDR que identifica um bloco de dados que está sendo enviado para um driver de dispositivo MIDI.

Se você precisar de mais de 32 bits de dados de instância, passe um endereço de uma estrutura contendo as informações adicionais.

Usando um retorno de chamada de evento para processar mensagens do driver

Para usar um retorno de chamada de evento, use a função CreateEvent para recuperar o identificador de um evento e especificar CALLBACK_EVENT na chamada para a função midiOutOpen .

Um retorno de chamada de evento é definido por qualquer coisa que possa causar um retorno de chamada de função. Ao contrário das funções de retorno de chamada e dos retornos de chamada de janela ou thread, os retornos de chamada de evento não recebem notificações específicas de fechamento, concluídos ou abertos. Portanto, um aplicativo pode ter que marcar o status do processo que está aguardando após a ocorrência do evento.

Para obter mais informações sobre retornos de chamada de evento, consulte Usando um retorno de chamada de evento para gerenciar a reprodução em buffer.

Usando um retorno de chamada de janela ou thread para processar mensagens de driver

Para usar um retorno de chamada de janela, especifique o sinalizador CALLBACK_WINDOW no parâmetro dwFlags e um identificador de janela na palavra de baixa ordem do parâmetro dwCallback da função midiInOpen ou midiOutOpen . As mensagens de driver serão enviadas para a função de procedimento de janela para a janela identificada pelo identificador em dwCallback.

Da mesma forma, para usar um retorno de chamada de thread, especifique o sinalizador CALLBACK_THREAD e um identificador de thread na chamada para midiInOpen ou midiOutOpen. Nesse caso, as mensagens serão postadas no thread especificado em vez de em uma janela.

As mensagens enviadas para uma janela ou retorno de chamada de thread são específicas para o dispositivo MIDI usado. Para obter mais informações sobre essas mensagens, consulte Enviando mensagens de System-Exclusive e Gerenciando gravação MIDI.

Serviços MIDI