]> Chaos Git - corbenik/ctrulib.git/commitdiff
NDSP: some more safety checks and fixes
authorfincs <fincs.alt1@gmail.com>
Sat, 24 Oct 2015 11:47:31 +0000 (13:47 +0200)
committerfincs <fincs.alt1@gmail.com>
Sat, 24 Oct 2015 11:47:31 +0000 (13:47 +0200)
libctru/source/ndsp/ndsp.c

index a28dfcdb1fe7039ab8719904950024324a09800c..b885a2ee6c0f3be963b7f62e724ae9acfa27797e 100644 (file)
@@ -278,9 +278,11 @@ static void ndspFinalize(bool suspend)
                bool ready;
                DSP_RecvDataIsReady(0, &ready);
                if (ready)
+               {
                        DSP_RecvData(0, &val);
-               if (val == 1)
-                       break;
+                       if (val == 1)
+                               break;
+               }
        }
        if (suspend)
                memcpy(dspVar5Backup, ndspVars[5][0], sizeof(dspVar5Backup));
@@ -464,8 +466,9 @@ Result ndspInit(void)
        if (rc==0)
        {
                u8 outMode;
-               CFGU_GetConfigInfoBlk2(sizeof(outMode), 0x70001, &outMode);
-               ndspMaster.outputMode = outMode;
+               rc = CFGU_GetConfigInfoBlk2(sizeof(outMode), 0x70001, &outMode);
+               if (rc==0)
+                       ndspMaster.outputMode = outMode;
                exitCfgu();
        }
 
@@ -502,14 +505,20 @@ _fail0:
 
 void ndspExit(void)
 {
+       if (!ndspRefCount) return;
        if (--ndspRefCount) return;
        if (!bDspReady) return;
        ndspThreadRun = false;
+       if (bSleeping)
+               svcSignalEvent(sleepEvent);
        svcWaitSynchronization(ndspThread, U64_MAX);
        svcCloseHandle(ndspThread);
        svcCloseHandle(sleepEvent);
        aptUnhook(&aptCookie);
-       ndspFinalize(false);
+       if (!bSleeping)
+               ndspFinalize(false);
+       bSleeping = false;
+       bNeedsSync = false;
        dspExit();
        if (componentFree)
        {