Use Event in audout/audin instead of raw handles.

This commit is contained in:
yellows8 2018-10-26 13:41:26 -04:00
parent 5dc7505139
commit 3b0348654e
2 changed files with 17 additions and 27 deletions

View File

@ -3,6 +3,7 @@
#include "result.h" #include "result.h"
#include "arm/atomics.h" #include "arm/atomics.h"
#include "kernel/ipc.h" #include "kernel/ipc.h"
#include "kernel/event.h"
#include "services/audin.h" #include "services/audin.h"
#include "services/sm.h" #include "services/sm.h"
@ -14,14 +15,14 @@ static Service g_audinSrv;
static Service g_audinIAudioIn; static Service g_audinIAudioIn;
static u64 g_refCnt; static u64 g_refCnt;
static Handle g_audinBufferEventHandle = INVALID_HANDLE; static Event g_audinBufferEvent;
static u32 g_sampleRate = 0; static u32 g_sampleRate = 0;
static u32 g_channelCount = 0; static u32 g_channelCount = 0;
static PcmFormat g_pcmFormat = PcmFormat_Invalid; static PcmFormat g_pcmFormat = PcmFormat_Invalid;
static AudioInState g_deviceState = AudioInState_Stopped; static AudioInState g_deviceState = AudioInState_Stopped;
static Result _audinRegisterBufferEvent(Handle *BufferEvent); static Result _audinRegisterBufferEvent(Event *BufferEvent);
Result audinInitialize(void) Result audinInitialize(void)
{ {
@ -46,7 +47,7 @@ Result audinInitialize(void)
// Register global handle for buffer events // Register global handle for buffer events
if (R_SUCCEEDED(rc)) if (R_SUCCEEDED(rc))
rc = _audinRegisterBufferEvent(&g_audinBufferEventHandle); rc = _audinRegisterBufferEvent(&g_audinBufferEvent);
if (R_FAILED(rc)) if (R_FAILED(rc))
audinExit(); audinExit();
@ -58,10 +59,7 @@ void audinExit(void)
{ {
if (atomicDecrement64(&g_refCnt) == 0) if (atomicDecrement64(&g_refCnt) == 0)
{ {
if (g_audinBufferEventHandle != INVALID_HANDLE) { eventClose(&g_audinBufferEvent);
svcCloseHandle(g_audinBufferEventHandle);
g_audinBufferEventHandle = INVALID_HANDLE;
}
g_sampleRate = 0; g_sampleRate = 0;
g_channelCount = 0; g_channelCount = 0;
@ -91,13 +89,10 @@ AudioInState audinGetDeviceState(void) {
Result audinWaitCaptureFinish(AudioInBuffer **released, u32* released_count, u64 timeout) { Result audinWaitCaptureFinish(AudioInBuffer **released, u32* released_count, u64 timeout) {
// Wait on the buffer event handle // Wait on the buffer event handle
Result rc = svcWaitSynchronizationSingle(g_audinBufferEventHandle, timeout); Result rc = eventWait(&g_audinBufferEvent, timeout);
if (R_SUCCEEDED(rc)) if (R_SUCCEEDED(rc))
{ {
// Signal the buffer event handle right away
svcResetSignal(g_audinBufferEventHandle);
// Grab the released buffer // Grab the released buffer
rc = audinGetReleasedAudioInBuffer(released, released_count); rc = audinGetReleasedAudioInBuffer(released, released_count);
} }
@ -349,7 +344,7 @@ Result audinAppendAudioInBuffer(AudioInBuffer *Buffer) {
return rc; return rc;
} }
static Result _audinRegisterBufferEvent(Handle *BufferEvent) { static Result _audinRegisterBufferEvent(Event *BufferEvent) {
IpcCommand c; IpcCommand c;
ipcInitialize(&c); ipcInitialize(&c);
@ -377,7 +372,7 @@ static Result _audinRegisterBufferEvent(Handle *BufferEvent) {
rc = resp->result; rc = resp->result;
if (R_SUCCEEDED(rc) && BufferEvent) if (R_SUCCEEDED(rc) && BufferEvent)
*BufferEvent = r.Handles[0]; eventLoadRemote(BufferEvent, r.Handles[0], true);
} }
return rc; return rc;

View File

@ -3,6 +3,7 @@
#include "result.h" #include "result.h"
#include "arm/atomics.h" #include "arm/atomics.h"
#include "kernel/ipc.h" #include "kernel/ipc.h"
#include "kernel/event.h"
#include "services/audout.h" #include "services/audout.h"
#include "services/sm.h" #include "services/sm.h"
@ -14,14 +15,14 @@ static Service g_audoutSrv;
static Service g_audoutIAudioOut; static Service g_audoutIAudioOut;
static u64 g_refCnt; static u64 g_refCnt;
static Handle g_audoutBufferEventHandle = INVALID_HANDLE; static Event g_audoutBufferEvent;
static u32 g_sampleRate = 0; static u32 g_sampleRate = 0;
static u32 g_channelCount = 0; static u32 g_channelCount = 0;
static PcmFormat g_pcmFormat = PcmFormat_Invalid; static PcmFormat g_pcmFormat = PcmFormat_Invalid;
static AudioOutState g_deviceState = AudioOutState_Stopped; static AudioOutState g_deviceState = AudioOutState_Stopped;
static Result _audoutRegisterBufferEvent(Handle *BufferEvent); static Result _audoutRegisterBufferEvent(Event *BufferEvent);
Result audoutInitialize(void) Result audoutInitialize(void)
{ {
@ -46,7 +47,7 @@ Result audoutInitialize(void)
// Register global handle for buffer events // Register global handle for buffer events
if (R_SUCCEEDED(rc)) if (R_SUCCEEDED(rc))
rc = _audoutRegisterBufferEvent(&g_audoutBufferEventHandle); rc = _audoutRegisterBufferEvent(&g_audoutBufferEvent);
if (R_FAILED(rc)) if (R_FAILED(rc))
audoutExit(); audoutExit();
@ -58,10 +59,7 @@ void audoutExit(void)
{ {
if (atomicDecrement64(&g_refCnt) == 0) if (atomicDecrement64(&g_refCnt) == 0)
{ {
if (g_audoutBufferEventHandle != INVALID_HANDLE) { eventClose(&g_audoutBufferEvent);
svcCloseHandle(g_audoutBufferEventHandle);
g_audoutBufferEventHandle = INVALID_HANDLE;
}
g_sampleRate = 0; g_sampleRate = 0;
g_channelCount = 0; g_channelCount = 0;
@ -91,13 +89,10 @@ AudioOutState audoutGetDeviceState(void) {
Result audoutWaitPlayFinish(AudioOutBuffer **released, u32* released_count, u64 timeout) { Result audoutWaitPlayFinish(AudioOutBuffer **released, u32* released_count, u64 timeout) {
// Wait on the buffer event handle // Wait on the buffer event handle
Result rc = svcWaitSynchronizationSingle(g_audoutBufferEventHandle, timeout); Result rc = eventWait(&g_audoutBufferEvent, timeout);
if (R_SUCCEEDED(rc)) if (R_SUCCEEDED(rc))
{ {
// Signal the buffer event handle right away
svcResetSignal(g_audoutBufferEventHandle);
// Grab the released buffer // Grab the released buffer
rc = audoutGetReleasedAudioOutBuffer(released, released_count); rc = audoutGetReleasedAudioOutBuffer(released, released_count);
} }
@ -349,7 +344,7 @@ Result audoutAppendAudioOutBuffer(AudioOutBuffer *Buffer) {
return rc; return rc;
} }
static Result _audoutRegisterBufferEvent(Handle *BufferEvent) { static Result _audoutRegisterBufferEvent(Event *BufferEvent) {
IpcCommand c; IpcCommand c;
ipcInitialize(&c); ipcInitialize(&c);
@ -377,7 +372,7 @@ static Result _audoutRegisterBufferEvent(Handle *BufferEvent) {
rc = resp->result; rc = resp->result;
if (R_SUCCEEDED(rc) && BufferEvent) if (R_SUCCEEDED(rc) && BufferEvent)
*BufferEvent = r.Handles[0]; eventLoadRemote(BufferEvent, r.Handles[0], true);
} }
return rc; return rc;