"""
Default :class:`.EnvironmentDriver` mapping that ships with libretro.py.
.. seealso::
:class:`.EnvironmentDriver`
The protocol this implementation satisfies.
"""
from collections.abc import Mapping
from ctypes import c_bool, c_char_p, c_float, c_uint, c_uint64, cast
from typing import override
from libretro.api import (
EnvironmentCall,
retro_audio_buffer_status_callback,
retro_audio_callback,
retro_av_enable_flags,
retro_camera_callback,
retro_controller_info,
retro_core_option_definition,
retro_core_option_display,
retro_core_options_intl,
retro_core_options_update_display_callback,
retro_core_options_v2,
retro_core_options_v2_intl,
retro_device_power,
retro_disk_control_callback,
retro_disk_control_ext_callback,
retro_fastforwarding_override,
retro_frame_time_callback,
retro_framebuffer,
retro_game_geometry,
retro_game_info_ext,
retro_get_proc_address_interface,
retro_hw_context_type,
retro_hw_render_callback,
retro_hw_render_context_negotiation_interface,
retro_hw_render_interface,
retro_input_descriptor,
retro_keyboard_callback,
retro_language,
retro_led_interface,
retro_location_callback,
retro_log_callback,
retro_memory_map,
retro_message,
retro_message_ext,
retro_microphone_interface,
retro_midi_interface,
retro_netpacket_callback,
retro_perf_callback,
retro_pixel_format,
retro_rumble_interface,
retro_savestate_context,
retro_sensor_interface,
retro_subsystem_info,
retro_system_av_info,
retro_system_content_info_override,
retro_throttle_state,
retro_variable,
retro_vfs_interface_info,
)
from libretro.ctypes import TypedPointer
from .dict import DictEnvironmentDriver, EnvironmentCallbackFunction
[docs]
class DefaultEnvironmentDriver(DictEnvironmentDriver):
"""
:class:`.EnvironmentDriver` that registers handlers for the standard environment calls.
Subclasses implement the underscore-prefixed handler methods
(``_set_rotation``, ``_get_overscan``, etc.) for each call they support.
"""
[docs]
@override
def __init__(self):
# These parameterized types are resolved at runtime to regular "POINTER(...)" types,
# so they're equivalent to cast(data, POINTER(...)) in the lambda functions below.
# They're written this way because TypedPointer (and TypedPointer[c_bool], FloatPointer, etc.).
# is technically a subclass of POINTER(...).
envcalls: Mapping[EnvironmentCall, EnvironmentCallbackFunction] = {
EnvironmentCall.SET_ROTATION: lambda data: self._set_rotation(
cast(data, TypedPointer[c_uint])
),
EnvironmentCall.GET_OVERSCAN: lambda data: self._get_overscan(
cast(data, TypedPointer[c_bool])
),
EnvironmentCall.GET_CAN_DUPE: lambda data: self._get_can_dupe(
cast(data, TypedPointer[c_bool])
),
EnvironmentCall.SET_MESSAGE: lambda data: self._set_message(
cast(data, TypedPointer[retro_message])
),
EnvironmentCall.SHUTDOWN: lambda _: self._shutdown(),
EnvironmentCall.SET_PERFORMANCE_LEVEL: lambda data: self._set_performance_level(
cast(data, TypedPointer[c_uint])
),
EnvironmentCall.GET_SYSTEM_DIRECTORY: lambda data: self._get_system_directory(
cast(data, TypedPointer[c_char_p])
),
EnvironmentCall.SET_PIXEL_FORMAT: lambda data: self._set_pixel_format(
cast(data, TypedPointer[retro_pixel_format])
),
EnvironmentCall.SET_INPUT_DESCRIPTORS: lambda data: self._set_input_descriptors(
cast(data, TypedPointer[retro_input_descriptor])
),
EnvironmentCall.SET_KEYBOARD_CALLBACK: lambda data: self._set_keyboard_callback(
cast(data, TypedPointer[retro_keyboard_callback])
),
EnvironmentCall.SET_DISK_CONTROL_INTERFACE: lambda data: (
self._set_disk_control_interface(
cast(data, TypedPointer[retro_disk_control_callback])
)
),
EnvironmentCall.SET_HW_RENDER: lambda data: self._set_hw_render(
cast(data, TypedPointer[retro_hw_render_callback])
),
EnvironmentCall.GET_VARIABLE: lambda data: self._get_variable(
cast(data, TypedPointer[retro_variable])
),
EnvironmentCall.SET_VARIABLES: lambda data: self._set_variables(
cast(data, TypedPointer[retro_variable])
),
EnvironmentCall.GET_VARIABLE_UPDATE: lambda data: self._get_variable_update(
cast(data, TypedPointer[c_bool])
),
EnvironmentCall.SET_SUPPORT_NO_GAME: lambda data: self._set_support_no_game(
cast(data, TypedPointer[c_bool])
),
EnvironmentCall.GET_LIBRETRO_PATH: lambda data: self._get_libretro_path(
cast(data, TypedPointer[c_char_p])
),
EnvironmentCall.SET_FRAME_TIME_CALLBACK: lambda data: self._set_frame_time_callback(
cast(data, TypedPointer[retro_frame_time_callback])
),
EnvironmentCall.SET_AUDIO_CALLBACK: lambda data: self._set_audio_callback(
cast(data, TypedPointer[retro_audio_callback])
),
EnvironmentCall.GET_RUMBLE_INTERFACE: lambda data: self._get_rumble_interface(
cast(data, TypedPointer[retro_rumble_interface])
),
EnvironmentCall.GET_INPUT_DEVICE_CAPABILITIES: lambda data: (
self._get_input_device_capabilities(cast(data, TypedPointer[c_uint64]))
),
EnvironmentCall.GET_SENSOR_INTERFACE: lambda data: self._get_sensor_interface(
cast(data, TypedPointer[retro_sensor_interface])
),
EnvironmentCall.GET_CAMERA_INTERFACE: lambda data: self._get_camera_interface(
cast(data, TypedPointer[retro_camera_callback])
),
EnvironmentCall.GET_LOG_INTERFACE: lambda data: self._get_log_interface(
cast(data, TypedPointer[retro_log_callback])
),
EnvironmentCall.GET_PERF_INTERFACE: lambda data: self._get_perf_interface(
cast(data, TypedPointer[retro_perf_callback])
),
EnvironmentCall.GET_LOCATION_INTERFACE: lambda data: self._get_location_interface(
cast(data, TypedPointer[retro_location_callback])
),
EnvironmentCall.GET_CORE_ASSETS_DIRECTORY: lambda data: (
self._get_core_assets_directory(cast(data, TypedPointer[c_char_p]))
),
EnvironmentCall.GET_SAVE_DIRECTORY: lambda data: self._get_save_directory(
cast(data, TypedPointer[c_char_p])
),
EnvironmentCall.SET_SYSTEM_AV_INFO: lambda data: self._set_system_av_info(
cast(data, TypedPointer[retro_system_av_info])
),
EnvironmentCall.SET_PROC_ADDRESS_CALLBACK: lambda data: (
self._set_proc_address_callback(
cast(data, TypedPointer[retro_get_proc_address_interface])
)
),
EnvironmentCall.SET_SUBSYSTEM_INFO: lambda data: self._set_subsystem_info(
cast(data, TypedPointer[retro_subsystem_info])
),
EnvironmentCall.SET_CONTROLLER_INFO: lambda data: self._set_controller_info(
cast(data, TypedPointer[retro_controller_info])
),
EnvironmentCall.SET_MEMORY_MAPS: lambda data: self._set_memory_maps(
cast(data, TypedPointer[retro_memory_map])
),
EnvironmentCall.SET_GEOMETRY: lambda data: self._set_geometry(
cast(data, TypedPointer[retro_game_geometry])
),
EnvironmentCall.GET_USERNAME: lambda data: self._get_username(
cast(data, TypedPointer[c_char_p])
),
EnvironmentCall.GET_LANGUAGE: lambda data: self._get_language(
cast(data, TypedPointer[retro_language])
),
EnvironmentCall.GET_CURRENT_SOFTWARE_FRAMEBUFFER: lambda data: (
self._get_current_software_framebuffer(cast(data, TypedPointer[retro_framebuffer]))
),
EnvironmentCall.GET_HW_RENDER_INTERFACE: lambda data: self._get_hw_render_interface(
cast(data, TypedPointer[retro_hw_render_interface])
),
EnvironmentCall.SET_SUPPORT_ACHIEVEMENTS: lambda data: self._set_support_achievements(
cast(data, TypedPointer[c_bool])
),
EnvironmentCall.SET_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE: lambda data: (
self._set_hw_render_context_negotiation_interface(
cast(data, TypedPointer[retro_hw_render_context_negotiation_interface])
)
),
EnvironmentCall.SET_SERIALIZATION_QUIRKS: lambda data: self._set_serialization_quirks(
cast(data, TypedPointer[c_uint64])
),
EnvironmentCall.SET_HW_SHARED_CONTEXT: lambda _: self._set_hw_shared_context(),
EnvironmentCall.GET_VFS_INTERFACE: lambda data: self._get_vfs_interface(
cast(data, TypedPointer[retro_vfs_interface_info])
),
EnvironmentCall.GET_LED_INTERFACE: lambda data: self._get_led_interface(
cast(data, TypedPointer[retro_led_interface])
),
EnvironmentCall.GET_AUDIO_VIDEO_ENABLE: lambda data: self._get_audio_video_enable(
cast(data, TypedPointer[retro_av_enable_flags])
),
EnvironmentCall.GET_MIDI_INTERFACE: lambda data: self._get_midi_interface(
cast(data, TypedPointer[retro_midi_interface])
),
EnvironmentCall.GET_FASTFORWARDING: lambda data: self._get_fastforwarding(
cast(data, TypedPointer[c_bool])
),
EnvironmentCall.GET_TARGET_REFRESH_RATE: lambda data: self._get_target_refresh_rate(
cast(data, TypedPointer[c_float])
),
EnvironmentCall.GET_INPUT_BITMASKS: lambda _: self._get_input_bitmasks(),
EnvironmentCall.GET_CORE_OPTIONS_VERSION: lambda data: self._get_core_options_version(
cast(data, TypedPointer[c_uint])
),
EnvironmentCall.SET_CORE_OPTIONS: lambda data: self._set_core_options(
cast(data, TypedPointer[retro_core_option_definition])
),
EnvironmentCall.SET_CORE_OPTIONS_INTL: lambda data: self._set_core_options_intl(
cast(data, TypedPointer[retro_core_options_intl])
),
EnvironmentCall.SET_CORE_OPTIONS_DISPLAY: lambda data: self._set_core_options_display(
cast(data, TypedPointer[retro_core_option_display])
),
EnvironmentCall.GET_PREFERRED_HW_RENDER: lambda data: self._get_preferred_hw_render(
cast(data, TypedPointer[retro_hw_context_type])
),
EnvironmentCall.GET_DISK_CONTROL_INTERFACE_VERSION: lambda data: (
self._get_disk_control_interface_version(cast(data, TypedPointer[c_uint]))
),
EnvironmentCall.SET_DISK_CONTROL_EXT_INTERFACE: lambda data: (
self._set_disk_control_ext_interface(
cast(data, TypedPointer[retro_disk_control_ext_callback])
)
),
EnvironmentCall.GET_MESSAGE_INTERFACE_VERSION: lambda data: (
self._get_message_interface_version(cast(data, TypedPointer[c_uint]))
),
EnvironmentCall.SET_MESSAGE_EXT: lambda data: self._set_message_ext(
cast(data, TypedPointer[retro_message_ext])
),
EnvironmentCall.GET_INPUT_MAX_USERS: lambda data: self._get_input_max_users(
cast(data, TypedPointer[c_uint])
),
EnvironmentCall.SET_AUDIO_BUFFER_STATUS_CALLBACK: lambda data: (
self._set_audio_buffer_status_callback(
cast(data, TypedPointer[retro_audio_buffer_status_callback])
)
),
EnvironmentCall.SET_MINIMUM_AUDIO_LATENCY: lambda data: (
self._set_minimum_audio_latency(cast(data, TypedPointer[c_uint]))
),
EnvironmentCall.SET_FASTFORWARDING_OVERRIDE: lambda data: (
self._set_fastforwarding_override(
cast(data, TypedPointer[retro_fastforwarding_override])
)
),
EnvironmentCall.SET_CONTENT_INFO_OVERRIDE: lambda data: (
self._set_content_info_override(
cast(data, TypedPointer[retro_system_content_info_override])
)
),
EnvironmentCall.GET_GAME_INFO_EXT: lambda data: self._get_game_info_ext(
cast(data, TypedPointer[TypedPointer[retro_game_info_ext]])
),
EnvironmentCall.SET_CORE_OPTIONS_V2: lambda data: self._set_core_options_v2(
cast(data, TypedPointer[retro_core_options_v2])
),
EnvironmentCall.SET_CORE_OPTIONS_V2_INTL: lambda data: self._set_core_options_v2_intl(
cast(data, TypedPointer[retro_core_options_v2_intl])
),
EnvironmentCall.SET_CORE_OPTIONS_UPDATE_DISPLAY_CALLBACK: lambda data: (
self._set_core_options_update_display_callback(
cast(data, TypedPointer[retro_core_options_update_display_callback])
)
),
EnvironmentCall.SET_VARIABLE: lambda data: self._set_variable(
cast(data, TypedPointer[retro_variable])
),
EnvironmentCall.GET_THROTTLE_STATE: lambda data: self._get_throttle_state(
cast(data, TypedPointer[retro_throttle_state])
),
EnvironmentCall.GET_SAVESTATE_CONTEXT: lambda data: self._get_savestate_context(
cast(data, TypedPointer[retro_savestate_context])
),
EnvironmentCall.GET_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_SUPPORT: lambda data: (
self._get_hw_render_context_negotiation_interface_support(
cast(data, TypedPointer[retro_hw_render_context_negotiation_interface])
)
),
EnvironmentCall.GET_JIT_CAPABLE: lambda data: self._get_jit_capable(
cast(data, TypedPointer[c_bool])
),
EnvironmentCall.GET_MICROPHONE_INTERFACE: lambda data: self._get_microphone_interface(
cast(data, TypedPointer[retro_microphone_interface])
),
EnvironmentCall.GET_DEVICE_POWER: lambda data: self._get_device_power(
cast(data, TypedPointer[retro_device_power])
),
EnvironmentCall.SET_NETPACKET_INTERFACE: lambda data: self._set_netpacket_interface(
cast(data, TypedPointer[retro_netpacket_callback])
),
EnvironmentCall.GET_PLAYLIST_DIRECTORY: lambda data: self._get_playlist_directory(
cast(data, TypedPointer[c_char_p])
),
}
super().__init__(envcalls)
__all__ = [
"DefaultEnvironmentDriver",
]