xref: /haiku/src/kits/media/ChunkCache.h (revision 508f54795f39c3e7552d87c95aae9dd8ec6f505b)
1 /*
2  * Copyright 2009, Axel Dörfler, axeld@pinc-software.de.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _CHUNK_CACHE_H
6 #define _CHUNK_CACHE_H
7 
8 
9 #include <Locker.h>
10 #include <MediaDefs.h>
11 #include <RealtimeAlloc.h>
12 #include <queue>
13 #include <deque>
14 
15 #include "ReaderPlugin.h"
16 
17 
18 namespace BPrivate {
19 namespace media {
20 
21 // Limit to 10 entries, we might want to instead limit to a length of time
22 #define CACHE_MAX_ENTRIES 10
23 
24 struct chunk_buffer {
25 	void*			buffer;
26 	size_t			size;
27 	size_t			capacity;
28 	media_header	header;
29 	status_t		status;
30 };
31 
32 typedef std::queue<chunk_buffer*> ChunkQueue;
33 typedef std::deque<chunk_buffer*> ChunkList;
34 
35 class ChunkCache : public BLocker {
36 public:
37 								ChunkCache(sem_id waitSem, size_t maxBytes);
38 								~ChunkCache();
39 
40 			status_t			InitCheck() const;
41 
42 			void				MakeEmpty();
43 			bool				SpaceLeft() const;
44 
45 			chunk_buffer*		NextChunk(Reader* reader, void* cookie);
46 			void				RecycleChunk(chunk_buffer* chunk);
47 			bool				ReadNextChunk(Reader* reader, void* cookie);
48 
49 private:
50 			rtm_pool*			fRealTimePool;
51 			sem_id				fWaitSem;
52 			size_t				fMaxBytes;
53 			ChunkQueue			fChunkCache;
54 			ChunkList			fUnusedChunks;
55 };
56 
57 
58 }	// namespace media
59 }	// namespace BPrivate
60 
61 using namespace BPrivate::media;
62 
63 #endif	// _CHUNK_CACHE_H
64