A BBufferGroup
serves as a repository for
BBuffer
s,
and can be used to
pass those buffers to another node for its use when sending data. It must
also be used by your
BBufferProducer
to acquire
BBuffer
s to put data that
you produce into before you send the buffer on to its destination.
You can create a new
BBufferGroup
by simply calling:
new BBufferGroup
;
If you pass in some arguments describing what sort of buffers you want,
and how many of them, the group will even create the
BBuffer
s for you. This is how you'll usually use
BBufferGroup
,
from within your
BBufferProducer
subclass' constructor so you'll know there are buffers
ready and waiting when it's time to start sending data. A possible
exception is if your node is a filter that simply processes buffers it
receives and passes them along.
A BBufferGroup
instance runs a thread that reclaims
BBuffer
s whose
Recycle()
function has been called. If the group is temporarily out of
free buffers, a request for a buffer may block until one is available, or
until the request times out, if a timeout is specified when the request
is made.
If you're doing video processing, you might want your buffers to be
BBitmap
s.
Here's how you can accomplish this:
BBufferGroup *my_group
= newBBufferGroup
; BBitmap *my_bitmap
= newBBitmap
(BRect
(0,0,639,479),B_BITMAP_IS_AREA
,B_RGB32
, 640*4); if (!my_bitmap
->IsValid
()) { returnB_ERROR
; } area_infobm_info
; if (get_area_info
(my_bitmap
->Area
(), &bm_info
) !=B_OK
) { returnB_ERROR
; } buffer_clone_infobc_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_terr
=my_group
->AddBuffer
(bc_info
, &out_buffer
); /* out_buffer is now set to use the BBitmap's memory */
This code takes advantage of the B_BITMAP_IS_AREA
flag when creating the
bitmap. This forces the bitmap to be in a memory area of its very own,
which you can then use when creating the
BBuffer
.
If you need to do real-time accesses to the
BBuffer
, you should lock it
down. In addition, if you use DMA, you'll need to specify for the buffer
to be contiguous (you can do this using the
BBitmap
constructor, specifying the contiguous flag).
Before deleting any
BBitmap
s
used in this way, be sure the buffer group has been deleted first and (if
SetOutputBuffersFor()
has been used) all buffers have been reclaimed.