Управление блоками данных MIDI

Приложения, использующие блоки данных для передачи системных эксклюзивных сообщений (с помощью midiOutLongMsg и midiInAddBuffer функций) и буферов потоков (с помощью функции midiStreamOut) должны постоянно предоставлять драйверу устройства блоки данных до завершения воспроизведения или записи.

Даже если используется один блок данных, приложение должно иметь возможность определить, когда драйвер устройства завершит работу с блоком данных, чтобы освободить память, связанную со структурой блока данных и заголовка. Три метода можно использовать для определения завершения работы драйвера устройства с блоком данных:

  • Укажите функцию обратного вызова для получения сообщения, отправленного драйвером после завершения работы с блоком данных. Чтобы получить входные данные MIDI с меткой времени, необходимо использовать функцию обратного вызова.
  • Используйте обратный вызов события (только для выходных данных).
  • Используйте обратный вызов окна или потока, чтобы получить сообщение, отправленное драйвером после завершения работы с блоком данных.

Если приложение не получает блок данных для драйвера устройства, когда это необходимо, может возникнуть разрыв в воспроизведении или потеря входящих записанных сведений. Как минимум, приложение должно использовать схему двойной буферизации, чтобы оставаться по крайней мере одним блоком данных перед драйвером устройства.

Использование функции обратного вызова для обработки сообщений драйвера

Вы можете написать собственную функцию обратного вызова для обработки сообщений, отправленных драйвером устройства. Для использования функции обратного вызова укажите флаг CALLBACK_FUNCTION в параметре dwFlags и адрес функции обратного вызова в параметре dwCallback в функциях midiInOpen или midiOutOpen.

Сообщения, отправленные в функцию обратного вызова, похожи на сообщения, отправленные в окно, но содержат два параметра doubleword вместо параметра беззнакового целого числа и параметра doubleword. Дополнительные сведения об этих сообщениях см. в разделах Отправка System-Exclusive Сообщения и Управление записью MIDI.

Используйте один из следующих методов для передачи данных экземпляра из приложения в функцию обратного вызова:

  • Используйте параметр dwCallbackInstance функции, открывшей драйвер устройства.
  • Используйте элемент dwUser структуры MIDIHDR, которая определяет блок данных, отправляемый драйверу устройства MIDI.

Если требуется более чем 32 бита данных экземпляра, передайте адрес структуры, содержащей дополнительные сведения.

Использование обратного вызова для обработки сообщений драйвера

Чтобы использовать обратный вызов события, используйте функцию CreateEvent, чтобы получить дескриптор события и указать CALLBACK_EVENT в вызове функции midiOutOpen.

Обратный вызов события задается любым, что может вызвать обратный вызов функции. В отличие от функций обратного вызова и вызовов окна или потока, обратные вызовы событий не получают конкретных уведомлений о закрытии, завершении или открытии. Поэтому приложению может потребоваться проверить состояние процесса, которого оно ожидает, после возникновения события.

Дополнительные сведения о обратных вызовах событий см. в разделе Использование обратного вызова события для управления буферным воспроизведением.

Использование обратного вызова окна или потока для обработки сообщений драйвера

Чтобы использовать обратный вызов окна, укажите флаг CALLBACK_WINDOW в параметре dwFlags и дескриптор окна в младшем слове параметра dwCallback функции midiInOpen или midiOutOpen. Сообщения драйвера будут отправляться в функцию оконной процедуры для окна, определяемого дескриптором в dwCallback.

Аналогичным образом, чтобы использовать обратный вызов потока, укажите флаг CALLBACK_THREAD и идентификатор потока в вызове midiInOpen или midiOutOpen. В этом случае сообщения будут размещены в указанном потоке вместо окна.

Сообщения, отправляемые в окно или функцию обратного вызова потока, связаны с конкретным используемым устройством MIDI. Для получения дополнительной информации об этих сообщениях см. разделы Отправка System-Exclusive сообщений и Управление записью MIDI.

Службы MIDI