omx: fix buffer overflow. evdev: better default gamepad mapping

This commit is contained in:
Flyinghead 2020-05-11 15:59:30 +02:00
parent fec79624df
commit 2e9238d719
2 changed files with 34 additions and 6 deletions

View File

@ -6,6 +6,33 @@
#include <linux/input.h>
#include <unistd.h>
class DefaultEvdevInputMapping : public InputMapping
{
public:
DefaultEvdevInputMapping() {
name = "Default";
set_button(DC_BTN_START, BTN_START);
set_button(DC_BTN_A, BTN_SOUTH);
set_button(DC_BTN_B, BTN_EAST);
set_button(DC_BTN_X, BTN_WEST);
set_button(DC_BTN_Y, BTN_NORTH);
set_button(DC_BTN_C, BTN_C);
set_button(DC_BTN_Z, BTN_Z);
set_button(DC_DPAD_UP, BTN_DPAD_UP);
set_button(DC_DPAD_DOWN, BTN_DPAD_DOWN);
set_button(DC_DPAD_LEFT, BTN_DPAD_LEFT);
set_button(DC_DPAD_RIGHT, BTN_DPAD_RIGHT);
set_button(EMU_BTN_MENU, BTN_SELECT);
set_axis(DC_AXIS_X, ABS_X, false);
set_axis(DC_AXIS_Y, ABS_Y, false);
set_axis(DC_AXIS_LT, ABS_Z, false);
set_axis(DC_AXIS_RT, ABS_RZ, false);
set_axis(DC_AXIS_X2, ABS_RX, false);
set_axis(DC_AXIS_Y2, ABS_RY, false);
}
};
class EvdevGamepadDevice : public GamepadDevice
{
public:
@ -58,7 +85,7 @@ public:
input_mapper = std::make_shared<InputMapping>(*input_mapper);
}
else
input_mapper = std::make_shared<IdentityInputMapping>();
input_mapper = std::make_shared<DefaultEvdevInputMapping>();
input_mapper->name = _name + " mapping";
save_mapping();
}

View File

@ -223,9 +223,9 @@ static void omx_init()
WARN_LOG(AUDIO, "OMX: failed to empty buffer[%u]. Error 0x%X", i, error);
}
char* output_device = "local";
const char* output_device = "local";
if(settings.omx.Audio_HDMI)
output_device = (char*)"hdmi";
output_device = (const char*)"hdmi";
// Set audio destination
OMX_CONFIG_BRCMAUDIODESTINATIONTYPE ar_dest;
@ -255,7 +255,7 @@ static u32 omx_push(const void* frame, u32 samples, bool wait)
while(data_size > 0)
{
size_t copy_size = std::min(buffer_size, data_size);
size_t copy_size = std::min(buffer_size - buffer_length, data_size);
// Don't have more than maximum audio latency
u32 latency = omx_get_latency();
@ -265,11 +265,12 @@ static u32 omx_push(const void* frame, u32 samples, bool wait)
}
else if(latency == 0)
{
WARN_LOG(AUDIO, "OMX: underrun occurred");
INFO_LOG(AUDIO, "OMX: underrun occurred");
}
memcpy(audio_buffers[audio_buffer_idx]->pBuffer + buffer_length, frame, copy_size);
buffer_length += copy_size;
frame = (char *)frame + copy_size;
// Flush buffer and swap
if(buffer_length >= buffer_size)
@ -279,7 +280,7 @@ static u32 omx_push(const void* frame, u32 samples, bool wait)
OMX_ERRORTYPE error = OMX_EmptyThisBuffer(omx_handle, audio_buffers[audio_buffer_idx]);
if(error != OMX_ErrorNone)
WARN_LOG(AUDIO, "OMX: failed to empty buffer[%u]. Error 0x%X", audio_buffer_idx, error);
INFO_LOG(AUDIO, "OMX: failed to empty buffer[%u]. Error 0x%X", audio_buffer_idx, error);
audio_buffer_idx = (audio_buffer_idx + 1) % buffer_count;
buffer_length = 0;