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
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
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/...
Mit aplay sollte man .wav Dateien abspielen können:
aplay test.wav
Auch der alsamixer funktioniert wie gewohnt.
- Vorbis-Tools 1.4.0 von http://xiph.org/downloads/
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
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
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
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
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
Ziel: MP3- und OGG Streams aus dem Internet abspielen
Tools:
- ogg123
- mpg321
- mplayer
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.oggmedium quality:
http://dradio.ic.llnwd.net/stream/dradio_dlf_medium_a.ogg http://dradio.ic.llnwd.net/stream/dradio_dlf_medium_b.ogghigh 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:
- low-quality: http://streams.br-online.de/br-klassik_1.m3u
- high-quality: http://streams.br-online.de/br-klassik_2.m3u
Der Inhalt der low-quality .m3u Datei ist:
http://gffstream.ic.llnwd.net/stream/gffstream_w4a http://gffstream.ic.llnwd.net/stream/gffstream_w4b
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
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.