Поделиться через


Управление блоками данных 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