More NDSP wavebuf queue fixes

This commit is contained in:
fincs 2015-10-24 21:56:40 +02:00
parent a35abcb901
commit f362ae62a0

View File

@ -145,9 +145,9 @@ void ndspChnWaveBufAdd(int id, ndspWaveBuf* buf)
ndspChnSt* chn = &ndspChn[id]; ndspChnSt* chn = &ndspChn[id];
if (!buf->nsamples) return; if (!buf->nsamples) return;
LightLock_Lock(&chn->lock);
buf->next = NULL; buf->next = NULL;
buf->status = NDSP_WBUF_QUEUED; buf->status = NDSP_WBUF_QUEUED;
LightLock_Lock(&chn->lock);
ndspWaveBuf* cb = chn->waveBuf; ndspWaveBuf* cb = chn->waveBuf;
if (cb) if (cb)
@ -369,23 +369,28 @@ void ndspiReadChnState(void)
ndspWaveBuf* wb = chn->waveBuf; ndspWaveBuf* wb = chn->waveBuf;
if (wb) if (wb)
{ {
ndspWaveBuf* doneList = NULL;
if (chn->wavBufCount) if (chn->wavBufCount)
{ {
while (wb->sequence_id != seqId) while (wb->sequence_id != seqId)
{ {
chn->wavBufCount--; chn->wavBufCount--;
bool shouldBreak = seqId == 0 && (wb->sequence_id == st->lastSeqId || st->lastSeqId == 0); bool shouldBreak = seqId == 0 && (wb->sequence_id == st->lastSeqId || st->lastSeqId == 0);
wb->status = NDSP_WBUF_DONE; ndspWaveBuf* next = wb->next;
wb = wb->next; wb->next = doneList;
doneList = wb;
wb = next;
if (!wb || shouldBreak || chn->wavBufCount == 0) if (!wb || shouldBreak || chn->wavBufCount == 0)
break; break;
} }
if (wb && wb->status != NDSP_WBUF_DONE) if (wb)
wb->status = NDSP_WBUF_PLAYING; wb->status = NDSP_WBUF_PLAYING;
} }
if (seqId == 0) if (seqId == 0)
chn->wavBufCount = 0; chn->wavBufCount = 0;
chn->waveBuf = wb; chn->waveBuf = wb;
for (; doneList; doneList = doneList->next)
doneList->status = NDSP_WBUF_DONE;
} }
LightLock_Unlock(&chn->lock); LightLock_Unlock(&chn->lock);
} }