====== Utilisation d'une télécommande multimédia avec Lirc ======

Cet article est inspiré de [[http://ubuntuforums.org/showthread.php?t=183545&highlight=lirc+nova-t|celui-ci]] et va vous présenter comment installer votre télécommande sous Frugalware. L'exemple donné est pour une télécommande fournie avec la carte tuner TNT Hauppauge Nova-t, vous pourrez l'adapter à la votre.

  * Pré-requis

Avant de commencer, il va vous falloir ajouter un module au démarrage. Pour le charger manuellement, en root faites :

  #  modprobe evdev

Dans votre /etc/sysconfig/modules, ajouter le module evdev pour qu'il se lance automatiquement au démarrage :
  #  nano /etc/sysconfig/modules

Installer ensuite lirc qui va vous permettre de contrôler votre télécommande :

  #  pacman-g2 -S lirc

(cela va vous installer lirc_modules par la même occasion). Pour que le service lirc se lance automatiquement au démarrage, tapez la commande :
  #service lirc add

  * Création d'une règle Udev

Dans certains cas, l'identifiant de notre télécommande peut changer au démarrage. Pour éviter cela, nous allons créer une règle Udev. Nous allons avoir besoin de quelques informations.
D'abord, tapez :

  cat /proc/bus/input/devices

Cela va vous donner la liste de vos périphériques de saisie. Repérez-y votre télécommande. Dans mon cas :

  I: Bus=0001 Vendor=0070 Product=9002 Version=0001 
  N: Name="cx88 IR (Hauppauge Nova-T DVB-T" 
  P: Phys=pci-0000:00:0b.0/ir0 
  S: Sysfs=/class/input/input2 
  U: Uniq= 
  H: Handlers=kbd event2
  B: EV=100003 
  B: KEY=100fc312 214a80200000000 0 18000 41a800004801 9e168000000000 10000ffc''

Ce dont nous avons besoin ici est le numéro de l'event (ici 2).

Taper ensuite :

  udevinfo -a -p $(udevinfo -q path -n /dev/input/event2)

En adaptant bien sûr le numéro de l'event retourné lors de la commande précèdente. Vous allez obtenir un certain nombre d'informations concernant votre técommande :

<php>  Udevinfo starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/class/input/input2/event2':
    KERNEL=="event2"
    SUBSYSTEM=="input"
    DRIVER==""
    ATTR{dev}=="13:66"

  looking at parent device '/class/input/input2':
    KERNELS=="input2"
    SUBSYSTEMS=="input"
    DRIVERS==""
    ATTRS{modalias}=="input:b0001v0070p9002e0001-e0,1,14,k71,72,73,74,77,80,8B,8E,A3,A5,A7,A8,AE,CF,D0,161,16B,16D,16F,172,174,179,181,184,188,189,18E,18F,190,191,192,193,19C,ramlsfw"
    ATTRS{uniq}==""
    ATTRS{phys}=="pci-0000:00:0b.0/ir0"
    ATTRS{name}=="cx88 IR _Hauppauge Nova-T DVB-T"

  looking at parent device '/devices/pci0000:00/0000:00:0b.0':
    KERNELS=="0000:00:0b.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="cx8800"
    ATTRS{msi_bus}==""
    ATTRS{broken_parity_status}=="0"
    ATTRS{modalias}=="pci:v000014F1d00008800sv00000070sd00009002bc04sc00i00"
    ATTRS{local_cpus}=="ff"
    ATTRS{irq}=="19"
    ATTRS{class}=="0x040000"
    ATTRS{subsystem_device}=="0x9002"
    ATTRS{subsystem_vendor}=="0x0070"
    ATTRS{device}=="0x8800"
    ATTRS{vendor}=="0x14f1"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""
    ATTRS{uevent}==""
</php>

L'objectif est de trouver une information qui va identifier votre télécommande de manière unique sur votre système pour créer notre règle Udev. On va par exemple pouvoir utiliser le ATTRS{vendor}, ici 0x14f1.
Maintenant que nous avons l'information nécessaire, nous allons pouvoir créer notre règle.

  #  nano /etc/udev/rules.d/10-local.rules

et ajoutez-y :

  KERNEL=="event*", ATTRS{vendor}=="0x14f1", SYMLINK="input/irremote"

L'idée est que l'on va créer un lien symbolique du périphérique ayant le ATTRS{vendor}=="0x14f1" quel que soit son numéro d'event. Ainsi notre télécommande sera toujours reconnue de la même façon.
Il vous faut maintenant redémarrer udev pour que cette nouvelle règle soit prise en compte. La commande ''service udev restart'' ne fonctionnant pas chez moi (Le service rc.udev n'est pas pris en charge par chkconfig), un redémarrage est nécessaire.
Vous pourrez alors taper :

  ls -l /dev/input

pour vérifier que votre lien symbolique a bien été mis en place.

  * Configuration de Lirc.

Nous allons maintenant passer à la configuration de lirc.
Tout d'abord, éditez le fichier de configuration :

  #  nano /etc/sysconfig/lirc

Vous allez devoir modifier la ligne LIRCD_OPTIONS pour la faire correspondre au changement précèdent :

  LIRCD_OPTIONS="-H dev/input --device=/dev/input/irremote"

Le -H dev/input (notez qu'il n'y a pas de faute de frappe ici) défini le driver qui sera utilisé. Vous devrez l'adapter en conséquence pour d'autres télécommandes. La commande :

  #  lircd --driver=help

va vous afficher la liste des drivers possibles (par exemple pour les télécommandes Pinnacle, il s'agit du driver pinsys).

Il va ensuite vous falloir créer un fichier /etc/lircd.conf qui va servir à faire la correspondance entre le nom de vos touches et leur code hexadécimal. Ce fichier peut être trouvé [[http://lirc.sourceforge.net/remotes/|ici]] pour la plupart des télécommandes. Pour la mienne :

<php># Please make this file available to others
# by sending it to <lirc@bartelmus.de>
#
# this config file was automatically generated
# using lirc-0.7.1pre2(any) on Sat Sep 17 01:00:56 2005
#
# contributed by
#
# brand:                       lircd.conf.kernel-2.6.13.1.conf
# model no. of remote control:
# devices being controlled by this remote:
#

begin remote

  name  hauppauge_nova_t_uk
  bits           16
  eps            30
  aeps          100

  one             0     0
  zero            0     0
  pre_data_bits   16
  pre_data       0x8001
  gap          135803
  toggle_bit      0


      begin codes
          Power                    0x0074
          Go                       0x0161
          TV                       0x0179
          Videos                   0x0189
          Music                    0x0188
          Pictures                 0x016F
          Guide                    0x016D
          Radio                    0x0181
          Up                       0x0067
          Left                     0x0069
          Right                    0x006A
          Down                     0x006C
          OK                       0x001C
          Back                     0x00AE
          Menu                     0x008B
          VolumeUp                 0x0073
          VolumeDown               0x0072
          PreviousChannel          0x019C
          Mute                     0x0071
          ChannelUp                0x0192
          ChannelDown              0x0193
          Record                   0x00A7
          Stop                     0x0080
          Replay                   0x00A8
          Play                     0x00CF
          Skip                     0x00D0
          PreviousTrack            0x00A5
          Pause                    0x0077
          NextTrack                0x00A3
          1                        0x004F
          2                        0x0050
          3                        0x0051
          4                        0x004B
          5                        0x004C
          6                        0x004D
          7                        0x0047
          8                        0x0048
          9                        0x0049
          0                        0x0052
          Text                     0x0184
          Subtitles                0x0172
          Red                      0x018E
          Green                    0x018F
          Yellow                   0x0190
          Blue                     0x0191
      end codes

end remote</php>

Maintenant que la configuration de Lirc est terminée, redémarrons-le :
  #service lirc restart
et testons son bon fonctionnement avec la commande :
  irw
Appuyez sur les touches de votre télécommande et vous devriez voir des sorties correspondantes dans votre terminal. Si c'est le cas, c'est que votre configuration est fonctionnelle et vous pouvez passer à la suite.

  * Configurer Lirc pour vos applications

Voici une partie assez délicate car elle va dépendre des applications que vous allez contrôler avec votre télécommande. Je vais donner quelques pistes, mais il vous faudra sans doute faire quelques recherches pour vos applications.

Note : sous KDE, il existe une applications, IRKick (qui fait partie du paquet kdeutils) qui permet de configurer tout ça de manière graphique. L'inconvénient c'est que cela est limité à certaines applications KDE.

Donc sous Gnome ou si vous souhaitez avoir plus de possibilités, il va falloir le faire à la main.

Voici la méthode que j'utilise. Tout d'abord, dans votre home, créez un fichier .lircrc. Dans celui-ci, on va spécifier un fichier par application que l'on souhaite utiliser. Il est possible de tout mettre dans le fichier .lircrc, mais on perd en lisibilité. Voici par exemple mon fichier .lircrc (je sépare suivant l'environnement que j'utilise) :

  ##KDE
  include ~/.lirc/.lircrc-kaffeine
  include ~/.lirc/.lircrc-amarok
  ##GNOME
  include ~/.lirc/.lircrc-mplayer
  #include ~/.lirc/.lircrc-exaile
  #include ~/.lirc/.lircrc-vlc
  #include ~/.lirc/.lircrc-rhythmbox
  ##Communs
  include ~/.lirc/.lircrc-xdtv</php>

Les modifications dans ce fichier nécessitent un redémarrage de lirc pour être prises en compte.
Et donc vous l'avez compris, on va créer ensuite dans le répertoire ~/.lirc/ les fichiers correspondants.

Il existe plusieurs façons pour faire ces fichiers, et vous trouverez des exemples sur le net pour beaucoup d'applications. Voici deux exemples, une application KDE (Amarok) où on va utiliser dcop et une application Gnome (Rhythmbox). Notez qu'on utilise irexec, fourni avec lirc, qu'il faudra prendre soin de lancer au démarrage de votre environnement. La ligne button est à adapter aux noms des touches définis dans votre /etc/lircd.conf.

<php>##~/.lirc/.lircrc-amarok
begin
  prog   = irexec
  button = Music
  config = amarok
end

begin
 prog = irexec
 button = Play
 config = dcop amarok player play
end

begin
 prog = irexec
 button = Stop
 config = dcop amarok player stop
end

begin
 prog = irexec
 button = Pause
 config = dcop amarok player playPause
end

begin
 prog = irexec
 button = VolumeDown
 repeat = 2
 config = dcop amarok player volumeDown 
end

begin
 prog = irexec
 button = VolumeUp
 repeat = 2
 config = dcop amarok player volumeUp
end

begin
 prog = irexec
 button = Skip
 repeat = 3
 config = dcop amarok player seekRelative 5
end

begin
 prog = irexec
 button = NextTrack
 repeat = 3
 config = dcop amarok player next
end

begin
 prog = irexec
 button = Replay 
 repeat = 3
 config = dcop amarok player seekRelative -5
end

begin
 prog = irexec
 button = Mute
 config = dcop amarok player mute
end

begin
 prog = irexec
 button = Menu
 repeat = 3
 config = dcop amarok player showOSD
end</php>

<php>#~/.lirc/.lircrc-rhythmbox
begin
  prog   = irexec
  button = Music
  config = rhythmbox-client --play & rhythmbox-client --hide
end

begin
    prog   = irexec
    button = Play
    config = rhythmbox-client --play-pause
end
begin
    prog   = irexec
    button = Pause
    config = rhythmbox-client --play-pause
end
begin
    prog   = irexec
    button = Stop
    config = rhythmbox-client --pause
end
begin
    prog   = irexec
    button = NextTrack
    config = rhythmbox-client --next
end
begin
    prog   = irexec
    button = PreviousTrack
    config = rhythmbox-client --previous
end
begin
    prog   = irexec
    button = Red
    config = shuffle
end
begin
    prog   = irexec
    button = Replay
    config = seek_backward
end
begin
    prog   = irexec
    button = Skip
    config = seek_forward
end
begin
    prog   = irexec
    button = VolumeDown
    config = volume_down
end
begin
    prog   = irexec
    button = VolumeUp
    config = volume_up
end
begin
    prog   = irexec
    button = Mute
    config = mute
end
begin
    prog   = irexec
    button = Menu
    config = rhythmbox-client --notify
end
begin
    prog   = irexec
    button = Power
    config = rhythmbox-client --quit
end</php>

