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->ID() <= 0 49 || buffer->Data() == NULL) { 50 delete buffer; 51 return NULL; 52 } 53 54 if (buffer->ID() != id) 55 debugger("BufferCache::GetBuffer: IDs mismatch"); 56 57 try { 58 fMap.insert(std::make_pair(id, buffer)); 59 } catch (std::bad_alloc& exception) { 60 delete buffer; 61 return NULL; 62 } 63 64 return buffer; 65 } 66 67 68 } // namespace BPrivate 69