Browse Source

Fix audiofile plugin thread usage

tags/1.9.4
falkTX 12 years ago
parent
commit
a3c9330655
1 changed files with 40 additions and 23 deletions
  1. +40
    -23
      source/backend/native/audiofile.c

+ 40
- 23
source/backend/native/audiofile.c View File

@@ -87,7 +87,7 @@ void audiofile_read_poll(AudioFileInstance* const handlePtr)
return; return;
} }


if (handlePtr->fileNfo.frames == 0)
if (handlePtr->fileNfo.frames == 0 || handlePtr->maxFrame == 0)
{ {
//fprintf(stderr, "R: no song loaded\n"); //fprintf(stderr, "R: no song loaded\n");
handlePtr->needsRead = false; handlePtr->needsRead = false;
@@ -204,11 +204,37 @@ void audiofile_read_poll(AudioFileInstance* const handlePtr)
handlePtr->needsRead = false; 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) void audiofile_load_filename(AudioFileInstance* const handlePtr, const char* const filename)
{ {
// wait for jack processing to end // wait for jack processing to end
handlePtr->doProcess = false; handlePtr->doProcess = false;
pthread_mutex_lock(&handlePtr->mutex); 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); pthread_mutex_unlock(&handlePtr->mutex);


// clear old data // clear old data
@@ -237,6 +263,10 @@ void audiofile_load_filename(AudioFileInstance* const handlePtr, const char* con
handlePtr->maxFrame = handlePtr->fileNfo.frames; handlePtr->maxFrame = handlePtr->fileNfo.frames;
audiofile_read_poll(handlePtr); audiofile_read_poll(handlePtr);
handlePtr->doProcess = true; handlePtr->doProcess = true;

// start thread
handlePtr->doQuit = false;
pthread_create(&handlePtr->thread, NULL, (void*)&audiofile_thread_idle, handlePtr);
} }
else 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; static bool gADInitiated = false;
@@ -295,7 +310,7 @@ static PluginHandle audiofile_instantiate(const PluginDescriptor* _this_, HostDe
handlePtr->loopMode = true; handlePtr->loopMode = true;
handlePtr->needsRead = false; handlePtr->needsRead = false;
handlePtr->doProcess = false; handlePtr->doProcess = false;
handlePtr->doQuit = false;
handlePtr->doQuit = true;


ad_clear_nfo(&handlePtr->fileNfo); ad_clear_nfo(&handlePtr->fileNfo);
pthread_mutex_init(&handlePtr->mutex, NULL); 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[0], handlePtr->pool.size);
zeroFloat(handlePtr->pool.buffer[1], handlePtr->pool.size); zeroFloat(handlePtr->pool.buffer[1], handlePtr->pool.size);


pthread_create(&handlePtr->thread, NULL, (void*)&audiofile_thread_idle, handlePtr);

return handlePtr; return handlePtr;


// unused // unused
@@ -341,10 +354,15 @@ static void audiofile_cleanup(PluginHandle handle)


// wait for processing to end // wait for processing to end
handlePtr->doProcess = false; handlePtr->doProcess = false;
handlePtr->doQuit = true;
pthread_mutex_lock(&handlePtr->mutex); 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_unlock(&handlePtr->mutex);
pthread_mutex_destroy(&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) static uint32_t audiofile_get_parameter_count(PluginHandle handle)
{ {
// FIXME - loop mode needs fixing
return 0;
return 1;


// unused // unused
(void)handle; (void)handle;


Loading…
Cancel
Save