[haiku-commits] r34500 - in haiku/trunk: headers/os/media headers/private/media src/kits/media src/servers/media src/servers/media_addon

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 &notifyHandler, const media_node 
&node, int32 notification);
-       
+
        // called by BMediaRoster::StopWatching()
        status_t Unregister(const BMessenger &notifyHandler, 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: