Daily Archive for July 5th, 2007

QuartzComposer の CustomPatch で Signal を生成する方法

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 などとして眺めるとグッドです。