質問

i'm trying to use unimidi gem since a while with no success... i've post my issue on the unimidi github's repository but no answer since a while

i'm using rvm, ruby 1.9.3-p327 on OS X.8.2

everything seems fine at the installation of unimidi:

new-host:~ pierrebaille$ gem install unimidi
Building native extensions.  This could take a while...
Fetching: alsa-rawmidi-0.2.14.gem (100%)
Fetching: ffi-coremidi-0.1.8.gem (100%)
Fetching: midi-jruby-0.0.12.gem (100%)
Fetching: midi-winmm-0.1.10.gem (100%)
Fetching: unimidi-0.3.3.gem (100%)
Successfully installed ffi-1.2.0
Successfully installed alsa-rawmidi-0.2.14
Successfully installed ffi-coremidi-0.1.8
Successfully installed midi-jruby-0.0.12
Successfully installed midi-winmm-0.1.10
Successfully installed unimidi-0.3.3
6 gems installed
Installing ri documentation for ffi-1.2.0...
Installing RDoc documentation for alsa-rawmidi-0.2.14...
Installing RDoc documentation for ffi-coremidi-0.1.8...
Installing RDoc documentation for midi-jruby-0.0.12...
Installing RDoc documentation for midi-winmm-0.1.10...
Installing RDoc documentation for unimidi-0.3.3...

when i'm trying to use it:

new-host:~ pierrebaille$ unimidi list
input:
/Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/gems/ffi-      1.2.0/lib/ffi/pointer.rb:42:in `get_string': invalid memory read at address=0x00000000000000 (FFI::NullPointerError)
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/gems/ffi-1.2.0/lib/ffi/pointer.rb:42:in `read_string'
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/gems/ffi-coremidi-0.1.8/lib/coremidi/device.rb:23:in `initialize'
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/gems/ffi-coremidi-0.1.8/lib/coremidi/device.rb:41:in `new'
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/gems/ffi-coremidi-0.1.8/lib/coremidi/device.rb:41:in `all'
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/gems/ffi-coremidi-0.1.8/lib/coremidi/endpoint.rb:52:in `all_by_type'
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/gems/unimidi-0.3.3/lib/unimidi/adapter/ffi-coremidi.rb:28:in `populate'
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/gems/unimidi-0.3.3/lib/unimidi/congruous_api_adapter.rb:143:in `ensure_initialized'
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/gems/unimidi-0.3.3/lib/unimidi/congruous_api_adapter.rb:110:in `all_by_type'
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/gems/unimidi-0.3.3/lib/unimidi/congruous_api_adapter.rb:249:in `all'
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/gems/unimidi-0.3.3/lib/unimidi/congruous_api_adapter.rb:55:in `list'
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/gems/unimidi-0.3.3/lib/unimidi.rb:26:in `command'
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/gems/unimidi-0.3.3/bin/unimidi:10:in `<top (required)>'
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/bin/unimidi:19:in `load'
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/bin/unimidi:19:in `<main>'
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/bin/ruby_noexec_wrapper:14:in `eval'
from /Users/pierrebaille/.rvm/gems/ruby-1.9.3-p327@first_gemset/bin/ruby_noexec_wrapper:14:in `<main>'

any help should be really appreciated...

Merry Christmas!

役に立ちましたか?

解決

I think thats a bug in ffi-coremidi, where it is not properly handling a NULL returned from CFStringGetCStringPtr() (see https://stackoverflow.com/a/9166500/186057).

e.g. It should have been doing:

name_ptr = FFI::MemoryPointer.new(:pointer)
Map::MIDIObjectGetStringProperty(@resource, prop, name_ptr)
name = name_ptr.read_pointer
len = Map::CF.CFStringGetMaximumSizeForEncoding(Map::CF.CFStringGetLength(name), :kCFStringEncodingUTF8)
bytes = FFI::MemoryPointer.new(len + 1)
raise RuntimeError.new("CFStringGetCString") unless Map::CF.CFStringGetCString(name, bytes, len, :kCFStringEncodingUTF8)
@name = bytes.read_string

If you want to apply the fix yourself, apply https://github.com/arirusso/ffi-coremidi/pull/2 and rebuild the ffi-coremidi gem.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top