OpenWrt - Audio
Aby ruter też mógł przemówić...
Ostatnia zmiana: 2013-11-26 22:06

1. USB
 1.1. Instalacja modułów
2. Demon MPD
 2.1. Odtwarzanie pliku
 2.2. Odtwarzanie strumienia radiowego
3. LCD
4. Sterowanie telefonem
 4.1. OpenWrt
5. Sterowanie przyciskami
6. Zakończenie


Skoro niektóre rutery mają port USB, to dlaczego nie miały by robić za odtwarzacz mp3? Kupujemy najtańszą kartę dźwiękową USB (3D sound - cena na allegro jakieś 6 zł na koniec 2009r). Ten poradnik opisuje:
- instalację karty dźwiękowej na USB
- instalację i konfigurację MPD (demona do odtwarzania muzyki)
- odtwarzanie plików mp3 przez MPD
- odtwarzanie radia internetowego
- wyświetlanie informacji o odtwarzanej muzyce na LCD
- sterowanie całością przez telefon z bluetoothem
USB

    # opkg install kmod-usb-core kmod-usb2

Instalacja modułów
Należy zainstalować moduły, podłączyć kartę dźwiękową i zrestartować ruter

    # opkg install kmod-sound-core kmod-usb-audio

powinny pojawić się odpowiednie urządzenia w /dev/snd podsystemu audio

    # ls /dev/snd/*
    /dev/snd/controlC0 /dev/snd/pcmC0D0c /dev/snd/pcmC0D0p /dev/snd/timer

Demon MPD

    # opkg install mpd-full mpc

mpc jest przydatny do sterowania samym programem mpd, więc go też należy doinstalować. Wraz mpd zostanie zainstalowana cała masa zależności (libintl, libflac, libiconv, libcurl, libmad, glib2, libmms, libopenssl, libid3tag, zlib, libvorbisidec, libpthread), może się nie zmieścić w ruterach z małą ilością wolnej pamięci flash.
Konfiguracja demona jest w pliku /etc/mpd.conf, wystarczy tylko taka zawartość:

    music_directory "/mnt/sda1/music"
    playlist_directory "/mnt/sda1/playlists"
    db_file "/mnt/sda1/database"
    pid_file "/mnt/sda1/pid"
    state_file "/mnt/sda1/state"
    input {
        plugin "curl"
    }
    mixer_type "software"

Gdzie /mnt/sda1 to katalog gdzie jest przechowywana muzyka i playlisty dla mpd. Do ustawienia oczywiście we własnym zakresie.
Niekiedy będzie potrzeba dodania grupy użytkowników o nazwie audio:

    # echo "audio:x:1000:" >> /etc/group

Zostaje jeszcze tylko jego uruchomienie

    # /etc/init.d/mpd start

Aby uruchomić mpd po starcie systemu należy jeszcze wykonać

    # /etc/init.d/mpd enable

Odtwarzanie pliku
Plik musi być umieszczony w katalogu /mnt/sda1/music. Dodajemy go do bieżącej playlisty i odtwarzamy

    # mpc clear
    # mpc add plik.mp3
    # mpc play

Odtwarzanie strumienia radiowego

    # mpc clear
    # mpc add http://217.74.72.29:8000/rmf_smooth_jazz
    # mpc play

Podany adres to w przykładzie RMF FM Smooth Jazz z Miasta Muzyki.
LCD
Oczywiście MPD potrafi współpracować także z projektem LCD4Linux, co pozwala wyświetlać informacje na temat odtwarzanego utworu, czasu, stanu odtwarzacza i wielu innych parametrów. Sama instalacja nie powinna sprawić problemu, opisana jest w dokumencie LCD dla OpenWrt, zmienia się jednakże plik konfiguracyjny.
Opcje konfiguracyjne opisane są na wiki projektu LCD4Linux, natomiast przykładowy plik konfiguracyjny może wyglądać tak: (pierwsza linia - artysta i tytuł, następna stan playera, kolejna - poziom głośności)

    Plugin MPD {
        enabled 1
        server 'localhost'
        port 6600
        minUpdateTime 500
    }	    
    
    Display st2205u {
        Driver     'st2205'
        Port       '/dev/sda'
        Font       '6x8'
        Foreground 'ffffff'
        Background '000000'
        Basecolor  '000000'
    }
    
    Widget mpd-combo {
        class 'Text'
        expression mpd::artist() . '/' . mpd::title() 
        width 20
        align 'A'
        speed scroller
        update tack
    }

    Widget mpd-vol {
        class  'Text'
        expression 'VOL:'.mpd::getVolume()
        width  7
        align  'R'
        update tack   
    }

    Widget mpd-playerstatus {
        class 'Text'
        expression (mpd::getStateInt() == 1 ? 'PLAYING' : '').(mpd::getStateInt() == 2 ? 'PAUSED ' : '').(mpd::getStateInt() == 3 ? 'STOPPED' : '').(mpd::getStateInt() == 0 ? 'UNKNOWN' : '')
        width 7
        align 'L'
        update tack
    }

    Variables {
        tack 500
        scroller 300
    }

    Layout mylayout {
        Row01.Col01 'mpd-combo'
        Row03.Col01 'mpd-playerstatus'
        Row05.Col01 'mpd-vol'
    }

    Display 'st2205u'
    Layout 'mylayout'

Oczywiście nie wyczerpuje to możliwości konfiguracyjnych pluginu i LCD4Linux, polecam zapoznać się ze stroną projektu.
Sterowanie telefonem
Można sterować MPD przy pomocy np. telefonu z bluetooth. W tym przypadku była to Nokia E51 (Symbian S60 3rd). Aplikacja do sterowania nazywa się bemused i dostępna jest m.in. http://my-symbian.com/s60v3/software/applications.php?fldAuto=46&faq=14 (należy pamiętać o przestawieniu daty na 2006, inaczej nie zainstaluje się z powodu wygaśnięcia certyfikatu).

Dostępne jest także odpowiednie oprogramowanie pod androida: http://mpd.wikia.com/wiki/Clients , dzięki czemu możliwe jest sterowanie mpd nowszymi urządzeniami.
OpenWrt
Opis instalacji znajduje się w dokumencie OpenWrt - bluetooth. Następnie należy dostosować konfigurację bluez:
  • powiązać OpenWrt z telefonem
Należy znaleźć adres telefonu przy pomocy polecenia

    # hcitool scan

W tym przypadku rezultat wyglądał następująco:

    Scanning ...
        00:1C:26:xx:xx:xx	laptop
        00:1D:6E:xx:xx:xx	E51

Interesująca linia to oczywiście ta ostania. Następnie należy skonfigurować rfcomm w pliku /etc/bluetooth/rfcomm.conf, który powinien wyglądać następująco:
 
    rfcomm0 {
        bind yes;
        device 00:1D:6E:xx:xx:xx;
        channel 3;
    }

gdzie adres to oczywiście dane uzyskane w poprzednim poleceniu. Zostaje już tylko włączenie rfcomm:

    # uci set bluetooth.@rfcomm[0]=rfcomm
    # uci set bluetooth.@rfcomm[0].config=/etc/bluetooth/rfcomm.conf
    # uci set bluetooth.@rfcomm[0].enabled=1
    # uci commit bluetooth
    # /etc/init.d/bluez-utils stop
    # /etc/init.d/bluez-utils start

Jeżeli wszystko jest poprawnie to w logu (logread) powinna znajdować się informacja podobna do tej:

    Nov  7 07:54:04 OpenWrt daemon.info hcid[1456]: Bluetooth HCI daemon
    Nov  7 07:54:04 OpenWrt daemon.info hcid[1456]: Starting SDP server
    Nov  7 07:54:04 OpenWrt daemon.info hcid[1456]: HCI dev 0 registered
    Nov  7 07:54:04 OpenWrt daemon.info hcid[1456]: HCI dev 0 already up
    Nov  7 07:54:04 OpenWrt daemon.info hcid[1456]: Device hci0 has been added
    Nov  7 07:54:04 OpenWrt daemon.info hcid[1456]: Starting security manager 0
    Nov  7 07:54:04 OpenWrt daemon.info hcid[1456]: Device hci0 has been activated

  • zainstalować bemusedlinuxserver

    # opkg install bemusedlinuxserver

  • skonfigurować go
Konfiguracja umieszczona jest w pliku /etc/bemused.conf i powinna wyglądać następująco:

    mpddir=/usr/bin/mpd
    channel=3
    mp3dir=/mnt/sda1/music
    bookmarkfile=/etc/bemused-bookmarks
    #fastforbackspeed=10000
    #tcp=1
    #tcpport=7654

  • wystartować demona

    # /etc/init.d/bemused start

Uruchamiamy teraz program w komórce, wyszukujemy urządzenie bluetooth (o nazwie OpenWrt domyślnie) i już można sterować MPD - stop, start, volume, playlisty itd.
Sterowanie przyciskami
Niektóre rutery mają sprzętowe przyciski które można wykorzystać do sterowania MPD. W przypadku np. Linksysa WRT160NL można wykorzystać przycisk WPS na wierzchu obudowy (przez system rozpoznawany jako BTN_1). Najprostszy skrypt włączający/wyłączający odtwarzanie po naciśnięciu przycisku można utworzyć wydając poniższe polecenia:

    # mkdir -p /etc/hotplug.d/button
    # cd /etc/hotplug.d/button
    # touch 00-mpd
    # chmod 755 00-mpd

a następnie umieścić w tym pliku (/etc/hotplug.d/button/00-mpd) następującą zawartość

    if [ "$ACTION" = "pressed" ]; then
        if [ "$BUTTON" = "BTN_1" ]; then
            mpc toggle
        fi
    fi

Zakończenie
Niektóre telefony mogą obsługiwać inny kanał komunikacyjny niż 3. Aby uzyskać informację o kanale należy wykonać polecenie

    # sdptool browse 00:1D:6E:xx:xx:xx

i odszukać usługę Serial Port lub RFCOMM. Adres mac to oczywiście adres telefonu uzyskany przez hcitool scan.

Przykładowe zastosowanie mpd jako budzika: http://openrouter.info/forum/viewtopic.php?f=22&t=414