다음을 통해 공유


MIDI 데이터 블록 관리

시스템 전용 메시지( midiOutLongMsgmidiInAddBuffer 함수 사용) 및 스트림 버퍼( midiStreamOut 함수 사용)를 전달하는 데 데이터 블록을 사용하는 애플리케이션은 재생 또는 녹화가 완료될 때까지 디바이스 드라이버에 데이터 블록을 지속적으로 제공해야 합니다.

단일 데이터 블록을 사용하는 경우에도 애플리케이션은 데이터 블록 및 헤더 구조와 연결된 메모리를 해제할 수 있도록 디바이스 드라이버가 데이터 블록으로 완료되는 시기를 결정할 수 있어야 합니다. 세 가지 메서드를 사용하여 디바이스 드라이버가 데이터 블록으로 완료되는 시기를 확인할 수 있습니다.

  • 데이터 블록으로 완료되면 드라이버에서 보낸 메시지를 받을 콜백 함수를 지정합니다. 타임스탬프를 적용한 MIDI 입력 데이터를 얻으려면 콜백 함수를 사용해야 합니다.
  • 이벤트 콜백을 사용합니다(출력에만 해당).
  • 창 또는 스레드 콜백을 사용하여 데이터 블록으로 완료되면 드라이버가 보낸 메시지를 받습니다.

애플리케이션이 필요할 때 디바이스 드라이버에 데이터 블록을 얻지 못하면 재생에서 가청 간격이 발생하거나 들어오는 기록된 정보가 손실될 수 있습니다. 최소한 애플리케이션은 이중 버퍼링 체계를 사용하여 디바이스 드라이버보다 하나 이상의 데이터 블록을 유지해야 합니다.

콜백 함수를 사용하여 드라이버 메시지 처리

사용자 고유의 콜백 함수를 작성하여 디바이스 드라이버에서 보낸 메시지를 처리할 수 있습니다. 콜백 함수를 사용하려면 dwFlags 매개 변수에 CALLBACK_FUNCTION 플래그를 지정하고 midiInOpen 또는 midiOutOpen 함수의 dwCallback 매개 변수에서 콜백 함수의 주소를 지정합니다.

콜백 함수로 전송된 메시지는 부호 없는 정수 매개 변수와 doubleword 매개 변수 대신 두 개의 이중 단어 매개 변수가 있다는 점을 제외하고 창으로 전송된 메시지와 비슷합니다. 이러한 메시지에 대한 자세한 내용은 System-Exclusive 메시지 보내기MIDI 기록 관리를 참조하세요.

다음 기술 중 하나를 사용하여 애플리케이션에서 콜백 함수로 instance 데이터를 전달합니다.

  • 디바이스 드라이버를 여는 함수의 dwCallbackInstance 매개 변수를 사용합니다.
  • MIDI 디바이스 드라이버로 전송되는 데이터 블록을 식별하는 MIDIHDR 구조체의 dwUser 멤버를 사용합니다.

32비트 이상의 instance 데이터가 필요한 경우 추가 정보가 포함된 구조체의 주소를 전달합니다.

이벤트 콜백을 사용하여 드라이버 메시지 처리

이벤트 콜백을 사용하려면 CreateEvent 함수를 사용하여 이벤트의 핸들을 검색하고 midiOutOpen 함수 호출에서 CALLBACK_EVENT 지정합니다.

이벤트 콜백은 함수 콜백을 일으킬 수 있는 모든 항목에 의해 설정됩니다. 콜백 함수 및 창 또는 스레드 콜백과 달리 이벤트 콜백은 특정 닫기, 완료 또는 열린 알림을 수신하지 않습니다. 따라서 애플리케이션은 이벤트가 발생한 후 대기 중인 프로세스의 상태 검사 수 있습니다.

이벤트 콜백에 대한 자세한 내용은 이벤트 콜백을 사용하여 버퍼링된 재생 관리를 참조하세요.

창 또는 스레드 콜백을 사용하여 드라이버 메시지 처리

창 콜백을 사용하려면 dwFlags 매개 변수에 CALLBACK_WINDOW 플래그를 지정하고 midiInOpen 또는 midiOutOpen 함수의 dwCallback 매개 변수의 하위 순서 단어에 창 핸들을 지정합니다. 드라이버 메시지는 dwCallback의 핸들로 식별된 창의 창 프로시저 함수로 전송됩니다.

마찬가지로 스레드 콜백을 사용하려면 midiInOpen 또는 midiOutOpen 호출에서 CALLBACK_THREAD 플래그 및 스레드 식별자를 지정합니다. 이 경우 메시지는 창 대신 지정된 스레드에 게시됩니다.

창 또는 스레드 콜백으로 전송되는 메시지는 사용되는 MIDI 디바이스와 관련이 있습니다. 이러한 메시지에 대한 자세한 내용은 System-Exclusive 메시지 보내기MIDI 기록 관리를 참조하세요.

MIDI 서비스