【发布时间】:2016-12-18 06:50:31
【问题描述】:
我只是尝试进行一些基本的 Windows 调用来打印来自 MIDI 输入设备(键盘)的信息。这些调用似乎有效,但对 midiInOpen 和 midiInStart 的前两个调用返回 MMSYSERR_NOMEM 和 MMSYSERR_INVALHANDLE。我相信这与ptr = FFI::MemoryPointer.new(:pointer) 有关,但我对 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 {}
【问题讨论】:
-
问瑞安的问题:我也有同样的问题。 midiInOpen 的结果是 MMSYSERR_NOERROR 并且回调函数在 midiInOpen 之后被准确地调用了一次。然后我调用 midiInStart,结果是 MMSYSERR_INVALHANDLE。您是否发现错误消失了,问题是什么或在 midiInOpen 中设置的正确标志是什么?