gpt4 book ai didi

ruby - 帮助 Ruby FFI

转载 作者:太空宇宙 更新时间:2023-11-03 16:38:01 24 4
gpt4 key购买 nike

我只是想进行一些基本的 Windows 调用,以打印来自 MIDI 输入设备(键盘)的信息。这些调用似乎有效,但对 midiInOpen 和 midiInStart 的前两次调用返回 MMSYSERR_NOMEMMMSYSERR_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() 的 dwFlags(最后一个参数)才是问题所在。看着http://msdn.microsoft.com/en-us/library/dd798458(v=vs.85).aspx , 它似乎需要非零。

尝试在 winmm 头文件中查找 CALLBACK_FUNCTION 的值,并在您的模块中声明一个类似的常量,然后将其用作标志参数。

http://powersdr-iq.googlecode.com/svn/trunk/Source/Console/midi.cs 处有一个 C# 包装器这可能是其他人使用 C# P/Invoke 接口(interface)包装相同 API 的有用示例。

您对 midiInOpen 和回调的签名略有错误(但不会导致此问题)。它们应该是:

callback :midiInProc, [ :pointer, :uint, :pointer, :pointer, :pointer  ], :void

attach_function :midiInOpen, [ :pointer, :uint, :midiInProc, :pointer, :int ], :int

即在 API 文档使用 DWORD_PTR 的地方使用 :pointer

关于ruby - 帮助 Ruby FFI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4622922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com