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 "MediaDebug.h"
16
17
18namespace BPrivate {
19
20
21BufferCache::BufferCache()
22{
23}
24
25
26BufferCache::~BufferCache()
27{
28	for (BufferMap::iterator iterator = fMap.begin(); iterator != fMap.end();
29			iterator++) {
30		delete iterator->second;
31	}
32}
33
34
35BBuffer*
36BufferCache::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