Audio-Experimente mit Gnublin

Autor: Hubert Högl <Hubert.Hoegl@hs-augsburg.de>
Datum: 2012-07-23

URL: http://elk.informatik.fh-augsburg.de/pub/gnublin-lpc3131/appnotes/audio.html

E N T W U R F - E N T W U R F - E N T W U R F - E N T W U R F -

Inhalt

1   Audio Treiber für Linux

Getestete Soundkarten

  • Kleine Platine mit TI/Burr Brown PCM2912 (Embedded Projects Web Shop)
  • Speedlink VIGO USB, vermutlich mit C-Media 108 Chipsatz (KM-Elektronik)

Laden des Treibers:

root@armv5te:~# modprobe snd-usb-audio
usbcore: registered new interface driver snd-usb-audio
root@armv5te:~# lsmod
Module                  Size  Used by
snd_usb_audio          56402  0
snd_pcm                55561  1 snd_usb_audio
snd_timer              15798  1 snd_pcm
snd_page_alloc          3328  1 snd_pcm
snd_hwdep               4881  1 snd_usb_audio
snd_usb_lib            14247  1 snd_usb_audio
snd_rawmidi            14982  1 snd_usb_lib
snd_seq_device          4679  1 snd_rawmidi
snd                    36116  7 snd_usb_audio,snd_pcm,snd_timer,snd_hwdep,snd_usb_lib,snd_rawmidi,snd_seq_device
soundcore               4515  1 snd
r8712u                271323  0

2   Alsa Utilities für Gnublin

http://www.alsa-project.org

Aus Debian/ARM genommen:

  • alsa-utils_1.0.23-3_armel.deb
  • libasound2_1.0.23-2.1_armel.deb
  • linux-sound-base_1.0.23+dfsg-2_all.deb (nicht nötig?)

Root FS:

/usr/lib/
          libasound.so.2 -> libasound.so.2.0.0

/usr/bin/
      aconnect   amidi   aplay      arecord      aseqdump  iecset
      alsamixer  amixer  aplaymidi  arecordmidi  aseqnet   speaker-test

/usr/sbin/alsactl

/usr/share/alsa/alsa.conf

/usr/share/alsa/...

2.1   Test

Mit aplay sollte man .wav Dateien abspielen können:

aplay test.wav

Auch der alsamixer funktioniert wie gewohnt.

3   Ogg-Vorbis

Pakete aus Debian/ARM nachinstallieren:

libao4-1.0.0.tgz
libcurl3-gnutls-7.21.0.tgz
libgssapi-krb5-2-1.8.3+dfsg.tgz
libidn11-1.15.tgz
libk5crypto3-1.8.3+dfsg.tgz
libkeyutils1-1.4.tgz
libkrb5-3-1.8.3+dfsg.tgz
libkrb5support0-1.8.3+dfsg.tgz
libldap-2.4-2-2.4.23.tgz
libsasl2-2-2.1.23.dfsg1.tgz
libspeex1-1.2~rc1.tgz
vorbis-tools-1.4.0.tgz

Folgende dynamische Bibliotheken müssen vorhanden sein:

root@armv5te:~/vorbis-tools/usr/bin# ldd ./ogg123
        libvorbisfile.so.3
        libvorbis.so.0
        libao.so.4
        libnsl.so.1
        libcurl-gnutls.so.4
        libpthread.so.0
        libFLAC.so.8
        libogg.so.0
        libspeex.so.1
        libm.so.6
        libc.so.6
        libdl.so.2
        libidn.so.11
        liblber-2.4.so.2

Root-Filesystem:

/usr/bin/
    ogg123  oggdec  oggenc  ogginfo  vcut  vorbiscomment  vorbistagedit

/usr/lib/
    ao                       libidn.so.11           libldap-2.4.so.2
    krb5                     libidn.so.11.5.44      libldap_r-2.4.so.2
    libao.so.4               libk5crypto.so.3       libldap_r-2.4.so.2.5.6
    libao.so.4.0.0           libk5crypto.so.3.1     libsasl2.so.2
    libcurl-gnutls.so.3      libkrb5.so.3           libsasl2.so.2.0.23
    libcurl-gnutls.so.4      libkrb5.so.3.3         libspeex.so.1
    libcurl-gnutls.so.4.2.0  libkrb5support.so.0    libspeex.so.1.5.0
    libgssapi_krb5.so.2      libkrb5support.so.0.1  mime
    libgssapi_krb5.so.2.2    liblber-2.4.so.2       sasl2
    libidn.la                liblber-2.4.so.2.5.6

/lib/
    libkeyutils.so.1  libkeyutils.so.1.3

3.1   Ogg abspielen

ogg123 kann zur Zeit nur einen .wav Datenstrom auf die Standardausgabe schreiben, den man dann mit aplay hörbar macht:

root@armv5te:~# ogg123 -d wav -f - sample.ogg | aplay

Man kann mit ogg123 Audiodateien auf Gnublin abspielen, die bis maximal 32 kHz abgetastet sind. Bei CD Qualität mit 44,1 kHz gibt es störende Unterbrechungen. Die Grösse des Hauptspeichers (8 oder 32 MByte) spielt dabei keine Rolle.

Man kommt von einer .wav Datei zu einer .ogg Datei mit dem Kommando oggenc. Auf dem PC gibt man dazu ein:

# demo.wav 44,1 kHz --> demo.ogg 32 kHz
oggenc --resample 32000 demo.wav -q 1 -o demo.ogg

4   Mpg321

Nachinstallieren aus Debian/ARM:

libid3tag0-0.15.1b.tgz
libmad0-0.15.1b.tgz
mpg321-0.2.12.tgz

Root-FS:

/usr/lib/
   libid3tag.so.0  libid3tag.so.0.3.0  libmad.so.0  libmad.so.0.2.1

/usr/bin/
   mpg321

4.1   Test

Die MP3 Audiodateien können mit Gnublin bis zu CD Qualität (44,1 kHz) wiedergegeben werden, egal ob 8 oder 32 MByte Hauptspeicher vorhanden sind. Anscheinend ist der Dekodieralgorithmus für den Mikrocontroller weniger anstrengend als die Dekodierung der OGG Dateien.

mpg321 -w - demo.mp3 | aplay

5   Speex

Nachinstallieren aus Debian/ARM:

libspeex1-1.2~rc1.tgz
speex-1.2~rc1.tgz

Root-FS:

/usr/bin/
   speexdec  speexenc

/usr/lib/
   libspeex.so.1  libspeex.so.1.5.0

Modul snd-pcm-oss im Kernel aktivieren/laden.

Device Drivers
    -> [M] Sound card support
        -> [M] Alsa Linux Sound Architecture
           -> --- Advanced Linux Sound Architecture
             <M>   Sequencer support
             <>     Sequencer dummy client
             <M>   OSS Mixer API
             <M>   OSS PCM (digital audio) API
             [*]     OSS PCM (digital audio) API - Include plugin system
             ...

Device anlegen:

mknod /dev/dsp c 14 3

Test:

# Auf dem PC aus einer .wav Datei eine .spx Datei machen
speexenc wb_male.wav wb_male.spx

# Auf Gnublin die .spx Datei abspielen
root@armv5te:/opt/speex# usr/bin/speexdec wb_male.spx

6   Internet Radio

Ziel: MP3- und OGG Streams aus dem Internet abspielen

Tools:

  • ogg123
  • mpg321
  • mplayer

6.1   Ein paar "Sender"

Zunächst suche ich mir zum Test ein paar Sender zusammen.

Die Radiosender geben die URLs für die Audio-Streams in .m3u Dateien an, bei Deutschlandfunk z.B. hier:

http://www.dradio.de/streaming/dlf_lq_ogg.m3u

Diese Dateien enthalten die URLs der Streams, die ich im folgenden angegeben habe. Man kann sich diese URL-Listen am einfachsten mit dem Kommando

wget http://www.dradio.de/streaming/dlf_lq_ogg.m3u

holen und mit einem Editor ansehen.

Ogg Sender (Deutschlandfunk)

  • low quality:

    http://dradio.ic.llnwd.net/stream/dradio_dlf_s_a.ogg
    http://dradio.ic.llnwd.net/stream/dradio_dlf_s_b.ogg
    
  • medium quality:

    http://dradio.ic.llnwd.net/stream/dradio_dlf_medium_a.ogg
    http://dradio.ic.llnwd.net/stream/dradio_dlf_medium_b.ogg
    
  • high quality:

    http://dradio.ic.llnwd.net/stream/dradio_dlf_m_a.ogg
    http://dradio.ic.llnwd.net/stream/dradio_dlf_m_b.ogg
    

Die DLF MP3 Sender können nur high-quality (44.1 kHz). Das kann Gnublin nur stockend wiedergeben. Deswegen suche ich noch einen Sender der auch MP3 in niedriger Datenrate schicken kann.

MP3 Sender (BR Klassik)

BR Klassik sendet MP3 in low- und high-quality:

Der Inhalt der low-quality .m3u Datei ist:

http://gffstream.ic.llnwd.net/stream/gffstream_w4a
http://gffstream.ic.llnwd.net/stream/gffstream_w4b

6.2   mplayer

Version 1.1 von http://www.mplayerhq.hu

Konfigurieren. Alles was mit Video zu tun hat, habe ich in einem ersten Anlauf versucht zu entfernen. Man könnte sicher noch viel mehr Optionen anwenden, die das Program kleiner machen würden, siehe ./configure --help):

CFLAGS="-mcpu=arm926ej-s -mfpu=vfp -mfloat-abi=softfp -O3 \
-fomit-frame-pointer -ffast-math" CC=arm-linux-gnueabi-gcc \
RANLIB=arm-linux-gnueabi-ranlib STRIP=arm-linux-gnueabi-strip \
LD=arm-linux-gnueabi-ld  ./configure --disable-x11 \
--prefix=/opt/mplayer-1.1 --enable-armv5te --target=arm-linux \
--disable-tv --host-cc=arm-linux-gnueabi-gcc \
--disable-libavcodec_mpegaudio_hp --disable-mencoder --disable-gui \
--disable-pvr

Kompilieren mit make.

Trick: Die Kompilierung bricht bei den Dateien

libavcodec/arm/h264dsp_init_arm.c
libavcodec/arm/h264pred_init_arm.c

ab, weil Maschinenbefehle kompiliert werden sollen, die bei ARMv5 nicht definiert sind. Das hat auch schon jemand beschrieben:

http://lists.mplayerhq.hu/pipermail/mplayer-users/2010-July/080637.html

Ich habe es genauso gemacht, mit #if HAVE_NEON ... #endif die unerwünschten Programmteile entfernt. Eigentlich sollte dieser Fehler gar nicht auftreten, muss aber der Sache noch auf den Grund gehen.

Der resultierende mplayer ist ziemlich gross:

-rwxr-xr-x 1 hhoegl hhoegl 16884905 2012-07-23 00:12 mplayer

6.3   Test des Internet Radio

iradio.jpg

Gnublin mit 32 MHz, Verbindung mit dem Internet über den blauen Pegasus USB zu Ethernet Adapter, grünes Audio Platinchen mit TI/Burr Brown PCM2912, beide am Equip Mini USB Hub.

ogg123

Damit ogg123 mit Streams funktioniert muss man noch die beiden Gerätedateien anlegen:

mknod -m 644 /dev/random c 1 8
mknod -m 644 /dev/urandom c 1 9

Damit kann man dann einen Stream anhören:

ogg123 -d wav -f - http://dradio.ic.llnwd.net/stream/dradio_dlf_s_a.ogg  | aplay

mpg321

Mit mpg321 kann man low-quality streams anhören. Mit high-quality gibt es störende Unterbrechungen.

mpg321 -w - http://gffstream.ic.llnwd.net/stream/gffstream_w4a | aplay

mplayer

Mit dem mplayer kann man sowohl OGG als auch MP3 Streams anhören.

/opt/mplayer-1.1/bin/mplayer http://dradio.ic.llnwd.net/stream/dradio_dlf_s_a.ogg

Man kann mit allen Tools nur low- und medium-quality Streams anhören, für high-quality fehlt anscheinend die Rechenleistung.

7   To Do