summaryrefslogtreecommitdiff
path: root/src/cachemanager.cc
diff options
context:
space:
mode:
authorJonas Suhr Christensen <jsc@umbraculum.org>2015-04-11 19:11:31 +0200
committerJonas Suhr Christensen <jsc@umbraculum.org>2015-04-11 19:11:31 +0200
commit9c52ab4a6688782d0db723bd411db745fed08087 (patch)
tree8aa7fc27d581b3e2f07f81bf615c3afbfe7e74d0 /src/cachemanager.cc
parent4d82b13f332ea8c3af3493e9ee2ac9cacdfa7f22 (diff)
ADded local cache.
Diffstat (limited to 'src/cachemanager.cc')
-rw-r--r--src/cachemanager.cc54
1 files changed, 24 insertions, 30 deletions
diff --git a/src/cachemanager.cc b/src/cachemanager.cc
index d047d66..9288ed1 100644
--- a/src/cachemanager.cc
+++ b/src/cachemanager.cc
@@ -81,6 +81,7 @@ void CacheManager::deinit()
}
// Invariant: initial_samples_needed < preloaded audio data
+// Proposal: preloaded > 2 x CHUNKSIZE? So that we can fill c.front immediatly on open
sample_t *CacheManager::open(AudioFile *file, size_t initial_samples_needed, int channel, cacheid_t &id)
{
{
@@ -97,13 +98,12 @@ sample_t *CacheManager::open(AudioFile *file, size_t initial_samples_needed, int
return nodata;
}
-
cache_t c;
c.file = file;
c.channel = channel;
c.pos = initial_samples_needed;
- c.front = file->data;
- c.back = nodata;
+ c.front = file->data + initial_samples_needed;
+ c.back = file->data;
// Allocate buffers
// Increase audio ref count
@@ -116,11 +116,11 @@ sample_t *CacheManager::open(AudioFile *file, size_t initial_samples_needed, int
localcache[id] = c.front;
if(initial_samples_needed < file->size) {
- event_t e = createLoadNextEvent(id, c.pos, LOADNEXT);
+ event_t e = createLoadNextEvent(id, c.pos, &c.back);
pushEvent(e);
}
- return c.front;
+ return file->data; // preloaded data
}
void CacheManager::close(cacheid_t id)
@@ -141,11 +141,16 @@ void CacheManager::close(cacheid_t id)
// Decrement audiofile ref count
}
-const CacheManager::cache_t CacheManager::getNextCache(cacheid_t id)
+CacheManager::cache_t CacheManager::getNextCache(cacheid_t id)
{
MutexAutolock l(m_caches);
cache_t c = id2cache[id];
+
+ sample_t *tmp = id2cache[id].front;
+ id2cache[id].front = c.back;
+ id2cache[id].back = tmp;
id2cache[id].pos += CHUNKSIZE;
+
return c;
}
@@ -157,22 +162,18 @@ sample_t *CacheManager::next(cacheid_t id, size_t &size)
return nodata;
}
- size_t localpos = localcachepos[id];
- sample_t* localbuf = localcache[id];
- if(localpos < CHUNKSIZE) {
- localcachepos[id] += FRAMESIZE;
- return localbuf + FRAMESIZE;
+ if(localcachepos[id] < CHUNKSIZE) {
+ localcachepos[id] += size;
+ return localcache[id] + localcachepos[id];
}
- localcachepos[id] = 0;
- localcache[id] = NULL;
-
- const cache_t c = getNextCache(id);
+ cache_t c = getNextCache(id);
+ localcachepos[id] = 0;
localcache[id] = c.front;
if(c.pos < c.file->size) {
- event_t e = createLoadNextEvent(id, c.pos + CHUNKSIZE, LOADNEXT);
+ event_t e = createLoadNextEvent(id, c.pos + CHUNKSIZE, &c.back);
pushEvent(e);
}
@@ -181,18 +182,10 @@ sample_t *CacheManager::next(cacheid_t id, size_t &size)
// return s;
}
-void CacheManager::loadNext(cacheid_t id)
+void CacheManager::loadNext(event_t &e)
{
- m_caches.lock();
- cache_t c = id2cache[id];
- sample_t *tmp = c.front;
- c.front = c.back;
- c.back = tmp;
- id2cache[id] = c;
- m_caches.unlock();
-
- // do work
- tmp = tmp + CHUNKSIZE;
+ cache_t c = id2cache[e.id];
+ *e.fillbuffer = c.file->data + e.pos;
}
void CacheManager::thread_main()
@@ -211,7 +204,7 @@ void CacheManager::thread_main()
switch(e.cmd) {
case LOADNEXT:
- loadNext(e.id);
+ loadNext(e);
break;
// case CLEAN:
// break;
@@ -233,12 +226,13 @@ void CacheManager::pushEvent(event_t e)
sem.post();
}
-CacheManager::event_t CacheManager::createLoadNextEvent(cacheid_t id, size_t pos, cmd_t cmd)
+CacheManager::event_t CacheManager::createLoadNextEvent(cacheid_t id, size_t pos, sample_t** fillbuffer)
{
event_t e;
e.active = true;
e.id = id;
- e.cmd = cmd;
+ e.cmd = LOADNEXT;
e.pos = pos;
+ e.fillbuffer = fillbuffer;
return e;
}