v1.8.6

29 de julio de 2026

Versión de funciones: slots de estado de guardado renombrables, sincronización de grabación entre rebobinados de Time Machine, selección de pantalla en Modo TV, atajo para conectar/desconectar el mando de Wii, API de sesión/ping de RetroAchievements y gestión de permisos TCC para carpetas que evita el aviso repetido de acceso a Descargas al arrancar.

Destacados

  • Slots de guardado renombrables: Pasa el cursor por un slot para mostrar un botón de lápiz y renómbralo en línea, o usa la opción Renombrar en el menú contextual del slot/miniatura. Los nombres se guardan en un .meta.json junto a cada .state y vuelven a "Slot N" al vaciarse. El slot automático (-1) no se puede renombrar.
  • La grabación se mantiene sincronizada entre rebobinados (#30): Se suspenden las inserciones de frames de vídeo y la captura de audio durante el rebobinado/scrub, y la duración del rebobinado se resta de los anclajes PTS para saltárselo en ambas pistas (sin frame congelado ni silencio). Un ajuste opt-in "Cortar rebobinados de la grabación" y un toggle "Permitir rebobinado durante la grabación" exponen ambos comportamientos; el writer se detiene de forma síncrona al cerrar la ventana antes de runner.stop() para evitar un fallo de captura de audio al desmapear la memoria compartida XPC.
  • Selección de pantalla en Modo TV: Un nuevo TVModeMainSettingsView centraliza los ajustes del Modo TV (comportamiento, tema, opciones de pantalla, colecciones visibles, reasignación de botones del gamepad), y TVModeScreenPickerView permite elegir qué pantalla conectada usar al entrar al Modo TV mediante un nuevo ScreenCatalog.
  • Atajo para conectar/desconectar el mando de Wii: Conecta/desconecta el mando de Wii en tiempo de ejecución con un nuevo atajo. Las opciones de IR de Wii ahora usan enteros como texto para las opciones de núcleo, con valores por defecto ajustados en dolphin_libretro_default.json, y se soporta el seguimiento sintético del puntero durante la captura de entrada.
  • API de sesión/ping de RetroAchievements: Añade rcheevos_api_init_ping/rcheevos_api_init_start_session para presencia enriquecida e inicio de sesión, más rcheevos_api_init_login_with_token para refresco de token. La vista de ajustes muestra una acción de refresco para las estadísticas del usuario y notificaciones de re-login. El manejo de errores ahora usa un tipo estructurado RAError con mensajes localizados.
  • Gestión de permisos TCC para carpetas: ROMLibrary ahora gestiona las concesiones TCC para ámbitos de carpeta. Combinado con la corrección del bookmark de carpeta en LogManager/LoggerService (resolver con .withSecurityScope, emparejar startAccessingSecurityScopedResource/stopAccessingSecurityScopedResource alrededor del handle del log abierto), la app ya no vuelve a pedir acceso a Descargas en cada arranque.
  • Renovación de ajustes de atajos: Restablece atajos individuales o varios a la vez a sus asignaciones por defecto. Un nuevo enum HotkeyTab organiza los atajos de App, En juego y Especiales, con secciones nuevas para mando de Wii y Velocidad & Rebobinado. Los ajustes de Navegación con gamepad ahora se reutilizan bajo Atajos en vez de estar en una página separada.
  • Integración de BoxArtService: GameCardView y GameDetailView usan el BoxArtService compartido, con un nuevo parámetro forceReplace en downloadAndCache.
  • Override de auto-carga por lanzamiento: launchGame gana un parámetro disableAutoLoadOnStart para saltarse la auto-carga en un solo lanzamiento sin cambiar la preferencia global.

Cambios detallados

  • feat: añadir nombre visible para los slots de guardado (#31) — slots renombrables por el usuario, guardados en un .meta.json auxiliar, que se vacían al borrar el slot por completo; SlotInfo gana customName y su Equatable lo compara para que SwiftUI refresque al recargar
  • fix: mantener la grabación A/V sincronizada entre rebobinados de Time Machine (#30) — flag isRewindPaused + acumulador rewindPtsOffset, marcas de agua estrictas monotónicas de PTS, reinicio de posición de lectura de audio al soltar el rebobinado, parada síncrona del writer en windowWillClose
  • feat: ajuste opt-in para cortar rebobinados de Time Machine de las grabaciones — recording_seamlessRewindCut y timeMachine_rewindDuringRecording (por defecto ON para preservar el comportamiento) con pista OSD localizada cuando se bloquea el rebobinado
  • refactor: revertir el código de rotación de chunks sin costuras (#30) — problemas de inflación de chunks y de cómputo de recortes forzaron revertir al enfoque de escritor único con cut-PTS-skip; se preserva el fix del snapshot de MetalCoordinator para que los frames de scrub queden fuera de la grabación
  • feat: exponer entradas desalojadas de TimeMachineBuffer + añadir scaffold del toggle bufferBasedRecordingTimeMachineBuffer.push devuelve entradas desalojadas; el pipeline basado en búfer aún no está conectado, el servicio de grabación sigue usando cut-PTS-skip
  • chore: dejar el servicio de grabación en el comportamiento cut-PTS-skip verificado — el contenido previo al rebobinado se preserva entre fronteras de rebobinado; la duración del archivo es solo tiempo de juego
  • feat(tvmode): implementar selección de pantalla y gestión de ajustes — TVModeMainSettingsView, ScreenCatalog, ScreenDescriptor, TVModeScreenPickerView con nuevas claves de localización (en/es/pt)
  • feat: añadir parámetro disableAutoLoadOnStart a la función launchGame
  • feat(BoxArtService): añadir parámetro forceReplace al método downloadAndCache
  • feat: integrar BoxArtService en GameCardView y GameDetailView para un manejo mejorado de carátulas
  • Implementar las capas de ping e inicio de sesión de la API para la integración de RetroAchievements — rcheevos_api_init_ping, rcheevos_api_init_start_session, rcheevos_api_init_login_with_token; RetroAchievementsService gestiona el refresco de token y el manejo de sesión con notificaciones al usuario e interfaz de refresco
  • feat: mejorar el manejo de errores de RetroAchievements con tipo estructurado RAError y mensajes localizados
  • feat: implementar la gestión de permisos TCC y el manejo de ámbitos de carpeta en ROMLibrary
  • fix: dejar de volver a pedir acceso a Descargas en cada arranque — resolver el bookmark de carpeta de log personalizada con .withSecurityScope y emparejar startAccessingSecurityScopedResource/stopAccessingSecurityScopedResource alrededor del handle del log abierto
  • feat: mejorar la configuración de atajos — restablecer por acción y en bloque los atajos por defecto, nuevo enum HotkeyTab (App/En juego/Especiales), secciones de mando de Wii y Velocidad & Rebobinado, Navegación con gamepad reutilizada bajo Atajos
  • Refactorizar niveles de logging y mejorar la funcionalidad del mando de Wii — INFO cambiado a DEBUG en CoreOverrideBridge/LibretroBridgeImpl/LibretroCallbacks/LibretroGlobals; atajo de conexión/desconexión del mando de Wii; opciones de IR de Wii con enteros como texto y defaults ajustados; seguimiento sintético de puntero durante la captura de entrada
  • Subir la versión de marketing a 1.8.6 y el número de build a 29 en project.yml, los dos Info.plist y docs/_config.yml