# [HOWTO] "Gentoo media box" sous XOrg

## razer

Bon, à mon tour d'apporter ma modeste contribution à cet HOWTO permettant la même opération sur framebuffer, et dont je me suis bien inspiré

Après de longues heures de galère, je suis parvenu à mon tour à faire ma propre Mediabox sous Xorg

Voici sur quoi je suis parti, nul besoin de préciser qu'il s'agit de matos de récup   :Laughing:   :

CONFIG MATERIELLE :

P3 550 Mhz - Chipset Intel PIIXn

Nvidia GeForce2 MX 400, sortie Télé

SB Live 5.1

DD 2 Go

Lecteur DVD Pioneer

Télécommande ATI Remote Wonder

Mon cahier des charges :

Lecture des vidéos des principaux formats avec :

             le panscan (zoom de l'image) -> XORG requis

             Le format AC3 en sortie 6 canaux analogiques 3 jacks -> ALSA requis

Lecture de musique ogg/mp3/cdaudio

Visionnage d'images

Contrôle grace à la remote ATI -> LIRC

Connexion sur téléviseur

Démarrage rapide -> Software suspend 2

Montage automatique cd/usbstorage -> HAL + DBUS + IVMAN

L'architecture logicielle :

Kernel 2.6.10 avec SoftwareSuspend patch et script hibernate

Drivers Nvidia 6628 (les plus récents rendaient ma sortie télé HS)

Xorg

Lirc 0.7.2

Freevo 

Mplayer 1.0pre7

Je n'ai malheureusement pas le temps de détailler la totalité de mon installation, mais je vais rajouter quelques configs et scripts pouvant être intéressants.

Freevo 

Il est lancé en mode X11, grâce aux drivers nvidia. C'est le prix à payer pour me permettre le zoom de l'image (panscan) sous mplayer. C'était une des limitations de la Geexbox (avec le son AC3), qui m'a décidé à me lancer dans ma propre aventure.

donc tout d'abord le /etc/freevo/freevo.conf :

```
display = x11

geometry = 800x600

jpegtran = /usr/bin/jpegtran

lsdvd = /usr/bin/lsdvd

mplayer = /root/mplayer

renice = /usr/bin/renice

setterm = /usr/bin/setterm

version = 2.1

xine = /usr/bin/xine
```

Il est déjà remarquable que la commande "mplayer" est redirigée vers un script perso, placé dans /root. J'y reviendrais plus bas...

Ensuite le local.py.conf :

```
###########GENERAL CONF############

CONFIG_VERSION = 5.15

AUDIO_DEVICE        = '/dev/dsp'      # e.g.: /dev/dsp0, /dev/audio, /dev/alsa/?

CONTROL_ALL_AUDIO = 1

ROM_DRIVES =    [('/mnt/cdrom','/dev/hdc','Lecteur CD/DVD')]

ROM_SPEED = 2

HIDE_UNUSABLE_DISCS = 1

USE_NETWORK = 0

CACHE_IMAGES = 1

START_FULLSCREEN_X  = 1

LIRCRC = '/etc/freevo/lircrc'

LOCALE='latin-1'

MEDIAINFO_USE_MEMORY   = 0

CONFIRM_SHUTDOWN    = 0

###########PLUGINS############

plugin.remove('plugin_tv')

plugin.remove('tv.generic_record')

plugin.remove('web.microdom')

plugin.remove('tv')

plugin.remove('tv.mplayer')

plugin.remove('tv.manual_record')

plugin.remove('tv.record_client')

plugin.remove('tv.view_favorites')

plugin.remove('util.marmalade')

plugin.remove('tv.scheduled_recordings')

plugin.remove('record_client')

###########APPLICATIONS############

VIDEO_PREFERED_PLAYER = 'mplayer'

AUDIO_PREFERED_PLAYER = 'mplayer'

MPLAYER_VERSION = "1.0"

MPLAYER_AO_DEV       = 'alsa'  # e.g.: oss,sdl,alsa, see mplayer docs

MPLAYER_NICE         = 0

MPLAYER_VF_INTERLACED  = ''

MPLAYER_VF_PROGRESSIVE = ''

MPLAYER_SET_AUDIO_DELAY = 0

MPLAYER_SOFTWARE_SCALER = ''

MPLAYER_ARGS = { 'dvd'    : '',

                  'vcd'    : '',

                  'cd'     : '',

                  'tv'     : '',

                  'ivtv'   : '',

                  'avi'    : '',

                  'rm'     : '',

                  'rmvb'   : '',

                  'webcam' : '',

                  'default': ''

                  }

##########MENU VIDEOS##############

VIDEO_MPLAYER_SUFFIX = [ 'avi', 'mpg', 'mpeg', 'wmv', 'bin', 'rm',

                          'divx', 'ogm', 'vob', 'asf', 'm2v', 'm2p',

                          'mp4', 'viv', 'nuv', 'mov', 'iso',

                          'nsv', 'mkv' ]

VIDEO_ITEMS = [ ('Disque/Cle USB', '/mnt/usbdisk') ]

##########MENU AUDIO##############

AUDIO_SUFFIX     = [ 'mp3', 'ogg', 'wav','m4a', 'wma', 'aac', 'flac', 'mka' ]

AUDIO_ITEMS = [ ('Disque/Cle USB', '/mnt/usbdisk') ]

##########MENU IMAGES##############

IMAGEVIEWER_BLEND_MODE = 0

##########CONF MENU#############

#OSD_OVERSCAN_X = 150

#OSD_OVERSCAN_Y = 35

OSD_SDL_EXEC_AFTER_STARTUP = "nvtv -t -C CONVERT -r 800,600 -s LARGE; xvattr -a XV_COLORKEY -v 0"

OSD_SDL_EXEC_AFTER_CLOSE = "nvtv -t -C CONVERT -r 800,600 -s LARGE"

OSD_STOP_WHEN_PLAYING = 1
```

Bcp de choses à remarquer :

le lien vers mon disque externe USB dans audio/video/images

La commande nvtv pour virer les bandes noires sur la télé

Le lien vers le fichier de conf lirc (merci à cet howto !)

Les arguments de mplayer réduits à leur plus simple expression (pas de postprocessing, petit PC oblige)

J'ai aussi modifié le fichier mplayer.py (/usr/lib/python/site-package/freevo/....), de telle sorte à forcer l'inutilisation du postprocessing.

Pour ceux qui comme moi ont une petite config, il est dispo ICI

La config de Xorg afin de lancer tout çà : ICI

On y trouve des options intéressantes, comme par exemple la possibilité de lancer X sans souris

J'en viens à mon script effectuant la jonction entre freevo et mplayer. Je voulais réaliser plusieurs petites choses :

Charger automatiquement les sous-titres nommés <NomDuFilm>.<langue>.sub/srt (j'aime bien les sous-titrages anglais mais des fois j'ai du mal, donc je repasse au français : bref je voulais avoir le choix)

Définir l'option "channels" de mplayer en fonction de la bande son : 6 pour l'AC3, 2 pour les bandes son classiques. En effet mplayer est la fâcheuse habitude de "mutter" automatiquement les sorties WaveREAR et WaveLFE/Center en 6 canaux. Cela fonctionne parfaitement en AC3, mais dans le cas inverse on sort que sur les enceintes Front

Le voici :

```
#!/bin/bash

mplay="/usr/bin/mplayer"

while [ $# -ne 1 ]; do               #On recupere les arguments de freevo

   arglist="$arglist $1"

   shift

done

aviarg=$1                  #Nom orginal donne au film par freevo

avifile=${1#/}                  #On eleve le premier slash

movie=${avifile%.*}               #On eleve l'extension

for filename in "$movie"*.srt "$movie"*.sub; do      #On cherche les sub

   if [ -f "$filename" ]; then

      subargs="$subargs"",""$filename"   #Si existant on ajoute à la chaine subargs

   fi

done 

surnd=$($mplay -identify -vo null -frames 1 "$avifile"| grep "AC3: 5.1")

if [ "$surnd" = "" ]; then

   nbchannel=2               #Si pas son AC3 channel=2

else

        nbchannel=6               #Sinon channel=6

fi

if [ ! "$subargs" = "" ]; then            #Si il existe des sous-titres

        subargs=${subargs#*","}                         #On retire la derniere virgule genante

   $mplay "$arglist" \

      -channels $nbchannel \

      "$avifile" \

      -sub "$subargs"

else                     #Sinon

        $mplay "$arglist" \

      -channels $nbchannel \

      "$avifile"

fi
```

J'ai aussi ajouté un ~/.lircrc afin d'avoir des fonctions de mplayer accessibles à la télécommande :

```
begin

     button = a

     prog = mplayer

     config = panscan 0.1

     repeat = 1

end

begin

     button = b

     prog = mplayer

     config = panscan -0.1

     repeat = 1

end

begin

     button = media_library

     prog = mplayer

     config = sub_select 1

     repeat = 1

end

begin

     button = vol-down

     prog = mplayer

     config = volume -1

     repeat = 1

end

begin

     button = vol-up

     prog = mplayer

     config = volume 1

     repeat = 1

end

begin

     button = chan-down

     prog = mplayer

     config = seek -20

     repeat = 1

end

begin

     button = chan-up

     prog = mplayer

     config = seek 20

     repeat = 1

end

begin

     button = launch_setup

     prog = mplayer

     config = osd

     #repeat = 1

end

```

Lirc fonctionnait mal : il fallait parfois plusieurs pressions pour obtenir l'effet désiré, sous mplayer comme sous freevo. Cela est peut-être du au fait que le kernel est compilé en "Preemptible", ou simplement que ma config est faiblarde

J'ai largement amélioré la situation en donnant une haute priorité au process lircd, en modifiant le script d'initialisation :

```
#!/sbin/runscript

# Copyright 1999-2004 Gentoo Foundation

# Distributed under the terms of the GNU General Public License v2

# $Header: /var/cvsroot/gentoo-x86/app-misc/lirc/files/lircd,v 1.6 2004/09/26 21:27:07 lanius Exp $

start() {

   ebegin "Starting lircd"

   start-stop-daemon --start --quiet --exec /usr/sbin/lircd -- ${LIRCD_OPTS}

   renice -20 $(pidof lircd) > /dev/null

   eend $?

}

stop() {

   ebegin "Stopping lircd"

   start-stop-daemon --stop --quiet --exec /usr/sbin/lircd

   eend $?

}
```

Enfin, le tout mettant 3 plombes à booter (pas génial pour l'usage   :Confused: ), j'ai patché le noyau pour obtenir un software suspend.

Or le driver Nvidia n'aime pas trop çà, la méthode est donc de sortir de freevo préalablement, de suspendre à l'aide du bouton power, le script hibernate se chargeant de redémarrer tout à la restauration :

```
UseSuspend2 yes

Reboot no

EnableEscape yes

DefaultConsoleLevel 1

Compressor lzf

Encryptor none

SuspendDevice swap:/dev/hda2

PowerdownMethod 5

ProcSetting expected_compression 50

Verbosity 0

LogFile /var/log/hibernate.log

LogVerbosity 1

SaveClock restore-only

UnmountFSTypes smbfs nfs vfat

UnloadBlacklistedModules yes

LoadModules auto

RestartServices lircd freevo

SwitchToTextMode yes

```

Pour hiberner grace au bouton "power", j'ai modifié le /etc/acpi/default.sh, et j'ai ajouter au boot acpid grace à rc-update :

```
#!/bin/sh

# Default acpi script that takes an entry for all actions

set $*

group=${1/\/*/}

action=${1/*\//}

case "$group" in

        button)

                case "$action" in

                       power)  /usr/sbin/hibernate

                                ;;

                        *)      logger "ACPI action $action is not defined"

                                ;;

                esac

                ;;

        *)

                logger "ACPI group $group / action $action is not defined"

                ;;

esac
```

Voilà, je suis loin d'avoir fait le tour de la question, mais voila au moins une petite contribution personnelle.

Elle sera j'espère utile pour d'autres désirant se lancer dans cette aventure. Pour ces derniers je suis biensûr dispo pour de plus amples renseignements

Bon, je m'en vais me regarder un p'tit film  :lol

----------

## chrissou

j'ai envie de me lancer dans cette aventure aussi par contre je me demandais pourquoi tu avais choisis freevo, as tu testé mythtv ? 

Sinon bravo pour le tuto c'est nickel  :Wink: 

@+

----------

## razer

 *chrissou wrote:*   

> j'ai envie de me lancer dans cette aventure aussi par contre je me demandais pourquoi tu avais choisis freevo, as tu testé mythtv ? 
> 
> Sinon bravo pour le tuto c'est nickel 
> 
> @+

 

Merci !

En fait j'ai cherché sur portage et freshmeat ce qui pourrait remplir la fonction désirée, et je suis tombé sur freevo qui semblait pas mal. De plus, il fonctionne en python, langage que je connais un peu, donc je me suis dit que çà faciliterait le tweaking si nécessaire.

Je ne connais pas mythtv, mais je vais me renseigner

----------

## chrissou

Merci @ toi

----------

