1

RubyMotion プロジェクトで CoreMIDI を使用しようとしています。コードの簡単な例を次に示します。

clientName = "Client"
clientRef = Pointer.new(:uint)
MIDIClientCreate( clientName, nil, nil, clientRef )

次の要点で、より詳細なコードとバックトレースを参照してください: https://gist.github.com/4299810

そのコードにより、次のエラーが発生します。

(メイン)> 2012-12-15 14:43:27.410 core-midi-test[42560:c07] app_delegate.rb:5:in application:didFinishLaunchingWithOptions:': expected instance of Pointer of type^{OpaqueMIDIClient}'、取得したI' (TypeError) 2012-12-15 14:43:27.412 core-midi-test[42560:c07] *** Terminating app due to uncaught exception 'TypeError', reason: 'app_delegate.rb:5:inアプリケーション:didFinishLaunchingWithOptions:': タイプのポインターの予想されるインスタンス^{OpaqueMIDIClient}', got私' (TypeError)'

エラーは、明らかに MIDIClientCreate の 4 番目の引数にあります。MIDIClientCreate ショーのドキュメント:

OSStatus MIDIClientCreate (
   CFStringRef     name,
   MIDINotifyProc  notifyProc,
   void            *notifyRefCon,
   MIDIClientRef   *outClient
);

MIDIClientRef は、UInt32 として定義されている MIDIObjectRef から派生しているため、RubyMotion で使用するには Pointer.new(:uint) が正しい型であると確信しています。

以下は、RubyMotion が使用している CoreMIDI.bridgesupport ファイルの関連部分です。

<function name='MIDIClientCreate'>
  <arg name='name' type='^{__CFString=}' declared_type='CFStringRef'/>
    <arg name='notifyProc' function_pointer='true' type='^?' declared_type='MIDINotifyProc'>
        <arg type='^{MIDINotification=iI}' declared_type='MIDINotification*' const='true'/>
        <arg type='^v' declared_type='void*'/>
        <retval type='v' declared_type='void'/>
    </arg>
    <arg name='notifyRefCon' type='^v' declared_type='void*'/>
    <arg name='outClient' type='^^{OpaqueMIDIClient}' declared_type='MIDIClientRef*'/>
    <retval type='l' declared_type='OSStatus'/>
</function>

私が知る限り、bridgesupport の定義には、適切な変換を行うために必要な配管が含まれている必要があります。しかし、それはもちろん機能していません。

コードに何か問題がありますか、それとも RubyMotion に含まれている CoreMIDI.bridgesupport ファイルに何か問題がありますか?

4

1 に答える 1

2

MacRuby のドキュメントを読んで、目的のポインター型を Pointer コンストラクターに次のように明示的に渡すことができることがわかりました。

clientName = "Client"
clientRef = Pointer.new(MIDIClientRef.type)
MIDIClientCreate( clientName, nil, nil, clientRef )

portName = "Output"
outport = Pointer.new(MIDIPortRef.type)
MIDIOutputPortCreate( clientRef[0], portName, outport )
于 2012-12-16T05:36:43.127 に答える