質問

私はこのコードを.mmに持っています

void MyMIDINotifyProc(const MIDINotification *message, void *refCon);

これはこの行に合っています

MIDIClientCreate((CFStringRef)@"MidiMonitor MIDI Client", MyMIDINotifyProc, self, &client);

そして、myMidinotifyProcがCoremidiから呼び出されます。

ファイル拡張子を.mに変更せずに、OBJ-Cの署名に翻訳しました。

@interface MidiInput (Private) 
    -(void) MyMIDINotifyProc:(const MIDINotification *)message reference:(void *)refCon;
@end

どのコンパイルされますが、それから私は何をすべきか分かりません MIDIClientCreate ライン。現状では、生成されます "MyMIDINotifyProc" was not declared in this scope. 。タイプのはずです void *...そしてドキュメントはそれが A refCon passed back to notifyRefCon (リンク).

この問題は、OBJ-Cだけで解決できますか? C ++のものをCに翻訳する必要があると思います。その場合、私はそれをそのままにしておくだけです。

役に立ちましたか?

解決

MIDIClientCreate 通常のC機能がコールバックとして期待されます。通話規則が異なるため、Objective-Cメソッドに合格することはできません(C用語では、ObjectIve-Cメソッドの最初の2つのパラメーターは self_cmd - セレクター - 通常のC機能のためにはありません)。

これを回避する通常の方法は、シムとして機能するC関数を作成し、パラメーターとして明示的に自己を渡すことです。 Shim関数はすぐにObjective-Cメッセージを送信します。私はこのライブラリに精通していませんが、 refCon まさにこの種のために設計されたパラメーターです。だからあなたの中で .m ファイルこのような関数が必要です。

static void MyMIDINotifyProc(const MIDINotification *message, void *refCon)
{
    [(id) refCon MIDINotify: message];
}

また、実際のことをする方法も必要です。

-(void) MIDINotify: (const MIDINotification*) message
{
    // do stuff
}

そして、あなたは最初にやっていたようにMidiclientCreateを正確に呼びます。

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