mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-28 13:56:59 +01:00
audio: retire destroyed NGS2 racks
This commit is contained in:
+65
-10
@@ -1641,11 +1641,12 @@ enum class Ngs2RackType {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct Ngs2RackInternal {
|
struct Ngs2RackInternal {
|
||||||
Ngs2Internal* ngs = nullptr;
|
Ngs2Internal* ngs = nullptr;
|
||||||
Ngs2RackInternal* next = nullptr;
|
Ngs2RackInternal* next = nullptr;
|
||||||
Ngs2RackType type = Ngs2RackType::Sampler;
|
Ngs2RackType type = Ngs2RackType::Sampler;
|
||||||
Ngs2RackOptionUnion option;
|
Ngs2RackOptionUnion option;
|
||||||
Ngs2BufferAllocator allocator;
|
Ngs2ContextBufferInfo buffer_info;
|
||||||
|
Ngs2BufferAllocator allocator;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class Ngs2VoicePlayState { Empty, Playing, Paused, Stopped };
|
enum class Ngs2VoicePlayState { Empty, Playing, Paused, Stopped };
|
||||||
@@ -1743,6 +1744,7 @@ struct Ngs2SamplerVoiceState {
|
|||||||
|
|
||||||
static Ngs2Internal* g_ngs_list = nullptr;
|
static Ngs2Internal* g_ngs_list = nullptr;
|
||||||
static Ngs2RackInternal* g_racks_list = nullptr;
|
static Ngs2RackInternal* g_racks_list = nullptr;
|
||||||
|
static Common::Mutex g_racks_mutex;
|
||||||
|
|
||||||
static_assert(sizeof(Ngs2SystemOption) == 144);
|
static_assert(sizeof(Ngs2SystemOption) == 144);
|
||||||
static_assert(sizeof(Ngs2RackOption) == 176);
|
static_assert(sizeof(Ngs2RackOption) == 176);
|
||||||
@@ -2122,11 +2124,15 @@ int KYTY_SYSV_ABI Ngs2RackCreate(uintptr_t system_handle, uint32_t rack_id,
|
|||||||
|
|
||||||
LOGF("\t type = %s\n", Common::EnumName(rack->type).c_str());
|
LOGF("\t type = %s\n", Common::EnumName(rack->type).c_str());
|
||||||
|
|
||||||
rack->allocator = Ngs2BufferAllocator();
|
rack->allocator = Ngs2BufferAllocator();
|
||||||
rack->ngs = ngs;
|
rack->buffer_info = *buffer_info;
|
||||||
|
rack->ngs = ngs;
|
||||||
|
|
||||||
rack->next = g_racks_list;
|
{
|
||||||
g_racks_list = rack;
|
Common::LockGuard racks_lock(g_racks_mutex);
|
||||||
|
rack->next = g_racks_list;
|
||||||
|
g_racks_list = rack;
|
||||||
|
}
|
||||||
|
|
||||||
for (uint32_t i = 0; i < option->max_voices; i++) {
|
for (uint32_t i = 0; i < option->max_voices; i++) {
|
||||||
voices[i].rack = rack;
|
voices[i].rack = rack;
|
||||||
@@ -2207,11 +2213,59 @@ int KYTY_SYSV_ABI Ngs2RackCreateWithAllocator(uintptr_t system_handle, uint32_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
int KYTY_SYSV_ABI Ngs2RackDestroy(uintptr_t rack_handle, Ngs2ContextBufferInfo* buffer_info) {
|
int KYTY_SYSV_ABI Ngs2RackDestroy(uintptr_t rack_handle, Ngs2ContextBufferInfo* buffer_info) {
|
||||||
|
constexpr int32_t ERROR_INVALID_RACK_HANDLE = static_cast<int32_t>(0x804a8202u);
|
||||||
|
|
||||||
PRINT_NAME();
|
PRINT_NAME();
|
||||||
LOGF("\t rack_handle = 0x%016" PRIx64 "\n", static_cast<uint64_t>(rack_handle));
|
LOGF("\t rack_handle = 0x%016" PRIx64 "\n", static_cast<uint64_t>(rack_handle));
|
||||||
|
|
||||||
if (buffer_info != nullptr) {
|
if (buffer_info != nullptr) {
|
||||||
std::memset(buffer_info, 0, sizeof(Ngs2ContextBufferInfo));
|
*buffer_info = {};
|
||||||
|
}
|
||||||
|
if (rack_handle == 0) {
|
||||||
|
return ERROR_INVALID_RACK_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto* rack = reinterpret_cast<Ngs2RackInternal*>(rack_handle);
|
||||||
|
Ngs2Internal* ngs = nullptr;
|
||||||
|
{
|
||||||
|
Common::LockGuard racks_lock(g_racks_mutex);
|
||||||
|
for (auto* current = g_racks_list; current != nullptr; current = current->next) {
|
||||||
|
if (current == rack) {
|
||||||
|
ngs = current->ngs;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ngs == nullptr) {
|
||||||
|
return ERROR_INVALID_RACK_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ngs2ContextBufferInfo context_buffer;
|
||||||
|
Ngs2BufferAllocator allocator;
|
||||||
|
{
|
||||||
|
Common::LockGuard lock(ngs->mutex);
|
||||||
|
Common::LockGuard racks_lock(g_racks_mutex);
|
||||||
|
|
||||||
|
auto** link = &g_racks_list;
|
||||||
|
while (*link != nullptr && *link != rack) {
|
||||||
|
link = &(*link)->next;
|
||||||
|
}
|
||||||
|
if (*link == nullptr) {
|
||||||
|
return ERROR_INVALID_RACK_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*link = rack->next;
|
||||||
|
context_buffer = rack->buffer_info;
|
||||||
|
allocator = rack->allocator;
|
||||||
|
rack->ngs = nullptr;
|
||||||
|
rack->next = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allocator.free_handler != nullptr) {
|
||||||
|
return allocator.free_handler(&context_buffer);
|
||||||
|
}
|
||||||
|
if (buffer_info != nullptr) {
|
||||||
|
*buffer_info = context_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
@@ -2272,6 +2326,7 @@ int KYTY_SYSV_ABI Ngs2SystemRender(uintptr_t system_handle, const Ngs2RenderBuff
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Common::LockGuard racks_lock(g_racks_mutex);
|
||||||
for (auto* rack = g_racks_list; rack != nullptr; rack = rack->next) {
|
for (auto* rack = g_racks_list; rack != nullptr; rack = rack->next) {
|
||||||
if (rack->ngs == ngs) {
|
if (rack->ngs == ngs) {
|
||||||
auto* voices = reinterpret_cast<Ngs2VoiceInternal*>(rack + 1);
|
auto* voices = reinterpret_cast<Ngs2VoiceInternal*>(rack + 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user