From 3742ac29b3ab8b39b3c8cb820ed988b553de27bb Mon Sep 17 00:00:00 2001 From: Jonas Suhr Christensen Date: Sat, 11 Apr 2015 11:19:42 +0200 Subject: Added pos to event_t. Fixed bufs. --- hugin | 2 +- src/cachemanager.cc | 42 +++++++++++++++++++++++++----------------- src/cachemanager.h | 4 +++- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/hugin b/hugin index bb7388b..7e73471 160000 --- a/hugin +++ b/hugin @@ -1 +1 @@ -Subproject commit bb7388b685ed043b4a3030da86f7f1e491414773 +Subproject commit 7e734710be0098ea77ca2d3f54fb626b65bbf477 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 eventqueue; -- cgit v1.2.3