Files
Pulse/Sources/PulseBuffer.c
2024-12-12 11:07:10 +01:00

81 lines
2.5 KiB
C

// Copyright (C) 2024 kanel
// This file is part of "Pulse"
// For conditions of distribution and use, see copyright notice in LICENSE
#include "Pulse.h"
#include "PulseDefs.h"
#include "PulseInternal.h"
#include "PulseProfile.h"
PULSE_API PulseBuffer PulseCreateBuffer(PulseDevice device, const PulseBufferCreateInfo* create_infos)
{
PULSE_CHECK_HANDLE_RETVAL(device, PULSE_NULL_HANDLE);
if(PULSE_IS_BACKEND_LOW_LEVEL_DEBUG(device->backend))
{
if(create_infos == PULSE_NULLPTR)
{
PulseLogError(device->backend, "create_infos is NULL");
PulseSetInternalError(PULSE_ERROR_INITIALIZATION_FAILED);
return PULSE_NULL_HANDLE;
}
}
PulseBuffer buffer = device->PFN_CreateBuffer(device, create_infos);
if(buffer == PULSE_NULL_HANDLE)
return PULSE_NULL_HANDLE;
PULSE_EXPAND_ARRAY_IF_NEEDED(device->allocated_buffers, PulseBuffer, device->allocated_buffers_size, device->allocated_buffers_capacity, 64);
device->allocated_buffers[device->allocated_buffers_size] = buffer;
device->allocated_buffers_size++;
return buffer;
}
PULSE_API bool PulseMapBuffer(PulseBuffer buffer, void** data)
{
PULSE_CHECK_HANDLE_RETVAL(buffer, false);
PULSE_CHECK_PTR_RETVAL(data, false);
bool res = buffer->device->PFN_MapBuffer(buffer, data);
if(res)
buffer->is_mapped = true;
return res;
}
PULSE_API void PulseUnmapBuffer(PulseBuffer buffer)
{
PULSE_CHECK_HANDLE(buffer);
buffer->device->PFN_UnmapBuffer(buffer);
buffer->is_mapped = false;
}
PULSE_API void PulseDestroyBuffer(PulseDevice device, PulseBuffer buffer)
{
PULSE_CHECK_HANDLE(device);
if(buffer == PULSE_NULL_HANDLE)
{
if(PULSE_IS_BACKEND_LOW_LEVEL_DEBUG(device->backend))
PulseLogWarning(device->backend, "buffer is NULL, this may be a bug in your application");
return;
}
if(buffer->is_mapped)
{
if(PULSE_IS_BACKEND_LOW_LEVEL_DEBUG(device->backend))
PulseLogWarning(device->backend, "buffer is still mapped, consider unmapping it before destroy");
}
if(buffer->device != device)
{
if(PULSE_IS_BACKEND_LOW_LEVEL_DEBUG(device->backend))
PulseLogErrorFmt(device->backend, "cannot destroy buffer [%p] that have been allocated with device [%p] using device [%p]", buffer, buffer->device, device);
PulseSetInternalError(PULSE_ERROR_INVALID_DEVICE);
return;
}
for(uint32_t i = 0; i < device->allocated_buffers_size; i++)
{
if(device->allocated_buffers[i] == buffer)
{
PULSE_DEFRAG_ARRAY(device->allocated_buffers, device->allocated_buffers_size, i);
break;
}
}
device->PFN_DestroyBuffer(device, buffer);
device->allocated_buffers_size--;
}