The Media Kit Table of Contents | The Media Kit Index |
Derived from: virtual BMediaNode
Declared in: be/media/TimeSource.h
Library: libmedia.so
Allocation: Constructor only
BTimeSourceクラスは、nodeが従属することのできる時計を表現します。単一のmaster time sourceに全てのnodeを従属させることで、nodeはお互いに同期を保つことができます。
もしnodeが、そう設計されているかあるいは底にあるハードウェアの副産物として信頼できるタイミングサービスを提供できるなら、BBufferProducerやBBufferConsumerといった他のクラスが派生する元となるクラスから派生するのと同様に、BTimeSourceから派生することは意味をなします。
BTimeSourceが実際のオブジェクトとして実装されているため(そしてそれ故に純粋な抽象クラスではないため)、他のnodeはあなたのBTimeSourceのメンバ関数を直接呼び出しません—あなたのBTimeSourceが、他のnodeが読み込むデータを提供する場合は除きますが。
他のnodeに代用として使用されるBTimeSourceプロトコルのシステム実装には目に見えません。したがって、もしnodeの一つを(BTimeSourceから派生した)他のnodeのためのtime sourceにするためにBMediaRoster::SetTimeSource()を呼び出したら、他のnodeは、実際のBTimeSourceから派生するオブジェクトではなく、システムの代理のオブジェクトを見ることになります。
この抽象レイヤは、大事な目的に使用されます。この章で定義されるMedia Kitプロトコルの範疇を越えて、nodeがお互いに情報交換を行うことを防ぎたい、という要求を強化します。これが共通部分を減少させるため、この低レベルの相互依存のようなものが抑制されます。
まず混乱することですが、BTimeSourceとBBufferProducer(またはBBufferConsumer)の両方から派生するnodeは、バッファのproducerまたはconsumerであるのと同じくtime sourceであるがゆえに、二つの異った時間の概念を扱わなければならないということを心に留めて下さい。BTimeSourceとしては、real timeで要求を理解する必要があり、一方でBBufferProducerまたはBBufferConsumerとしてperformance timeで要求を受け入れる必要があります。
real timeは、system_time()またはBTimeSource::RealTime()関数によって報告される、実際の経過時間を参照します。これはマイクロ秒で計測されます。
performance timeは、real timeに直接関連する必要のない"time units"(単位時間)で動作します。あなたのコードが両方の種類の時間を扱わなければならないことから、必要があれば二つの時間システムを相互に変換しなければならないことに注意する必要があります。これを行うには、BTimeSource::RealTimeFor()を使用して下さい。
例えば、必要とするperformance timeと、その接続について評価されたlatencyを与えて時間の値を計算するには、下記のコードを使用して下さい :
bigtime_t timeout = TimeSource()->RealTimeFor(performance_time, estimated_latency) - TimeSource()->RealTime();
このコードは、performance_timeを稼働しているtime sourceの単位に変換し、それから現在のreal timeを減算します。これは、要求されたタイムアウトの値となります。
protected:
|
標準的なBTimeSourceのコンストラクタです。あなたは決して直接BTimeSourceのインスタンスを生成しないで下さい。その代わりに、BTimeSource(できれば他のBMediaNodeが派生しているクラスも同様に)から派生するnodeクラスを生成し、要求されたようにnodeのインスタンスを生成するためにBMediaRosterを使用して下さい。
|
(例えばseek処理が生じた時など)時間が突然ジャンプする時には必ず、時間が不連続な方法でジャンプしたことを従属する全てのnodeに通知するために、この関数を呼び出して下さい。もしあなたのtime sourceが派生する時間がジャンプするなら、この関数も呼び出して下さい。
atRealTimeによって指定されるreal timeに、performance timeはnewPerformanceTimeへと即座にジャンプします。
|
outLatencyに、そのtime sourceに従属しているnodeが始動をを行うのに必要な時間を含め、time sourceが始動するのに必要な時間の長さをマイクロ秒単位で返します。
RETURN CODES
B_OK. latencyの値は問題なく返された。
|
このtime sourceに対して最も最近発行された時間情報(time information)を返します。この情報は、driftの値と同じく、最後に発行されたタイムスタンプのperformance timeとreal timeを指定します。これは、下記の様により正確なreal timeを与えることによって得られる、現在の真実のperformance timeに手を加えるのに使用できます。
bigtime_t performanceTime; bigtime_t realTime; float drift; while (GetTime(&performanceTime, &realTime, &drift) != B_OK); performanceTime = performanceTime + (RealTime() - realTime) * drift;
しかし、結果として得られたperformanceTimeは、PerformanceTimeFor()を呼び出すことによって得られた値と同じものです。代りにPerformanceTimeFor()を使いましょう。
RETURN CODES
B_OK. 返された情報は正確である。
protected:
|
制御ポートから受け取ったメッセージを与えることで、この関数は適切なBTimeSourceのフック関数に、そのメッセージをディスパッチします。もしメッセージがフック関数に合致しなければ、適切なエラーが返されます。
もしnodeがBTimeSourceから派生しているなら、HandleMessage()は受け継いだ全ての型のHandleMessage()を呼び出すよう実装して下さい。
RETURN CODES
B_OK. メッセージはディスパッチされた。
|
もしBTimeSourceが現在、時間とともに進行しているならtrueを、停止していればfalseを返します。
|
Now()は、現在のperformance timeの近似値を返します。
PerformanceTimeFor()は、(BTimeSource::RealTime()によって返される)指定されたreal timeによって表されるperformance timeの推定値を返します。
performance timeを与えられることにより、RealTimeFor()は、与えられたlatencyによって調整され、real timeに対応する近似値を返します。
protected:
|
あなたのtime sourceが動作している間、real timeとperformance timeの間のマッピングを絶えずリフレッシュするために、あなたは繰り返しこの関数を呼び出さなければなりません。time sourceが停止している時は、この関数を、全ての引数をゼロにして一度だけ呼び出して下さい。
引数は以下の意味を持ちます。
driftの値は、中間の値の挿入を可能にします。例えば、もしビデオソースの再生が普通の速度で行われているとしたら、driftの値は、performance timeとreal timeが同じ比率で進行することを示す1.0となります。
しかしながら、もしムービーが半分の速度で再生されているとしたら、driftは、0.5となります。これにより、渡されるreal timeのひとつの単位ごとに、performance timeの半分だけが渡されることになります。この情報は、更新が生じた際に毎回time sourceを検索する必要なしに、時間を計算するのに使用されます。
(driftの値が大きく変化しなければ呼び出す頻度には変化が許されますが、1秒につき約20回呼び出すよう試みるべき)この関数によって提供されるデータは、あなたのnodeから他の世界が見ている情報に過ぎません。
|
全てのtime sourceが自分を計測するのに使用する、現在に於ける絶対的なreal timeを返します。この関数は、この値を得るために唯一信頼できる呼び出しです(Kernel Kitのsystem_time()は使用しないで下さい)。
|
protected:
|
seek要求を扱うために、この関数を実装して下さい。BTimeSourceのperformance timeが調整される際には、BTimeSourceは従属する全てのnodeにその変更を広く伝える必要があります。これを行うには、BroadcastTimeWarp()を呼び出して下さい。
必ず、少なくともひとつのseek要求を待ち行列に入れて下さい。そうすれば、seek処理を前もって要求しておくことができます。seek要求は、atRealTimeによって指定されるreal timeに生じます。
protected:
|
この関数は、指定されたmodeを、このnodeに従属する全てのnodeに伝達します。これによって、nodeは自分達のtime sourceの実行モードが変更されたことを知ることができます。この関数は、SetRunMode()によって呼び出されます。あなたのBTimeSourceの実装によっては、別の場所でそれを呼び出すことが意味をなしたり、なさなかったりするでしょう。
protected:
|
このフック関数は、誰かがあなたのnodeの実行モードを変更するよう要求した時に呼び出されます。必ず、BMediaNode::SetRunMode()またはBTimeSource::SetRunMode()のいずれかを通して呼び出して下さい。
modeの取りうる値は下記の通りです :
Constant | Description |
---|---|
BMediaNode::B_FREEWHEELING | もし演奏のタイムラグが起きたり演奏速度が速くなりすぎたとしても、データを正確に保持する。 |
BMediaNode::B_DECREASE_PRECISION | もし演奏がずれはじめたら、追いつくように試みる。 |
BMediaNode::B_INCREASE_LATENCY | もし演奏がずれはじめたら、再生の遅延を増やしてバッファの配送頻度を低下させる。 |
BMediaNode::B_DROP_DATA | もし演奏がずれはじめたら、データをスキップする。 |
|
指定された(performance timeで指定された)performanceTimeに、real timeに於て到達するまで待ちます。もしwithLatencyがゼロでなければ、SnoozeUntil()は指定されたperformance timeまで(real timeで)withLatencyマイクロ秒の間待ちます。これによって、なにか処理を開始するまでの間にセットアップする時間を持つことができます。
|
retrySignalsが(デフォルトの)falseである場合、もしperformanceTimeより以前に信号によって割り込まれたなら、SnoozeUntil()はB_INTERRUPTEDを返します。もしretrySignalsがtrueなら、この関数はすぐさまスリープ状態になり、実際にその時間が来るまで返りません。
RETURN CODES
B_OK. エラーなし。snoozeは問題なく完了した。
protected:
|
この関数は、誰かがBTimeSourceの動作を開始させようと考えた際に呼び出されます。引数realTimeは、time sourceが開始されるreal timeを示します。必要に応じて、要求を待ち行列に入れるようにこの関数を実装して下さい。
少なくとも一つの開始要求を、必ず待ち行列に入れて下さい。そうすることで、開始要求は前もって書類を提出しておくことが(処理を要求することが)できます。
|
protected:
|
Stop()は、誰かがBTimeSourceを停止させようと考えた際に呼び出されます。引数realTimeはtime sourceの動作が停止されるreal timeを示します。この要求を待ち行列に入れるよう、この関数を実装して下さい。
少なくとも一つの開始要求を、必ず待ち行列に入れて下さい。そうすることで、開始要求は前もって書類を提出しておくことが(処理を要求することが)できます。
|
|
この関数は、要求された行動を実行するために、BMediaRoster::Start()、BMediaRoster::Stop()及びBMediaRoster::Seek()関数によって呼び出されます。
あなたはこれらの要求を処理できるようにこの関数を実装しなければなりません。
もし要求が問題なく扱われれば、B_OKが返されます。そうでなければ、適切なエラーコードが返されます。
Declared in: <be/media/TimeSource.h>
Constant | Meaning |
---|---|
B_TIMESOURCE_START | time sourceを開始させる。 |
B_TIMESOURCE_STOP | time sourceを停止させる。 |
B_TIMESOURCE_STOP_IMMEDIATELY | time sourceを直ちに停止させる。 |
B_TIMESOURCE_SEEK | time sourceをseekする。 |
これらの定数は、TimeSourceOp()が扱うために呼び出される多様な処理を同定します。
Declared in: <be/media/TimeSource.h>
struct time_source_op_info { time_source_op op; int32 _reserved1; bigtime_t real_time; bigtime_t performance_time; int32 _reserved2[6]; };
これは、TimeSourceOp()への要求を記述しています。
The Media Kit Table of Contents | The Media Kit Index |
Copyright © 2000 Be, Inc. All rights reserved..