Result acInit(void);
/// Exits AC.
-Result acExit(void);
+void acExit(void);
/**
* @brief Gets the current Wifi status.
Result amInit(void);
/// Exits AM.
-Result amExit(void);
+void amExit(void);
/// Gets the current AM session handle.
Handle *amGetSessionHandle(void);
*
* This will internally call CAMU_DriverFinalize and close the handle of the service.
*/
-Result camExit(void);
+void camExit(void);
/**
* Begins capture on the specified camera port.
} CFG_Langage;
/// Initializes CFGU.
-Result initCfgu(void);
+Result cfguInit(void);
/// Exits CFGU.
-Result exitCfgu(void);
+void cfguExit(void);
/**
* @brief Gets the system's region from secure info.
Result csndInit(void);
/// Exits CSND.
-Result csndExit(void);
+void csndExit(void);
/**
* @brief Adds a command to the list, returning a buffer to write arguments to.
* @brief Closes the dsp service.
* @note This will also unload the DSP binary.
*/
-Result dspExit(void);
+void dspExit(void);
/**
* @brief Checks if a headphone is inserted.
Result fsInit(void);
/// Exits FS.
-Result fsExit(void);
+void fsExit(void);
/**
* @brief Gets the current FS session handle.
* @param sharedmem_addr Address of the shared memory block to use.
* @param sharedmem_size Size of the shared memory block.
*/
-Result IRU_Initialize(u32 *sharedmem_addr, u32 sharedmem_size);
+Result iruInit(u32 *sharedmem_addr, u32 sharedmem_size);
/// Shuts down IRU.
-Result IRU_Shutdown(void);
+void iruExit(void);
/**
* @brief Gets the IRU service handle.
* @return The IRU service handle.
*/
-Handle IRU_GetServHandle(void);
+Handle iruGetServHandle(void);
/**
* @brief Sends IR data.
* @param size Size of the buffer.
* @param wait Whether to wait for the data to be sent.
*/
-Result IRU_SendData(u8 *buf, u32 size, u32 wait);
+Result iruSendData(u8 *buf, u32 size, bool wait);
/**
* @brief Receives IR data.
* @param transfercount Pointer to write the bytes read to.
* @param wait Whether to wait for the data to be received.
*/
-Result IRU_RecvData(u8 *buf, u32 size, u8 flag, u32 *transfercount, u32 wait);
+Result iruRecvData(u8 *buf, u32 size, u8 flag, u32 *transfercount, bool wait);
/**
* @brief Sets the IR bit rate.
Result mvdstdInit(mvdstdMode mode, mvdstdTypeInput input_type, mvdstdTypeOutput output_type, u32 size);
/// Shuts down MVDSTD.
-Result mvdstdShutdown(void);
+void mvdstdExit(void);
/**
* @brief Sets the current configuration of MVDSTD.
Result newsInit(void);
/// Exits NEWS.
-Result newsExit(void);
+void newsExit(void);
/**
* @brief Adds a notification to the home menu Notifications applet.
Result nsInit(void);
/// Exits NS.
-Result nsExit(void);
+void nsExit(void);
/**
* @brief Launches a title.
Result pmInit(void);
/// Exits PM.
-Result pmExit(void);
+void pmExit(void);
/**
* @brief Launches a title.
Result psInit(void);
/// Exits PS.
-Result psExit(void);
+void psExit(void);
/**
* @brief Encrypts/Decrypts AES data. Does not support AES CCM.
Result ptmInit(void);
/// Exits PTM.
-Result ptmExit(void);
+void ptmExit(void);
/// Initializes ptm:sysm.
Result ptmSysmInit(void);
/// Exits ptm:sysm.
-Result ptmSysmExit(void);
+void ptmSysmExit(void);
/**
* @brief Gets the system's current shell state.
- * @param servhandle Optional pointer to the handle to use.
* @param out Pointer to write the current shell state to. (0 = closed, 1 = open)
*/
-Result PTMU_GetShellState(Handle* servhandle, u8 *out);
+Result PTMU_GetShellState(u8 *out);
/**
* @brief Gets the system's current battery level.
- * @param servhandle Optional pointer to the handle to use.
* @param out Pointer to write the current battery level to. (0-5)
*/
-Result PTMU_GetBatteryLevel(Handle* servhandle, u8 *out);
+Result PTMU_GetBatteryLevel(u8 *out);
/**
* @brief Gets the system's current battery charge state.
- * @param servhandle Optional pointer to the handle to use.
* @param out Pointer to write the current battery charge state to. (0 = not charging, 1 = charging)
*/
-Result PTMU_GetBatteryChargeState(Handle* servhandle, u8 *out);
+Result PTMU_GetBatteryChargeState(u8 *out);
/**
* @brief Gets the system's current pedometer state.
- * @param servhandle Optional pointer to the handle to use.
* @param out Pointer to write the current pedometer state to. (0 = not counting, 1 = counting)
*/
-Result PTMU_GetPedometerState(Handle* servhandle, u8 *out);
+Result PTMU_GetPedometerState(u8 *out);
/**
* @brief Gets the pedometer's total step count.
- * @param servhandle Optional pointer to the handle to use.
* @param steps Pointer to write the total step count to.
*/
-Result PTMU_GetTotalStepCount(Handle* servhandle, u32 *steps);
+Result PTMU_GetTotalStepCount(u32 *steps);
/**
* @brief Configures the New 3DS' CPU clock speed and L2 cache.
*
* This will internally call Y2RU_DriverFinalize and close the handle of the service.
*/
-Result y2rExit(void);
+void y2rExit(void);
/**
framebufferInfoHeader[0x1]=1;
}
-void (*screenFree)(void *) = NULL;
+static void (*screenFree)(void *) = NULL;
void gfxInit(GSP_FramebufferFormats topFormat, GSP_FramebufferFormats bottomFormat, bool vrambuffers)
{
#include <stdlib.h>
#include <string.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/os.h>
#include <3ds/synchronization.h>
Result rc;
rc = ndspLoadComponent();
- if (rc) return rc;
+ if (R_FAILED(rc)) return rc;
rc = svcCreateEvent(&irqEvent, 1);
- if (rc) goto _fail1;
+ if (R_FAILED(rc)) goto _fail1;
rc = DSP_RegisterInterruptEvents(irqEvent, 2, 2);
- if (rc) goto _fail2;
+ if (R_FAILED(rc)) goto _fail2;
rc = DSP_GetSemaphoreHandle(&dspSem);
- if (rc) goto _fail3;
+ if (R_FAILED(rc)) goto _fail3;
DSP_SetSemaphoreMask(0x2000);
componentFree = false;
}
-bool ndspFindAndLoadComponent(void)
+static bool ndspFindAndLoadComponent(void)
{
extern Handle __get_handle_from_list(const char* name);
Result rc;
FS_path path = { PATH_CHAR, sizeof(dsp_filename), (u8*)dsp_filename };
rc = FSUSER_OpenFileDirectly(&rsrc, arch, path, FS_OPEN_READ, FS_ATTRIBUTE_NONE);
- if (rc) break;
+ if (R_FAILED(rc)) break;
u64 size = 0;
rc = FSFILE_GetSize(rsrc, &size);
- if (rc) { FSFILE_Close(rsrc); break; }
+ if (R_FAILED(rc)) { FSFILE_Close(rsrc); break; }
bin = malloc(size);
if (!bin) { FSFILE_Close(rsrc); break; }
u32 dummy = 0;
rc = FSFILE_Read(rsrc, &dummy, 0, bin, size);
FSFILE_Close(rsrc);
- if (rc) { free(bin); return false; }
+ if (R_FAILED(rc)) { free(bin); return false; }
componentBin = bin;
componentSize = size;
extern u32 fake_heap_end;
u32 mapAddr = (fake_heap_end+0xFFF) &~ 0xFFF;
rc = svcMapMemoryBlock(rsrc, mapAddr, 0x3, 0x3);
- if (rc) break;
+ if (R_FAILED(rc)) break;
componentSize = *(u32*)(mapAddr + 0x104);
bin = malloc(componentSize);
Result ndspInit(void)
{
Result rc = 0;
- if (ndspRefCount++) return 0;
+ if (AtomicPostIncrement(&ndspRefCount)) return 0;
if (!componentBin && !ndspFindAndLoadComponent())
{
- rc = 1018 | (41 << 10) | (4 << 21) | (27 << 27);
+ rc = MAKERESULT(RL_PERMANENT, RS_NOTFOUND, 41, RD_NOT_FOUND);
goto _fail0;
}
ndspInitMaster();
ndspiInitChn();
- rc = initCfgu();
- if (rc==0)
+ rc = cfguInit();
+ if (R_SUCCEEDED(rc))
{
u8 outMode;
rc = CFGU_GetConfigInfoBlk2(sizeof(outMode), 0x70001, &outMode);
- if (rc==0)
+ if (R_SUCCEEDED(rc))
ndspMaster.outputMode = outMode;
- exitCfgu();
+ cfguExit();
}
rc = dspInit();
- if (rc) return rc;
+ if (R_FAILED(rc)) return rc;
rc = ndspInitialize(false);
- if (rc) goto _fail1;
+ if (R_FAILED(rc)) goto _fail1;
rc = svcCreateEvent(&sleepEvent, 0);
- if (rc) goto _fail2;
+ if (R_FAILED(rc)) goto _fail2;
rc = svcCreateThread(&ndspThread, ndspThreadMain, 0x0, (u32*)(&ndspThreadStack[NDSP_THREAD_STACK_SIZE/8]), 0x31, -2);
- if (rc) goto _fail3;
+ if (R_FAILED(rc)) goto _fail3;
aptHook(&aptCookie, ndspAptHook, NULL);
return 0;
componentBin = NULL;
}
_fail0:
- ndspRefCount--;
+ AtomicDecrement(&ndspRefCount);
return rc;
}
void ndspExit(void)
{
- if (!ndspRefCount) return;
- if (--ndspRefCount) return;
+ if (AtomicDecrement(&ndspRefCount)) return;
if (!bDspReady) return;
ndspThreadRun = false;
if (bSleeping)
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/os.h>
#include <3ds/svc.h>
#include <3ds/services/ptm.h>
void __ctru_speedup_config(void)
{
- if (ptmSysmInit()==0)
+ if (R_SUCCEEDED(ptmSysmInit()))
{
PTMSYSM_ConfigureNew3DSCPU(__ctru_speedup ? 3 : 0);
ptmSysmExit();
#include <unistd.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/romfs.h>
#include <3ds/services/fs.h>
u64 pos = (u64)romFS_offset + offset;
u32 read = 0;
Result rc = FSFILE_Read(romFS_file, &read, pos, buffer, size);
- if (rc) return -1;
+ if (R_FAILED(rc)) return -1;
return read;
}
FS_path path = { PATH_WCHAR, (units+1)*2, (u8*)__utf16path };
Result rc = FSUSER_OpenFileDirectly(&romFS_file, arch, path, FS_OPEN_READ, FS_ATTRIBUTE_NONE);
- if (rc) return rc;
+ if (R_FAILED(rc)) return rc;
_3DSX_Header hdr;
if (!_romfs_read_chk(0, &hdr, sizeof(hdr))) goto _fail0;
FS_path path = { PATH_BINARY, sizeof(zeros), zeros };
Result rc = FSUSER_OpenFileDirectly(&romFS_file, arch, path, FS_OPEN_READ, FS_ATTRIBUTE_NONE);
- if (rc) return rc;
+ if (R_FAILED(rc)) return rc;
}
return romfsInitCommon();
#include <unistd.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/sdmc.h>
#include <3ds/services/fs.h>
#include <3ds/util/utf.h>
return rc;
rc = FSUSER_OpenArchive(&sdmcArchive);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
{
int dev = AddDevice(&sdmc_devoptab);
if(!sdmcInitialised) return rc;
rc = FSUSER_CloseArchive(&sdmcArchive);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
{
RemoveDevice("sdmc");
sdmcInitialised = false;
if((flags & O_CREAT) && (flags & O_EXCL))
{
rc = FSUSER_CreateFile(sdmcArchive, fs_path, 0);
- if(rc != 0)
+ if(R_FAILED(rc))
{
r->_errno = sdmc_translate_error(rc);
return -1;
/* open the file */
rc = FSUSER_OpenFile(&fd, sdmcArchive, fs_path,
sdmc_flags, attributes);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
{
if((flags & O_ACCMODE) != O_RDONLY && (flags & O_TRUNC))
{
rc = FSFILE_SetSize(fd, 0);
- if(rc != 0)
+ if(R_FAILED(rc))
{
FSFILE_Close(fd);
r->_errno = sdmc_translate_error(rc);
sdmc_file_t *file = (sdmc_file_t*)fd;
rc = FSFILE_Close(file->fd);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
return 0;
r->_errno = sdmc_translate_error(rc);
{
/* append means write from the end of the file */
rc = FSFILE_GetSize(file->fd, &file->offset);
- if(rc != 0)
+ if(R_FAILED(rc))
{
r->_errno = sdmc_translate_error(rc);
return -1;
/* write the data */
rc = FSFILE_Write(file->fd, &bytes, file->offset,
(u32*)tmp_buffer, (u32)toWrite, sync);
- if(rc != 0)
+ if(R_FAILED(rc))
{
/* return partial transfer */
if(bytesWritten > 0)
/* read the data */
rc = FSFILE_Read(file->fd, &bytes, file->offset, (u32*)ptr, (u32)len);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
{
/* update current file offset */
file->offset += bytes;
/* set position relative to the end of the file */
case SEEK_END:
rc = FSFILE_GetSize(file->fd, &offset);
- if(rc != 0)
+ if(R_FAILED(rc))
{
r->_errno = sdmc_translate_error(rc);
return -1;
sdmc_file_t *file = (sdmc_file_t*)fd;
rc = FSFILE_GetSize(file->fd, &size);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
{
memset(st, 0, sizeof(struct stat));
st->st_size = (off_t)size;
if(fs_path.data == NULL)
return -1;
- if((rc = FSUSER_OpenFile(&fd, sdmcArchive, fs_path,
- FS_OPEN_READ, FS_ATTRIBUTE_NONE)) == 0)
+ if(R_SUCCEEDED(rc = FSUSER_OpenFile(&fd, sdmcArchive, fs_path,
+ FS_OPEN_READ, FS_ATTRIBUTE_NONE)))
{
sdmc_file_t tmpfd = { .fd = fd };
rc = sdmc_fstat(r, (int)&tmpfd, st);
return rc;
}
- else if((rc = FSUSER_OpenDirectory(&fd, sdmcArchive, fs_path)) == 0)
+ else if(R_SUCCEEDED(rc = FSUSER_OpenDirectory(&fd, sdmcArchive, fs_path)))
{
memset(st, 0, sizeof(struct stat));
st->st_nlink = 1;
return -1;
rc = FSUSER_DeleteFile(sdmcArchive, fs_path);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
return 0;
r->_errno = sdmc_translate_error(rc);
return -1;
rc = FSUSER_OpenDirectory(&fd, sdmcArchive, fs_path);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
{
FSDIR_Close(fd);
strncpy(__cwd, __fixedpath, PATH_MAX);
return -1;
rc = FSUSER_RenameFile(sdmcArchive, fs_path_old, sdmcArchive, fs_path_new);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
return 0;
rc = FSUSER_RenameDirectory(sdmcArchive, fs_path_old, sdmcArchive, fs_path_new);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
return 0;
r->_errno = sdmc_translate_error(rc);
/* TODO: Use mode to set directory attributes. */
rc = FSUSER_CreateDirectory(sdmcArchive, fs_path);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
return 0;
r->_errno = sdmc_translate_error(rc);
/* open the directory */
rc = FSUSER_OpenDirectory(&fd, sdmcArchive, fs_path);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
{
dir->fd = fd;
memset(&dir->entry_data, 0, sizeof(dir->entry_data));
/* fetch the next entry */
memset(&dir->entry_data, 0, sizeof(dir->entry_data));
rc = FSDIR_Read(dir->fd, &entries, 1, &dir->entry_data);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
{
if(entries == 0)
{
/* close the directory */
rc = FSDIR_Close(dir->fd);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
return 0;
r->_errno = sdmc_translate_error(rc);
&numClusters,
&freeClusters);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
{
buf->f_bsize = clusterSize;
buf->f_frsize = clusterSize;
buf->f_namemax = 0; //??? how to get
rc = FSUSER_IsSdmcWritable(&writable);
- if(rc != 0 || !writable)
+ if(R_FAILED(rc) || !writable)
buf->f_flag |= ST_RDONLY;
return 0;
/* set the new file size */
rc = FSFILE_SetSize(file->fd, len);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
return 0;
r->_errno = sdmc_translate_error(rc);
sdmc_file_t *file = (sdmc_file_t*)fd;
rc = FSFILE_Flush(file->fd);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
return 0;
r->_errno = sdmc_translate_error(rc);
return -1;
rc = FSUSER_DeleteDirectory(sdmcArchive, fs_path);
- if(rc == 0)
+ if(R_SUCCEEDED(rc))
return 0;
r->_errno = sdmc_translate_error(rc);
#include <stdlib.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
+#include <3ds/synchronization.h>
#include <3ds/services/ac.h>
#include <3ds/ipc.h>
static Handle acHandle;
+static int acRefCount;
Result acInit(void)
{
- Result ret = srvGetServiceHandle(&acHandle, "ac:u");
- if(!ret)return ret;
- return srvGetServiceHandle(&acHandle, "ac:i");
+ Result ret;
+
+ if (AtomicPostIncrement(&acRefCount)) return 0;
+
+ ret = srvGetServiceHandle(&acHandle, "ac:u");
+ if(R_FAILED(ret)) ret = srvGetServiceHandle(&acHandle, "ac:i");
+ if(R_FAILED(ret)) AtomicDecrement(&acRefCount);
+
+ return ret;
}
-Result acExit(void)
+void acExit(void)
{
- return svcCloseHandle(acHandle);
+ if (AtomicDecrement(&acRefCount)) return;
+ svcCloseHandle(acHandle);
}
// ptr=0x200-byte outbuf
staticbufs[0] = IPC_Desc_StaticBuffer(0x200,0);
staticbufs[1] = (u32)ptr;
- if((ret = svcSendSyncRequest(acHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
staticbufs[0] = savedValue0;
staticbufs[1] = savedValue1;
cmdbuf[2] = IPC_Desc_StaticBuffer(0x200,0);
cmdbuf[3] = (u32)ptr;
- if((ret = svcSendSyncRequest(acHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
staticbufs[0] = savedValue0;
staticbufs[1] = savedValue1;
cmdbuf[0] = IPC_MakeHeader(0xD,0,0); // 0x000D0000
- if((ret = svcSendSyncRequest(acHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
*out = cmdbuf[2];
Result ret=0;
u32 outval=0;
- if((ret = acInit())!=0)return ret;
+ if(R_FAILED(ret = acInit()))return ret;
while(1)
{
ret = ACU_GetWifiStatus(&outval);
- if(ret==0 && outval!=0)break;
+ if(R_SUCCEEDED(ret) && outval!=0)break;
}
acExit();
-#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
+#include <3ds/synchronization.h>
#include <3ds/services/am.h>
#include <3ds/ipc.h>
-static Handle amHandle = 0;
+static Handle amHandle;
+static int amRefCount;
Result amInit(void)
{
- if(srvGetServiceHandle(&amHandle, "am:net") == 0)
- return (Result)0;
- else if(srvGetServiceHandle(&amHandle, "am:u") == 0)
- return (Result)0;
- else if(srvGetServiceHandle(&amHandle, "am:sys") == 0)
- return (Result)0;
- else return srvGetServiceHandle(&amHandle, "am:app");
+ Result ret;
+
+ if (AtomicPostIncrement(&amRefCount)) return 0;
+
+ ret = srvGetServiceHandle(&amHandle, "am:net");
+ if (R_FAILED(ret)) ret = srvGetServiceHandle(&amHandle, "am:u");
+ if (R_FAILED(ret)) ret = srvGetServiceHandle(&amHandle, "am:sys");
+ if (R_FAILED(ret)) ret = srvGetServiceHandle(&amHandle, "am:app");
+ if (R_FAILED(ret)) AtomicDecrement(&amRefCount);
+
+ return ret;
}
-Result amExit(void)
+void amExit(void)
{
- return svcCloseHandle(amHandle);
+ if (AtomicDecrement(&amRefCount)) return;
+ svcCloseHandle(amHandle);
}
Handle *amGetSessionHandle(void)
cmdbuf[0] = IPC_MakeHeader(0x1,1,0); // 0x00010040
cmdbuf[1] = mediatype;
- if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
*count = cmdbuf[2];
cmdbuf[3] = IPC_Desc_Buffer(count*sizeof(u64),IPC_BUFFER_W);
cmdbuf[4] = (u32)titleIDs;
- if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
return (Result)cmdbuf[1];
}
cmdbuf[5] = IPC_Desc_Buffer(titleCount*sizeof(AM_TitleEntry),IPC_BUFFER_W);
cmdbuf[6] = (u32)titleList;
- if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
return (Result)cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0xA,0,0); // 0x000A0000
- if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
*deviceID = cmdbuf[3];
cmdbuf[0] = IPC_MakeHeader(0x402,1,0); // 0x04020040
cmdbuf[1] = mediatype;
- if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
*ciaHandle = cmdbuf[3];
cmdbuf[0] = IPC_MakeHeader(0x403,0,0); // 0x04030000
- if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
*ciaHandle = cmdbuf[3];
cmdbuf[1] = IPC_Desc_MoveHandles(1);
cmdbuf[2] = *ciaHandle;
- if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
return (Result)cmdbuf[1];
}
cmdbuf[1] = IPC_Desc_MoveHandles(1);
cmdbuf[2] = *ciaHandle;
- if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
return (Result)cmdbuf[1];
}
cmdbuf[2] = titleID & 0xffffffff;
cmdbuf[3] = (u32)(titleID >> 32);
- if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
return (Result)cmdbuf[1];
}
cmdbuf[2] = titleID & 0xffffffff;
cmdbuf[3] = (u32)(titleID >> 32);
- if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
return (Result)cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x40F,0,0); // 0x040F0000
- if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
return (Result)cmdbuf[1];
}
cmdbuf[2] = titleID & 0xffffffff;
cmdbuf[3] = (u32)(titleID >> 32);
- if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
// The product code string can use the full 16 bytes without NULL terminator
- if(productCode) snprintf(productCode, 16, "%s", (char*)&cmdbuf[2]);
+ if(productCode) strncpy(productCode, (char*)&cmdbuf[2], 16);
return (Result)cmdbuf[1];
}
cmdbuf[2] = IPC_Desc_SharedHandles(1);
cmdbuf[3] = fileHandle;
- if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret;
if(titleEntry) memcpy(titleEntry, &cmdbuf[2], sizeof(AM_TitleEntry));
#include <stdlib.h>
#include <string.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
+#include <3ds/synchronization.h>
#include <3ds/services/apt.h>
#include <3ds/services/gsp.h>
#include <3ds/ipc.h>
NS_APPID currentAppId;
-static char *__apt_servicestr = NULL;
-static char *__apt_servicenames[3] = {"APT:U", "APT:S", "APT:A"};
+static const char *__apt_servicestr;
+static const char * const __apt_servicenames[3] = {"APT:U", "APT:S", "APT:A"};
-static u32 __apt_new3dsflag_initialized = 0;
-static u8 __apt_new3dsflag = 0;
+static u32 __apt_new3dsflag_initialized;
+static u8 __apt_new3dsflag;
Handle aptLockHandle;
Handle aptuHandle;
Handle aptEventHandlerThread;
u64 aptEventHandlerStack[APT_HANDLER_STACKSIZE/8]; // u64 so that it's 8-byte aligned
-Handle aptStatusMutex;
-Handle aptStatusEvent = 0;
+LightLock aptStatusMutex;
+Handle aptStatusEvent;
APP_STATUS aptStatus = APP_NOTINITIALIZED;
APP_STATUS aptStatusBeforeSleep = APP_NOTINITIALIZED;
-u32 aptStatusPower = 0;
-Handle aptSleepSync = 0;
+u32 aptStatusPower;
+Handle aptSleepSync;
u32 aptParameters[0x1000/4]; //TEMP
for(i=0; i<3; i++)
{
ret = srvGetServiceHandle(&aptuHandle, __apt_servicenames[i]);
- if(ret==0)
+ if(R_SUCCEEDED(ret))
{
__apt_servicestr = __apt_servicenames[i];
return ret;
aptOpenSession();
ret = APT_InquireNotification(currentAppId, &type);
aptCloseSession();
- if(ret!=0) return;
+ if(R_FAILED(ret)) return;
_aptDebug(1, type);
svcExitThread();
}
-static bool aptInitialised = false;
+static int aptRefCount = 0;
Result aptInit(void)
{
Result ret=0;
- if (aptInitialised) return ret;
-
- aptStatusMutex = 0;
+ if (AtomicPostIncrement(&aptRefCount)) return 0;
// Initialize APT stuff, escape load screen.
ret = __apt_initservicehandle();
- if(ret!=0)return ret;
- if((ret=APT_GetLockHandle(0x0, &aptLockHandle)))return ret;
+ if(R_FAILED(ret)) goto _fail;
+ if(R_FAILED(ret=APT_GetLockHandle(0x0, &aptLockHandle))) goto _fail;
svcCloseHandle(aptuHandle);
currentAppId = __apt_appid;
svcCreateEvent(&aptStatusEvent, 0);
svcCreateEvent(&aptSleepSync, 0);
- svcCreateMutex(&aptStatusMutex, false);
+ LightLock_Init(&aptStatusMutex);
aptStatus=0;
if(!aptIsCrippled())
{
aptOpenSession();
- if((ret=APT_Initialize(currentAppId, &aptEvents[0], &aptEvents[1])))return ret;
+ if(R_FAILED(ret=APT_Initialize(currentAppId, &aptEvents[0], &aptEvents[1])))return ret;
aptCloseSession();
aptOpenSession();
- if((ret=APT_Enable(0x0)))return ret;
+ if(R_FAILED(ret=APT_Enable(0x0))) goto _fail;
aptCloseSession();
// create APT close event
}
aptOpenSession();
- if((ret=APT_NotifyToWait(currentAppId)))return ret;
+ if(R_FAILED(ret=APT_NotifyToWait(currentAppId)))return ret;
aptCloseSession();
// create APT event handler thread
} else
aptAppStarted();
- aptInitialised = true;
-
return 0;
+
+_fail:
+ AtomicDecrement(&aptRefCount);
+ return ret;
}
void aptExit(void)
{
- if (!aptInitialised) return;
+ if (AtomicDecrement(&aptRefCount)) return;
if(!aptIsCrippled())aptAppletUtility_Exit_RetToApp(0);
svcCloseHandle(aptSleepSync);
- svcCloseHandle(aptStatusMutex);
svcCloseHandle(aptLockHandle);
svcCloseHandle(aptStatusEvent);
-
- aptInitialised = false;
}
bool aptMainLoop(void)
APP_STATUS aptGetStatus(void)
{
APP_STATUS ret;
- svcWaitSynchronization(aptStatusMutex, U64_MAX);
+ LightLock_Lock(&aptStatusMutex);
ret = aptStatus;
- svcReleaseMutex(aptStatusMutex);
+ LightLock_Unlock(&aptStatusMutex);
return ret;
}
void aptSetStatus(APP_STATUS status)
{
- svcWaitSynchronization(aptStatusMutex, U64_MAX);
+ LightLock_Lock(&aptStatusMutex);
aptStatus = status;
svcSignalEvent(aptStatusEvent);
//}
- svcReleaseMutex(aptStatusMutex);
+ LightLock_Unlock(&aptStatusMutex);
}
u32 aptGetStatusPower(void)
{
u32 ret;
- svcWaitSynchronization(aptStatusMutex, U64_MAX);
+ LightLock_Lock(&aptStatusMutex);
ret = aptStatusPower;
- svcReleaseMutex(aptStatusMutex);
+ LightLock_Unlock(&aptStatusMutex);
return ret;
}
void aptSetStatusPower(u32 status)
{
- svcWaitSynchronization(aptStatusMutex, U64_MAX);
+ LightLock_Lock(&aptStatusMutex);
aptStatusPower = status;
- svcReleaseMutex(aptStatusMutex);
+ LightLock_Unlock(&aptStatusMutex);
}
void aptOpenSession(void)
{
- //Result ret;
-
- svcWaitSynchronization(aptLockHandle, U64_MAX);
+ LightLock_Lock(&aptStatusMutex);
__apt_initservicehandle();
}
void aptCloseSession(void)
{
svcCloseHandle(aptuHandle);
- svcReleaseMutex(aptLockHandle);
+ LightLock_Unlock(&aptStatusMutex);
}
void aptSignalReadyForSleep(void)
cmdbuf[1]=flags;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
if(lockHandle)*lockHandle=cmdbuf[5];
cmdbuf[2]=0x0;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
if(eventHandle1)*eventHandle1=cmdbuf[3]; //return to menu event ?
if(eventHandle2)*eventHandle2=cmdbuf[4];
cmdbuf[1]=appId;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[0]=IPC_MakeHeader(0x4E,0,0); // 0x4E0000
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[1]=a;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[1]=inval;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
if(outval8)*outval8=cmdbuf[2];
if(outval32)*outval32=cmdbuf[3];
cmdbuf[1]=appID;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
if(pProgramID)*pProgramID=(u64)cmdbuf[2]|((u64)cmdbuf[3]<<32);
if(pMediaType)*pMediaType=cmdbuf[4];
cmdbuf[2]=flags;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
if(titleversion)*titleversion=cmdbuf[2];
cmdbuf[1] = IPC_Desc_CurProcessHandle();
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
if(ret==0)ret = cmdbuf[1];
cmdbuf[1]=appID;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
if(out)*out=cmdbuf[2];
cmdbuf[1]=appID;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
if(signalType)*signalType=cmdbuf[2];
cmdbuf[0]=IPC_MakeHeader(0x2B,0,0); // 0x2B0000
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[5]= (u32) param;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[1]=a;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[5]= (u32) param;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[1]=appID;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
staticbufs[1]=(u32)buf2;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
if(out)*out=cmdbuf[2];
staticbufs[1]=(u32)buffer;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
if(signalType)*signalType=cmdbuf[3];
if(actualSize)*actualSize=cmdbuf[4];
staticbufs[1]=(u32)buffer;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
if(signalType)*signalType=cmdbuf[3];
if(actualSize)*actualSize=cmdbuf[4];
cmdbuf[8] = (u32)buffer;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[3] = (u32)buffer;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[2]=a;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[1]=appID;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[1]=a;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[5]= (u32) param;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[2]=percent;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[1]=1;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
if(percent)*percent=cmdbuf[2];
cmdbuf[0]=IPC_MakeHeader(0x101,0,0); // 0x1010000
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
if(ret==0)ret = cmdbuf[1];
cmdbuf[0]=IPC_MakeHeader(0x102,0,0); // 0x1020000
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
if(ret==0)ret = cmdbuf[1];
cmdbuf[4]=mediatype;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[6]=(u32)NSbuf1Ptr;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[1]=appID;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[6]=(u32)parambuf;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
aptOpenSession();
ret=APT_PrepareToStartLibraryApplet(appID);
aptCloseSession();
- if(ret!=0)return ret;
+ if(R_FAILED(ret))return ret;
memset(buf1, 0, 4);
aptOpenSession();
aptOpenSession();
ret=APT_IsRegistered(appID, &tmp);
aptCloseSession();
- if(ret!=0)return ret;
+ if(R_FAILED(ret))return ret;
if(tmp!=0)break;
}
cmdbuf[1]=appID;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[6] = (u32)buf;
Result ret=0;
- if((ret=svcSendSyncRequest(aptuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;
return cmdbuf[1];
}
#include <3ds/services/y2r.h>
#include <3ds/srv.h>
#include <3ds/svc.h>
+#include <3ds/synchronization.h>
#include <3ds/types.h>
+#include <3ds/result.h>
Handle camHandle;
-static bool initialized = false;
+static int camRefCount;
Result camInit(void) {
Result ret = 0;
- if (initialized) return 0;
+ if (AtomicPostIncrement(&camRefCount)) return 0;
- if (camHandle == 0)
+ ret = srvGetServiceHandle(&camHandle, "cam:u");
+ if (R_SUCCEEDED(ret))
{
- ret = srvGetServiceHandle(&camHandle, "cam:u");
- if (ret < 0) return ret;
+ ret = CAMU_DriverInitialize();
+ if (R_FAILED(ret)) svcCloseHandle(camHandle);
}
-
- ret = CAMU_DriverInitialize();
- if (ret < 0) return ret;
- initialized = true;
+ if (R_FAILED(ret)) AtomicDecrement(&camRefCount);
return 0;
}
-Result camExit(void) {
- Result ret = 0;
-
- if (initialized)
- {
- ret = CAMU_DriverFinalize();
- if (ret < 0) return ret;
- }
-
- if (camHandle != 0)
- {
- ret = svcCloseHandle(camHandle);
- if (ret < 0) return ret;
- camHandle = 0;
- }
-
- return 0;
+void camExit(void) {
+ if (AtomicDecrement(&camRefCount)) return;
+ CAMU_DriverFinalize();
+ svcCloseHandle(camHandle);
}
Result CAMU_StartCapture(CAMU_Port port) {
cmdbuf[0] = 0x00010040;
cmdbuf[1] = port;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = 0x00020040;
cmdbuf[1] = port;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = 0x00030040;
cmdbuf[1] = port;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*busy = (bool) cmdbuf[2];
return cmdbuf[1];
}
cmdbuf[0] = 0x00040040;
cmdbuf[1] = port;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = 0x00050040;
cmdbuf[1] = port;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*event = cmdbuf[3];
return cmdbuf[1];
}
cmdbuf[0] = 0x00060040;
cmdbuf[1] = port;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*event = cmdbuf[3];
return cmdbuf[1];
}
cmdbuf[5] = 0;
cmdbuf[6] = 0xFFFF8001;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*event = cmdbuf[3];
return cmdbuf[1];
}
cmdbuf[0] = 0x00080040;
cmdbuf[1] = port;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*finishedReceiving = (bool) cmdbuf[2];
return cmdbuf[1];
}
cmdbuf[3] = width;
cmdbuf[4] = height;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[1] = width;
cmdbuf[2] = height;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*maxLines = (s16) cmdbuf[2];
return cmdbuf[1];
}
cmdbuf[3] = width;
cmdbuf[4] = height;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = 0x000C0040;
cmdbuf[1] = port;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*transferBytes = cmdbuf[2];
return cmdbuf[1];
}
cmdbuf[1] = width;
cmdbuf[2] = height;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*maxBytes = cmdbuf[2];
return cmdbuf[1];
}
cmdbuf[1] = port;
cmdbuf[2] = trimming;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = 0x000F0040;
cmdbuf[1] = port;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*trimming = (bool) cmdbuf[2];
return cmdbuf[1];
}
cmdbuf[4] = xEnd;
cmdbuf[5] = yEnd;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = 0x00110040;
cmdbuf[1] = port;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*xStart = (s16) cmdbuf[2];
*yStart = (s16) cmdbuf[3];
*xEnd = (s16) cmdbuf[4];
cmdbuf[4] = camWidth;
cmdbuf[5] = camHeight;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = 0x00130040;
cmdbuf[1] = select;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[1] = select;
cmdbuf[2] = context;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[1] = select;
cmdbuf[2] = exposure;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[1] = select;
cmdbuf[2] = whiteBalance;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[1] = select;
cmdbuf[2] = whiteBalance;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[1] = select;
cmdbuf[2] = sharpness;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[1] = select;
cmdbuf[2] = autoExposure;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = 0x001A0040;
cmdbuf[1] = select;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*autoExposure = (bool) cmdbuf[2];
return cmdbuf[1];
}
cmdbuf[1] = select;
cmdbuf[2] = autoWhiteBalance;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = 0x001C0040;
cmdbuf[1] = select;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*autoWhiteBalance = (bool) cmdbuf[2];
return cmdbuf[1];
}
cmdbuf[2] = flip;
cmdbuf[3] = context;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[7] = cropY1;
cmdbuf[8] = context;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[2] = size;
cmdbuf[3] = context;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[1] = select;
cmdbuf[2] = frameRate;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[1] = select;
cmdbuf[2] = photoMode;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[2] = effect;
cmdbuf[3] = context;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[1] = select;
cmdbuf[2] = contrast;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[1] = select;
cmdbuf[2] = lensCorrection;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[2] = format;
cmdbuf[3] = context;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[4] = width;
cmdbuf[5] = height;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[4] = width;
cmdbuf[5] = height;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[1] = select;
cmdbuf[2] = noiseFilter;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[1] = select1;
cmdbuf[2] = select2;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[49] = (past << 17) | 2;
cmdbuf[50] = (u32) timing;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x002B0000;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*data = *(CAMU_StereoCameraCalibrationData*) cmdbuf[2];
return cmdbuf[1];
}
cmdbuf[0] = 0x002C0400;
*(CAMU_StereoCameraCalibrationData*) cmdbuf[1] = data;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[2] = addr;
cmdbuf[3] = data;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[2] = addr;
cmdbuf[3] = data;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[1] = select;
cmdbuf[2] = addr;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*data = (u16) cmdbuf[2];
return cmdbuf[1];
}
cmdbuf[1] = select;
cmdbuf[2] = addr;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*data = (u16) cmdbuf[2];
return cmdbuf[1];
}
cmdbuf[0] = 0x00310180;
*(CAMU_ImageQualityCalibrationData*) cmdbuf[1] = data;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00320000;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*data = *(CAMU_ImageQualityCalibrationData*) cmdbuf[2];
return cmdbuf[1];
}
cmdbuf[0] = 0x003302C0;
*(CAMU_PackageParameterCameraSelect*) cmdbuf[1] = param;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = 0x00340140;
*(CAMU_PackageParameterContext*) cmdbuf[1] = param;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = 0x003501C0;
*(CAMU_PackageParameterContextDetail*) cmdbuf[1] = param;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00360000;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*coefficient = (Y2R_StandardCoefficient) cmdbuf[2];
return cmdbuf[1];
}
cmdbuf[0] = 0x00380040;
cmdbuf[1] = sound;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00390000;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x003A0000;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x003B0000;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*select = (CAMU_CameraSelect) cmdbuf[2];
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x003C0000;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*select = (CAMU_CameraSelect) cmdbuf[2];
return cmdbuf[1];
}
cmdbuf[0] = 0x003D0040;
cmdbuf[1] = select;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = 0x003E0040;
cmdbuf[1] = brightnessSynchronization;
- if ((ret = svcSendSyncRequest(camHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1];
}
#include <stdlib.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
#include <3ds/services/cfgnor.h>
#include <3ds/ipc.h>
-Handle CFGNOR_handle = 0;
+Handle CFGNOR_handle;
Result CFGNOR_Initialize(u8 value)
{
u32 *cmdbuf = getThreadCommandBuffer();
ret = srvGetServiceHandle(&CFGNOR_handle, "cfg:nor");
- if(ret!=0)return ret;
+ if(R_FAILED(ret))return ret;
cmdbuf[0] = IPC_MakeHeader(0x1,1,0); // 0x10040
cmdbuf[1] = (u32)value;
- if((ret = svcSendSyncRequest(CFGNOR_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(CFGNOR_handle)))return ret;
ret = (Result)cmdbuf[1];
return ret;
cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000
- if((ret = svcSendSyncRequest(CFGNOR_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(CFGNOR_handle)))return ret;
ret = (Result)cmdbuf[1];
svcCloseHandle(CFGNOR_handle);
cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_W);
cmdbuf[4] = (u32)buf;
- if((ret = svcSendSyncRequest(CFGNOR_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(CFGNOR_handle)))return ret;
ret = (Result)cmdbuf[1];
return ret;
cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
cmdbuf[4] = (u32)buf;
- if((ret = svcSendSyncRequest(CFGNOR_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(CFGNOR_handle)))return ret;
ret = (Result)cmdbuf[1];
return ret;
if(size-pos < chunksize)chunksize = size-pos;
ret = CFGNOR_ReadData(pos, &buf[pos>>2], chunksize);
- if(ret!=0)break;
+ if(R_FAILED(ret))break;
}
return ret;
#include <stdlib.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
+#include <3ds/synchronization.h>
#include <3ds/services/cfgu.h>
#include <3ds/ipc.h>
-static Handle CFGU_handle = 0;
+static Handle CFGU_handle;
+static int CFGU_refCount;
-Result initCfgu()
+Result cfguInit(void)
{
Result ret;
+ if (AtomicPostIncrement(&CFGU_refCount)) return 0;
+
// cfg:i has the most commands, then cfg:s, then cfg:u
ret = srvGetServiceHandle(&CFGU_handle, "cfg:i");
- if(ret) ret = srvGetServiceHandle(&CFGU_handle, "cfg:s");
- if(ret) ret = srvGetServiceHandle(&CFGU_handle, "cfg:u");
+ if(R_FAILED(ret)) ret = srvGetServiceHandle(&CFGU_handle, "cfg:s");
+ if(R_FAILED(ret)) ret = srvGetServiceHandle(&CFGU_handle, "cfg:u");
+ if(R_FAILED(ret)) AtomicDecrement(&CFGU_refCount);
return ret;
}
-Result exitCfgu()
+void cfguExit(void)
{
- Result ret = svcCloseHandle(CFGU_handle);
- CFGU_handle = 0;
-
- return ret;
+ if (AtomicDecrement(&CFGU_refCount)) return;
+ svcCloseHandle(CFGU_handle);
}
Result CFGU_SecureInfoGetRegion(u8* region)
cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000
- if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
*region = (u8)cmdbuf[2];
cmdbuf[0] = IPC_MakeHeader(0x3,1,0); // 0x30040
cmdbuf[1] = appIDSalt;
- if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
*hash = (u64)cmdbuf[2];
*hash |= ((u64)cmdbuf[3])<<32;
cmdbuf[0] = IPC_MakeHeader(0x4,0,0); // 0x40000
- if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
*value = (u8)cmdbuf[2];
cmdbuf[0] = IPC_MakeHeader(0x5,0,0); // 0x50000
- if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
*model = (u8)cmdbuf[2];
cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000
- if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
*value = (u8)cmdbuf[2];
cmdbuf[0] = IPC_MakeHeader(0x9,1,0); // 0x90040
cmdbuf[1] = (u32)code;
- if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
*string = (u16)cmdbuf[2];
cmdbuf[0] = IPC_MakeHeader(0xA,1,0); // 0xA0040
cmdbuf[1] = (u32)string;
- if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
*code = (u16)cmdbuf[2];
cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_W);
cmdbuf[4] = (u32)outData;
- if((ret = svcSendSyncRequest(CFGU_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret;
return (Result)cmdbuf[1];
}
#include <stdlib.h>
#include <string.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
#include <3ds/mappable.h>
#include <3ds/os.h>
#include <3ds/services/csnd.h>
#include <3ds/ipc.h>
+#include <3ds/synchronization.h>
// See here regarding CSND shared-mem commands, etc: http://3dbrew.org/wiki/CSND_Shared_Memory
-vu32* csndSharedMem = NULL;
+vu32* csndSharedMem;
u32 csndSharedMemSize;
-u32 csndChannels = 0;
+u32 csndChannels;
u32 csndOffsets[4];
-static Handle csndHandle = 0;
-static Handle csndMutex = 0;
-static Handle csndSharedMemBlock = 0;
+static Handle csndHandle;
+static Handle csndMutex;
+static Handle csndSharedMemBlock;
+static int csndRefCount;
static u32 csndCmdBlockSize = 0x2000;
-static u32 csndCmdStartOff = 0;
-static u32 csndCmdCurOff = 0;
+static u32 csndCmdStartOff;
+static u32 csndCmdCurOff;
static Result CSND_Initialize(void)
{
cmdbuf[1] = csndSharedMemSize;
memcpy(&cmdbuf[2], &csndOffsets[0], 4*sizeof(u32));
- if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
csndMutex = cmdbuf[3];
csndSharedMemBlock = cmdbuf[4];
cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000
- if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
return (Result)cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x5,0,0); // 0x50000
- if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
*channelMask = cmdbuf[2];
cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000
- if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
return (Result)cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x7,0,0); // 0x70000
- if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
*capUnit = cmdbuf[2];
cmdbuf[0] = IPC_MakeHeader(0x8,1,0); // 0x80040
cmdbuf[1] = capUnit;
- if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
return (Result)cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0xC,0,0); // 0xC0000
- if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
return (Result)cmdbuf[1];
}
{
Result ret=0;
- // TODO: proper error handling!
+ if (AtomicPostIncrement(&csndRefCount)) return ret;
ret = srvGetServiceHandle(&csndHandle, "csnd:SND");
- if (ret != 0) return ret;
+ if (R_FAILED(ret)) goto cleanup0;
// Calculate offsets and sizes required by the CSND module
csndOffsets[0] = csndCmdBlockSize; // Offset to DSP semaphore and irq disable flags
csndSharedMemSize = csndOffsets[3] + 0x3C; // Total size of the CSND shared memory
ret = CSND_Initialize();
- if (ret != 0) goto cleanup1;
+ if (R_FAILED(ret)) goto cleanup1;
csndSharedMem = (vu32*)mappableAlloc(csndSharedMemSize);
if(!csndSharedMem)
}
ret = svcMapMemoryBlock(csndSharedMemBlock, (u32)csndSharedMem, 3, 0x10000000);
- if (ret != 0) goto cleanup2;
+ if (R_FAILED(ret)) goto cleanup2;
memset((void*)csndSharedMem, 0, csndSharedMemSize);
ret = CSND_AcquireSoundChannels(&csndChannels);
- if (!ret) return 0;
+ if (R_FAILED(ret)) return 0;
cleanup2:
svcCloseHandle(csndSharedMemBlock);
}
cleanup1:
svcCloseHandle(csndHandle);
+cleanup0:
+ AtomicDecrement(&csndRefCount);
return ret;
}
-Result csndExit(void)
+void csndExit(void)
{
- Result ret;
-
- //ret = CSND_Reset();
- //if (ret != 0) return ret;
+ if (AtomicDecrement(&csndRefCount)) return;
- ret = CSND_ReleaseSoundChannels();
- if (ret != 0) return ret;
+ //CSND_Reset();
+ CSND_ReleaseSoundChannels();
svcUnmapMemoryBlock(csndSharedMemBlock, (u32)csndSharedMem);
svcCloseHandle(csndSharedMemBlock);
- ret = CSND_Shutdown();
+ CSND_Shutdown();
svcCloseHandle(csndHandle);
if(csndSharedMem != NULL)
mappableFree((void*) csndSharedMem);
csndSharedMem = NULL;
}
-
- return ret;
}
static Result CSND_ExecuteCommands(u32 offset)
cmdbuf[0] = IPC_MakeHeader(0x3,1,0); // 0x30040
cmdbuf[1] = offset;
- if((ret = svcSendSyncRequest(csndHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
return (Result)cmdbuf[1];
}
ret = CSND_ExecuteCommands(csndCmdStartOff);
csndCmdStartOff = csndCmdCurOff;
- if (ret != 0) return ret;
+ if (R_FAILED(ret)) return ret;
// FIXME: This is a really ugly busy waiting loop!
while (waitDone && *flag == 0);
Result ret = 0;
channel = chnGetSharedMemIdx(channel);
- if ((ret = CSND_UpdateInfo(true)) != 0)return ret;
+ if (R_FAILED(ret = CSND_UpdateInfo(true)))return ret;
memcpy(out, (const void*)&csndSharedMem[(csndOffsets[1] + channel*0xc) >> 2], 0xc);
//out[2] -= 0x0c000000;
CSND_ChnInfo entry;
ret = csndGetState(channel, &entry);
- if(ret!=0)return ret;
+ if(R_FAILED(ret))return ret;
*status = entry.active;
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
#include <3ds/ipc.h>
+#include <3ds/synchronization.h>
#include <3ds/services/dsp.h>
-static Handle dspHandle = 0;
+static Handle dspHandle;
+static int dspRefCount;
Result dspInit(void)
{
Result ret = 0;
- if (dspHandle == 0)
- {
- ret = srvGetServiceHandle(&dspHandle, "dsp::DSP");
- if (ret < 0) return ret;
- }
- DSP_UnloadComponent();
- return 0;
+
+ if (AtomicPostIncrement(&dspRefCount)) return 0;
+
+ ret = srvGetServiceHandle(&dspHandle, "dsp::DSP");
+ if (R_SUCCEEDED(ret)) DSP_UnloadComponent();
+ else AtomicDecrement(&dspRefCount);
+
+ return ret;
}
-Result dspExit(void)
+void dspExit(void)
{
- Result ret = 0;
- //No need to call unload, it will be done automatically by closing the handle
- if (dspHandle != 0)
- {
- ret = svcCloseHandle(dspHandle);
- if (ret < 0) return ret;
- dspHandle = 0;
- }
-
- return 0;
+ if (AtomicDecrement(&dspRefCount)) return;
+ svcCloseHandle(dspHandle);
}
Result DSP_GetHeadphoneStatus(bool* is_inserted)
Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1F,0,0);
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
*is_inserted = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
cmdbuf[2] = size;
cmdbuf[3] = IPC_Desc_SharedHandles(1);
cmdbuf[4] = CUR_PROCESS_HANDLE;
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[2] = size;
cmdbuf[3] = IPC_Desc_SharedHandles(1);
cmdbuf[4] = CUR_PROCESS_HANDLE;
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x7,1,0);
cmdbuf[1] = value;
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x17,1,0);
cmdbuf[1] = mask;
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
return cmdbuf[1];
}
Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x16,0,0);
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
*semaphore = cmdbuf[3];
return cmdbuf[1];
}
cmdbuf[3] = data_mask;
cmdbuf[4] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
cmdbuf[5] = (u32) component;
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
*is_loaded = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x12,0,0);
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[2] = channel;
cmdbuf[3] = IPC_Desc_SharedHandles(1);
cmdbuf[4] = handle;
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
return cmdbuf[1];
}
staticbufs[0] = IPC_Desc_StaticBuffer(length,0);
staticbufs[1] = (u32)buffer;
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
staticbufs[0] = saved1;
staticbufs[1] = saved2;
cmdbuf[2] = length;
cmdbuf[3] = IPC_Desc_StaticBuffer(length,1);
cmdbuf[4] = (u32)buffer;
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xC,1,0);
cmdbuf[1] = dsp_address;
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
*arm_address = cmdbuf[2];
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1,1,0);
cmdbuf[1] = regNo;
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
*value = cmdbuf[2] & 0xFFFF;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x2,1,0);
cmdbuf[1] = regNo;
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
*is_ready = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x3,2,0);
cmdbuf[1] = regNo;
cmdbuf[2] = value;
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x4,1,0);
cmdbuf[1] = regNo;
- if ((ret = svcSendSyncRequest(dspHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(dspHandle))) return ret;
*is_empty = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
#include <string.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
+#include <3ds/synchronization.h>
#include <3ds/services/fs.h>
#include <3ds/ipc.h>
return (FS_path){type, strlen(path)+1, (const u8*)path};
}
+static int fsRefCount;
+
/*! Initialize FS service
*
* @returns error
*/
-
-static bool fsInitialised = false;
-
-Result
-fsInit(void)
+Result fsInit(void)
{
Result ret = 0;
- if (fsInitialised) return ret;
-
- if((ret=srvGetServiceHandle(&fsuHandle, "fs:USER"))!=0)return ret;
- if(__get_handle_from_list("fs:USER")==0)ret=FSUSER_Initialize(fsuHandle);
-
- fsInitialised = true;
+ if (AtomicPostIncrement(&fsRefCount)) return 0;
+ ret = srvGetServiceHandle(&fsuHandle, "fs:USER");
+ if (R_SUCCEEDED(ret) && __get_handle_from_list("fs:USER")==0)
+ {
+ ret = FSUSER_Initialize(fsuHandle);
+ if (R_FAILED(ret)) svcCloseHandle(fsuHandle);
+ }
+ if (R_FAILED(ret)) AtomicDecrement(&fsRefCount);
return ret;
}
-/*! Deinitialize FS service
- *
- * @returns error
- */
-Result
-fsExit(void)
+/// Deinitialize FS service
+void fsExit(void)
{
- if (!fsInitialised) return 0;
-
- fsInitialised = false;
-
- return svcCloseHandle(fsuHandle);
+ if (AtomicDecrement(&fsRefCount)) return;
+ svcCloseHandle(fsuHandle);
}
/*! Gets the fsuser service session handle.
cmdbuf[1] = IPC_Desc_CurProcessHandle();
Result ret = 0;
- if((ret = svcSendSyncRequest(handle)))
+ if(R_FAILED(ret = svcSendSyncRequest(handle)))
return ret;
return cmdbuf[1];
cmdbuf[9] = (u32)fileLowPath.data;
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
if(out)
cmdbuf[12] = (u32)fileLowPath.data;
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
if(out)
cmdbuf[7] = (u32)fileLowPath.data;
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
return cmdbuf[1];
cmdbuf[13] = (u32)destFileLowPath.data;
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
return cmdbuf[1];
cmdbuf[7] = (u32)dirLowPath.data;
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
return cmdbuf[1];
cmdbuf[7] = (u32)dirLowPath.data;
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
return cmdbuf[1];
cmdbuf[10] = (u32)fileLowPath.data;
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
return cmdbuf[1];
cmdbuf[8] = (u32)dirLowPath.data;
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
return cmdbuf[1];
cmdbuf[13] = (u32)destDirLowPath.data;
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
return cmdbuf[1];
cmdbuf[6] = (u32)dirLowPath.data;
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
if(out)
cmdbuf[5] = (u32)archive->lowPath.data;
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
archive->handleLow = cmdbuf[2];
cmdbuf[2] = archive->handleHigh;
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
return cmdbuf[1];
cmdbuf[0] = IPC_MakeHeader(0x814,0,0); // 0x8140000
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
if(sectorSize)
cmdbuf[0] = IPC_MakeHeader(0x815,0,0); // 0x8150000
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
if(sectorSize)
cmdbuf[0] = IPC_MakeHeader(0x817,0,0); // 0x8170000
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
if(detected)
cmdbuf[0] = IPC_MakeHeader(0x868,0,0); // 0x8680000
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
if(mediatype)
cmdbuf[0] = IPC_MakeHeader(0x818,0,0); // 0x8180000
Result ret = 0;
- if((ret = svcSendSyncRequest(fsuHandle)))
+ if(R_FAILED(ret = svcSendSyncRequest(fsuHandle)))
return ret;
if(writable)
cmdbuf[0] = IPC_MakeHeader(0x808,0,0); // 0x8080000
Result ret = 0;
- if((ret = svcSendSyncRequest(handle)))
+ if(R_FAILED(ret = svcSendSyncRequest(handle)))
return ret;
ret = cmdbuf[1];
- if(!ret)ret = svcCloseHandle(handle);
+ if(R_SUCCEEDED(ret))ret = svcCloseHandle(handle);
return ret;
}
cmdbuf[5] = (u32)buffer;
Result ret = 0;
- if((ret = svcSendSyncRequest(handle)))
+ if(R_FAILED(ret = svcSendSyncRequest(handle)))
return ret;
if(bytesRead)
cmdbuf[6] = (u32)buffer;
Result ret = 0;
- if((ret = svcSendSyncRequest(handle)))
+ if(R_FAILED(ret = svcSendSyncRequest(handle)))
return ret;
if(bytesWritten)
cmdbuf[0] = IPC_MakeHeader(0x804,0,0); // 0x8040000
Result ret = 0;
- if((ret = svcSendSyncRequest(handle)))
+ if(R_FAILED(ret = svcSendSyncRequest(handle)))
return ret;
if(size)
cmdbuf[2] = (u32)(size >> 32);
Result ret = 0;
- if((ret = svcSendSyncRequest(handle)))
+ if(R_FAILED(ret = svcSendSyncRequest(handle)))
return ret;
cmdbuf[0] = IPC_MakeHeader(0x806,0,0); // 0x8060000
Result ret = 0;
- if((ret = svcSendSyncRequest(handle)))
+ if(R_FAILED(ret = svcSendSyncRequest(handle)))
return ret;
if(attributes)
cmdbuf[1] = attributes;
Result ret = 0;
- if((ret = svcSendSyncRequest(handle)))
+ if(R_FAILED(ret = svcSendSyncRequest(handle)))
return ret;
return cmdbuf[1];
cmdbuf[0] = IPC_MakeHeader(0x809,0,0); // 0x8090000
Result ret = 0;
- if((ret = svcSendSyncRequest(handle)))
+ if(R_FAILED(ret = svcSendSyncRequest(handle)))
return ret;
return cmdbuf[1];
cmdbuf[3] = (u32)buffer;
Result ret = 0;
- if((ret = svcSendSyncRequest(handle)))
+ if(R_FAILED(ret = svcSendSyncRequest(handle)))
return ret;
if(entriesRead)
cmdbuf[0] = IPC_MakeHeader(0x802,0,0); // 0x8020000
Result ret = 0;
- if((ret = svcSendSyncRequest(handle)))
+ if(R_FAILED(ret = svcSendSyncRequest(handle)))
return ret;
ret = cmdbuf[1];
- if(!ret)ret = svcCloseHandle(handle);
+ if(R_SUCCEEDED(ret))ret = svcCloseHandle(handle);
return ret;
}
#include <stdlib.h>
#include <string.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
+#include <3ds/synchronization.h>
#include <3ds/services/gsp.h>
#define GSP_EVENT_STACK_SIZE 0x1000
-Handle gspGpuHandle=0;
-Handle gspLcdHandle=0;
+Handle gspGpuHandle;
+Handle gspLcdHandle;
Handle gspEvents[GSPEVENT_MAX];
vu32 gspEventCounts[GSPEVENT_MAX];
u64 gspEventStack[GSP_EVENT_STACK_SIZE/sizeof(u64)]; //u64 so that it's 8-byte aligned
Handle gspEventThread;
static Handle gspEvent;
+static int gspRefCount, gspLcdRefCount;
static vu8* gspEventData;
static void gspEventThreadMain(void *arg);
Result gspInit(void)
{
- return srvGetServiceHandle(&gspGpuHandle, "gsp::Gpu");
+ Result res=0;
+ if (AtomicPostIncrement(&gspRefCount)) return 0;
+ res = srvGetServiceHandle(&gspGpuHandle, "gsp::Gpu");
+ if (R_FAILED(res)) AtomicDecrement(&gspRefCount);
+ return res;
}
void gspExit(void)
{
- if(gspGpuHandle)svcCloseHandle(gspGpuHandle);
+ if (AtomicDecrement(&gspRefCount)) return;
+ svcCloseHandle(gspGpuHandle);
}
Result gspInitEventHandler(Handle _gspEvent, vu8* _gspSharedMem, u8 gspThreadId)
static int popInterrupt()
{
int curEvt;
- u32 strexFailed;
+ bool strexFailed;
do {
union {
struct {
u32 as_u32;
} header;
- u32* gsp_header_ptr = (u32*)(gspEventData + 0);
-
// Do a load on all header fields as an atomic unit
- __asm__ volatile (
- "ldrex %[result], %[addr]" :
- [result]"=r"(header.as_u32) :
- [addr]"Q"(*gsp_header_ptr));
+ header.as_u32 = __ldrex((s32*)gspEventData);
if (__builtin_expect(header.count == 0, 0)) {
- __asm__ volatile ("clrex");
+ __clrex();
return -1;
}
header.count -= 1;
header.err = 0; // Should this really be set?
- __asm__ volatile (
- "strex %[result], %[val], %[addr]" :
- [result]"=&r"(strexFailed), [addr]"=Q"(*gsp_header_ptr) :
- [val]"r"(header.as_u32));
+ strexFailed = __strex((s32*)gspEventData, header.as_u32);
} while (__builtin_expect(strexFailed, 0));
return curEvt;
cmdbuf[4]=(u32)data;
Result ret=0;
- if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[6]=(u32)maskdata;
Result ret=0;
- if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[0x40+1]=(u32)data;
Result ret=0;
- if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
memcpy(&cmdbuf[2], framebufinfo, sizeof(GSP_FramebufferInfo));
Result ret=0;
- if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[4]=CUR_PROCESS_HANDLE;
Result ret=0;
- if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[4] = CUR_PROCESS_HANDLE;
Result ret=0;
- if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[1]=flags;
Result ret=0;
- if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[0]=0x000C0000; //request header code
Result ret=0;
- if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[3]=eventHandle;
Result ret=0;
- if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
if(threadID)*threadID=cmdbuf[2];
if(outMemHandle)*outMemHandle=cmdbuf[4];
cmdbuf[0]=0x00140000; //request header code
Result ret=0;
- if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[3]=CUR_PROCESS_HANDLE;
Result ret=0;
- if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[0]=0x170000; //request header code
Result ret=0;
- if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[0]=0x00180000; //request header code
Result ret=0;
- if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
ret = cmdbuf[1];
- if(ret==0)
- {
+ if(R_SUCCEEDED(ret))
memcpy(captureinfo, &cmdbuf[2], 0x20);
- }
return ret;
}
cmdbuf[0]=0x00190000; //request header code
Result ret=0;
- if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[0]=0x001A0000; //request header code
Result ret=0;
- if((ret=svcSendSyncRequest(gspGpuHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
{
if(!sharedGspCmdBuf || !gxCommand)return -1;
- u32 cmdBufHeader;
- __asm__ __volatile__ ("ldrex %[result], [%[adr]]" : [result] "=r" (cmdBufHeader) : [adr] "r" (sharedGspCmdBuf));
+ u32 cmdBufHeader = __ldrex((s32*)sharedGspCmdBuf);
u8 commandIndex=cmdBufHeader&0xFF;
u8 totalCommands=(cmdBufHeader>>8)&0xFF;
u32* dst=&sharedGspCmdBuf[8*(1+nextCmd)];
memcpy(dst, gxCommand, 0x20);
- u32 mcrVal=0x0;
- __asm__ __volatile__ ("mcr p15, 0, %[val], c7, c10, 4" :: [val] "r" (mcrVal)); //Data Synchronization Barrier Register
+ __dsb();
totalCommands++;
cmdBufHeader=((cmdBufHeader)&0xFFFF00FF)|(((u32)totalCommands)<<8);
while(1)
{
- u32 strexResult;
- __asm__ __volatile__ ("strex %[result], %[val], [%[adr]]" : [result] "=&r" (strexResult) : [adr] "r" (sharedGspCmdBuf), [val] "r" (cmdBufHeader));
- if(!strexResult)break;
+ if (!__strex((s32*)sharedGspCmdBuf, cmdBufHeader)) break;
- __asm__ __volatile__ ("ldrex %[result], [%[adr]]" : [result] "=r" (cmdBufHeader) : [adr] "r" (sharedGspCmdBuf));
+ cmdBufHeader = __ldrex((s32*)sharedGspCmdBuf);
totalCommands=((cmdBufHeader&0xFF00)>>8)+1;
cmdBufHeader=((cmdBufHeader)&0xFFFF00FF)|((totalCommands<<8)&0xFF00);
}
Result gspLcdInit(void)
{
- return srvGetServiceHandle(&gspLcdHandle, "gsp::Lcd");
+ Result res=0;
+ if (AtomicPostIncrement(&gspLcdRefCount)) return 0;
+ res = srvGetServiceHandle(&gspLcdHandle, "gsp::Lcd");
+ if (R_FAILED(res)) AtomicDecrement(&gspLcdRefCount);
+ return res;
}
void gspLcdExit(void)
{
- if(gspLcdHandle)svcCloseHandle(gspLcdHandle);
+ if (AtomicDecrement(&gspLcdRefCount)) return;
+ svcCloseHandle(gspLcdHandle);
}
Result GSPLCD_PowerOffBacklight(GSPLCD_Screens screen)
cmdbuf[1] = screen;
Result ret=0;
- if ((ret = svcSendSyncRequest(gspLcdHandle)))return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[1] = screen;
Result ret=0;
- if ((ret = svcSendSyncRequest(gspLcdHandle)))return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle)))return ret;
return cmdbuf[1];
}
#include <3ds/types.h>\r
+#include <3ds/result.h>\r
#include <3ds/svc.h>\r
#include <3ds/srv.h>\r
+#include <3ds/synchronization.h>\r
#include <3ds/services/hb.h>\r
#include <3ds/ipc.h>\r
\r
static Handle hbHandle;\r
+static int hbRefCount;\r
\r
Result hbInit(void)\r
{\r
- return srvGetServiceHandle(&hbHandle, "hb:HB");\r
+ Result res=0;\r
+ if (AtomicPostIncrement(&hbRefCount)) return 0;\r
+ res = srvGetServiceHandle(&hbHandle, "hb:HB");\r
+ if (R_FAILED(res)) AtomicDecrement(&hbRefCount);\r
+ return res;\r
}\r
\r
void hbExit(void)\r
{\r
+ if (AtomicDecrement(&hbRefCount)) return;\r
svcCloseHandle(hbHandle);\r
}\r
\r
cmdbuf[2] = IPC_Desc_SharedHandles(1);\r
cmdbuf[3] = CUR_PROCESS_HANDLE;\r
\r
- if((ret = svcSendSyncRequest(hbHandle))!=0) return ret;\r
+ if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret;\r
\r
return (Result)cmdbuf[1];\r
}\r
\r
cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000\r
\r
- if((ret = svcSendSyncRequest(hbHandle))!=0) return ret;\r
+ if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret;\r
\r
if(load3dsx)*load3dsx=(void*)cmdbuf[2];\r
if(setArgv)*setArgv=(void*)cmdbuf[3];\r
cmdbuf[2] = pages;\r
cmdbuf[3] = mode;\r
\r
- if((ret = svcSendSyncRequest(hbHandle))!=0) return ret;\r
+ if(R_FAILED(ret = svcSendSyncRequest(hbHandle))) return ret;\r
\r
if(reprotectedPages)\r
{\r
- if(!ret)*reprotectedPages=(u32)cmdbuf[2];\r
+ if(R_SUCCEEDED(ret))*reprotectedPages=(u32)cmdbuf[2];\r
else *reprotectedPages=0;\r
}\r
\r
#include <stdlib.h>
#include <string.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
#include <3ds/mappable.h>
+#include <3ds/synchronization.h>
#include <3ds/services/apt.h>
#include <3ds/services/hid.h>
#include <3ds/services/irrst.h>
static accelVector aVec;
static angularRate gRate;
-static bool hidInitialised;
+static int hidRefCount;
Result hidInit(void)
{
u8 val=0;
Result ret=0;
- if(hidInitialised) return ret;
+ if (AtomicPostIncrement(&hidRefCount)) return 0;
// Request service.
- if((ret=srvGetServiceHandle(&hidHandle, "hid:USER")) && (ret=srvGetServiceHandle(&hidHandle, "hid:SPVR")))return ret;
+ ret = srvGetServiceHandle(&hidHandle, "hid:USER");
+ if (R_FAILED(ret)) ret = srvGetServiceHandle(&hidHandle, "hid:SPVR");
+ if (R_FAILED(ret)) goto cleanup0;
// Get sharedmem handle.
- if((ret=HIDUSER_GetHandles(&hidMemHandle, &hidEvents[HIDEVENT_PAD0], &hidEvents[HIDEVENT_PAD1], &hidEvents[HIDEVENT_Accel], &hidEvents[HIDEVENT_Gyro], &hidEvents[HIDEVENT_DebugPad]))) goto cleanup1;
+ if(R_FAILED(ret=HIDUSER_GetHandles(&hidMemHandle, &hidEvents[HIDEVENT_PAD0], &hidEvents[HIDEVENT_PAD1], &hidEvents[HIDEVENT_Accel], &hidEvents[HIDEVENT_Gyro], &hidEvents[HIDEVENT_DebugPad]))) goto cleanup1;
// Map HID shared memory.
hidSharedMem=(vu32*)mappableAlloc(0x2b0);
goto cleanup1;
}
- if((ret=svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
+ if(R_FAILED(ret=svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
APT_CheckNew3DS(&val);
}
// Reset internal state.
- hidInitialised = true;
kOld = kHeld = kDown = kUp = 0;
return ret;
}
cleanup1:
svcCloseHandle(hidHandle);
+cleanup0:
+ AtomicDecrement(&hidRefCount);
return ret;
}
void hidExit(void)
{
- if(!hidInitialised) return;
+ if (AtomicDecrement(&hidRefCount)) return;
// Unmap HID sharedmem and close handles.
u8 val=0;
mappableFree((void*) hidSharedMem);
hidSharedMem = NULL;
}
-
- hidInitialised = false;
}
void hidWaitForEvent(HID_Event id, bool nextEvent)
cmdbuf[0]=IPC_MakeHeader(0xA,0,0); // 0xA0000
Result ret=0;
- if((ret=svcSendSyncRequest(hidHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret;
if(outMemHandle)*outMemHandle=cmdbuf[3];
cmdbuf[0]=IPC_MakeHeader(0x11,0,0); // 0x110000
Result ret=0;
- if((ret=svcSendSyncRequest(hidHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[0]=IPC_MakeHeader(0x12,0,0); // 0x120000
Result ret=0;
- if((ret=svcSendSyncRequest(hidHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[0]=IPC_MakeHeader(0x13,0,0); // 0x130000
Result ret=0;
- if((ret=svcSendSyncRequest(hidHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[0]=IPC_MakeHeader(0x14,0,0); // 0x140000
Result ret=0;
- if((ret=svcSendSyncRequest(hidHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[0]=IPC_MakeHeader(0x15,0,0); // 0x150000
Result ret=0;
- if((ret=svcSendSyncRequest(hidHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret;
*coeff = (float)cmdbuf[2];
cmdbuf[0]=IPC_MakeHeader(0x17,0,0); // 0x170000
Result ret=0;
- if((ret=svcSendSyncRequest(hidHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret;
*volume = (u8)cmdbuf[2];
#include <string.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
+#include <3ds/synchronization.h>
#include <3ds/services/httpc.h>
#include <3ds/ipc.h>
-Handle __httpc_servhandle = 0;
+Handle __httpc_servhandle;
+static int __httpc_refcount;
Result httpcInit(void)
{
Result ret=0;
- if(__httpc_servhandle)return 0;
- if((ret=srvGetServiceHandle(&__httpc_servhandle, "http:C")))return ret;
+ if (AtomicPostIncrement(&__httpc_refcount)) return 0;
- ret = HTTPC_Initialize(__httpc_servhandle);
- if(ret!=0)return ret;
+ ret = srvGetServiceHandle(&__httpc_servhandle, "http:C");
+ if (R_SUCCEEDED(ret))
+ {
+ ret = HTTPC_Initialize(__httpc_servhandle);
+ if (R_FAILED(ret)) svcCloseHandle(__httpc_servhandle);
+ }
+ if (R_FAILED(ret)) AtomicDecrement(&__httpc_refcount);
- return 0;
+ return ret;
}
void httpcExit(void)
{
- if(__httpc_servhandle==0)return;
-
+ if (AtomicDecrement(&__httpc_refcount)) return;
svcCloseHandle(__httpc_servhandle);
-
- __httpc_servhandle = 0;
}
Result httpcOpenContext(httpcContext *context, char* url, u32 use_defaultproxy)
Result ret=0;
ret = HTTPC_CreateContext(__httpc_servhandle, url, &context->httphandle);
- if(ret!=0)return ret;
+ if(R_FAILED(ret))return ret;
ret = srvGetServiceHandle(&context->servhandle, "http:C");
- if(ret!=0) {
+ if(R_FAILED(ret)) {
HTTPC_CloseContext(__httpc_servhandle, context->httphandle);
return ret;
}
ret = HTTPC_InitializeConnectionSession(context->servhandle, context->httphandle);
- if(ret!=0) {
+ if(R_FAILED(ret)) {
svcCloseHandle(context->servhandle);
HTTPC_CloseContext(__httpc_servhandle, context->httphandle);
return ret;
if(use_defaultproxy==0)return 0;
ret = HTTPC_SetProxyDefault(context->servhandle, context->httphandle);
- if(ret!=0) {
+ if(R_FAILED(ret)) {
svcCloseHandle(context->servhandle);
HTTPC_CloseContext(__httpc_servhandle, context->httphandle);
return ret;
if(downloadedsize)*downloadedsize = 0;
ret=httpcGetDownloadSizeState(context, NULL, &contentsize);
- if(ret!=0)return ret;
+ if(R_FAILED(ret))return ret;
while(pos < size)
{
if(ret==HTTPC_RESULTCODE_DOWNLOADPENDING)
{
ret=httpcGetDownloadSizeState(context, &pos, NULL);
- if(ret!=0)return ret;
+ if(R_FAILED(ret))return ret;
}
- else if(ret!=0)
+ else if(R_FAILED(ret))
{
return ret;
}
cmdbuf[5]=0;//Some sort of handle.
Result ret=0;
- if((ret=svcSendSyncRequest(handle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
return cmdbuf[1];
}
cmdbuf[4]=(u32)url;
Result ret=0;
- if((ret=svcSendSyncRequest(handle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
if(contextHandle)*contextHandle=cmdbuf[2];
cmdbuf[2]=IPC_Desc_CurProcessHandle();
Result ret=0;
- if((ret=svcSendSyncRequest(handle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
return cmdbuf[1];
}
cmdbuf[1]=contextHandle;
Result ret=0;
- if((ret=svcSendSyncRequest(handle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
return cmdbuf[1];
}
cmdbuf[1]=contextHandle;
Result ret=0;
- if((ret=svcSendSyncRequest(handle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
return cmdbuf[1];
}
cmdbuf[7]=(u32)value;
Result ret=0;
- if((ret=svcSendSyncRequest(handle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
return cmdbuf[1];
}
cmdbuf[1]=contextHandle;
Result ret=0;
- if((ret=svcSendSyncRequest(handle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
return cmdbuf[1];
}
cmdbuf[4]=(u32)buffer;
Result ret=0;
- if((ret=svcSendSyncRequest(handle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
return cmdbuf[1];
}
cmdbuf[1]=contextHandle;
Result ret=0;
- if((ret=svcSendSyncRequest(handle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
*out = cmdbuf[2];
cmdbuf[1]=contextHandle;
Result ret=0;
- if((ret=svcSendSyncRequest(handle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
if(downloadedsize)*downloadedsize = cmdbuf[2];
if(contentsize)*contentsize = cmdbuf[3];
cmdbuf[7]=(u32)value;
Result ret=0;
- if((ret=svcSendSyncRequest(handle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
return cmdbuf[1];
}
cmdbuf[1]=contextHandle;
Result ret=0;
- if((ret=svcSendSyncRequest(handle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(handle)))return ret;
*out = cmdbuf[2];
#include <stdlib.h>
#include <string.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
+#include <3ds/synchronization.h>
#include <3ds/services/ir.h>
#include <3ds/ipc.h>
-static Handle iru_handle=0;
-static Handle iru_sharedmem_handle=0;
-static u32 *iru_sharedmem = NULL;
-static u32 iru_sharedmem_size = 0;
+static Handle iru_handle;
+static Handle iru_sharedmem_handle;
+static u32 *iru_sharedmem;
+static u32 iru_sharedmem_size;
+static int iru_refcount;
Result irucmd_Initialize(void)
{
cmdbuf[0] = IPC_MakeHeader(0x1,0,0); // 0x10000
- if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
ret = (Result)cmdbuf[1];
return ret;
cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000
- if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
ret = (Result)cmdbuf[1];
return ret;
cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
cmdbuf[3] = (u32)buf;
- if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
ret = (Result)cmdbuf[1];
return ret;
cmdbuf[0] = IPC_MakeHeader(0x4,0,0); // 0x40000
- if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
ret = (Result)cmdbuf[1];
return ret;
cmdbuf[4] = IPC_Desc_SharedHandles(1);
cmdbuf[5] = iru_sharedmem_handle;
- if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
ret = (Result)cmdbuf[1];
return ret;
cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000
- if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
ret = (Result)cmdbuf[1];
*transfercount = cmdbuf[2];
cmdbuf[0] = IPC_MakeHeader(0x9,1,0); // 0x90040
cmdbuf[1] = (u32)value;
- if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
ret = (Result)cmdbuf[1];
return ret;
cmdbuf[0] = IPC_MakeHeader(0xA,0,0); // 0xA0000
- if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
ret = (Result)cmdbuf[1];
*out = (u8)cmdbuf[2];
cmdbuf[0] = IPC_MakeHeader(0xB,1,0); // 0xB0040
cmdbuf[1] = value;
- if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
ret = (Result)cmdbuf[1];
return ret;
cmdbuf[0] = IPC_MakeHeader(0xC,0,0); // 0xC0000
- if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret;
ret = (Result)cmdbuf[1];
*out = cmdbuf[2];
return ret;
}
-Result IRU_Initialize(u32 *sharedmem_addr, u32 sharedmem_size)
+Result iruInit(u32 *sharedmem_addr, u32 sharedmem_size)
{
Result ret = 0;
- if(iru_handle)return 0;
+ if(AtomicPostIncrement(&iru_refcount)) return 0;
ret = srvGetServiceHandle(&iru_handle, "ir:u");
- if(ret!=0)return ret;
+ if(R_FAILED(ret))goto cleanup0;
ret = irucmd_Initialize();
- if(ret!=0)return ret;
+ if(R_FAILED(ret))goto cleanup1;
ret = svcCreateMemoryBlock(&iru_sharedmem_handle, (u32)sharedmem_addr, sharedmem_size, 1, 3);
- if(ret!=0)return ret;
+ if(R_FAILED(ret))goto cleanup2;
iru_sharedmem = sharedmem_addr;
iru_sharedmem_size = sharedmem_size;
return ret;
+
+cleanup2:
+ irucmd_Shutdown();
+cleanup1:
+ svcCloseHandle(iru_handle);
+cleanup0:
+ AtomicDecrement(&iru_refcount);
+ return ret;
}
-Result IRU_Shutdown(void)
+void iruExit(void)
{
- Result ret = 0;
-
- if(iru_handle==0)return 0;
-
- ret = irucmd_Shutdown();
- if(ret!=0)return ret;
+ if(AtomicDecrement(&iru_refcount)) return;
+ irucmd_Shutdown();
svcCloseHandle(iru_handle);
svcCloseHandle(iru_sharedmem_handle);
iru_handle = 0;
iru_sharedmem_handle = 0;
-
- return 0;
}
-Handle IRU_GetServHandle(void)
+Handle iruGetServHandle(void)
{
return iru_handle;
}
-Result IRU_SendData(u8 *buf, u32 size, u32 wait)
+Result iruSendData(u8 *buf, u32 size, bool wait)
{
Result ret = 0;
ret = irucmd_StartSendTransfer(buf, size);
- if(ret!=0)return ret;
+ if(R_FAILED(ret))return ret;
- if(wait==0)return 0;
+ if(!wait)return 0;
return irucmd_WaitSendTransfer();
}
-Result IRU_RecvData(u8 *buf, u32 size, u8 flag, u32 *transfercount, u32 wait)
+Result iruRecvData(u8 *buf, u32 size, u8 flag, u32 *transfercount, bool wait)
{
Result ret = 0;
*transfercount = 0;
ret = irucmd_StartRecvTransfer(size, flag);
- if(ret!=0)return ret;
+ if(R_FAILED(ret))return ret;
if(wait)
{
ret = irucmd_WaitRecvTransfer(transfercount);
- if(ret!=0)return ret;
+ if(R_FAILED(ret))return ret;
if(buf)memcpy(buf, iru_sharedmem, size);
}
#include <stdlib.h>
#include <string.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
#include <3ds/mappable.h>
+#include <3ds/synchronization.h>
#include <3ds/services/irrst.h>
#include <3ds/ipc.h>
static u32 kHeld;
static circlePosition csPos;
-static bool irrstUsed = false;
+static int irrstRefCount;
Result irrstInit(void)
{
- if(irrstUsed)return 0;
+ if (AtomicPostIncrement(&irrstRefCount)) return 0;
Result ret=0;
// Request service.
- if((ret=srvGetServiceHandle(&irrstHandle, "ir:rst")))return ret;
+ if(R_FAILED(ret=srvGetServiceHandle(&irrstHandle, "ir:rst"))) goto cleanup0;
// Get sharedmem handle.
- if((ret=IRRST_GetHandles(&irrstMemHandle, &irrstEvent))) goto cleanup1;
+ if(R_FAILED(ret=IRRST_GetHandles(&irrstMemHandle, &irrstEvent))) goto cleanup1;
// Initialize ir:rst
if(__get_handle_from_list("ir:rst")==0)ret=IRRST_Initialize(10, 0);
goto cleanup1;
}
- if((ret=svcMapMemoryBlock(irrstMemHandle, (u32)irrstSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
+ if(R_FAILED(ret=svcMapMemoryBlock(irrstMemHandle, (u32)irrstSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
// Reset internal state.
- irrstUsed = true;
kHeld = 0;
return 0;
}
cleanup1:
svcCloseHandle(irrstHandle);
+cleanup0:
+ AtomicDecrement(&irrstRefCount);
return ret;
}
void irrstExit(void)
{
- if(!irrstUsed)return;
+ if (AtomicDecrement(&irrstRefCount)) return;
- irrstUsed = false;
svcCloseHandle(irrstEvent);
// Unmap ir:rst sharedmem and close handles.
svcUnmapMemoryBlock(irrstMemHandle, (u32)irrstSharedMem);
void irrstScanInput(void)
{
- if(!irrstUsed)return;
+ if(irrstRefCount==0)return;
u32 Id=0;
kHeld = 0;
u32 irrstKeysHeld(void)
{
- if(irrstUsed)return kHeld;
+ if(irrstRefCount>0)return kHeld;
return 0;
}
cmdbuf[0]=IPC_MakeHeader(0x1,0,0); // 0x10000
Result ret=0;
- if((ret=svcSendSyncRequest(irrstHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(irrstHandle)))return ret;
if(outMemHandle)*outMemHandle=cmdbuf[3];
if(outEventHandle)*outEventHandle=cmdbuf[4];
cmdbuf[2]=unk2;
Result ret=0;
- if((ret=svcSendSyncRequest(irrstHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(irrstHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[0]=IPC_MakeHeader(0x3,0,0); // 0x30000
Result ret=0;
- if((ret=svcSendSyncRequest(irrstHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(irrstHandle)))return ret;
return cmdbuf[1];
}
#include <stdlib.h>
#include <string.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
#include <3ds/os.h>
#include <3ds/linear.h>
+#include <3ds/synchronization.h>
#include <3ds/services/mvd.h>
#include <3ds/ipc.h>
Handle mvdstdHandle;
-static u32 mvdstdInitialized = 0;
+static int mvdstdRefCount;
static mvdstdMode mvdstd_mode;
static mvdstdTypeInput mvdstd_input_type;
static mvdstdTypeOutput mvdstd_output_type;
-static u32 *mvdstd_workbuf = NULL;
-static size_t mvdstd_workbufsize = 0;
+static u32 *mvdstd_workbuf;
+static size_t mvdstd_workbufsize;
static Result mvdstdipc_Initialize(u32 *buf, u32 bufsize, Handle kprocess)
{
cmdbuf[4] = kprocess;
Result ret=0;
- if((ret=svcSendSyncRequest(mvdstdHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(mvdstdHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x18,0,0); // 0x180000
Result ret=0;
- if((ret=svcSendSyncRequest(mvdstdHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(mvdstdHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x19,0,0); // 0x190000
Result ret=0;
- if((ret=svcSendSyncRequest(mvdstdHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(mvdstdHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x1A,0,0); // 0x1A0000
Result ret=0;
- if((ret=svcSendSyncRequest(mvdstdHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(mvdstdHandle)))return ret;
return cmdbuf[1];
}
cmdbuf[5] = (u32)config;
Result ret=0;
- if((ret=svcSendSyncRequest(mvdstdHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(mvdstdHandle)))return ret;
return cmdbuf[1];
}
{
Result ret=0;
- if(mvdstdInitialized)return 0;
-
mvdstd_workbufsize = size;
mvdstd_mode = mode;
mvdstd_input_type = input_type;
if(mvdstd_mode==MVDMODE_COLORFORMATCONV)mvdstd_workbufsize = 1;
if(mvdstd_mode!=MVDMODE_COLORFORMATCONV)return -2;//Video processing / H.264 isn't supported atm.
- if((ret=srvGetServiceHandle(&mvdstdHandle, "mvd:STD")))return ret;
+ if (AtomicPostIncrement(&mvdstdRefCount)) return 0;
+
+ if(R_FAILED(ret=srvGetServiceHandle(&mvdstdHandle, "mvd:STD"))) goto cleanup0;
mvdstd_workbuf = linearAlloc(mvdstd_workbufsize);
- if(mvdstd_workbuf==NULL)return -1;
+ if(mvdstd_workbuf==NULL) goto cleanup1;
ret = mvdstdipc_Initialize((u32*)osConvertOldLINEARMemToNew((u32)mvdstd_workbuf), mvdstd_workbufsize, CUR_PROCESS_HANDLE);
- if(ret<0)
- {
- svcCloseHandle(mvdstdHandle);
- linearFree(mvdstd_workbuf);
- return ret;
- }
+ if(R_FAILED(ret)) goto cleanup2;
ret = mvdstdipc_cmd18();
- if(ret<0)
- {
- mvdstdipc_Shutdown();
- svcCloseHandle(mvdstdHandle);
- linearFree(mvdstd_workbuf);
- return ret;
- }
+ if(R_FAILED(ret)) goto cleanup3;
- mvdstdInitialized = 1;
+ return ret;
- return 0;
+cleanup3:
+ mvdstdipc_Shutdown();
+cleanup2:
+ linearFree(mvdstd_workbuf);
+cleanup1:
+ svcCloseHandle(mvdstdHandle);
+cleanup0:
+ AtomicDecrement(&mvdstdRefCount);
+ return ret;
}
-Result mvdstdShutdown(void)
+void mvdstdExit(void)
{
- if(!mvdstdInitialized)return 0;
+ if (AtomicDecrement(&mvdstdRefCount)) return;
if(mvdstd_mode==MVDMODE_COLORFORMATCONV)
{
svcCloseHandle(mvdstdHandle);
linearFree(mvdstd_workbuf);
-
- return 0;
}
Result mvdstdProcessFrame(mvdstdConfig *config, u32 *h264_vaddr_inframe, u32 h264_inframesize, u32 h264_frameid)
{
Result ret;
- if(!mvdstdInitialized)return 0;
+ if(mvdstdRefCount==0)return 0;
if(config==NULL)return -1;
if(mvdstd_mode!=MVDMODE_COLORFORMATCONV)return -2;
ret = mvdstdSetConfig(config);
- if(ret<0)return ret;
+ if(R_FAILED(ret))return ret;
return mvdstdipc_cmd1a();
}
#include <string.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/os.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
+#include <3ds/synchronization.h>
#include <3ds/services/news.h>
#include <3ds/ipc.h>
u16 title[32];
} NotificationHeader;
-static Handle newsHandle = 0;
+static Handle newsHandle;
+static int newsRefCount;
Result newsInit(void) {
- return srvGetServiceHandle(&newsHandle, "news:u");
+ Result res;
+ if (AtomicPostIncrement(&newsRefCount)) return 0;
+ res = srvGetServiceHandle(&newsHandle, "news:u");
+ if (R_FAILED(res)) AtomicDecrement(&newsRefCount);
+ return res;
}
-Result newsExit(void) {
- return svcCloseHandle(newsHandle);
+void newsExit(void) {
+ if (AtomicDecrement(&newsRefCount)) return;
+ svcCloseHandle(newsHandle);
}
Result NEWSU_AddNotification(const u16* title, u32 titleLength, const u16* message, u32 messageLength, const void* imageData, u32 imageSize, bool jpeg)
cmdbuf[10] = IPC_Desc_Buffer(imageSize,IPC_BUFFER_R);
cmdbuf[11] = (u32) imageData;
- if((ret = svcSendSyncRequest(newsHandle))!=0) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;
return (Result)cmdbuf[1];
}
#include <stdlib.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
+#include <3ds/synchronization.h>
#include <3ds/services/ns.h>
#include <3ds/ipc.h>
static Handle nsHandle;
+static int nsRefCount;
Result nsInit(void)
{
- return srvGetServiceHandle(&nsHandle, "ns:s");
+ Result res;
+ if (AtomicPostIncrement(&nsRefCount)) return 0;
+ res = srvGetServiceHandle(&nsHandle, "ns:s");
+ if (R_FAILED(res)) AtomicDecrement(&nsRefCount);
+ return res;
}
-Result nsExit(void)
+void nsExit(void)
{
- return svcCloseHandle(nsHandle);
+ if (AtomicDecrement(&nsRefCount)) return;
+ svcCloseHandle(nsHandle);
}
Result NS_LaunchTitle(u64 titleid, u32 launch_flags, u32 *procid)
cmdbuf[2] = (titleid >> 32) & 0xffffffff;
cmdbuf[3] = launch_flags;
- if((ret = svcSendSyncRequest(nsHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret;
if(procid != NULL)
*procid = cmdbuf[2];
cmdbuf[5] = 0x0; // reserved
cmdbuf[6] = 0x0;
- if((ret = svcSendSyncRequest(nsHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret;
return (Result)cmdbuf[1];
}
\ No newline at end of file
#include <stdlib.h>
#include <string.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
+#include <3ds/synchronization.h>
#include <3ds/services/pm.h>
#include <3ds/ipc.h>
static Handle pmHandle;
+static int pmRefCount;
Result pmInit(void)
{
- return srvGetServiceHandle(&pmHandle, "pm:app");
+ Result res;
+ if (AtomicPostIncrement(&pmRefCount)) return 0;
+ res = srvGetServiceHandle(&pmHandle, "pm:app");
+ if (R_FAILED(res)) AtomicDecrement(&pmRefCount);
+ return res;
}
-Result pmExit(void)
+void pmExit(void)
{
- return svcCloseHandle(pmHandle);
+ if (AtomicDecrement(&pmRefCount)) return;
+ svcCloseHandle(pmHandle);
}
Result PM_LaunchTitle(u8 mediatype, u64 titleid, u32 launch_flags)
cmdbuf[4] = 0x0;
cmdbuf[5] = launch_flags;
- if((ret = svcSendSyncRequest(pmHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
return (Result)cmdbuf[1];
}
cmdbuf[3] = mediatype;
cmdbuf[4] = 0x0;
- if((ret = svcSendSyncRequest(pmHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
memcpy(out, (u8*)(&cmdbuf[2]), 8);
cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
cmdbuf[3] = (u32)in;
- if((ret = svcSendSyncRequest(pmHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
return (Result)cmdbuf[1];
}
cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_W);
cmdbuf[3] = (u32)out;
- if((ret = svcSendSyncRequest(pmHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
return (Result)cmdbuf[1];
}
cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
cmdbuf[4] = (u32)in;
- if((ret = svcSendSyncRequest(pmHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(pmHandle)))return ret;
return (Result)cmdbuf[1];
}
\ No newline at end of file
#include <stdlib.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
+#include <3ds/synchronization.h>
#include <3ds/services/ps.h>
#include <3ds/ipc.h>
static Handle psHandle;
+static int psRefCount;
Result psInit(void)
{
- return srvGetServiceHandle(&psHandle, "ps:ps");
+ Result res;
+ if (AtomicPostIncrement(&psRefCount)) return 0;
+ res = srvGetServiceHandle(&psHandle, "ps:ps");
+ if (R_FAILED(res)) AtomicDecrement(&psRefCount);
+ return res;
}
-Result psExit(void)
+void psExit(void)
{
- return svcCloseHandle(psHandle);
+ if (AtomicDecrement(&psRefCount)) return;
+ svcCloseHandle(psHandle);
}
Result PS_EncryptDecryptAes(u32 size, u8* in, u8* out, u32 aes_algo, u32 key_type, u8* iv)
cmdbuf[10] = IPC_Desc_PXIBuffer(size,1,false);
cmdbuf[11] = (u32)out;
- if((ret = svcSendSyncRequest(psHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(psHandle)))return ret;
_iv[0] = cmdbuf[2];
_iv[1] = cmdbuf[3];
cmdbuf[10] = IPC_Desc_PXIBuffer(out_size,1,false);
cmdbuf[11] = (u32)out;
- if((ret = svcSendSyncRequest(psHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(psHandle)))return ret;
return (Result)cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0xA,0,0); // 0xA0000
- if((ret = svcSendSyncRequest(psHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(psHandle)))return ret;
*seed = (u64)cmdbuf[2] | (u64)cmdbuf[3] << 32;
cmdbuf[0] = IPC_MakeHeader(0xB,0,0); // 0xB0000
- if((ret = svcSendSyncRequest(psHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(psHandle)))return ret;
*device_id = cmdbuf[2];
#include <stdlib.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
+#include <3ds/synchronization.h>
#include <3ds/services/ptm.h>
#include <3ds/ipc.h>
-
static Handle ptmHandle, ptmSysmHandle;
+static int ptmRefCount, ptmSysmRefCount;
Result ptmInit(void)
{
- return srvGetServiceHandle(&ptmHandle, "ptm:u");
+ if (AtomicPostIncrement(&ptmRefCount)) return 0;
+ Result res = srvGetServiceHandle(&ptmHandle, "ptm:u");
+ if (R_FAILED(res)) AtomicDecrement(&ptmRefCount);
+ return res;
}
-Result ptmExit(void)
+void ptmExit(void)
{
- return svcCloseHandle(ptmHandle);
+ if (AtomicDecrement(&ptmRefCount)) return;
+ svcCloseHandle(ptmHandle);
}
Result ptmSysmInit(void)
{
- return srvGetServiceHandle(&ptmSysmHandle, "ptm:sysm");
+ if (AtomicPostIncrement(&ptmSysmRefCount)) return 0;
+ Result res = srvGetServiceHandle(&ptmSysmHandle, "ptm:sysm");
+ if (R_FAILED(res)) AtomicDecrement(&ptmSysmHandle);
+ return res;
}
-Result ptmSysmExit(void)
+void ptmSysmExit(void)
{
- return svcCloseHandle(ptmSysmHandle);
+ if (AtomicDecrement(&ptmSysmHandle)) return;
+ svcCloseHandle(ptmSysmHandle);
}
-Result PTMU_GetShellState(Handle* servhandle, u8 *out)
+Result PTMU_GetShellState(u8 *out)
{
- if(!servhandle)servhandle=&ptmHandle;
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000
- if((ret = svcSendSyncRequest(*servhandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(ptmHandle)))return ret;
*out = (u8)cmdbuf[2];
return (Result)cmdbuf[1];
}
-Result PTMU_GetBatteryLevel(Handle* servhandle, u8 *out)
+Result PTMU_GetBatteryLevel(u8 *out)
{
- if(!servhandle)servhandle=&ptmHandle;
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x7,0,0); // 0x70000
- if((ret = svcSendSyncRequest(*servhandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(ptmHandle)))return ret;
*out = (u8)cmdbuf[2];
return (Result)cmdbuf[1];
}
-Result PTMU_GetBatteryChargeState(Handle* servhandle, u8 *out)
+Result PTMU_GetBatteryChargeState(u8 *out)
{
- if(!servhandle)servhandle=&ptmHandle;
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x8,0,0); // 0x80000
- if((ret = svcSendSyncRequest(*servhandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(ptmHandle)))return ret;
*out = (u8)cmdbuf[2];
return (Result)cmdbuf[1];
}
-Result PTMU_GetPedometerState(Handle* servhandle, u8 *out)
+Result PTMU_GetPedometerState(u8 *out)
{
- if(!servhandle)servhandle=&ptmHandle;
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x9,0,0); // 0x90000
- if((ret = svcSendSyncRequest(*servhandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(ptmHandle)))return ret;
*out = (u8)cmdbuf[2];
return (Result)cmdbuf[1];
}
-Result PTMU_GetTotalStepCount(Handle* servhandle, u32 *steps)
+Result PTMU_GetTotalStepCount(u32 *steps)
{
- if(!servhandle)servhandle=&ptmHandle;
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xC,0,0); // 0xC0000
- if((ret = svcSendSyncRequest(*servhandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(ptmHandle)))return ret;
*steps = cmdbuf[2];
cmdbuf[0] = IPC_MakeHeader(0x818,1,0); // 0x08180040
cmdbuf[1] = value;
- if((ret = svcSendSyncRequest(ptmSysmHandle))!=0)return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
return (Result)cmdbuf[1];
}
#include <stdlib.h>
#include <string.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
+#include <3ds/synchronization.h>
#include <3ds/services/qtm.h>
#include <3ds/ipc.h>
Handle qtmHandle;
-
-static bool qtmInitialized = false;
+static int qtmRefCount;
Result qtmInit(void)
{
Result ret=0;
- if(qtmInitialized)return 0;
-
- if((ret=srvGetServiceHandle(&qtmHandle, "qtm:u")) && (ret=srvGetServiceHandle(&qtmHandle, "qtm:s")) && (ret=srvGetServiceHandle(&qtmHandle, "qtm:sp")))return ret;
-
- qtmInitialized = true;
+ if (AtomicPostIncrement(&qtmRefCount)) return 0;
- return 0;
+ ret = srvGetServiceHandle(&qtmHandle, "qtm:u");
+ if (R_FAILED(ret)) ret = srvGetServiceHandle(&qtmHandle, "qtm:s");
+ if (R_FAILED(ret)) ret = srvGetServiceHandle(&qtmHandle, "qtm:sp");
+ if (R_FAILED(ret)) AtomicDecrement(&qtmRefCount);
+ return ret;
}
void qtmExit(void)
{
- if(!qtmInitialized)return;
-
+ if (AtomicDecrement(&qtmRefCount)) return;
svcCloseHandle(qtmHandle);
- qtmInitialized = false;
}
bool qtmCheckInitialized(void)
{
- return qtmInitialized;
+ return qtmRefCount>0;
}
Result qtmGetHeadtrackingInfo(u64 val, qtmHeadtrackingInfo *out)
{
u32* cmdbuf=getThreadCommandBuffer();
- if(!qtmInitialized)return -1;
+ if(!qtmCheckInitialized())return -1;
cmdbuf[0]=IPC_MakeHeader(0x2,2,0); // 0x20080
cmdbuf[1] = val&0xFFFFFFFF;
cmdbuf[2] = val>>32;
Result ret=0;
- if((ret=svcSendSyncRequest(qtmHandle)))return ret;
+ if(R_FAILED(ret=svcSendSyncRequest(qtmHandle)))return ret;
ret = (Result)cmdbuf[1];
- if(ret!=0)return ret;
+ if(R_FAILED(ret))return ret;
if(out)memcpy(out, &cmdbuf[2], sizeof(qtmHeadtrackingInfo));
#include <3ds/srv.h>
#include <3ds/svc.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/ipc.h>
+#include <3ds/synchronization.h>
-Handle y2rHandle = 0;
-static bool initialized = false;
+Handle y2rHandle;
+static int y2rRefCount;
Result y2rInit(void)
{
Result ret = 0;
- if (initialized) return 0;
+ if (AtomicPostIncrement(&y2rRefCount)) return 0;
- if (y2rHandle == 0)
+ ret = srvGetServiceHandle(&y2rHandle, "y2r:u");
+ if (R_SUCCEEDED(ret))
{
- ret = srvGetServiceHandle(&y2rHandle, "y2r:u");
- if (ret < 0) return ret;
+ ret = Y2RU_DriverInitialize();
+ if (R_FAILED(ret)) svcCloseHandle(y2rHandle);
}
-
- ret = Y2RU_DriverInitialize();
- if (ret < 0) return ret;
- initialized = true;
-
- return 0;
+ if (R_FAILED(ret)) AtomicDecrement(&y2rRefCount);
+ return ret;
}
-Result y2rExit(void)
+void y2rExit(void)
{
- Result ret = 0;
-
- if (initialized)
- {
- ret = Y2RU_DriverFinalize();
- if (ret < 0) return ret;
- }
-
- if (y2rHandle != 0)
- {
- ret = svcCloseHandle(y2rHandle);
- if (ret < 0) return ret;
- y2rHandle = 0;
- }
-
- return 0;
+ if (AtomicDecrement(&y2rRefCount)) return;
+ Y2RU_DriverFinalize();
+ svcCloseHandle(y2rHandle);
}
Result Y2RU_SetInputFormat(Y2R_InputFormat format)
cmdbuf[0] = IPC_MakeHeader(0x1,1,0); // 0x10040
cmdbuf[1] = format;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*format = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x3,1,0); // 0x30040
cmdbuf[1] = format;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x4,0,0); // 0x40000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*format = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x5,1,0); // 0x50040
cmdbuf[1] = rotation;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*rotation = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x7,1,0); // 0x70040
cmdbuf[1] = alignment;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x8,0,0); // 0x80000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*alignment = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x9,1,0); // 0x90040
cmdbuf[1] = enable;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xA,0,0); // 0xA0000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*enabled = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0xB,1,0); // 0xB0040
cmdbuf[1] = enable;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xC,0,0); // 0xC0000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*enabled = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0xD,1,0); // 0xD0040
cmdbuf[1] = should_interrupt;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xE,0,0); // 0xE0000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*should_interrupt = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xF,0,0); // 0xF0000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*end_event = cmdbuf[3];
return cmdbuf[1];
cmdbuf[5] = IPC_Desc_SharedHandles(1);
cmdbuf[6] = CUR_PROCESS_HANDLE;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[5] = IPC_Desc_SharedHandles(1);
cmdbuf[6] = CUR_PROCESS_HANDLE;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[5] = IPC_Desc_SharedHandles(1);
cmdbuf[6] = CUR_PROCESS_HANDLE;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[5] = IPC_Desc_SharedHandles(1);
cmdbuf[6] = CUR_PROCESS_HANDLE;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x14,0,0); // 0x140000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*is_done = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x15,0,0); // 0x150000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*is_done = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x16,0,0); // 0x160000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*is_done = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x17,0,0); // 0x170000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*is_done = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
cmdbuf[5] = IPC_Desc_SharedHandles(1);
cmdbuf[6] = CUR_PROCESS_HANDLE;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x19,0,0); // 0x190000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*is_done = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x1A,1,0); // 0x1A0040
cmdbuf[1] = line_width;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1B,0,0); // 0x1B0000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*line_width = cmdbuf[2] & 0xFFFF;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x1C,1,0); // 0x1C0040
cmdbuf[1] = num_lines;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1D,0,0); // 0x1D0000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*num_lines = cmdbuf[2] & 0xFFFF;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x1E,4,0); // 0x1E0100
memcpy(&cmdbuf[1], coefficients, sizeof(Y2R_ColorCoefficients));
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1F,0,0); // 0x1F0000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
memcpy(coefficients,cmdbuf + 2, sizeof(Y2R_ColorCoefficients));
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x20,1,0); // 0x200040
cmdbuf[1] = coefficient;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x21,1,0); // 0x210040
cmdbuf[1] = standardCoeff;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
memcpy(coefficients,cmdbuf + 2, sizeof(Y2R_ColorCoefficients));
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x22,1,0); // 0x220040
cmdbuf[1] = alpha;
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x23,0,0); // 0x230000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*alpha = cmdbuf[2] & 0xFFFF;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x24,8,0); // 0x240200
memcpy(&cmdbuf[1], params, sizeof(Y2R_DitheringWeightParams));
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x25,0,0); // 0x250000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
memcpy(params,cmdbuf+2, sizeof(Y2R_DitheringWeightParams));
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x26,0,0); // 0x260000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x27,0,0); // 0x270000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x28,0,0); // 0x280000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*is_busy = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x29,7,0); // 0x2901C0
memcpy(&cmdbuf[1], params, sizeof(Y2R_ConversionParams));
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x2A,0,0); // 0x2A0000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
*ping = (u8)cmdbuf[2];
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x2B,0,0); // 0x2B0000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x2C,0,0); // 0x2C0000
- if ((ret = svcSendSyncRequest(y2rHandle)) != 0) return ret;
+ if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1];
}
#include <string.h>
#include <3ds/types.h>
+#include <3ds/result.h>
#include <3ds/srv.h>
#include <3ds/svc.h>
#include <3ds/ipc.h>
extern service_list_t* __service_ptr;
-static Handle g_srv_handle = 0;
+static Handle g_srv_handle;
static int __name_cmp(const char* a, const char* b) {
if(g_srv_handle != 0) return rc;
- if((rc = svcConnectToPort(&g_srv_handle, "srv:")))return rc;
+ if(R_FAILED(rc = svcConnectToPort(&g_srv_handle, "srv:")))return rc;
- if((rc = srvRegisterClient())) {
+ if(R_FAILED(rc = srvRegisterClient())) {
svcCloseHandle(g_srv_handle);
g_srv_handle = 0;
}
cmdbuf[0] = IPC_MakeHeader(0x1,0,2); // 0x10002
cmdbuf[1] = IPC_Desc_CurProcessHandle();
- if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
+ if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle)))return rc;
return cmdbuf[1];
}
cmdbuf[3] = strlen(name);
cmdbuf[4] = 0x0;
- if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
+ if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle)))return rc;
*out = cmdbuf[3];
return cmdbuf[1];
cmdbuf[4] = maxSessions;
Result rc;
- if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
+ if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle)))return rc;
*out = cmdbuf[3];
return cmdbuf[1];
cmdbuf[3] = strlen(name);
Result rc;
- if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
+ if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle)))return rc;
return cmdbuf[1];
}
{
Result rc = 0;
- if((rc = svcConnectToPort(&g_srv_handle, "srv:pm")))return rc;
+ if(R_FAILED(rc = svcConnectToPort(&g_srv_handle, "srv:pm")))return rc;
- if((rc = srvRegisterClient())) {
+ if(R_FAILED(rc = srvRegisterClient())) {
svcCloseHandle(g_srv_handle);
g_srv_handle = 0;
}
cmdbuf[3] = IPC_Desc_StaticBuffer(count*4,0);
cmdbuf[4] = (u32)serviceaccesscontrol;
- if((rc = svcSendSyncRequest(g_srv_handle))) return rc;
+ if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle))) return rc;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x404,1,0); // 0x4040040 // <7.x
cmdbuf[1] = procid;
- if((rc = svcSendSyncRequest(g_srv_handle))) return rc;
+ if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle))) return rc;
return cmdbuf[1];
}