Introduction
Enjoy est un logiciel HTPC (Home Theater PC) modulaire basé sur FFmpeg, les EFL et OpenAL.
Fonctionnalités natives :
- lecteur video (yc streaming rtp, rtsp)
- lecteur audio (yc streaming rtp, rtsp)
- lecteur images
- navigation clavier/souris
- configuration
- raccourcis clavier
- affichage ou non du curseur de la souris
- modules (liste chargés, liste non chargés, config)
- themes (liste, import, preview)
- fonds d'écran (liste, import, preview; également ceux présent dans les thèmes)
- apparence :
- utilise les objets définis dans les thèmes e17 directement
- n'importe quel objet Evas peut faire office de fond d'écran (bg e17, gradient, ...); possibilté d'ajouter d'autres types via des modules
- en plein écran le curseur de la souris n'est pas affichés (quoique ...)
- surveillance du materiel (HAL et/ou lmsensors)
- actions système :
- arret
- reboot
- suspend to disk
- suspend to ram
- Redimensionnement par défaut d'evas, avec ou sans smooth pour tous les objets evas de type image.
Il sera constitué de deux éléments principaux :
- enjoy : l'exécutable contenant l'interface graphique basée sur edje et evas
- libenjoy : la bibliothèque partagée utilisant FFmpeg et OpenAL
Ainsi que d'un certain nombre de modules gérés par libenjoy :
- des modules permettant le redimensionnement (par défaut evas, swscale, scale2x, ...)
- des modules de fonctionnalités (émulateur, lecture de dvd, jeux, ...)
- ...
Détails
libenjoy
- gestion de l'apparence (themes, fonds d'écrans et icones)
- gestion des évènements
- gestion des modules
- un module peut surcharger des fonctionnalités internes
Modules
- Les modules sont des bibliothèques partagées (shared libraries) chargées dynamiquement au cours de l'exécution.
- Un module a un nom, une description, une catégorie, des options.
- On pourra précisér à libenjoy
- de charger un seul module pendant l'exécution du process
- de charger une catégorie de modules pendant l'exécution du process
Exemple : dans le cadre d'un media player, chargé uniquement les modules audio/video
- les modules auront accès à tous les objets internes d'enjoy
- Modules souhaités :
- Devices :
- télécommande (lirc)
- joystick (calibrage)
- écran lcd (LCDProc)
- Drawing/filter
- swscale (et ses différents filtres)
- scale2x
- hq2x, hq3x, hq4x
- Fonctions
- CD (lecture, gravure et rip)
- DVD (lecture, gravure et rip)
- Emulation (gb, gba, ds, nes, gg/ms, snes, md, ps, n64, ...)
- Petits Jeux (Tétris, frozen bubble, pacman, ...)
- Ports de jeux plus conséquents (TuxKart, Pingus, ...)
- Apparence
- modules de gestion de formats de themes différents (freevo, gtk, etk, ewl, ...)
- modules de gestion de formats de fonds d'écrans différents (slideshow, ...)
- Gestion des options :
/*
* Retourne la liste des options disponibles pour un module
*/
Evas_List * enjoy_module_options_get (module);
/*
* Retourne la liste des valeurs possible pour une options
* ou NULL si aucune valeur n'est définie (par exemple une option définissant
* un chemin d'accès à une ressource ne peut pas être définie lors de l'écriture
* du module).
*/
Evas_List * enjoy_module_option_available_values_get (module, option);
/*
* Retourne la valeur actuelle d'une option d'un module
*/
char * enjoy_module_option_value_get (module, option);
/*
* Met à jour la valeur d'une option d'un module
*/
int enjoy_module_option_value_set (module, option, value);
#ifndef __ENJOY_H__
#define __ENJOY_H__
int enjoy_init (void);
int enjoy_shutdown (void);
Evas_Object * enjoy_object_add (Evas * e);
int enjoy_object_file_set (Evas_Object * o, const char * file);
const char * enjoy_object_file_get (Evas_Object * o);
int enjoy_object_play (Evas_Object * o);
int enjoy_object_stop (Evas_Object * o);
int enjoy_object_record (Evas_Object * o);
int enjoy_object_next (Evas_Object * o);
int enjoy_object_prev (Evas_Object * o);
int enjoy_object_forward (Evas_Object * o, int speed);
int enjoy_object_backward (Evas_Object * o, int speed);
/* ... */
/* Error management */
void enjoy_error_add (int error);
int enjoy_error_get (void);
const char * enjoy_error_message_get (int error);
void enjoy_error_info_print (const char * msg, ...);
void enjoy_error_warn_print (const char * msg, ...);
void enjoy_error_fatal_print (const char * msg, ...);
#endif /* __ENJOY_H__ */
enjoy
- c'est l'exécutable
- peut charger un module particulier
Le menu
- Watching TV
- Watching DVD
- Listen to CD
- Library
- Videos
- Music
- Images
- Game Boy
- Master System
- Megadrive
- Super Nintendo
- Playstation
- Nintendo 64
ou
- Video
- DVD (uniquement si un DVD est dans le lecteur)
- Music
- CD (uniquement si un CD est dans le lecteur)
- Game
- Settings
- Apparence
- Background
- Theme
- Icon Theme
- Ecran
- Joystick
- Modules
Les modules DVD et CD seront chargés lorsqu'un DVD ou CD sera inséré dans le lecteur. La détection sera faite via HAL. Si un media est détecter :
- afficher un message d'indication avec les Play, Rip, Open ... selon le type du media
- charger le module adéquate
- lancer l'action demander
Les options
- -m : module à charger
- -f : fichier à charger (s'utilise avec -m pour forcer le module sinon retrouve le module grace au type mime)
- -t : theme
- -b : fond d'écran (bg e17 ou image)
- -r : raz de la configuration
- -c : spéficie le fichier de configuration (fichier eet)
- -g : résolution de la forme wxh (exemple : 800x600)
- -w : mode fenetre ou pelin écran (window)
- -e : engine (fb, x11, xrender, GL, sdl, ...)
FFmpeg
ffmpeg supporte les "protocols" suivants :
- file://
- pipe://
- udp://
- tcp://
- rtp://
- http://
protocols à ajouter :
- cdda://
- dvb://
- dvd://
- evfs://
- mms://
- rstp://
- smb://
- v4l://
- vcd://
- upnp://
Exemple
/* cdda.c */
#include <avformat.h>
static int cdda_open (URLContext * h, const char * filename, int flags)
{
strstart (filename, "cdda:", &filename);
/* on ouvre le device avec les flags voulus */
return 0;
}
static int cdda_read (URLContext *h, unsigned char *buf, int size)
{
int nb_octest_lus;
return nb_octets_lus;
}
static int cdda_write (URLContext *h, unsigned char *buf, int size)
{
int nb_octest_ecrits;
return nb_octets_ecrits;
}
static offset_t cdda_seek(URLContext *h, offset_t pos, int whence)
{
offset_t nv_pos;
return nv_pos;
}
static int cdda_close(URLContext *h)
{
return ;
}
URLProtocol cdda_protocol = {
"cdda",
cdda_open,
cdda_read,
cdda_write,
cdda_seek,
cdda_close,
};
/* init.c */
#include <avformat.h>
int init (void)
{
register_protocol (&cdda_protocol);
return 0;
}