| 182 | } |
| 183 | |
| 184 | Result csndInit(void) |
| 185 | { |
| 186 | Result ret=0; |
| 187 | |
| 188 | if (AtomicPostIncrement(&csndRefCount)) return ret; |
| 189 | |
| 190 | ret = srvGetServiceHandle(&csndHandle, "csnd:SND"); |
| 191 | if (R_FAILED(ret)) goto cleanup0; |
| 192 | |
| 193 | // Calculate offsets and sizes required by the CSND module |
| 194 | csndOffsets[0] = csndCmdBlockSize; // Offset to DSP semaphore and irq disable flags |
| 195 | csndOffsets[1] = csndOffsets[0] + 8; // Offset to sound channel information |
| 196 | csndOffsets[2] = csndOffsets[1] + 32*sizeof(CSND_ChnInfo); // Offset to capture unit information |
| 197 | csndOffsets[3] = csndOffsets[2] + 2*8; // Offset to the input of command 0x00040080 |
| 198 | csndSharedMemSize = csndOffsets[3] + 0x3C; // Total size of the CSND shared memory |
| 199 | |
| 200 | ret = CSND_Initialize(&csndMutex, &csndSharedMemBlock, csndSharedMemSize, csndOffsets); |
| 201 | if (R_FAILED(ret)) goto cleanup1; |
| 202 | |
| 203 | csndSharedMem = (vu32*)mappableAlloc(csndSharedMemSize); |
| 204 | if(!csndSharedMem) |
| 205 | { |
| 206 | ret = -1; |
| 207 | goto cleanup1; |
| 208 | } |
| 209 | |
| 210 | ret = svcMapMemoryBlock(csndSharedMemBlock, (u32)csndSharedMem, MEMPERM_READWRITE, MEMPERM_DONTCARE); |
| 211 | if (R_FAILED(ret)) goto cleanup2; |
| 212 | |
| 213 | memset((void*)csndSharedMem, 0, csndSharedMemSize); |
| 214 | |
| 215 | ret = CSND_AcquireSoundChannels(&csndChannels); |
| 216 | if (R_SUCCEEDED(ret)) return 0; |
| 217 | |
| 218 | cleanup2: |
| 219 | svcCloseHandle(csndSharedMemBlock); |
| 220 | if(csndSharedMem != NULL) |
| 221 | { |
| 222 | mappableFree((void*) csndSharedMem); |
| 223 | csndSharedMem = NULL; |
| 224 | } |
| 225 | cleanup1: |
| 226 | svcCloseHandle(csndHandle); |
| 227 | cleanup0: |
| 228 | AtomicDecrement(&csndRefCount); |
| 229 | return ret; |
| 230 | } |
| 231 | |
| 232 | void csndExit(void) |
| 233 | { |
nothing calls this directly
no test coverage detected