diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2016-01-28 17:03:18 +0100 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2016-01-28 17:03:18 +0100 |
commit | 9f770629606ca58c78b411e73696eec275c328a5 (patch) | |
tree | 021a18e45119f221290b42a96ff6ee8a24797066 /src | |
parent | 83e33a14f672c2d1f9f333703867959921d40ffb (diff) |
Conform to style guide.
Diffstat (limited to 'src')
-rw-r--r-- | src/audiocache.cc | 51 | ||||
-rw-r--r-- | src/audiocache.h | 29 | ||||
-rw-r--r-- | src/audiocacheeventhandler.cc | 82 | ||||
-rw-r--r-- | src/audiocacheeventhandler.h | 22 | ||||
-rw-r--r-- | src/audiocachefile.cc | 3 | ||||
-rw-r--r-- | src/audiocachefile.h | 13 | ||||
-rw-r--r-- | src/audiocacheidmanager.cc | 10 | ||||
-rw-r--r-- | src/audiocacheidmanager.h | 18 |
8 files changed, 102 insertions, 126 deletions
diff --git a/src/audiocache.cc b/src/audiocache.cc index 1493e46..237a3ff 100644 --- a/src/audiocache.cc +++ b/src/audiocache.cc @@ -42,8 +42,6 @@ AudioCache::~AudioCache() { DEBUG(cache, "~AudioCache() pre\n"); - // TODO: Run through all active cacheids and release them/close their files. - deinit(); delete[] nodata; @@ -54,13 +52,13 @@ void AudioCache::init(size_t poolsize) { setAsyncMode(true); - idManager.init(poolsize); - eventHandler.start(); + id_manager.init(poolsize); + event_handler.start(); } void AudioCache::deinit() { - eventHandler.stop(); + event_handler.stop(); } // Invariant: initial_samples_needed < preloaded audio data @@ -76,7 +74,7 @@ sample_t* AudioCache::open(AudioFile* file, size_t initial_samples_needed, } // Register a new id for this cache session. - id = idManager.registerID({}); + id = id_manager.registerID({}); // If we are out of available ids we get CACHE_DUMMYID if(id == CACHE_DUMMYID) @@ -87,9 +85,9 @@ sample_t* AudioCache::open(AudioFile* file, size_t initial_samples_needed, } // Get the cache_t connected with the registered id. - cache_t& c = idManager.getCache(id); + cache_t& c = id_manager.getCache(id); - c.afile = &eventHandler.openFile(file->filename); + c.afile = &event_handler.openFile(file->filename); c.channel = channel; // Next call to 'next()' will read from this point. @@ -124,7 +122,8 @@ sample_t* AudioCache::open(AudioFile* file, size_t initial_samples_needed, c.back = new sample_t[CHUNKSIZE(framesize)]; } - eventHandler.pushLoadNextEvent(c.afile, c.channel, c.pos, c.back, &c.ready); + event_handler.pushLoadNextEvent(c.afile, c.channel, c.pos, + c.back, &c.ready); } return c.preloaded_samples; // return preloaded data @@ -140,7 +139,7 @@ sample_t* AudioCache::next(cacheid_t id, size_t& size) return nodata; } - cache_t& c = idManager.getCache(id); + cache_t& c = id_manager.getCache(id); if(c.preloaded_samples) { @@ -172,7 +171,7 @@ sample_t* AudioCache::next(cacheid_t id, size_t& size) if(!c.ready) { // Just return silence. - ++numberOfUnderruns; + ++number_of_underruns; return nodata; } @@ -193,7 +192,8 @@ sample_t* AudioCache::next(cacheid_t id, size_t& size) c.back = new sample_t[CHUNKSIZE(framesize)]; } - eventHandler.pushLoadNextEvent(c.afile, c.channel, c.pos, c.back, &c.ready); + event_handler.pushLoadNextEvent(c.afile, c.channel, c.pos, + c.back, &c.ready); } // We should always have a front buffer at this point. @@ -209,7 +209,7 @@ bool AudioCache::isReady(cacheid_t id) return true; } - cache_t& cache = idManager.getCache(id); + cache_t& cache = id_manager.getCache(id); return cache.ready; } @@ -220,7 +220,7 @@ void AudioCache::close(cacheid_t id) return; } - eventHandler.pushCloseEvent(id); + event_handler.pushCloseEvent(id); } void AudioCache::setFrameSize(size_t framesize) @@ -229,12 +229,10 @@ void AudioCache::setFrameSize(size_t framesize) // Make sure the event handler thread is stalled while we set the framesize // state. - std::lock_guard<AudioCacheEventHandler> eventHandlerLock(eventHandler); - - DEBUG(cache, "A\n"); + std::lock_guard<AudioCacheEventHandler> event_handler_lock(event_handler); // NOTE: Not threaded... - //std::lock_guard<AudioCacheIDManager> idManagerLock(idManager); + //std::lock_guard<AudioCacheIDManager> id_manager_lock(id_manager); if(framesize > this->framesize) { @@ -249,11 +247,7 @@ void AudioCache::setFrameSize(size_t framesize) this->framesize = framesize; - DEBUG(cache, "B\n"); - - eventHandler.setChunkSize(CHUNKSIZE(framesize)); - - DEBUG(cache, "C\n"); + event_handler.setChunkSize(CHUNKSIZE(framesize)); } size_t AudioCache::frameSize() const @@ -263,23 +257,20 @@ size_t AudioCache::frameSize() const void AudioCache::setAsyncMode(bool async) { - // TODO: Clean out read queue. - // TODO: Block until reader thread is idle, otherwise we might screw up the - // buffers...? - eventHandler.setThreaded(async); + event_handler.setThreaded(async); } bool AudioCache::asyncMode() const { - return eventHandler.getThreaded(); + return event_handler.getThreaded(); } size_t AudioCache::getNumberOfUnderruns() const { - return numberOfUnderruns; + return number_of_underruns; } void AudioCache::resetNumberOfUnderruns() { - numberOfUnderruns = 0; + number_of_underruns = 0; } diff --git a/src/audiocache.h b/src/audiocache.h index 06493e6..004fcf8 100644 --- a/src/audiocache.h +++ b/src/audiocache.h @@ -39,29 +39,6 @@ #define CHUNK_MULTIPLIER 16 - -//TODO: -// 1: Move nodata initialisation to init method. -// 2: Make semaphore in thread to block init call until thread has been started. - -//// next -// Pre: preloaded contains 2 x framesize. chunk size is framesize. -// allocate 2 chunks and copy initial_samples_needed to first buffer from -// preloaded data and enough to fill up the second buffer from preloaded -// returns the first buffer and its size in &size. -// get id from "free stack" and store pointers to buffers in id vector. -// event: open sndfile handle (if not already open) and increase refcount - -//// next -// Return which ever buffer is the front, swap them and add event to load the -// next chunk. - -//// close -// decrement file handle refcounter and close file if it is 0. -// free the 2 buffers -// (do not erase from the id vector), push index to -// "free stack" for reuse. - class AudioCache { public: AudioCache() = default; @@ -129,8 +106,8 @@ public: private: size_t framesize{0}; sample_t *nodata{nullptr}; - size_t numberOfUnderruns{0}; + size_t number_of_underruns{0}; - AudioCacheIDManager idManager; - AudioCacheEventHandler eventHandler{idManager}; + AudioCacheIDManager id_manager; + AudioCacheEventHandler event_handler{id_manager}; }; diff --git a/src/audiocacheeventhandler.cc b/src/audiocacheeventhandler.cc index 89eb09e..7322785 100644 --- a/src/audiocacheeventhandler.cc +++ b/src/audiocacheeventhandler.cc @@ -52,10 +52,10 @@ public: CacheChannels channels; }; -AudioCacheEventHandler::AudioCacheEventHandler(AudioCacheIDManager& idManager) +AudioCacheEventHandler::AudioCacheEventHandler(AudioCacheIDManager& id_manager) // Hack to be able to forward declare CacheEvent: : eventqueue(new std::list<CacheEvent>()) - , idManager(idManager) + , id_manager(id_manager) { } @@ -64,8 +64,8 @@ AudioCacheEventHandler::~AudioCacheEventHandler() // Close all ids already enqueued to be closed. clearEvents(); - auto activeIDs = idManager.getActiveIDs(); - for(auto id : activeIDs) + auto active_ids = id_manager.getActiveIDs(); + for(auto id : active_ids) { handleCloseCache(id); } @@ -139,10 +139,10 @@ void AudioCacheEventHandler::pushLoadNextEvent(AudioCacheFile* afile, size_t pos, sample_t* buffer, volatile bool* ready) { - CacheEvent e; - e.eventType = EventType::LoadNext; - e.pos = pos; - e.afile = afile; + CacheEvent cache_event; + cache_event.eventType = EventType::LoadNext; + cache_event.pos = pos; + cache_event.afile = afile; CacheChannel c; c.channel = channel; @@ -151,18 +151,18 @@ void AudioCacheEventHandler::pushLoadNextEvent(AudioCacheFile* afile, *ready = false; c.ready = ready; - e.channels.insert(e.channels.end(), c); + cache_event.channels.insert(cache_event.channels.end(), c); - pushEvent(e); + pushEvent(cache_event); } void AudioCacheEventHandler::pushCloseEvent(cacheid_t id) { - CacheEvent e; - e.eventType = EventType::Close; - e.id = id; + CacheEvent cache_event; + cache_event.eventType = EventType::Close; + cache_event.id = id; - pushEvent(e); + pushEvent(cache_event); } void AudioCacheEventHandler::setChunkSize(size_t chunksize) @@ -185,7 +185,7 @@ void AudioCacheEventHandler::setChunkSize(size_t chunksize) DEBUG(cache, "2)\n"); // Skip all active cacheids and make their buffers point at nodata. - idManager.disableActive(); + id_manager.disableActive(); DEBUG(cache, "3)\n"); @@ -217,38 +217,39 @@ void AudioCacheEventHandler::clearEvents() eventqueue->clear(); } -void AudioCacheEventHandler::handleLoadNextEvent(CacheEvent& event) +void AudioCacheEventHandler::handleLoadNextEvent(CacheEvent& cache_event) { - event.afile->readChunk(event.channels, event.pos, chunksize); + cache_event.afile->readChunk(cache_event.channels, cache_event.pos, + chunksize); } -void AudioCacheEventHandler::handleCloseEvent(CacheEvent& e) +void AudioCacheEventHandler::handleCloseEvent(CacheEvent& cache_event) { std::lock_guard<std::mutex> lock(mutex); - handleCloseCache(e.id); + handleCloseCache(cache_event.id); } void AudioCacheEventHandler::handleCloseCache(cacheid_t cacheid) { - auto& cache = idManager.getCache(cacheid); + auto& cache = id_manager.getCache(cacheid); files.releaseFile(cache.afile->getFilename()); delete[] cache.front; delete[] cache.back; - idManager.releaseID(cacheid); + id_manager.releaseID(cacheid); } -void AudioCacheEventHandler::handleEvent(CacheEvent& e) +void AudioCacheEventHandler::handleEvent(CacheEvent& cache_event) { - switch(e.eventType) + switch(cache_event.eventType) { case EventType::LoadNext: - handleLoadNextEvent(e); + handleLoadNextEvent(cache_event); break; case EventType::Close: - handleCloseEvent(e); + handleCloseEvent(cache_event); break; } } @@ -268,25 +269,25 @@ void AudioCacheEventHandler::thread_main() continue; } - CacheEvent e = eventqueue->front(); + CacheEvent cache_event = eventqueue->front(); eventqueue->pop_front(); mutex.unlock(); - // TODO: Skip event if e.pos < cache.pos - //if(!e.active) + // TODO: Skip event if cache_event.pos < cache.pos + //if(!cache_event.active) //{ // continue; //} - handleEvent(e); + handleEvent(cache_event); } } -void AudioCacheEventHandler::pushEvent(CacheEvent& event) +void AudioCacheEventHandler::pushEvent(CacheEvent& cache_event) { if(!threaded) { - handleEvent(event); + handleEvent(cache_event); return; } @@ -295,18 +296,19 @@ void AudioCacheEventHandler::pushEvent(CacheEvent& event) bool found = false; - if(event.eventType == EventType::LoadNext) + if(cache_event.eventType == EventType::LoadNext) { - for(auto& queuedEvent : *eventqueue) + for(auto& queued_event : *eventqueue) { - if((queuedEvent.eventType == EventType::LoadNext) && - (event.afile->getFilename() == queuedEvent.afile->getFilename()) && - (event.pos == queuedEvent.pos)) + if((queued_event.eventType == EventType::LoadNext) && + (cache_event.afile->getFilename() == + queued_event.afile->getFilename()) && + (cache_event.pos == queued_event.pos)) { // Append channel and buffer to the existing event. - queuedEvent.channels.insert(queuedEvent.channels.end(), - event.channels.begin(), - event.channels.end()); + queued_event.channels.insert(queued_event.channels.end(), + cache_event.channels.begin(), + cache_event.channels.end()); found = true; break; } @@ -316,7 +318,7 @@ void AudioCacheEventHandler::pushEvent(CacheEvent& event) if(!found) { // The event was not already on the list, create a new one. - eventqueue->push_back(event); + eventqueue->push_back(cache_event); } } diff --git a/src/audiocacheeventhandler.h b/src/audiocacheeventhandler.h index 733c80e..daf7bb9 100644 --- a/src/audiocacheeventhandler.h +++ b/src/audiocacheeventhandler.h @@ -43,7 +43,7 @@ class AudioCacheEventHandler : protected Thread { public: - AudioCacheEventHandler(AudioCacheIDManager& idManager); + AudioCacheEventHandler(AudioCacheIDManager& id_manager); ~AudioCacheEventHandler(); //! Start event handler thread. @@ -80,22 +80,26 @@ public: AudioCacheFile& openFile(const std::string& filename); protected: - AudioCacheFiles files; + void clearEvents(); - std::mutex mutex; + void handleLoadNextEvent(CacheEvent& cache_event); - void clearEvents(); + //! Lock the mutex and calls handleCloseCache + void handleCloseEvent(CacheEvent& cache_event); - void handleLoadNextEvent(CacheEvent& e); - void handleCloseEvent(CacheEvent& e); + //! Close decrease the file ref and release the cache id. void handleCloseCache(cacheid_t cacheid); - void handleEvent(CacheEvent& e); + void handleEvent(CacheEvent& cache_event); // From Thread void thread_main() override; - void pushEvent(CacheEvent& e); + void pushEvent(CacheEvent& cache_event); + + AudioCacheFiles files; + + std::mutex mutex; std::list<CacheEvent>* eventqueue; @@ -104,7 +108,7 @@ protected: Semaphore sem_run; bool running{false}; - AudioCacheIDManager& idManager; + AudioCacheIDManager& id_manager; size_t chunksize{1024}; }; diff --git a/src/audiocachefile.cc b/src/audiocachefile.cc index 039a46d..916ecb7 100644 --- a/src/audiocachefile.cc +++ b/src/audiocachefile.cc @@ -88,7 +88,8 @@ void AudioCacheFile::readChunk(const CacheChannels& channels, if((int)pos > sf_info.frames) { - printf("pos (%d) > sf_info.frames (%d)\n", (int)pos, (int)sf_info.frames); + WARN(cache, "pos (%d) > sf_info.frames (%d)\n", + (int)pos, (int)sf_info.frames); return; } diff --git a/src/audiocachefile.h b/src/audiocachefile.h index 2f988e2..9910563 100644 --- a/src/audiocachefile.h +++ b/src/audiocachefile.h @@ -29,20 +29,21 @@ #include <string> #include <list> #include <map> + #include <mutex> +#include "mutex.h" #include <sndfile.h> #include <audiotypes.h> -#include "mutex.h" - +//! Channel data container in the cache world. class CacheChannel { public: - size_t channel; - sample_t* samples; - size_t num_samples; - volatile bool* ready; + size_t channel; //< Channel number + sample_t* samples; //< Sample buffer pointer. + size_t num_samples; //< Number of samples in the sample buffer + volatile bool* ready; //< Is set to tru when the loading is done. }; using CacheChannels = std::list<CacheChannel>; diff --git a/src/audiocacheidmanager.cc b/src/audiocacheidmanager.cc index 87aaa41..a3e16a0 100644 --- a/src/audiocacheidmanager.cc +++ b/src/audiocacheidmanager.cc @@ -29,10 +29,6 @@ #include <limits> #include <assert.h> -AudioCacheIDManager::AudioCacheIDManager() -{ -} - AudioCacheIDManager::~AudioCacheIDManager() { assert(availableids.size() == id2cache.size()); // All ids should be released. @@ -114,15 +110,15 @@ void AudioCacheIDManager::disableActive() std::vector<cacheid_t> AudioCacheIDManager::getActiveIDs() { - std::vector<cacheid_t> activeIDs; + std::vector<cacheid_t> active_ids; for(auto& cache : id2cache) { if(cache.id != CACHE_NOID) { - activeIDs.push_back(cache.id); + active_ids.push_back(cache.id); } } - return activeIDs; + return active_ids; } diff --git a/src/audiocacheidmanager.h b/src/audiocacheidmanager.h index 1975973..70f7ce1 100644 --- a/src/audiocacheidmanager.h +++ b/src/audiocacheidmanager.h @@ -60,21 +60,25 @@ typedef struct { class AudioCacheIDManager { friend class AudioCacheEventHandler; public: - AudioCacheIDManager(); + AudioCacheIDManager() = default; ~AudioCacheIDManager(); + //! Initialise id lists with specified capacity. + //! Exceeding this capacity will result in CACHE_DUMMYID on calls to + //! registerID. void init(unsigned int capacity); - // #thread safe - // #hard real-time safe + //! Get the cache object connected with the specified cacheid. + //! Note: The cacheid MUST be active. cache_t& getCache(cacheid_t id); - // Thread safe - // Real-time safe + //! Reserve a new cache object and return its cacheid. + //! The contents of the supplied cache object will be copied to the new + //! cache object. cacheid_t registerID(const cache_t& cache); - // Thread safe - // Real-time safe + //! Release a cache object and its correseponding cacheid. + //! After this call the cacheid can no longer be used. void releaseID(cacheid_t id); protected: |