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 <linux/input.h>
|
||||||
#include <unistd.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
|
class EvdevGamepadDevice : public GamepadDevice
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -58,7 +85,7 @@ public:
|
||||||
input_mapper = std::make_shared<InputMapping>(*input_mapper);
|
input_mapper = std::make_shared<InputMapping>(*input_mapper);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
input_mapper = std::make_shared<IdentityInputMapping>();
|
input_mapper = std::make_shared<DefaultEvdevInputMapping>();
|
||||||
input_mapper->name = _name + " mapping";
|
input_mapper->name = _name + " mapping";
|
||||||
save_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);
|
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)
|
if(settings.omx.Audio_HDMI)
|
||||||
output_device = (char*)"hdmi";
|
output_device = (const char*)"hdmi";
|
||||||
|
|
||||||
// Set audio destination
|
// Set audio destination
|
||||||
OMX_CONFIG_BRCMAUDIODESTINATIONTYPE ar_dest;
|
OMX_CONFIG_BRCMAUDIODESTINATIONTYPE ar_dest;
|
||||||
|
@ -255,7 +255,7 @@ static u32 omx_push(const void* frame, u32 samples, bool wait)
|
||||||
|
|
||||||
while(data_size > 0)
|
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
|
// Don't have more than maximum audio latency
|
||||||
u32 latency = omx_get_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)
|
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);
|
memcpy(audio_buffers[audio_buffer_idx]->pBuffer + buffer_length, frame, copy_size);
|
||||||
buffer_length += copy_size;
|
buffer_length += copy_size;
|
||||||
|
frame = (char *)frame + copy_size;
|
||||||
|
|
||||||
// Flush buffer and swap
|
// Flush buffer and swap
|
||||||
if(buffer_length >= buffer_size)
|
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]);
|
OMX_ERRORTYPE error = OMX_EmptyThisBuffer(omx_handle, audio_buffers[audio_buffer_idx]);
|
||||||
if(error != OMX_ErrorNone)
|
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;
|
audio_buffer_idx = (audio_buffer_idx + 1) % buffer_count;
|
||||||
buffer_length = 0;
|
buffer_length = 0;
|
||||||
|
|
Loading…
Reference in New Issue