haiku/src/servers/media/BufferManager.cpp
Ingo Weinhold 77763004e0 Fixed include.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@53 a95241bf-73f2-0310-859d-f6bbb57e9c96
2002-07-10 19:59:20 +00:00

150 lines
3.9 KiB
C++

#include <MediaDefs.h>
#include <Autolock.h>
#include "BufferManager.h"
#include "SharedBufferList.h"
#include "debug.h"
BufferManager::BufferManager()
{
fSharedBufferList = _shared_buffer_list::Clone();
fAreaId = area_for(fSharedBufferList);
fBufferList = NULL;
fLocker = new BLocker("buffer manager locker");
fNextBufferId = 1;
}
BufferManager::~BufferManager()
{
fSharedBufferList->Unmap();
delete fLocker;
}
area_id
BufferManager::SharedBufferListID()
{
return fAreaId;
}
status_t
BufferManager::RegisterBuffer(team_id teamid, media_buffer_id bufferid,
size_t *size, int32 *flags, size_t *offset, area_id *area)
{
BAutolock lock(fLocker);
TRACE("RegisterBuffer team = 0x%08x, bufferid = 0x%08x\n",(int)teamid,(int)bufferid);
_buffer_list *list;
_team_list *team;
for (list = fBufferList; list; list = list->next)
if (list->id == bufferid) {
team = new _team_list;
team->team = teamid;
team->next = list->teams;
list->teams = team;
*area = list->area;
*offset = list->offset;
*size = list->size,
*flags = list->flags;
PrintToStream();
return B_OK;
}
TRACE("failed to register buffer! team = 0x%08x, bufferid = 0x%08x\n",(int)teamid,(int)bufferid);
PrintToStream();
return B_ERROR;
}
status_t
BufferManager::RegisterBuffer(team_id teamid, size_t size, int32 flags, size_t offset, area_id area,
media_buffer_id *bufferid)
{
BAutolock lock(fLocker);
TRACE("RegisterBuffer team = 0x%08x, areaid = 0x%08x, offset = 0x%08x, size = 0x%08x\n",(int)teamid,(int)area,(int)offset,(int)size);
void *adr;
area_id newarea;
newarea = clone_area("media_server buffer",&adr,B_ANY_ADDRESS,B_READ_AREA | B_WRITE_AREA,area);
if (newarea <= B_OK) {
TRACE("failed to clone buffer! team = 0x%08x, areaid = 0x%08x, offset = 0x%08x, size = 0x%08x\n",(int)teamid,(int)area,(int)offset,(int)size);
return B_ERROR;
}
*bufferid = fNextBufferId;
_buffer_list *list;
list = new _buffer_list;
list->next = fBufferList;
list->id = fNextBufferId;
list->area = newarea;
list->offset = offset;
list->size = size;
list->flags = flags;
list->teams = new _team_list;
list->teams->next = NULL;
list->teams->team = teamid;
fBufferList = list;
fNextBufferId++;
PrintToStream();
return B_OK;
}
status_t
BufferManager::UnregisterBuffer(team_id teamid, media_buffer_id bufferid)
{
BAutolock lock(fLocker);
TRACE("UnregisterBuffer team = 0x%08x bufferid = 0x%08x\n",(int)teamid,(int)bufferid);
_buffer_list **nextlist;
_team_list **nextteam;
for (nextlist = &fBufferList; (*nextlist); nextlist = &((*nextlist)->next)) {
if ((*nextlist)->id == bufferid) {
for (nextteam = &((*nextlist)->teams); (*nextteam); nextteam = &((*nextteam)->next)) {
if ((*nextteam)->team == teamid) {
_team_list *temp;
temp = *nextteam;
*nextteam = (*nextteam)->next;
delete temp;
TRACE("team = 0x%08x removed from bufferid = 0x%08x\n",(int)teamid,(int)bufferid);
PrintToStream();
break;
}
}
if ((*nextlist)->teams == NULL) {
_buffer_list *temp;
temp = *nextlist;
*nextlist = (*nextlist)->next;
delete_area(temp->area);
delete temp;
TRACE("bufferid = 0x%08x removed\n",(int)bufferid);
PrintToStream();
}
return B_OK;
}
}
PrintToStream();
TRACE("failed to unregister buffer! team = 0x%08x, bufferid = 0x%08x\n",(int)teamid,(int)bufferid);
return B_ERROR;
}
void
BufferManager::PrintToStream()
{
return;
BAutolock lock(fLocker);
_buffer_list *list;
_team_list *team;
printf("Buffer list:\n");
for (list = fBufferList; list; list = list->next) {
printf(" bufferid = 0x%08x, areaid = 0x%08x, offset = 0x%08x, size = 0x%08x, flags = 0x%08x, next = 0x%08x\n",
(int)list->id,(int)list->area,(int)list->offset,(int)list->size,(int)list->flags,(int)list->next);
for (team = list->teams; team; team = team->next)
printf(" team = 0x%08x, next = 0x%08x =>",(int)team->team,(int)team->next);
printf("\n");
}
}