我只是想做一些基本的Windows調用來打印來自MIDI輸入設備(鍵盤)的信息。這些調用似乎有效,但前兩個調用midiInOpen和midiInStart返回MMSYSERR_NOMEM
和MMSYSERR_INVALHANDLE
。我相信這與ptr = FFI::MemoryPointer.new(:pointer)
有關,但我對FFI瞭解不多。任何幫助表示讚賞。幫助紅寶石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之後一次調用回調函數。然後我打電話給midiInStart,結果是MMSYSERR_INVALHANDLE。你有沒有發現,問題是什麼或在midiInOpen中設置的正確標誌是什麼,錯誤消失了? – Michael 2015-04-13 19:05:47