mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-24 09:14:04 +02:00
Fix a bug with the resource manager and custom decoders.
This commit is contained in:
+12
-8
@@ -67959,6 +67959,8 @@ MA_API ma_result ma_resource_manager_init(const ma_resource_manager_config* pCon
|
|||||||
if (pConfig->ppDecodingBackendVTables != NULL && pConfig->decodingBackendCount > 0) {
|
if (pConfig->ppDecodingBackendVTables != NULL && pConfig->decodingBackendCount > 0) {
|
||||||
size_t vtableSizeInBytes;
|
size_t vtableSizeInBytes;
|
||||||
size_t vtableUserDataSizeInBytes;
|
size_t vtableUserDataSizeInBytes;
|
||||||
|
ma_decoding_backend_vtable** ppDecodingBackendVTables;
|
||||||
|
void** ppDecodingBackendUserData;
|
||||||
|
|
||||||
vtableSizeInBytes = sizeof(*pResourceManager->config.ppDecodingBackendVTables) * pConfig->decodingBackendCount;
|
vtableSizeInBytes = sizeof(*pResourceManager->config.ppDecodingBackendVTables) * pConfig->decodingBackendCount;
|
||||||
|
|
||||||
@@ -67968,22 +67970,24 @@ MA_API ma_result ma_resource_manager_init(const ma_resource_manager_config* pCon
|
|||||||
vtableUserDataSizeInBytes = 0; /* No vtable user data present. No need for an allocation. */
|
vtableUserDataSizeInBytes = 0; /* No vtable user data present. No need for an allocation. */
|
||||||
}
|
}
|
||||||
|
|
||||||
pResourceManager->config.ppDecodingBackendVTables = (const ma_decoding_backend_vtable* const*)ma_malloc(vtableSizeInBytes + vtableUserDataSizeInBytes, &pResourceManager->config.allocationCallbacks);
|
ppDecodingBackendVTables = (ma_decoding_backend_vtable**)ma_malloc(vtableSizeInBytes + vtableUserDataSizeInBytes, &pResourceManager->config.allocationCallbacks);
|
||||||
if (pResourceManager->config.ppDecodingBackendVTables == NULL) {
|
if (ppDecodingBackendVTables == NULL) {
|
||||||
ma_job_queue_uninit(&pResourceManager->jobQueue, &pResourceManager->config.allocationCallbacks);
|
ma_job_queue_uninit(&pResourceManager->jobQueue, &pResourceManager->config.allocationCallbacks);
|
||||||
return MA_OUT_OF_MEMORY;
|
return MA_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
MA_COPY_MEMORY(pResourceManager->config.ppDecodingBackendVTables, pConfig->ppDecodingBackendVTables, vtableSizeInBytes);
|
MA_COPY_MEMORY(ppDecodingBackendVTables, pConfig->ppDecodingBackendVTables, vtableSizeInBytes);
|
||||||
|
|
||||||
if (pConfig->ppDecodingBackendUserData != NULL) {
|
if (pConfig->ppDecodingBackendUserData != NULL) {
|
||||||
pResourceManager->config.ppDecodingBackendUserData = (void**)ma_offset_ptr(pResourceManager->config.ppDecodingBackendVTables, vtableSizeInBytes);
|
ppDecodingBackendUserData = (void**)ma_offset_ptr(ppDecodingBackendVTables, vtableSizeInBytes);
|
||||||
MA_COPY_MEMORY(pResourceManager->config.ppDecodingBackendUserData, pConfig->ppDecodingBackendUserData, vtableUserDataSizeInBytes);
|
MA_COPY_MEMORY(ppDecodingBackendUserData, pConfig->ppDecodingBackendUserData, vtableUserDataSizeInBytes);
|
||||||
} else {
|
} else {
|
||||||
pResourceManager->config.ppDecodingBackendUserData = NULL;
|
ppDecodingBackendUserData = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pResourceManager->config.decodingBackendCount = pConfig->decodingBackendCount;
|
pResourceManager->config.ppDecodingBackendVTables = ppDecodingBackendVTables;
|
||||||
|
pResourceManager->config.ppDecodingBackendUserData = ppDecodingBackendUserData;
|
||||||
|
pResourceManager->config.decodingBackendCount = pConfig->decodingBackendCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -68085,7 +68089,7 @@ MA_API void ma_resource_manager_uninit(ma_resource_manager* pResourceManager)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
ma_free(pResourceManager->config.ppDecodingBackendVTables, &pResourceManager->config.allocationCallbacks); /* <-- This also frees pResourceManager->config.ppDecodingBackendUserData because it's all in one allocation. */
|
ma_free((ma_decoding_backend_vtable**)pResourceManager->config.ppDecodingBackendVTables, &pResourceManager->config.allocationCallbacks); /* <-- This also frees pResourceManager->config.ppDecodingBackendUserData because it's all in one allocation. */
|
||||||
|
|
||||||
if (pResourceManager->config.pLog == &pResourceManager->log) {
|
if (pResourceManager->config.pLog == &pResourceManager->log) {
|
||||||
ma_log_uninit(&pResourceManager->log);
|
ma_log_uninit(&pResourceManager->log);
|
||||||
|
|||||||
Reference in New Issue
Block a user