Browse Source

Fix audiofile plugin thread usage

tags/1.9.4
falkTX 11 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;
}

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;


Loading…
Cancel
Save