Clockの使い方を調べていたので、分かったところまでを書いておきます。オーディオデバイスとMIDIデータとの同期などに本来の威力を発揮するのでしょうが、MIDI関係はまだちゃんと調べていないので、とりあえず内部のクロックをソースにした簡単な動かし方といったところです。最初からいろいろ書くのはめんどくさいので、とりあえずサンプルコードからです。単純なストップウォッチです。//CAClockを作成する。//同期モードを設定。//クロックのソースを設定する。dealloc];}@endCocoaアプリケーションを新規作成して、AudioToolbox.Frameworkを追加し、このサンプルコードのCAClockTestクラスも作成してください。それからInterfaceBuilderでCAClockTestをインスタンス化して、ボタンを3つ作ってIBActionの「start」「stop」「reset」につなげ、テキストフィールドを作ってIBOutletの「textField」からつなげます。実行すると、秒数とタイムコードをテキストフィールドに表示するストップウォッチとして動作するはずです。startで再生、stopで停止、resetで0に戻ります。コードを見ていきますと、awakeFromNib内でCAClockの作成や設定を行っています。CAClockNew関数でCAClockRefを作成して、CAClockSetProperty関数でパラメータを設定しています。設定している値はみんなデフォルトですが一応サンプルってことであえて設定してみています。freeTimerメソッドではCAClockDispose関数でCAClockRefを解放しています。clockのに同期して動かすかを選べるようです。UnitかAudioDeviceかを選べます(それぞれ試してみましたが、AudioDeviceはなぜかエラーが出て使えませんでした)。SMPTEFormatは、秒数単位のタイムをタイムコードに変換する際のフォーマットを選びます。awakeFromNib内最後のCAClockAddListenerは、CAClockの状態が変更された時にその情報を受け取る関数を設定します。今回はClockListenerという関数を設定しています。Audioのコールバックではめずらしくメインスレッドで呼ばれています。メソッドを移りまして、checkTimeがCAClockから現在のタイムを取得してテキストフィールドに表示するメソッドで、start:とstop:とreset:がCAClockを操作するメソッドになりますが、使われる関数名そのまんまに意味を受け取ると、CAClockはちょっとハマってしまいます。ひとつひとつ関数を見て行きます。CAClockSetCurrentTime関数でタイムを設定すると、「カレントタイム」というよりは、次回スタートさせる時の開始時間である「スタートタイム」が設定されます。reset:メソッドの中で、再生中のときは一旦停止させている事から分かると思いますが、この関数で設定できるのは停止中だけです。CAClockStart関数は、その「スタートタイム」から再生が開始されます。再生中に再びCAClockStart関数を呼ぶとまた「スタートタイム」から開始されます。CAClockGetCurrentTime関数は、最後にCAClockStart関数が呼びだされた時の「スタートタイム」から現在までの時間『カレントタイム」を返します。CAClockStop関数は、現在のタイムを「スタートタイム」に設定して、CAClockを停止状態にします。CAClockStop関数を呼び出して停止状態にした後にCAClockGetCurrentTime関数を呼び出すと、停止されていないかのように時間が進み続けた状態の値が取得されますので、checkTimeメソッドでは停止中の場合はCAClockGetStartTimeで「スタートタイム」を取得するようにしています。まとめると、CAClockの中には次回のスタート時間である「スタートタイム」と、「再生中か」と、最後にスタートさせたときの「スタート時のクロックソースのタイム」だけが保持されていて、「カレントタイム」は取得の都度「スタート時のクロックソースのタイム」と「スタートタイム」を基準に、現在のクロックソースのタイムとの差から算出されるといった感じになります。あと今回のように再生や停止などを自分で操作している場合は意味が無かったかもしれませんが、ClockListener関数内でCAClockの「スタート」と「ストップ」と「スタートタイム変更」を受け取って実際に処理を行うようにしてあります。コメントをキャンセルメールアドレスが公開されることはありません。