summaryrefslogtreecommitdiff
path: root/src/cachemanager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/cachemanager.cc')
-rw-r--r--src/cachemanager.cc28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/cachemanager.cc b/src/cachemanager.cc
index 9b18882..2c0315d 100644
--- a/src/cachemanager.cc
+++ b/src/cachemanager.cc
@@ -30,8 +30,13 @@
#define CHUNKSIZE 256
+sample_t nodata[CHUNKSIZE];
+
CacheManager::CacheManager()
{
+ for(int i = 0; i < CHUNKSIZE; i++) {
+ nodata[i] = 0;
+ }
}
CacheManager::~CacheManager()
@@ -62,11 +67,17 @@ sample_t *CacheManager::open(AudioFile *file, size_t initial_samples_needed, int
{
// What if no free ids is available?
m_ids.lock();
- id = availableids.front();
- availableids.pop_front();
+ if(availableids.empty()) {
+ id = CACHEMANAGER_NOID;
+ }
+ else {
+ id = availableids.front();
+ availableids.pop_front();
+ }
m_ids.unlock();
- if(initial_samples_needed < file->size) {
+ if(id != CACHEMANAGER_NOID &&
+ initial_samples_needed < file->size) {
cache_t c;
c.file = file;
c.channel = channel;
@@ -81,11 +92,17 @@ sample_t *CacheManager::open(AudioFile *file, size_t initial_samples_needed, int
pushEvent(e);
}
+ if(id == CACHEMANAGER_NOID) {
+ return nodata;
+ }
+
return file->data;
}
void CacheManager::close(cacheid_t id)
{
+ if(CACHEMANAGER_NOID) return;
+
{
event_t e = createEvent(id, CLEAN);
MutexAutolock l(m_events);
@@ -103,6 +120,11 @@ void CacheManager::close(cacheid_t id)
sample_t *CacheManager::next(cacheid_t id, size_t &size)
{
size = CHUNKSIZE;
+
+ if(id == CACHEMANAGER_NOID) {
+ return nodata;
+ }
+
m_caches.lock();
cache_t c = id2cache[id];
c.pos += size;