xref: /haiku/src/kits/media/BufferCache.cpp (revision d0ac609964842f8cdb6d54b3c539c6c15293e172)
1 /*
2  * Copyright 2009, Axel Dörfler, axeld@pinc-software.de.
3  * Copyright 2002, Marcus Overhagen. All Rights Reserved.
4  * Distributed under the terms of the MIT License.
5  */
6 
7 
8 //! A cache for BBuffers to be received by BBufferConsumer::BufferReceived().
9 
10 
11 #include "BufferCache.h"
12 
13 #include <Buffer.h>
14 
15 #include "debug.h"
16 
17 
18 namespace BPrivate {
19 
20 
21 BufferCache::BufferCache()
22 {
23 }
24 
25 
26 BufferCache::~BufferCache()
27 {
28 	for (BufferMap::iterator iterator = fMap.begin(); iterator != fMap.end();
29 			iterator++) {
30 		delete iterator->second;
31 	}
32 }
33 
34 
35 BBuffer*
36 BufferCache::GetBuffer(media_buffer_id id)
37 {
38 	if (id <= 0)
39 		return NULL;
40 
41 	BufferMap::iterator found = fMap.find(id);
42 	if (found != fMap.end())
43 		return found->second;
44 
45 	buffer_clone_info info;
46 	info.buffer = id;
47 	BBuffer* buffer = new(std::nothrow) BBuffer(info);
48 	if (buffer == NULL || buffer->Data() == NULL) {
49 		delete buffer;
50 		return NULL;
51 	}
52 
53 	try {
54 		fMap.insert(std::make_pair(id, buffer));
55 	} catch (std::bad_alloc& exception) {
56 		delete buffer;
57 		return NULL;
58 	}
59 
60 	return buffer;
61 }
62 
63 
64 }	// namespace BPrivate
65