mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 12:32:40 +02:00
78 lines
2.4 KiB
C
78 lines
2.4 KiB
C
#include "driver_internal.h"
|
|
|
|
int audrvMemPoolAdd(AudioDriver* d, void* buffer, size_t size)
|
|
{
|
|
if (!buffer || ((uintptr_t)buffer & (AUDREN_MEMPOOL_ALIGNMENT-1)))
|
|
return -1;
|
|
if (size & (AUDREN_MEMPOOL_ALIGNMENT-1))
|
|
return -1;
|
|
|
|
int id = d->etc->first_free_mempool;
|
|
if (id < 0)
|
|
return -1;
|
|
|
|
d->etc->first_free_mempool = d->etc->mempools[id].next_free;
|
|
d->in_mempools[id].address = buffer;
|
|
d->in_mempools[id].size = size;
|
|
d->in_mempools[id].state = AudioRendererMemPoolState_New;
|
|
|
|
return id;
|
|
}
|
|
|
|
bool audrvMemPoolRemove(AudioDriver* d, int id)
|
|
{
|
|
if (id < 0)
|
|
return false;
|
|
if (d->in_mempools[id].state == AudioRendererMemPoolState_Attached || d->in_mempools[id].state == AudioRendererMemPoolState_RequestDetach)
|
|
return false;
|
|
|
|
d->etc->mempools[id].next_free = d->etc->first_free_mempool;
|
|
d->etc->first_free_mempool = id;
|
|
d->in_mempools[id].address = NULL;
|
|
d->in_mempools[id].size = 0;
|
|
d->in_mempools[id].state = AudioRendererMemPoolState_Released;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool audrvMemPoolAttach(AudioDriver* d, int id)
|
|
{
|
|
if (id < 0 || id >= d->etc->mempool_count)
|
|
return false;
|
|
|
|
switch (d->in_mempools[id].state) {
|
|
case AudioRendererMemPoolState_New:
|
|
case AudioRendererMemPoolState_RequestAttach:
|
|
case AudioRendererMemPoolState_Detached:
|
|
d->in_mempools[id].state = AudioRendererMemPoolState_RequestAttach;
|
|
return true;
|
|
case AudioRendererMemPoolState_RequestDetach:
|
|
case AudioRendererMemPoolState_Attached:
|
|
d->in_mempools[id].state = AudioRendererMemPoolState_Attached;
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool audrvMemPoolDetach(AudioDriver* d, int id)
|
|
{
|
|
if (id < 0 || id >= d->etc->mempool_count)
|
|
return false;
|
|
|
|
switch (d->in_mempools[id].state) {
|
|
case AudioRendererMemPoolState_New:
|
|
return true;
|
|
case AudioRendererMemPoolState_RequestAttach:
|
|
case AudioRendererMemPoolState_Detached:
|
|
d->in_mempools[id].state = AudioRendererMemPoolState_Detached;
|
|
return true;
|
|
case AudioRendererMemPoolState_RequestDetach:
|
|
case AudioRendererMemPoolState_Attached:
|
|
d->in_mempools[id].state = AudioRendererMemPoolState_RequestDetach;
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|