]> Chaos Git - corbenik/ctrulib.git/commitdiff
Fix NDSP wavebuf synchronization issue (thanks to Lectem)
authorfincs <fincs.alt1@gmail.com>
Fri, 23 Oct 2015 22:54:57 +0000 (00:54 +0200)
committerfincs <fincs.alt1@gmail.com>
Fri, 23 Oct 2015 22:54:57 +0000 (00:54 +0200)
libctru/include/3ds/synchronization.h
libctru/source/ndsp/ndsp-channel.c

index eb0ee841697ac6a6dc5ca83e5f35244aca96acb0..c919757ca81ba30c2fa4c6e98cedc2c55443e952 100644 (file)
@@ -18,7 +18,7 @@ typedef struct
 /// Performs a clrex operation.
 static inline void __clrex(void)
 {
-       __asm__ __volatile__("clrex");
+       __asm__ __volatile__("clrex" ::: "memory");
 }
 
 /**
index 4970bdeff6482a020b558e4816d7fcf8a955976c..36880db2aa43570f5a49643ccdb3c0f9ee484536 100644 (file)
@@ -143,12 +143,12 @@ void ndspChnWaveBufClear(int id)
 void ndspChnWaveBufAdd(int id, ndspWaveBuf* buf)
 {
        ndspChnSt* chn = &ndspChn[id];
-       ndspWaveBuf* cb = chn->waveBuf;
        if (!buf->nsamples) return;
 
        buf->next = NULL;
        buf->status = NDSP_WBUF_QUEUED;
        LightLock_Lock(&chn->lock);
+       ndspWaveBuf* cb = chn->waveBuf;
 
        if (cb)
        {
@@ -360,13 +360,13 @@ void ndspiReadChnState(void)
                if (chn->syncCount == st->syncCount)
                {
                        u16 seqId = st->curSeqId;
+                       LightLock_Lock(&chn->lock);
+
                        ndspWaveBuf* wb = chn->waveBuf;
                        chn->samplePos = ndspiRotateVal(st->samplePos);
 
                        if ((st->flags & 0xFF00) && wb)
                        {
-                               LightLock_Lock(&chn->lock);
-
                                while (wb->sequence_id != seqId)
                                {
                                        chn->wavBufCount--;
@@ -382,9 +382,9 @@ void ndspiReadChnState(void)
                                        chn->wavBufCount = 0;
                                chn->waveBuf = wb;
                                chn->waveBufSeqPos = seqId;
-                               LightLock_Unlock(&chn->lock);
                        }
 
+                       LightLock_Unlock(&chn->lock);
                }
                chn->playing = (st->flags & 0xFF) ? true : false;
        }