나는 MIDI 입력 장치 (키보드)에서 정보를 인쇄하기 위해 몇 가지 기본적인 Windows 호출을 시도하려고합니다. 전화가 작동하는 것처럼 보이지만 midiInOpen 및 midiInStart에 대한 처음 두 번의 호출은 MMSYSERR_NOMEM
및 MMSYSERR_INVALHANDLE
을 반환합니다. 나는 그것이 ptr = FFI::MemoryPointer.new(:pointer)
과 관련이 있다고 믿지만, FFI에 대해 충분히 알지 못한다. 어떤 도움을 주셔서 감사합니다.도움말 Ruby FFI
require 'ffi'
module MIDI; end
module MIDI::Input
extend FFI::Library
ffi_lib 'winmm'
ffi_convention :stdcall
callback :midiInProc, [ :pointer, :uint, :int, :int, :int ], :void
attach_function :midiInOpen, [ :pointer, :uint, :midiInProc, :int, :int ], :int
attach_function :midiInClose, [ :long ], :int
attach_function :midiInStart, [ :long ], :int
attach_function :midiInStop, [ :long ], :int
attach_function :midiInReset, [ :long ], :int
MidiInProcCallback = Proc.new do |hmidiin, wmsg, dwintance, dwparam1, dwparam2|
p hmidiin, wmsg, dwintance, dwparam1, dwparam2
end
end
require 'pp'
ptr = FFI::MemoryPointer.new(:pointer)
p MIDI::Input.midiInOpen(ptr, 0, MIDI::Input::MidiInProcCallback, 0, 0)
p MIDI::Input.midiInStart(ptr.read_long)
trap("INT") do
p MIDI::Input.midiInStart(ptr.read_long)
p MIDI::Input.midiInClose(ptr.read_long)
p ptr.free
exit
end
loop {}
Ryan에게 질문 : 저는 여기에도 같은 문제가 있습니다. midiInOpen의 결과는 MMSYSERR_NOERROR이고, 콜백 함수는 midiInOpen 이후에 excactly 한 번 호출됩니다. 그런 다음 midiInStart를 호출하면 결과는 MMSYSERR_INVALHANDLE입니다. 문제가 무엇인지 또는 midiInOpen에서 설정할 올바른 플래그가 무엇인지 알아 냈는 지, 오류가 사라 졌는가? – Michael