2

MIDI入力デバイス(キーボード)から情報を印刷するために、いくつかの基本的なWindows呼び出しを実行しようとしています。呼び出しは機能しているように見えますが、midiInOpenとmidiInStartへの最初の2つの呼び出しはとを返し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 {}
4

2 に答える 2

1

あなたのコードはほとんど正しいように見えるので、明確な答えはありませんが、問題は、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インターフェイスを使用して同じAPIをラップする他の誰かの便利な例です。

midiInOpenとコールバックの署名が少し間違っています(ただし、この問題は発生しません)。彼らはする必要があります:

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

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

つまり、APIドキュメントがDWORD_PTRを使用する場合は:pointerを使用します

于 2011-01-07T06:54:38.830 に答える
0

https://github.com/arirusso/midi-winmm/blob/master/lib/midi-winmm/map.rbをご覧ください。

おー!それはあなたの一部です。涼しい。できます。

私はそれを試したので、これがWindowsで機能することを知っています。私の最大の望みは、winmm.dll API に関する Microsoft のドキュメントを見つけることです。あなたの質問にuser186057が答えてくれたおかげで見つけたと思います。

ありがとう。

于 2016-12-17T22:44:16.333 に答える