The Media Kit Table of Contents | The Media Kit Index |
Derived from: none
Declared in: be/media/BufferGroup.h
Library: libmedia.so
Allocation: Constructor only
BBufferGroupは、複数のBBufferの貯蔵庫として働き、データを送信する際にはそれらのバッファを他のnodeに渡すために使用することができます。BBufferGroupはまた、バッファがそのdestination(目的地)に送られる前に産生したデータを入れておくBBufferを取得するために、BBufferProducerが使用します。
単純な呼び出しにより、新しいBBufferGroupを生成することができます :
new BBufferGroup;
もし必要なバッファがどういうもので、その数がいくつであるかを記述するいくつかの引数を与えたら、そのグループはまさしくBBufferを生成してくれます。これは、BBufferProducerサブクラスのコンストラクタ中でBBufferGroupを使用する一般的な方法です。あなたは、準備が完了し、データの送信を開始する時を待つばかりのバッファがそこにあることを知るでしょう。例外は、もしnodeが、単に受け取ったバッファを処理して次に渡すだけのフィルタである場合です。
BBufferGroupのインスタンスは、Recycle()関数が呼び出されたBBufferを再請求するスレッドを動作させます。もしグループが一時的にフリーなバッファを失った場合、バッファへの要求は、バッファが一つ使用できるようになるまで、あるいは要求が生成された際に制限時間が指定されていれば、要求が時間切れになるまでブロックされるでしょう。
もしビデオの処理を行っているなら、バッファをBBitmapにしたいでしょう。ここでは、それをどうやって達成するかを説明します :
BBufferGroup *my_group = new BBufferGroup; BBitmap *my_bitmap = new BBitmap(BRect(0,0,639,479), B_BITMAP_IS_AREA, B_RGB32, 640*4); if (!my_bitmap->IsValid()) { return B_ERROR; } area_info bm_info; if (get_area_info(my_bitmap->Area(), &bm_info) != B_OK) { return B_ERROR; } buffer_clone_info bc_info; bc_info.area = bm_info.area; bc_info.offset = ((char *) my_bitmap->Bits())-((char *) bm_info.address); bc_info.size = my_bitmap->BitsLength(); BBuffer *out_buffer = NULL; status_t err = my_group->AddBuffer(bc_info, &out_buffer); /* out_buffer is now set to use the BBitmap's memory */
このコードは、ビットマップを生成するときに、B_BITMAP_IS_AREAフラグを設定できる利点があります。これはビットマップに対して、まさにそれ自身のメモリ領域に置かれるように強制します。これ以後、BBufferを作成する際にこれを使用することができます。
もしBBufferにリアルタイムなアクセスを行う必要があれば、それをロックして下さい。加えて、もしDMAを使用するのであれば、バッファに対して近接(contiguous)するように指定する必要があります(これは、BBitmapコンストラクタのcontiguousフラグで指定できます)。
|
|
コンストラクタの最初の形式では、すでにグループによって領域確保されたBBufferの数を用いてBBufferGroupを生成します。これらのバッファは、グループによって領域確保され、すべて単一のKernel Kit領域に生息しています。グループは、引数 placement及びlockによって指定される属性によって、指定されたsizeのnumBuffers個のバッファを内包するのに十分な領域を確保しようと試みます(領域には詰め物が追加されるでしょう)。
コンストラクタの2番目の形式では、BBufferGroupは生成されますが、そのためのバッファは全く生成されません。使用する前に、BBufferをそのグループに追加して下さい。
コンストラクタの3番目の形式では、指定されたバッファのリストを内包するBBufferGroupが生成されます。bufferListにはグループによって制御されるバッファのバッファIDの配列のポインタが指定され、numBuffersにはリスト中のバッファの数が指定されます。この種類のコンストラクタは、それほど頻繁に使用されるものではありません。
新しいBBufferGroupからのバッファを使用する前に、グループを作成する際になんらかのエラーが生じていないか確認するためにInitCheck()を呼び出して下さい。
|
それが制御するBBufferも含め、BBufferGroupによって使用される全てのメモリを解放します。
AddBuffer()がバッファ領域を複製するということを覚えておいて下さい。このデストラクタは複製を解放しますが、あなたが追加したオリジナルの領域を解放するのはあなたのアプリケーションの仕事です。
|
|
buffer_clone_infoを与えることで、この関数はバッファを複製し、その複製をBBufferGroupに追加します。普段は、あなた自身がbuffer_clone_info構造体を構築して下さい。
このバッファは複製であることから、それを使用しなくなった時、buffer_clone_info構造体で指定されるメモリ領域をあなたの手で削除する必要があります。BBufferGroupは、それを行ってはくれません。
|
RETURN CODES
B_OK. バッファをグループに追加する際にエラーが生じなかった。
|
グループのバッファを指定されたmessageに追加し、指定されたnameの配列にそれらを保存します。もしneedLockがtrueなら、BBufferGroupは処理を行う前にロックされ、それが完了したらロックを解除されます。そうでなければ、AddBuffersTo()が呼び出されている間にバッファがどこかに行ってしまわないように保証する必要があります。
バッファはID番号によって追加されます。番号はint32のフォーマットです。
RETURN CODES
B_OK. メッセージにバッファを追加する際にエラーは生じなかった。
|
outBufferCountに、グループのバッファの数を返します。
RETURN CODES
B_OK. バッファ数は問題なく返された。
|
グループ内の全てのバッファのリストを返します。GetBufferList()を呼び出す時、outBuffersにグループのバッファへのポインタを収めたいBBufferポインタの配列へのポインタを渡して下さい。そしてlistCountに配列の要素の数を指定して下さい。
RETURN CODES
B_OK. エラーなし。
|
BBufferGroupのコンストラクトの結果のエラーコードを返します。
RETURN CODES
B_OK. 新しいグループが問題なく作成された。
|
もし他のBBufferProducerにバッファグループを渡しても、BMediaRoster::SetOutputBuffers()呼び出しでwillReclaimにtrueを渡したら、後でReclaim()を呼び出せばBBufferGroupにバッファを再請求できます。
ReclaimAllBuffers()は、全てのバッファを補足できた時はB_OKを返しますが、バッファが再請求できなければエラーを返します。
もし(BBitmapの様に)消え去ってしまうオブジェクトを参照するバッファがあれば、オブジェクトが消えてしまう前に、グループのReclaimAllBuffers()を呼び出してBBufferGroupを削除して下さい。
|
RETURN CODES
B_OK. 全てのバッファは問題なく再請求された。
|
最低でもBBufferProducerサブクラスがデータを入れることのできる指定されたsizeのBBufferへのポインタを返し、その後media_destinationに渡します。もし適切なバッファが使用可能でなければ、この呼び出しはバッファが使用可能になるか(この場合はバッファが返されることによって)、あるいは指定されたtimeoutに到達するまでブロックされるでしょう。
もし0より小さいtimeout値を渡したら、使用できるバッファがない場合、RequestBuffer()は直ちにNULLを返します。そうでなければ、使用できるバッファへのポインタを返します。
|
RequestBuffer()は、バッファフラグを使用しません。その代わりに、例えばBBuffer::Flags()またはBBuffer::Size()によって返された値を元にして、あなたの要求した特定のバッファを探すために、BBufferGroupの中のバッファを見ることができます。特定のバッファを得るためには、RequestBuffer()の2番目の形式を使用して下さい。
最初の形式のRequestBuffer()は、もしバッファが得られなければNULLを返し、errno(訳不能)に適切なエラーコードを返します。2番目の形式では、適切なエラーコードが返されます。
|
RETURN CODES
B_OK. エラーなし。
|
最後に起こったRequestBuffer()エラーを返します。これはRequestBuffer()がNULLを返したときに便利です。
|
現在処理中のバッファ再請求が終了するまで待ち、その後返ります。もしバッファの再請求が処理中でなければ、直ちに返ります。
RETURN CODES
B_OK. エラーなし。
The Media Kit Table of Contents | The Media Kit Index |
Copyright © 2000 Be, Inc. All rights reserved..