Objective-C ++のObjective-Cに翻訳します
-
09-10-2019 - |
質問
私はこのコードを.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を正確に呼びます。