summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2016-03-13 17:32:24 +0100
committerBent Bisballe Nyeng <deva@aasimon.org>2016-03-13 17:32:24 +0100
commit28b5df96c2fc89652c724e48ad1ce352228450c6 (patch)
treece74a6e1bf401bd666949cfa1c5324306d7fc3d2 /src
parent08a929d3d32e50e7787428d130289c0f5fc2ff42 (diff)
Only open AudioCacheFile if needed.
Diffstat (limited to 'src')
-rw-r--r--src/audiocache.cc20
-rw-r--r--src/audiocacheeventhandler.cc40
2 files changed, 34 insertions, 26 deletions
diff --git a/src/audiocache.cc b/src/audiocache.cc
index 1aa0320..bb53646 100644
--- a/src/audiocache.cc
+++ b/src/audiocache.cc
@@ -121,8 +121,8 @@ sample_t* AudioCache::open(const AudioFile& file, size_t initial_samples_needed,
c.preloaded_samples = file.data;
c.preloaded_samples_size = cropped_size;
- // Next read from disk will read from this point.
- c.pos = cropped_size;//c.preloaded_samples_size;
+ // Next potential read from disk will read from this point.
+ c.pos = cropped_size;
// Only load next buffer if there is more data in the file to be loaded...
if(c.pos < file.size)
@@ -160,7 +160,15 @@ sample_t* AudioCache::next(cacheid_t id, size_t& size)
if(c.localpos < c.preloaded_samples_size)
{
sample_t* s = c.preloaded_samples + c.localpos;
+
+ if((c.localpos + framesize) > c.preloaded_samples_size)
+ {
+ // Only a partial frame is returned. Reflect this in the size
+ size = c.preloaded_samples_size - c.localpos;
+ }
+
c.localpos += framesize;
+
return s;
}
@@ -196,6 +204,7 @@ sample_t* AudioCache::next(cacheid_t id, size_t& size)
c.pos += CHUNKSIZE(framesize);
// Does the file have remaining unread samples?
+ assert(c.afile); // Assert that we have an audio file.
if(c.pos < c.afile->getSize())
{
// Do we have a back buffer to read into?
@@ -232,13 +241,6 @@ void AudioCache::close(cacheid_t id)
return;
}
- cache_t& cache = id_manager.getCache(id);
- if(cache.afile == nullptr)
- {
- // The file was never opened. It was played entirely from preloaded data.
- return;
- }
-
event_handler.pushCloseEvent(id);
}
diff --git a/src/audiocacheeventhandler.cc b/src/audiocacheeventhandler.cc
index c639242..916b04d 100644
--- a/src/audiocacheeventhandler.cc
+++ b/src/audiocacheeventhandler.cc
@@ -213,6 +213,8 @@ void AudioCacheEventHandler::clearEvents()
void AudioCacheEventHandler::handleLoadNextEvent(CacheEvent& cache_event)
{
+ assert(cache_event.afile); // Assert that we have an audio file
+
cache_event.afile->readChunk(cache_event.channels, cache_event.pos,
chunksize);
}
@@ -227,7 +229,11 @@ void AudioCacheEventHandler::handleCloseCache(cacheid_t id)
{
auto& cache = id_manager.getCache(id);
- files.releaseFile(cache.afile->getFilename());
+ // Only close the file if we have also opened it.
+ if(cache.afile)
+ {
+ files.releaseFile(cache.afile->getFilename());
+ }
delete[] cache.front;
delete[] cache.back;
@@ -267,12 +273,6 @@ void AudioCacheEventHandler::thread_main()
eventqueue.pop_front();
mutex.unlock();
- // TODO: Skip event if cache_event.pos < cache.pos
- //if(!cache_event.active)
- //{
- // continue;
- //}
-
handleEvent(cache_event);
}
}
@@ -294,17 +294,23 @@ void AudioCacheEventHandler::pushEvent(CacheEvent& cache_event)
{
for(auto& queued_event : eventqueue)
{
- if((queued_event.event_type == EventType::LoadNext) &&
- (cache_event.afile->getFilename() ==
- queued_event.afile->getFilename()) &&
- (cache_event.pos == queued_event.pos))
+ if(queued_event.event_type == EventType::LoadNext)
{
- // Append channel and buffer to the existing event.
- queued_event.channels.insert(queued_event.channels.end(),
- cache_event.channels.begin(),
- cache_event.channels.end());
- found = true;
- break;
+
+ assert(cache_event.afile); // Assert that we have an audio file
+ assert(queued_event.afile); // Assert that we have an audio file
+
+ if((cache_event.afile->getFilename() ==
+ queued_event.afile->getFilename()) &&
+ (cache_event.pos == queued_event.pos))
+ {
+ // Append channel and buffer to the existing event.
+ queued_event.channels.insert(queued_event.channels.end(),
+ cache_event.channels.begin(),
+ cache_event.channels.end());
+ found = true;
+ break;
+ }
}
}
}