私は単に、MIDI入力デバイス(キーボード)から情報を印刷するために、いくつかの基本的なWindows呼び出しを試みています。コールは機能しているようですが、midiInOpenとmidiInStartの最初の2回のコールはMMSYSERR_NOMEM
とMMSYSERR_INVALHANDLE
です。私はそれがptr = FFI::MemoryPointer.new(:pointer)
と関係があると信じていますが、私はそれを理解するためにFFIについて十分に知りません。どんな助けもありがとうございます。Help with 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の後に1回excactly呼ばれます。次にmidiInStartを呼び出し、結果はMMSYSERR_INVALHANDLEです。問題が何であるか、midiInOpenで設定する正しいフラグは何か、エラーが解消したことを確認しましたか? – Michael