QuartzComposer の Patch には、Signal という 一瞬だけ True になったあとまたすぐ False になるような Port をもつものがあります。たとえば、StopWatch とか、Counterとか。
では、どのようにして CustomPatch で Signal を生成すればよいか、いろいろ試行錯誤してみたので、メモを残しておきます。
Port
@interface SomePatch : QCPatch { QCBooleanPort *outputSignal; .... }
のように、Boolean な Port を宣言しておきます。
Configuration
まず、CustomPatch の timeMode を 1 にして、常に Patch が実行されるようにしておきます。
+ (int)timeMode { return 1; }
としておけばよいでしょう。
ここらへんの詳細については、QCPatch Configuration に書かれてあります。
Signal を発生させる
1〜2回、execute が実行される間に outputSignal の値が True になっていれば、Signal が発生したとみなされるようです。
- (BOOL)execute:(id)fp8 time:(double)fp12 arguments:(id)fp20 { static int count = 0; // signal hack if (TRUE == [outputSignal booleanValue]) { if (1 == count++) { [outputSignal setBooleanValue:FALSE]; count = 0; } } return YES; }
みたいにしました。[outputSignal setBooleanValue:TRUE] にするのは、どこか別のスレッドにてやっています。
まとめ
俺Patchで Signal が送れるようになれば、データが変わったタイミングを後段のPatchに伝えることができて、なにかと使えそうです。RSS Feed Patch や、Image Downloader も、FeedやImageのダウンロードが終わったタイミングをSignalで通知しているわけで。
おまけ
QuartzComposer の CustomPatch をデバッグするには、NSLog が便利です。 というか、つくった Patch は plugin 形式なので、いつものようにデバッガを直接起動することができないので。
NSLogのログは、 /Library/Logs/Console/”自分の uid”/console.log に出力されるので、tail -f などとして眺めるとグッドです。
日本語
English