Ogo Shell

La utilidad ogo-shell es un explorador de archivos, reproductor de audio y visor de imágenes para ODROID-GO. Principalmente lo uso para escuchar música usando los auriculares odroig-go de backofficeshow. Puede consultar el Proyecto Github y la publicación del foro si quieres probarlo. La siguiente es la historia de su desarrollo hasta el momento. ¡Espero que te guste!

La idea

Desde que recibí mi ODROID-GO el año pasado, me he divertido bastante desarrollando pequeños programas para él. Me gusta el desafío de escribir programas para dispositivos integrados con recursos limitados. Te obliga a entender mejor la pila de hardware y de software en relación a programación de alto nivel a la que estoy acostumbrado trabajar.

Un día leí un post en el foro de Cralex sobre [Solicitudes de funciones/aplicaciones] [publicación en el foro] que mencionaba un administrador de archivos integrado en el dispositivo y algunos enlaces al Proyecto 3DShell. El archivo README del proyecto describe el propósito de 3DShell de la siguiente forma:

3DShell (pronunciado 3D-Shell): es un administrador de archivos multifuncional para Nintendo 3DS que tiene como objetivo la gestión de archivos multimedia.

Y así nació la idea de ogo-shell. Debía ser un explorador o administrador de archivos que pudiera ampliarse con más y más funcionalidades, como por ejemplo poder reproducir diferentes archivos multimedia.

Desarrollo hasta ahora

Puesto que probar pequeños cambios en los programas sobre el ODROID-GO lleva su tiempo, decidí implementar las funciones relacionadas con el hardware usando nuevamente la librería SDL2. (SDL2 es una conocida librería C utilizada principalmente en juegos y proporciona acceso multiplataforma a gráficos, audio y hardware de entrada). Ésta hace posible ejecutar ogo-shell localmente en mi ordenador para que pueda testear y depurar rápidamente la lógica de las aplicaciones con facilidad.

Figure 1 - Screenshot of the ogo-shell running on Linux
Figura 1 - Captura de pantalla de ogo-shell ejecutándose en Linux

Administrador de archivos

Después de implementar la simulación, empecé a trabajar en el administrador de archivos. Ya había creado un servidor ftp para GO, así que estaba familiarizado con las API del sistema de archivos. El administrador de archivos Rover para terminales me sirvió de inspiración, cuenta con un código C muy limpio cuya lectura es muy agradable. Llegado a este punto, quiero agradecer a todas las personas que publican su trabajo como código abierto. Sin sus esfuerzos no sería posible desarrollar proyectos como este.

Reproductor de música

Una vez completada la exploración básica de archivos, quería ver si sería posible reproducir varios archivos de audio. Logar que únicamente se reprodujeran fue relativamente fácil, pero montar un reproductor de audio en toda regla, me suponía enfrentarme a algunos desafíos.

Figure 2 - ODROID-GO and music player
Figura 2 - ODROID-GO y reproductor de música

Uno de ellos es la concurrencia. El reproductor no solo tiene que reproducir música, leer su música codificada desde la tarjeta SD, sino que también debe reaccionar a tus entradas mientras lo hace. Implementar esto en C tanto para la simulación como para ODROID-GO no fue tarea fácil, pero me hizo aprender más sobre los mutexes, colas y cómo funcionan.

Otro obstáculo lo tenía en el hardware ODROID-GO. El ESP32 en ODROID-GO usa la misma conexión SPI para comunicarse con la pantalla y la tarjeta SD. Esto significa que no puedes actualizar la pantalla y leer desde la tarjeta SD al mismo tiempo. Al parchear el SDK subyacente usando un mutex, me aseguré de que el programa no pueda acceder a la tarjeta SD hasta que la pantalla termine de actualizarse.

El resto fue aglutinar librerías de código abierto que se encargan de la decodificación de audio y de montar la interfaz de usuario correcta. El reproductor admite los formatos de audio habituales MP3, OGG, FLAC y WAV. Además de estos, también admite módulos en los formatos MOD, XM, IT y S3M. Existe un escenario bastante grande para los módulos de música y se pueden encontrar muchas pistas en The Mod Archive.

Visor de imágenes

La segunda versión después de la versión pública (0.3.0) incluye un visor de imágenes en bruto. Sin embargo, solo puede mostrar pequeñas imágenes debido a la limitada cantidad de RAM que tiene ODROID-GO. Déjame explicarte por qué.

Figure 3 - Screenshot of the image viewer
Figura 3: captura de pantalla del visor de imágenes

Si quieres mostrar una imagen grande, digamos una con las dimensiones 1000x1000 píxeles, lo normal es decodificar primero el archivo de imagen en la memoria y luego cambiar su tamaño desde allí a otra parte de la memoria. Puedes calcular la cantidad de espacio necesario multiplicando la cantidad de píxeles por la profundidad de color de la imagen. La mayoría de las imágenes utilizan una profundidad de color de 24 bits en el formato RGB. Eso significa que tenemos tres canales de color para los colores rojo, verde y azul y cada canal se guarda como un número entero de 8 bits. Para guardar nuestra imagen de 1000x1000, necesitamos 24 bits o 3 bytes multiplicados por un millón (1000 veces 1000) que ya son 3 millones de bytes. La cantidad de RAM a la que puedes acceder fácilmente en ODROID-GO es de 4 MB, de modo que cualquier cosa que sea mayor que 1000x1000 no cogerá en la memoria. Puesto que el modus operandi habitual no funciona, tendría que encontrar una forma más inteligente de decodificar partes de la imagen y cambiar su tamaño directamente sobre la marcha sin la necesidad de recurrir a un gran búfer de imagen en la RAM. Esta optimización puede requerir mucho tiempo y esfuerzo que aún no he querido dedicar a este proyecto.

Me he dado cuenta que conseguir un primer prototipo de una característica funcional suele ser bastante fácil y divertido. Pero pulir el software corrigiendo errores, teniendo en cuenta casos extremos y agregar características de calidad que damos por sentado, generalmente requiere mucho más tiempo y esfuerzo, y no resulta tan divertido. Esta es probablemente la razón por la que hay tantos errores en el software actual. Cuanto más complejo es el software, más tiempo y esfuerzo tendrás que invertir para que funcione correctamente.

Próximas funciones

Actualmente estoy trabajando en el soporte para chiptunes usando la librería game-music-emu que puede emular chips de sonido de viejas consolas de juegos y ordenadores. Me gusta mucho el sonido y la creatividad que tienen estas viejas canciones. Lo que también está en proceso de desarrollo es la capacidad de lanzar los emuladores go-play desde ogo-shell. Resumiendo, todavía hay muchas ideas y características que implementar y errores que corregir.

Dicho esto, ha sido bastante divertido desarrollar ogo-shell y aprender cosas nuevas mientras lo hacía. La satisfacción que obtienes cuando ves o escuchas por primera vez que tu creación funciona según lo previsto puede ser realmente adictivo. Espero haberte animado a que no solo uses programas, sino que también aprendas a crear otros nuevos, y espero que ogo-shell te sea útil.

Be the first to comment

Leave a Reply