From 96df5c64a03de57732eb61c3f65c4e17d14c6688 Mon Sep 17 00:00:00 2001 From: Jonas Suhr Christensen Date: Fri, 10 Apr 2015 16:28:03 +0200 Subject: Added unit test shell for cachemanager. Added cache manager logic - still needing audio related code. --- src/cachemanager.cc | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 2 deletions(-) (limited to 'src/cachemanager.cc') diff --git a/src/cachemanager.cc b/src/cachemanager.cc index 2e9eab9..5e2adf0 100644 --- a/src/cachemanager.cc +++ b/src/cachemanager.cc @@ -3,8 +3,8 @@ * cachemanager.cc * * Fri Apr 10 10:39:24 CEST 2015 - * Copyright 2015 Bent Bisballe Nyeng - * deva@aasimon.org + * Copyright 2015 Jonas Suhr Christensen + * jsc@umbraculum.org ****************************************************************************/ /* @@ -26,3 +26,106 @@ */ #include "cachemanager.h" +#include + +CacheManager::CacheManager() +{ +} + +CacheManager::~CacheManager() +{ + wait_stop(); +} + +void CacheManager::init(int poolsize) +{ + id2cache.resize(poolsize); + for(int i = 0; i < poolsize; i++) { + availableids.push_back(i); + } + + running = true; + run(); +} + +// Invariant: initial_samples_needed < preloaded audio data +sample_t *CacheManager::open(AudioFile *file, int initial_samples_needed, int channel, cacheid_t &id) +{ + // What if no free ids is available? + m_ids.lock(); + id = availableids.front(); + availableids.pop_front(); + m_ids.unlock(); + + cache_t c; + c.file = file; + c.channel = channel; + c.pos = initial_samples_needed; + // Allocate buffers + // Increase audio ref count + + id2cache[id] = c; + + event_t e; + e.id = id; + pushEvent(e); + + return file->data; +} + +void CacheManager::close(cacheid_t id) +{ + m_ids.lock(); + availableids.push_back(id); + m_ids.unlock(); + + // Clean cache_t mapped to event + // Clean event list for other events mapped to this id? + // Maybe we need an event for this, that we can push in front of eventqueue (con: we dont read from disk when doing this stuff). + // Decrement audiofile ref count +} + +sample_t *CacheManager::next(cacheid_t id, size_t &size) +{ + sample_t *s = NULL; + return s; +} + +void CacheManager::loadNext(cacheid_t id) +{ + printf("Loading next...\n"); + + // If more is left of file + if(false) { + event_t e; + e.id = id; + pushEvent(e); + } +} + +void CacheManager::thread_main() +{ + while(running) { + sem.wait(); + + m_events.lock(); + if(eventqueue.empty()) { + event_t e = eventqueue.front(); + eventqueue.pop_front(); + m_events.unlock(); + + loadNext(e.id); + } + else { + m_events.unlock(); + } + } +} + +void CacheManager::pushEvent(event_t e) +{ + // Check that if event should be merged (Maybe by event queue (ie. push in front). + m_events.lock(); + eventqueue.push_back(e); + m_events.unlock(); +} -- cgit v1.2.3