|
|
@@ -88,13 +88,29 @@ void audiofile_read_poll(AudioFileInstance* const handlePtr) |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
const int64_t lastFrame = handlePtr->lastFrame; |
|
|
|
int64_t lastFrame = handlePtr->lastFrame; |
|
|
|
int64_t readFrame = lastFrame; |
|
|
|
|
|
|
|
if (lastFrame >= handlePtr->maxFrame) |
|
|
|
{ |
|
|
|
fprintf(stderr, "R: transport out of bounds\n"); |
|
|
|
handlePtr->needsRead = false; |
|
|
|
return; |
|
|
|
if (handlePtr->loopMode) |
|
|
|
{ |
|
|
|
if (handlePtr->maxFrame >= handlePtr->pool.size) |
|
|
|
{ |
|
|
|
readFrame %= handlePtr->maxFrame; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
readFrame = 0; |
|
|
|
lastFrame -= lastFrame % handlePtr->maxFrame; |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
//fprintf(stderr, "R: transport out of bounds\n"); |
|
|
|
handlePtr->needsRead = false; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// temp data buffer |
|
|
@@ -104,9 +120,9 @@ void audiofile_read_poll(AudioFileInstance* const handlePtr) |
|
|
|
zeroFloat(tmpData, tmpSize); |
|
|
|
|
|
|
|
{ |
|
|
|
fprintf(stderr, "R: poll data - reading at %li:%02li\n", lastFrame/44100/60, (lastFrame/44100) % 60); |
|
|
|
fprintf(stderr, "R: poll data - reading at %li:%02li\n", readFrame/44100/60, (readFrame/44100) % 60); |
|
|
|
|
|
|
|
ad_seek(handlePtr->filePtr, lastFrame); |
|
|
|
ad_seek(handlePtr->filePtr, readFrame); |
|
|
|
ssize_t i, j, rv = ad_read(handlePtr->filePtr, tmpData, tmpSize); |
|
|
|
i = j = 0; |
|
|
|
|
|
|
@@ -135,10 +151,40 @@ void audiofile_read_poll(AudioFileInstance* const handlePtr) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (; i < handlePtr->pool.size; i++) |
|
|
|
if (handlePtr->loopMode && readFrame+j == handlePtr->maxFrame) |
|
|
|
{ |
|
|
|
handlePtr->pool.buffer[0][i] = 0.0f; |
|
|
|
handlePtr->pool.buffer[1][i] = 0.0f; |
|
|
|
while (i < handlePtr->pool.size) |
|
|
|
{ |
|
|
|
for (j=0; i < handlePtr->pool.size && j < rv; j++) |
|
|
|
{ |
|
|
|
if (handlePtr->fileNfo.channels == 1) |
|
|
|
{ |
|
|
|
handlePtr->pool.buffer[0][i] = tmpData[j]; |
|
|
|
handlePtr->pool.buffer[1][i] = tmpData[j]; |
|
|
|
i++; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
if (j % 2 == 0) |
|
|
|
{ |
|
|
|
handlePtr->pool.buffer[0][i] = tmpData[j]; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
handlePtr->pool.buffer[1][i] = tmpData[j]; |
|
|
|
i++; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
for (; i < handlePtr->pool.size; i++) |
|
|
|
{ |
|
|
|
handlePtr->pool.buffer[0][i] = 0.0f; |
|
|
|
handlePtr->pool.buffer[1][i] = 0.0f; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
handlePtr->pool.startFrame = lastFrame; |
|
|
@@ -388,7 +434,8 @@ static void audiofile_set_parameter_value(PluginHandle handle, uint32_t index, f |
|
|
|
if (index != 0) |
|
|
|
return; |
|
|
|
|
|
|
|
handlePtr->loopMode = (value > 0.5f); |
|
|
|
handlePtr->loopMode = (value > 0.5f); |
|
|
|
handlePtr->needsRead = true; |
|
|
|
} |
|
|
|
|
|
|
|
static void audiofile_set_program(PluginHandle handle, uint32_t bank, uint32_t program) |
|
|
@@ -467,23 +514,29 @@ static void audiofile_process(PluginHandle handle, float** inBuffer, float** out |
|
|
|
{ |
|
|
|
AudioFileInstance* const handlePtr = (AudioFileInstance*)handle; |
|
|
|
|
|
|
|
const TimeInfo* const timePos = handlePtr->host->get_time_info(handlePtr->host->handle); |
|
|
|
|
|
|
|
float* out1 = outBuffer[0]; |
|
|
|
float* out2 = outBuffer[1]; |
|
|
|
|
|
|
|
if (! handlePtr->doProcess) |
|
|
|
{ |
|
|
|
//fprintf(stderr, "P: no process\n"); |
|
|
|
handlePtr->lastFrame = timePos->frame; |
|
|
|
|
|
|
|
zeroFloat(out1, frames); |
|
|
|
zeroFloat(out2, frames); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
const TimeInfo* const timePos = handlePtr->host->get_time_info(handlePtr->host->handle); |
|
|
|
|
|
|
|
// not playing |
|
|
|
if (! timePos->playing) |
|
|
|
{ |
|
|
|
//fprintf(stderr, "P: not rolling\n"); |
|
|
|
|
|
|
|
if (timePos->frame == 0 && handlePtr->lastFrame > 0) |
|
|
|
handlePtr->needsRead = true; |
|
|
|
|
|
|
|
handlePtr->lastFrame = timePos->frame; |
|
|
|
|
|
|
|
zeroFloat(out1, frames); |
|
|
@@ -494,7 +547,7 @@ static void audiofile_process(PluginHandle handle, float** inBuffer, float** out |
|
|
|
pthread_mutex_lock(&handlePtr->mutex); |
|
|
|
|
|
|
|
// out of reach |
|
|
|
if (timePos->frame + frames < handlePtr->pool.startFrame || timePos->frame >= handlePtr->maxFrame) |
|
|
|
if (timePos->frame + frames < handlePtr->pool.startFrame || (timePos->frame >= handlePtr->maxFrame && ! handlePtr->loopMode)) |
|
|
|
{ |
|
|
|
//fprintf(stderr, "P: non-continuous playback, out of reach %u vs %u\n", timePos->frame + frames, handlePtr->maxFrame); |
|
|
|
handlePtr->lastFrame = timePos->frame; |
|
|
|