[haiku-commits] r34500 - in haiku/trunk: headers/os/media headers/private/media src/kits/media src/servers/media src/servers/media_addon
- From: axeld@xxxxxxxxxxxxxxxx
- To: haiku-commits@xxxxxxxxxxxxx
- Date: Sat, 5 Dec 2009 12:11:28 +0100 (CET)
Author: axeld
Date: 2009-12-05 12:11:28 +0100 (Sat, 05 Dec 2009)
New Revision: 34500
Changeset: http://dev.haiku-os.org/changeset/34500/haiku
Ticket: http://dev.haiku-os.org/ticket/4954
Added:
haiku/trunk/headers/private/media/ServerInterface.h
haiku/trunk/src/kits/media/BufferCache.cpp
haiku/trunk/src/kits/media/BufferCache.h
Removed:
haiku/trunk/src/kits/media/BufferIdCache.cpp
haiku/trunk/src/kits/media/BufferIdCache.h
haiku/trunk/src/servers/media/ServerInterface.h
Modified:
haiku/trunk/headers/os/media/Buffer.h
haiku/trunk/headers/os/media/BufferConsumer.h
haiku/trunk/headers/os/media/BufferGroup.h
haiku/trunk/headers/private/media/DataExchange.h
haiku/trunk/headers/private/media/Notifications.h
haiku/trunk/headers/private/media/PortPool.h
haiku/trunk/headers/private/media/SharedBufferList.h
haiku/trunk/src/kits/media/Buffer.cpp
haiku/trunk/src/kits/media/BufferConsumer.cpp
haiku/trunk/src/kits/media/BufferGroup.cpp
haiku/trunk/src/kits/media/DataExchange.cpp
haiku/trunk/src/kits/media/DormantNodeManager.cpp
haiku/trunk/src/kits/media/Jamfile
haiku/trunk/src/kits/media/MediaAddOn.cpp
haiku/trunk/src/kits/media/MediaRoster.cpp
haiku/trunk/src/kits/media/Notifications.cpp
haiku/trunk/src/kits/media/SharedBufferList.cpp
haiku/trunk/src/servers/media/BufferManager.cpp
haiku/trunk/src/servers/media/BufferManager.h
haiku/trunk/src/servers/media/DefaultManager.cpp
haiku/trunk/src/servers/media/NodeManager.cpp
haiku/trunk/src/servers/media/NodeManager.h
haiku/trunk/src/servers/media/media_server.cpp
haiku/trunk/src/servers/media_addon/Jamfile
haiku/trunk/src/servers/media_addon/main.cpp
Log:
Sorry for this large commit in advance; it's not really possible to divide this
into smaller parts:
media_addon_server:
* Removed (broken) use of (broken and inefficient) home-brewn Map, and List
classes. This also fixes a crash on shutdown when used with the malloc_debug
implementation. It's using stl::vector, and stl::map now instead.
_shared_buffer_list:
* Renamed _shared_buffer_list to SharedBufferList, and put it into the BPrivate
namespace. Also, made a class out of it.
* Separated shared buffer list creation from cloning.
* Enlarged maximum number of buffers to something that is not that evil, but
actually uses the space it has (ie. is a useful multiple of
shared_buffer_info that fills a multiple of B_PAGE_SIZE as much as possible).
* No longer drops into the debugger if the
* The list that is currently used is very inefficient for the features it
provides though (no change there).
_buffer_id_cache:
* Renamed to BufferCache, and put it into the private namespace
* It now deletes its buffers on deletion; since the BBufferConsumer will be
gone, too, at this point, there is little chance that there are still buffers
in use.
* Also, it's now using std::map instead of the (see above) Map class.
BBuffer:
* Got rid of the fBufferID member.
Misc.:
* Got rid of the global "team" variable; the media kit is now using the
private app kit's current_team() now.
* Added a lot of missing error checks (mostly memory allocations).
* Renamed fields like "flavorid" to flavor_id, renamed "dfi_*" fields to
something more detailed.
* Moved ServerInterface.h from src/servers/media/ to headers/private/media.
* Notifications.h was not self contained.
* Added missing licenses.
* Lots of cleanups, and coding style fixes.
What this doesn't fix:
* Bug #4954 which started all this (this comes next, though)
* Deinitialization is broken, as the PortPool is uninitialized too early, and
still used afterwards.
* The strange add-on monitoring code in the media_addon_server
Modified: haiku/trunk/headers/os/media/Buffer.h
===================================================================
--- haiku/trunk/headers/os/media/Buffer.h 2009-12-05 10:46:49 UTC (rev
34499)
+++ haiku/trunk/headers/os/media/Buffer.h 2009-12-05 11:11:28 UTC (rev
34500)
@@ -9,7 +9,10 @@
#include <MediaDefs.h>
-struct _shared_buffer_list;
+namespace BPrivate {
+ class BufferCache;
+ class SharedBufferList;
+}
struct buffer_clone_info {
@@ -54,8 +57,8 @@
size_t Size();
private:
- friend struct _buffer_id_cache;
- friend struct _shared_buffer_list;
+ friend class BPrivate::BufferCache;
+ friend class BPrivate::SharedBufferList;
friend class BMediaRoster;
friend class BBufferProducer;
friend class BBufferConsumer;
@@ -73,15 +76,14 @@
void SetHeader(const
media_header* header);
media_header fMediaHeader;
- _shared_buffer_list* fBufferList;
+ BPrivate::SharedBufferList* fBufferList;
area_id fArea;
void* fData;
size_t fOffset;
size_t fSize;
- media_buffer_id fBufferID;
int32 fFlags;
- uint32 _reserved[11];
+ uint32 _reserved[12];
};
Modified: haiku/trunk/headers/os/media/BufferConsumer.h
===================================================================
--- haiku/trunk/headers/os/media/BufferConsumer.h 2009-12-05 10:46:49 UTC
(rev 34499)
+++ haiku/trunk/headers/os/media/BufferConsumer.h 2009-12-05 11:11:28 UTC
(rev 34500)
@@ -13,9 +13,9 @@
class BBuffer;
class BBufferGroup;
class BRegion;
-class _buffer_id_cache;
namespace BPrivate {
+ class BufferCache;
namespace media {
class BMediaRosterEx;
}
@@ -147,7 +147,7 @@
private:
media_type fConsumerType;
- _buffer_id_cache* fBufferCache;
+ BPrivate::BufferCache* fBufferCache;
BBufferGroup* fDeleteBufferGroup;
uint32 _reserved[14];
};
Modified: haiku/trunk/headers/os/media/BufferGroup.h
===================================================================
--- haiku/trunk/headers/os/media/BufferGroup.h 2009-12-05 10:46:49 UTC (rev
34499)
+++ haiku/trunk/headers/os/media/BufferGroup.h 2009-12-05 11:11:28 UTC (rev
34500)
@@ -10,7 +10,9 @@
class BBuffer;
-struct _shared_buffer_list;
+namespace BPrivate {
+ struct SharedBufferList;
+}
class BBufferGroup {
@@ -53,12 +55,12 @@
status_t _Init();
private:
- friend struct _shared_buffer_list;
+ friend struct BPrivate::SharedBufferList;
status_t fInitError;
status_t fRequestError;
int32 fBufferCount;
- _shared_buffer_list* fBufferList;
+ BPrivate::SharedBufferList* fBufferList;
sem_id fReclaimSem;
uint32 _reserved[9];
Modified: haiku/trunk/headers/private/media/DataExchange.h
===================================================================
--- haiku/trunk/headers/private/media/DataExchange.h 2009-12-05 10:46:49 UTC
(rev 34499)
+++ haiku/trunk/headers/private/media/DataExchange.h 2009-12-05 11:11:28 UTC
(rev 34500)
@@ -286,8 +286,8 @@
};
struct addonserver_instantiate_dormant_node_request : request_data {
- media_addon_id addonid;
- int32 flavorid;
+ media_addon_id addon_id;
+ int32 flavor_id;
team_id creator_team;
};
@@ -605,8 +605,8 @@
};
struct server_change_addon_flavor_instances_count_request : request_data {
- media_addon_id addonid;
- int32 flavorid;
+ media_addon_id addon_id;
+ int32 flavor_id;
int32 delta; // must be +1 or -1
team_id team;
};
@@ -624,17 +624,17 @@
};
struct server_register_node_reply : reply_data {
- media_node_id nodeid;
+ media_node_id node_id;
};
struct server_unregister_node_request : request_data {
- media_node_id nodeid;
+ media_node_id node_id;
team_id team;
};
struct server_unregister_node_reply : reply_data {
- media_addon_id addonid;
- int32 flavorid;
+ media_addon_id addon_id;
+ int32 flavor_id;
};
struct server_get_live_node_info_request : request_data {
@@ -669,11 +669,11 @@
};
struct server_node_id_for_reply : reply_data {
- media_node_id nodeid;
+ media_node_id node_id;
};
struct server_get_node_for_request : request_data {
- media_node_id nodeid;
+ media_node_id node_id;
team_id team;
};
@@ -713,7 +713,7 @@
};
struct addonserver_rescan_mediaaddon_flavors_command : command_data {
- media_addon_id addonid;
+ media_addon_id addon_id;
};
struct addonserver_rescan_finished_notify_command : command_data {
@@ -724,15 +724,15 @@
};
struct server_register_mediaaddon_reply : reply_data {
- media_addon_id addonid;
+ media_addon_id addon_id;
};
struct server_unregister_mediaaddon_command : command_data {
- media_addon_id addonid;
+ media_addon_id addon_id;
};
struct server_get_mediaaddon_ref_request : request_data {
- media_addon_id addonid;
+ media_addon_id addon_id;
};
struct server_get_mediaaddon_ref_reply : reply_data {
@@ -757,7 +757,7 @@
struct server_unregister_buffer_command : command_data {
team_id team;
- media_buffer_id bufferid;
+ media_buffer_id buffer_id;
};
struct server_rewindtypes_request : request_data {
Modified: haiku/trunk/headers/private/media/Notifications.h
===================================================================
--- haiku/trunk/headers/private/media/Notifications.h 2009-12-05 10:46:49 UTC
(rev 34499)
+++ haiku/trunk/headers/private/media/Notifications.h 2009-12-05 11:11:28 UTC
(rev 34500)
@@ -1,11 +1,14 @@
-/*
+/*
* Copyright 2002, Marcus Overhagen. All rights reserved.
* Distributed under the terms of the MIT License.
*/
-
#ifndef _NOTIFICATIONS_H
#define _NOTIFICATIONS_H
+
+#include <MediaNode.h>
+
+
namespace BPrivate {
namespace media {
namespace notifications {
@@ -15,7 +18,7 @@
* The notifications marked with "N" are only send when the
* media_node specific BMediaRoster::StartWatching() is used
* and the notification belongs to the watched node.
- *
+ *
* In addition, anyone watching a specific node will also receive
* error notifications generated by BMediaNode::ReportError()
*
@@ -35,13 +38,13 @@
* B_MEDIA_NODE_STOPPED N "node", "when"
* B_MEDIA_FLAVORS_CHANGED "be:addon_id",
"be:new_count", "be:gone_count"
*/
-
+
// used for BMediaRoster::StartWatching() parameter validation
bool IsValidNotificationRequest(bool node_specific, int32 notification);
// called by BMediaRoster::StartWatching()
status_t Register(const BMessenger ¬ifyHandler, const media_node
&node, int32 notification);
-
+
// called by BMediaRoster::StopWatching()
status_t Unregister(const BMessenger ¬ifyHandler, const media_node
&node, int32 notification);
@@ -54,20 +57,20 @@
void ConnectionBroken(const media_source &source, const
media_destination &destination);
void BuffersCreated(area_info *areas, int32 count);
void BuffersDeleted(const media_buffer_id *ids, int32 count);
-
+
// called by BMediaNode::NodeStopped()
void NodeStopped(const media_node &node, bigtime_t when);
// called by BControllable::BroadcastChangedParameter()
status_t ParameterChanged(const media_node &node, int32 parameterid);
-
+
// called by BControllable::SetParameterWeb()
void WebChanged(const media_node &node);
-
+
// called by BControllable::BroadcastNewParameterValue()
status_t NewParameterValue(const media_node &node, int32 parameterid,
bigtime_t when, const void *param, size_t paramsize);
-
- // called by the media_addon_server AFTER a flavor change has been
+
+ // called by the media_addon_server AFTER a flavor change has been
// handled. NOT CALLED by BMediaAddOn::NotifyFlavorChange()
void FlavorsChanged(media_addon_id addonid, int32 newcount, int32
gonecount);
Modified: haiku/trunk/headers/private/media/PortPool.h
===================================================================
--- haiku/trunk/headers/private/media/PortPool.h 2009-12-05 10:46:49 UTC
(rev 34499)
+++ haiku/trunk/headers/private/media/PortPool.h 2009-12-05 11:11:28 UTC
(rev 34500)
@@ -1,30 +1,28 @@
-/***********************************************************************
- * Copyright (c) 2002 Marcus Overhagen. All Rights Reserved.
- * This file may be used under the terms of the OpenBeOS License.
- *
- * A pool of kernel ports
- ***********************************************************************/
+/*
+ * Copyright 2002, Marcus Overhagen. All Rights Reserved.
+ * Distributed under the terms of the MIT License.
+ */
#ifndef _POOL_PORT_H_
#define _POOL_PORT_H_
-class PortPool
-{
+
+class PortPool {
public:
PortPool();
~PortPool();
-
+
port_id GetPort();
- void PutPort(port_id port);
+ void PutPort(port_id port);
private:
void Lock();
void Unlock();
- struct PortInfo
- {
+ struct PortInfo {
port_id port;
bool used;
};
+
PortInfo * pool;
int count;
int maxcount;
Copied: haiku/trunk/headers/private/media/ServerInterface.h (from rev 34487,
haiku/trunk/src/servers/media/ServerInterface.h)
===================================================================
--- haiku/trunk/headers/private/media/ServerInterface.h
(rev 0)
+++ haiku/trunk/headers/private/media/ServerInterface.h 2009-12-05 11:11:28 UTC
(rev 34500)
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2002, Marcus Overhagen. All Rights Reserved.
+ * Copyright 2009, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _SERVER_INTERFACE_H_
+#define _SERVER_INTERFACE_H_
+
+
+#include <Entry.h>
+#include <MediaDefs.h>
+#include <MediaNode.h>
+#include <MediaAddOn.h>
+
+
+enum {
+ ADDONSERVER_INSTANTIATE_DORMANT_NODE,
+ SERVER_REGISTER_MEDIAADDON,
+ SERVER_UNREGISTER_MEDIAADDON,
+ SERVER_GET_MEDIAADDON_REF,
+ SERVER_REGISTER_DORMANT_NODE,
+ SERVER_GET_DORMANT_NODES,
+ SERVER_GET_DORMANT_FLAVOR_INFO,
+ END
+};
+
+
+struct xfer_server_get_dormant_flavor_info {
+ media_addon_id addon;
+ int32 flavor_id;
+ port_id reply_port;
+};
+
+struct xfer_server_get_dormant_flavor_info_reply {
+ status_t result;
+ type_code type; // the flatten type_code
+ size_t flattened_size;
+ char flattened_data[1];
+ // a flattened dormant_flavor_info, flattened_size large
+};
+
+struct xfer_server_get_dormant_nodes {
+ int32 max_count;
+ bool has_input;
+ media_format input_format;
+ bool has_output;
+ media_format output_format;
+ bool has_name;
+ char name[B_MEDIA_NAME_LENGTH + 1]; // 1 for a
trailing "*"
+ uint64 require_kinds;
+ uint64 deny_kinds;
+ port_id reply_port;
+};
+
+struct xfer_server_get_dormant_nodes_reply {
+ status_t result;
+ int32 count;
+ // if count > 0, a second reply containing count
dormant_node_infos
+ // is send
+};
+
+struct xfer_server_register_dormant_node {
+ media_addon_id purge_id;
+ // if > 0, server must first remove all dormant_flavor_infos
+ // belonging to that id
+ type_code type; // the flatten type_code
+ size_t flattened_size;
+ char flattened_data[1];
+ // a flattened dormant_flavor_info, flattened_size large
+};
+
+#endif // _SERVER_INTERFACE_H_
Modified: haiku/trunk/headers/private/media/SharedBufferList.h
===================================================================
--- haiku/trunk/headers/private/media/SharedBufferList.h 2009-12-05
10:46:49 UTC (rev 34499)
+++ haiku/trunk/headers/private/media/SharedBufferList.h 2009-12-05
11:11:28 UTC (rev 34500)
@@ -1,53 +1,66 @@
-/***********************************************************************
- * Copyright (c) 2002 Marcus Overhagen. All Rights Reserved.
- * This file may be used under the terms of the OpenBeOS License.
- *
- * Used for BBufferGroup and BBuffer management across teams
- ***********************************************************************/
+/*
+ * Copyright 2009, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx
+ * Copyright 2002, Marcus Overhagen. All Rights Reserved.
+ * Distributed under the terms of the MIT License.
+ */
#ifndef _SHARED_BUFFER_LIST_H_
#define _SHARED_BUFFER_LIST_H_
+
#include <Buffer.h>
-// created in the media server, cloned into
-// each BBufferGroup (visible in all address spaces / teams)
-struct _shared_buffer_list
-{
- struct _shared_buffer_info
- {
- media_buffer_id id;
- BBuffer * buffer;
- bool reclaimed;
- // the reclaim_sem belonging to the BBufferGroup of this BBuffer
- // also used as a unique identifier of the group
- sem_id reclaim_sem;
+
+namespace BPrivate {
+
+
+class SharedBufferList {
+public:
+ static area_id Create(SharedBufferList**
_list);
+ static SharedBufferList* Get(area_id area);
+
+ void Put();
+ void
DeleteGroupAndPut(sem_id groupReclaimSem);
+
+ status_t Lock();
+ status_t Unlock();
+
+ status_t AddBuffer(sem_id
groupReclaimSem,
+
BBuffer* buffer);
+ status_t RequestBuffer(sem_id
groupReclaimSem,
+ int32
buffersInGroup, size_t size,
+
media_buffer_id wantID, BBuffer** _buffer,
+
bigtime_t timeout);
+ status_t RecycleBuffer(BBuffer*
buffer);
+ status_t GetBufferList(sem_id
groupReclaimSem,
+ int32
bufferCount, BBuffer** buffers);
+
+private:
+ struct _shared_buffer_info {
+ media_buffer_id id;
+ BBuffer* buffer;
+ bool reclaimed;
+ // The reclaim_sem belonging to the BBufferGroup of this BBuffer
+ // is also used as a unique identifier of the group
+ sem_id reclaim_sem;
};
- enum { MAX_BUFFER = 666 }; // this fixed limit is
probably very evil
- sem_id locker_sem;
- int32 locker_atom;
-
- // always only the first "buffercount" entries in the "info" array are
used
- int32 buffercount;
- _shared_buffer_info info[MAX_BUFFER];
+ enum { kMaxBuffers = 2047 };
+ // 16 bytes per buffer, 8 pages in total (one entry less for
the list)
- status_t AddBuffer(sem_id group_reclaim_sem, BBuffer *buffer);
- status_t RequestBuffer(sem_id group_reclaim_sem, int32
buffers_in_group, size_t size, media_buffer_id wantID, BBuffer **buffer,
bigtime_t timeout);
- status_t GetBufferList(sem_id group_reclaim_sem, int32
buf_count, BBuffer **out_buffers);
- status_t RecycleBuffer(BBuffer *buffer);
-
-
- status_t Init();
+ status_t _Init();
+ void
_RequestBufferInOtherGroups(
+ sem_id
groupReclaimSem, media_buffer_id id);
- static _shared_buffer_list *Clone(area_id id = -1);
- void Terminate(sem_id group_reclaim_sem);
- void Unmap();
+private:
+ sem_id fSemaphore;
+ vint32 fAtom;
- status_t Lock();
- status_t Unlock();
-
- // used by RequestBuffer, call this one with the list locked!
- void RequestBufferInOtherGroups(sem_id group_reclaim_sem,
media_buffer_id id);
+ _shared_buffer_info fInfos[kMaxBuffers];
+ int32 fCount;
};
-#endif
+
+} // namespace BPrivate
+
+
+#endif // _SHARED_BUFFER_LIST_H_
Modified: haiku/trunk/src/kits/media/Buffer.cpp
===================================================================
--- haiku/trunk/src/kits/media/Buffer.cpp 2009-12-05 10:46:49 UTC (rev
34499)
+++ haiku/trunk/src/kits/media/Buffer.cpp 2009-12-05 11:11:28 UTC (rev
34500)
@@ -1,4 +1,9 @@
/*
+ * Copyright 2009, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx
+ * Distributed under the terms of the MIT License.
+ */
+
+/*
* Copyright (c) 2002, 2003 Marcus Overhagen <Marcus@xxxxxxxxxxxx>
*
* Permission is hereby granted, free of charge, to any person obtaining
@@ -24,12 +29,12 @@
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
- *
*/
#include <Buffer.h>
+#include <AppMisc.h>
#include <MediaDefs.h>
#include "debug.h"
@@ -37,9 +42,6 @@
#include "SharedBufferList.h"
-namespace BPrivate { namespace media {
- extern team_id team;
-} }
using namespace BPrivate::media;
@@ -49,11 +51,11 @@
buffer_clone_info::buffer_clone_info()
{
CALLED();
- buffer = 0;
- area = 0;
- offset = 0;
- size = 0;
- flags = 0;
+ buffer = 0;
+ area = 0;
+ offset = 0;
+ size = 0;
+ flags = 0;
}
@@ -122,11 +124,11 @@
CALLED();
buffer_clone_info info;
- info.buffer = fBufferID;
- info.area = fArea;
- info.offset = fOffset;
- info.size = fSize;
- info.flags = fFlags;
+ info.buffer = fMediaHeader.buffer;
+ info.area = fArea;
+ info.offset = fOffset;
+ info.size = fSize;
+ info.flags = fFlags;
return info;
}
@@ -137,7 +139,6 @@
{
CALLED();
return fMediaHeader.buffer;
- //return fBufferID;
}
@@ -181,20 +182,21 @@
}
-// #pragma mark - private BBuffer
+// #pragma mark - private BBuffer
BBuffer::BBuffer(const buffer_clone_info& info)
:
- // must all be NULL/0 if not correct initialized
- fBufferList(NULL),
+ // must all be NULL/0 if not correctly initialized
+ fBufferList(NULL),
fData(NULL),
- fSize(0),
- fBufferID(0)
- // must be 0 if not registered
+ fSize(0)
{
CALLED();
+ fMediaHeader.buffer = 0;
+ // must be 0 if not registered
+
// special case for BSmallBuffer
if (info.area == 0 && info.buffer == 0)
return;
@@ -208,7 +210,7 @@
return;
}
- fBufferList = _shared_buffer_list::Clone(areaReply.area);
+ fBufferList = BPrivate::SharedBufferList::Get(areaReply.area);
if (fBufferList == NULL) {
ERROR("BBuffer::BBuffer: _shared_buffer_list::Clone()
failed\n");
return;
@@ -217,7 +219,7 @@
server_register_buffer_request request;
server_register_buffer_reply reply;
- request.team = team;
+ request.team = BPrivate::current_team();
request.info = info;
// ask media_server to register this buffer,
@@ -241,10 +243,11 @@
// the response from media server contains enough information
// to clone the memory for this buffer
- fBufferID = reply.info.buffer;
fSize = reply.info.size;
fFlags = reply.info.flags;
fOffset = reply.info.offset;
+ fMediaHeader.size_used = 0;
+ fMediaHeader.buffer = reply.info.buffer;
fArea = clone_area("a cloned BBuffer", &fData, B_ANY_ADDRESS,
B_READ_AREA | B_WRITE_AREA, reply.info.area);
@@ -256,28 +259,26 @@
}
fData = (char*)fData + fOffset;
- fMediaHeader.size_used = 0;
- fMediaHeader.buffer = fBufferID;
}
BBuffer::~BBuffer()
{
CALLED();
+
// unmap the BufferList
if (fBufferList != NULL)
- fBufferList->Unmap();
+ fBufferList->Put();
// unmap the Data
if (fData != NULL) {
delete_area(fArea);
- // ask media_server to unregister the buffer
- // when the last clone of this buffer is gone,
- // media_server will also remove it's cached area
+ // Ask media_server to unregister the buffer when the last
clone of
+ // this buffer is gone, media_server will also remove its
cached area.
server_unregister_buffer_command cmd;
- cmd.team = team;
- cmd.bufferid = fBufferID;
+ cmd.team = BPrivate::current_team();
+ cmd.buffer_id = fMediaHeader.buffer;
SendToServer(SERVER_UNREGISTER_BUFFER, &cmd, sizeof(cmd));
}
}
@@ -287,14 +288,14 @@
BBuffer::SetHeader(const media_header* header)
{
CALLED();
+ ASSERT(header->buffer == fMediaHeader.buffer);
+ if (header->buffer != fMediaHeader.buffer)
+ debugger("oops");
fMediaHeader = *header;
-
-// TODO: why can't we do this without crash? what's wrong?
-// fMediaHeader.buffer = fBufferID;
}
-// #pragma mark - public BSmallBuffer
+// #pragma mark - public BSmallBuffer
static const buffer_clone_info sSmallBufferInfo;
Copied: haiku/trunk/src/kits/media/BufferCache.cpp (from rev 34487,
haiku/trunk/src/kits/media/BufferIdCache.cpp)
===================================================================
--- haiku/trunk/src/kits/media/BufferCache.cpp (rev 0)
+++ haiku/trunk/src/kits/media/BufferCache.cpp 2009-12-05 11:11:28 UTC (rev
34500)
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2009, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx
+ * Copyright 2002, Marcus Overhagen. All Rights Reserved.
+ * Distributed under the terms of the MIT License.
+ */
+
+
+//! A cache for BBuffers to be received by BBufferConsumer::BufferReceived().
+
+
+#include "BufferCache.h"
+
+#include <Buffer.h>
+
+#include "debug.h"
+
+
+namespace BPrivate {
+
+
+BufferCache::BufferCache()
+{
+}
+
+
+BufferCache::~BufferCache()
+{
+ for (BufferMap::iterator iterator = fMap.begin(); iterator !=
fMap.end();
+ iterator++) {
+ delete iterator->second;
+ }
+}
+
+
+BBuffer*
+BufferCache::GetBuffer(media_buffer_id id)
+{
+ BufferMap::iterator found = fMap.find(id);
+ if (found != fMap.end())
+ return found->second;
+
+ buffer_clone_info info;
+ info.buffer = id;
+ BBuffer* buffer = new(std::nothrow) BBuffer(info);
+ if (buffer == NULL)
+ return NULL;
+
+ try {
+ fMap.insert(std::make_pair(id, buffer));
+ } catch (std::bad_alloc& exception) {
+ delete buffer;
+ return NULL;
+ }
+
+ return buffer;
+}
+
+
+} // namespace BPrivate
Copied: haiku/trunk/src/kits/media/BufferCache.h (from rev 34487,
haiku/trunk/src/kits/media/BufferIdCache.h)
===================================================================
--- haiku/trunk/src/kits/media/BufferCache.h (rev 0)
+++ haiku/trunk/src/kits/media/BufferCache.h 2009-12-05 11:11:28 UTC (rev
34500)
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2009, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx
+ * Copyright 2002, Marcus Overhagen. All Rights Reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _BUFFER_CACHE_H_
+#define _BUFFER_CACHE_H_
+
+
+#include <map>
+
+#include <MediaDefs.h>
+
+
+class BBuffer;
+
+
+namespace BPrivate {
+
+
+class BufferCache {
+public:
+ BufferCache();
+ ~BufferCache();
+
+ BBuffer*
GetBuffer(media_buffer_id id);
+
+private:
+ typedef std::map<media_buffer_id, BBuffer*> BufferMap;
+
+ BufferMap fMap;
+};
+
+
+} // namespace BPrivate
+
+
+#endif // _BUFFER_CACHE_H_
Modified: haiku/trunk/src/kits/media/BufferConsumer.cpp
===================================================================
--- haiku/trunk/src/kits/media/BufferConsumer.cpp 2009-12-05 10:46:49 UTC
(rev 34499)
+++ haiku/trunk/src/kits/media/BufferConsumer.cpp 2009-12-05 11:11:28 UTC
(rev 34500)
@@ -24,38 +24,36 @@
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
- *
*/
+
+#include "BufferCache.h"
#include <BufferConsumer.h>
+
+#include <stdlib.h>
+
#include <BufferProducer.h>
#include <BufferGroup.h>
#include <Buffer.h>
-#include <TimeSource.h> //for debugging
-#include <stdlib.h>
-#include "debug.h"
-#include "MediaMisc.h"
-#include "DataExchange.h"
-#include "BufferIdCache.h"
+#include <TimeSource.h>
-/*************************************************************
- * protected BBufferConsumer
- *************************************************************/
+#include <debug.h>
+#include <MediaMisc.h>
+#include <DataExchange.h>
-/* virtual */
+
+
BBufferConsumer::~BBufferConsumer()
{
CALLED();
delete fBufferCache;
- if (fDeleteBufferGroup)
- delete fDeleteBufferGroup;
+ delete fDeleteBufferGroup;
}
-/*************************************************************
- * public BBufferConsumer
- *************************************************************/
+// #pragma mark - public BBufferConsumer
+
media_type
BBufferConsumer::ConsumerType()
{
@@ -64,97 +62,97 @@
}
-/* static */ status_t
-BBufferConsumer::RegionToClipData(const BRegion *region,
- int32 *format,
- int32 *ioSize,
- void *data)
+/*static*/ status_t
+BBufferConsumer::RegionToClipData(const BRegion* region, int32* _format,
+ int32 *_size, void* data)
{
CALLED();
-
- status_t rv;
- int count;
- count = *ioSize / sizeof(int16);
- rv = BBufferProducer::clip_region_to_shorts(region, static_cast<int16
*>(data), count, &count);
- *ioSize = count * sizeof(int16);
- *format = BBufferProducer::B_CLIP_SHORT_RUNS;
-
- return rv;
+ int count = *_size / sizeof(int16);
+ status_t status = BBufferProducer::clip_region_to_shorts(region,
+ static_cast<int16 *>(data), count, &count);
+
+ *_size = count * sizeof(int16);
+ *_format = BBufferProducer::B_CLIP_SHORT_RUNS;
+
+ return status;
}
-/*************************************************************
- * protected BBufferConsumer
- *************************************************************/
-/* explicit */
-BBufferConsumer::BBufferConsumer(media_type consumer_type) :
+// #pragma mark - protected BBufferConsumer
+
+
+BBufferConsumer::BBufferConsumer(media_type consumerType)
+ :
BMediaNode("called by BBufferConsumer"),
- fConsumerType(consumer_type),
- fBufferCache(new _buffer_id_cache),
+ fConsumerType(consumerType),
+ fBufferCache(new BPrivate::BufferCache),
fDeleteBufferGroup(0)
{
CALLED();
-
+
AddNodeKind(B_BUFFER_CONSUMER);
}
-/* static */ void
-BBufferConsumer::NotifyLateProducer(const media_source &what_source,
-
bigtime_t how_much,
-
bigtime_t performance_time)
+/*static*/ void
+BBufferConsumer::NotifyLateProducer(const media_source& whatSource,
+ bigtime_t howMuch, bigtime_t performanceTime)
{
CALLED();
- if (IS_INVALID_SOURCE(what_source))
+ if (IS_INVALID_SOURCE(whatSource))
return;
producer_late_notice_received_command command;
- command.source = what_source;
- command.how_much = how_much;
- command.performance_time = performance_time;
-
- SendToPort(what_source.port, PRODUCER_LATE_NOTICE_RECEIVED, &command,
sizeof(command));
+ command.source = whatSource;
+ command.how_much = howMuch;
+ command.performance_time = performanceTime;
+
+ SendToPort(whatSource.port, PRODUCER_LATE_NOTICE_RECEIVED, &command,
+ sizeof(command));
}
status_t
-BBufferConsumer::SetVideoClippingFor(const media_source &output,
- const
media_destination &destination,
- const
int16 *shorts,
- int32
short_count,
- const
media_video_display_info &display,
- void
*user_data,
- int32
*change_tag,
- void
*_reserved_)
+BBufferConsumer::SetVideoClippingFor(const media_source& output,
+ const media_destination& destination, const int16* shorts, int32
shortCount,
+ const media_video_display_info& display, void* userData, int32*
_changeTag,
+ void *_reserved_)
{
CALLED();
if (IS_INVALID_SOURCE(output))
return B_MEDIA_BAD_SOURCE;
if (IS_INVALID_DESTINATION(destination))
return B_MEDIA_BAD_DESTINATION;
- if (short_count > int(B_MEDIA_MESSAGE_SIZE -
sizeof(producer_video_clipping_changed_command)) / 2)
- debugger("BBufferConsumer::SetVideoClippingFor short_count too
large (8000 limit)\n");
-
- producer_video_clipping_changed_command *command;
- size_t size;
- status_t rv;
+ if (shortCount > int(B_MEDIA_MESSAGE_SIZE
+ - sizeof(producer_video_clipping_changed_command)) / 2)
{
+ debugger("BBufferConsumer::SetVideoClippingFor short_count too
large "
+ "(8000 limit)\n");
+ }
- size = sizeof(producer_video_clipping_changed_command) + short_count *
sizeof(short);
- command = static_cast<producer_video_clipping_changed_command
*>(malloc(size));
+ producer_video_clipping_changed_command* command;
+ size_t size = sizeof(producer_video_clipping_changed_command)
+ + shortCount * sizeof(short);
+ command
+ =
static_cast<producer_video_clipping_changed_command*>(malloc(size));
+ if (command == NULL)
+ return B_NO_MEMORY;
+
[... truncated: 5191 lines follow ...]
Other related posts: