diff options
| -rw-r--r-- | src/audiocache.cc | 20 | ||||
| -rw-r--r-- | src/audiocacheeventhandler.cc | 40 | 
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; +					}  				}  			}  		} | 
