| @@ -87,7 +87,7 @@ void audiofile_read_poll(AudioFileInstance* const handlePtr) | |||
| return; | |||
| } | |||
| if (handlePtr->fileNfo.frames == 0) | |||
| if (handlePtr->fileNfo.frames == 0 || handlePtr->maxFrame == 0) | |||
| { | |||
| //fprintf(stderr, "R: no song loaded\n"); | |||
| handlePtr->needsRead = false; | |||
| @@ -204,11 +204,37 @@ void audiofile_read_poll(AudioFileInstance* const handlePtr) | |||
| handlePtr->needsRead = false; | |||
| } | |||
| static void audiofile_thread_idle(void* ptr) | |||
| { | |||
| AudioFileInstance* const handlePtr = (AudioFileInstance*)ptr; | |||
| while (! handlePtr->doQuit) | |||
| { | |||
| if (handlePtr->needsRead || handlePtr->lastFrame - handlePtr->pool.startFrame >= handlePtr->pool.size*3/4) | |||
| audiofile_read_poll(handlePtr); | |||
| else | |||
| usleep(50*1000); | |||
| } | |||
| pthread_exit(NULL); | |||
| } | |||
| void audiofile_load_filename(AudioFileInstance* const handlePtr, const char* const filename) | |||
| { | |||
| // wait for jack processing to end | |||
| handlePtr->doProcess = false; | |||
| pthread_mutex_lock(&handlePtr->mutex); | |||
| handlePtr->maxFrame = 0; | |||
| handlePtr->pool.startFrame = 0; | |||
| // stop thread | |||
| if (! handlePtr->doQuit) | |||
| { | |||
| handlePtr->doQuit = true; | |||
| pthread_join(handlePtr->thread, NULL); | |||
| } | |||
| pthread_mutex_unlock(&handlePtr->mutex); | |||
| // clear old data | |||
| @@ -237,6 +263,10 @@ void audiofile_load_filename(AudioFileInstance* const handlePtr, const char* con | |||
| handlePtr->maxFrame = handlePtr->fileNfo.frames; | |||
| audiofile_read_poll(handlePtr); | |||
| handlePtr->doProcess = true; | |||
| // start thread | |||
| handlePtr->doQuit = false; | |||
| pthread_create(&handlePtr->thread, NULL, (void*)&audiofile_thread_idle, handlePtr); | |||
| } | |||
| else | |||
| { | |||
| @@ -247,21 +277,6 @@ void audiofile_load_filename(AudioFileInstance* const handlePtr, const char* con | |||
| } | |||
| } | |||
| static void audiofile_thread_idle(void* ptr) | |||
| { | |||
| AudioFileInstance* const handlePtr = (AudioFileInstance*)ptr; | |||
| while (! handlePtr->doQuit) | |||
| { | |||
| if (handlePtr->needsRead || handlePtr->lastFrame - handlePtr->pool.startFrame >= handlePtr->pool.size*3/4) | |||
| audiofile_read_poll(handlePtr); | |||
| else | |||
| usleep(50*1000); | |||
| } | |||
| pthread_exit(NULL); | |||
| } | |||
| // ------------------------------------------------------------------------------------------ | |||
| static bool gADInitiated = false; | |||
| @@ -295,7 +310,7 @@ static PluginHandle audiofile_instantiate(const PluginDescriptor* _this_, HostDe | |||
| handlePtr->loopMode = true; | |||
| handlePtr->needsRead = false; | |||
| handlePtr->doProcess = false; | |||
| handlePtr->doQuit = false; | |||
| handlePtr->doQuit = true; | |||
| ad_clear_nfo(&handlePtr->fileNfo); | |||
| pthread_mutex_init(&handlePtr->mutex, NULL); | |||
| @@ -327,8 +342,6 @@ static PluginHandle audiofile_instantiate(const PluginDescriptor* _this_, HostDe | |||
| zeroFloat(handlePtr->pool.buffer[0], handlePtr->pool.size); | |||
| zeroFloat(handlePtr->pool.buffer[1], handlePtr->pool.size); | |||
| pthread_create(&handlePtr->thread, NULL, (void*)&audiofile_thread_idle, handlePtr); | |||
| return handlePtr; | |||
| // unused | |||
| @@ -341,10 +354,15 @@ static void audiofile_cleanup(PluginHandle handle) | |||
| // wait for processing to end | |||
| handlePtr->doProcess = false; | |||
| handlePtr->doQuit = true; | |||
| pthread_mutex_lock(&handlePtr->mutex); | |||
| pthread_join(handlePtr->thread, NULL); | |||
| // stop thread | |||
| if (! handlePtr->doQuit) | |||
| { | |||
| handlePtr->doQuit = true; | |||
| pthread_join(handlePtr->thread, NULL); | |||
| } | |||
| pthread_mutex_unlock(&handlePtr->mutex); | |||
| pthread_mutex_destroy(&handlePtr->mutex); | |||
| @@ -370,8 +388,7 @@ static void audiofile_cleanup(PluginHandle handle) | |||
| static uint32_t audiofile_get_parameter_count(PluginHandle handle) | |||
| { | |||
| // FIXME - loop mode needs fixing | |||
| return 0; | |||
| return 1; | |||
| // unused | |||
| (void)handle; | |||