summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
m---------hugin0
-rw-r--r--src/cachemanager.cc42
-rw-r--r--src/cachemanager.h4
3 files changed, 28 insertions, 18 deletions
diff --git a/hugin b/hugin
-Subproject bb7388b685ed043b4a3030da86f7f1e49141477
+Subproject 7e734710be0098ea77ca2d3f54fb626b65bbf47
diff --git a/src/cachemanager.cc b/src/cachemanager.cc
index 366cd49..641d984 100644
--- a/src/cachemanager.cc
+++ b/src/cachemanager.cc
@@ -88,9 +88,12 @@ sample_t *CacheManager::open(AudioFile *file, size_t initial_samples_needed, int
// Allocate buffers
// Increase audio ref count
+ {
+ MutexAutolock l(m_ids);
id2cache[id] = c;
+ }
- event_t e = createEvent(id, LOADNEXT);
+ event_t e = createLoadNextEvent(id, c.pos, LOADNEXT);
pushEvent(e);
}
@@ -102,9 +105,9 @@ void CacheManager::close(cacheid_t id)
if(id == CACHE_DUMMYID) return;
{
- event_t e = createEvent(id, CLEAN);
- MutexAutolock l(m_events);
- eventqueue.push_front(e);
+// event_t e = createEvent(id, CLEAN);
+// MutexAutolock l(m_events);
+// eventqueue.push_front(e);
}
{
@@ -115,6 +118,14 @@ void CacheManager::close(cacheid_t id)
// Decrement audiofile ref count
}
+const CacheManager::cache_t CacheManager::getNextCache(cacheid_t id)
+{
+ MutexAutolock l(m_caches);
+ cache_t c = id2cache[id];
+ id2cache[id].pos += CHUNKSIZE;
+ return c;
+}
+
sample_t *CacheManager::next(cacheid_t id, size_t &size)
{
size = CHUNKSIZE;
@@ -123,19 +134,15 @@ sample_t *CacheManager::next(cacheid_t id, size_t &size)
return nodata;
}
- m_caches.lock();
- cache_t c = id2cache[id];
- c.pos += size;
- id2cache[id] = c;
- m_caches.unlock();
-
+ const cache_t c = getNextCache(id);
+
// If more is left of file
if(c.pos < c.file->size) {
- event_t e = createEvent(id, LOADNEXT);
+ event_t e = createLoadNextEvent(id, c.pos + CHUNKSIZE, LOADNEXT);
pushEvent(e);
- }
+ }
- sample_t *s = c.file->data + c.pos;
+ sample_t *s = c.file->data + (c.pos - size);
return s;
}
@@ -143,7 +150,6 @@ void CacheManager::loadNext(cacheid_t id)
{
MutexAutolock l(m_caches);
cache_t c = id2cache[id];
- c.pos += CHUNKSIZE;
id2cache[id] = c;
}
@@ -153,11 +159,12 @@ void CacheManager::thread_main()
sem.wait();
m_events.lock();
- if(eventqueue.empty()) {
+ if(!eventqueue.empty()) {
event_t e = eventqueue.front();
eventqueue.pop_front();
m_events.unlock();
-
+
+ // TODO: Skip event if e.pos < cache.pos
if(!e.active) continue;
switch(e.cmd) {
@@ -184,11 +191,12 @@ void CacheManager::pushEvent(event_t e)
sem.post();
}
-CacheManager::event_t CacheManager::createEvent(cacheid_t id, cmd_t cmd)
+CacheManager::event_t CacheManager::createLoadNextEvent(cacheid_t id, size_t pos, cmd_t cmd)
{
event_t e;
e.active = true;
e.id = id;
e.cmd = cmd;
+ e.pos = pos;
return e;
}
diff --git a/src/cachemanager.h b/src/cachemanager.h
index 19749a7..264f644 100644
--- a/src/cachemanager.h
+++ b/src/cachemanager.h
@@ -101,12 +101,14 @@ private:
typedef struct {
bool active;
cacheid_t id;
+ size_t pos;
cmd_t cmd;
} event_t;
- CacheManager::event_t createEvent(cacheid_t id, cmd_t type);
+ CacheManager::event_t createLoadNextEvent(cacheid_t id, size_t pos, cmd_t type);
void loadNext(cacheid_t id);
void pushEvent(event_t e);
+ const cache_t getNextCache(cacheid_t id);
// Protected by mutex
std::list<event_t> eventqueue;