omx: fix buffer overflow. evdev: better default gamepad mapping
This commit is contained in:
parent
fec79624df
commit
2e9238d719
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue