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