r611 - in trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer: . Input Input/cdaudio Input/mpg123 Input/vorbis Input/wav Output Output/OSS Output/alsa Output/esd Visualization Visualization/blur_scope beep images intl libbeep po

jiang_li at sita.openmoko.org jiang_li at sita.openmoko.org
Thu Jan 25 08:03:13 CET 2007


Author: jiang_li
Date: 2007-01-25 07:50:09 +0100 (Thu, 25 Jan 2007)
New Revision: 611

Added:
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/ABOUT-NLS
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/AUTHORS
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/COPYING
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/ChangeLog
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/FAQ
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/INSTALL
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdaudio.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdaudio.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cddb.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cddb.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdinfo.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdinfo.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/configure.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/http.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/http.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/README
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/common.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/configure.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct36_3dnow.s
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64_3dnow.s
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64_MMX.s
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64_i386.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_2to1.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_3dnow.s
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_4to1.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_MMX.s
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_i386.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_i586.s
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dxhead.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dxhead.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/equalizer.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/fileinfo.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/getbits.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/getbits.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/getcpuflags.s
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/http.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/huffman.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame_content.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame_text.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame_url.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_header.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_tag.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/l2tables.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/layer1.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/layer2.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/layer3.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/mp3.xpm
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/mpg123.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/mpg123.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/tabinit.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/xmms-id3.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/vorbis/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/vorbis/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/vorbis/configure.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/vorbis/fileinfo.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/vorbis/http.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/vorbis/http.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/vorbis/ogg.xpm
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/vorbis/vcedit.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/vorbis/vcedit.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/vorbis/vorbis.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/vorbis/vorbis.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/wav/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/wav/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/wav/wav.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/wav/wav.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/NEWS
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/OSS/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/OSS/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/OSS/OSS.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/OSS/OSS.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/OSS/about.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/OSS/audio.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/OSS/configure.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/OSS/convert.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/OSS/init.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/OSS/mixer.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/OSS/soundcard.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/alsa/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/alsa/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/alsa/about.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/alsa/alsa.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/alsa/alsa.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/alsa/audio.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/alsa/configure.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/alsa/init.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/esd/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/esd/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/esd/about.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/esd/audio.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/esd/configure.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/esd/esd.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/esd/esdout.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/esd/init.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Output/esd/mixer.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/README
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Visualization/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Visualization/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Visualization/blur_scope/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Visualization/blur_scope/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Visualization/blur_scope/blur_8.s
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Visualization/blur_scope/blur_scope.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Visualization/blur_scope/blur_scope.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Visualization/blur_scope/config.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/autogen.sh
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep-media-player.1.in
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/.Makefile.swp
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/about.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/about.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/bmp.desktop.in
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/build.list
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/controlsocket.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/controlsocket.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/debug.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/dnd.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/dock.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/dock.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/effect.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/effect.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/eq_graph.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/eq_graph.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/eq_slider.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/eq_slider.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/equalizer.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/equalizer.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/fft.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/fft.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/fullscreen.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/fullscreen.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/general.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/general.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/getopt.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/getopt.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/getopt1.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/glade.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/glade.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/hints.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/hints.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/hslider.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/hslider.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/iir.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/iir.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/input.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/input.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/logger.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/logger.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/main.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/main.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/mainwin.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/mainwin.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/menurow.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/menurow.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/mkdtemp.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/monostereo.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/monostereo.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/number.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/number.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/output.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/output.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/pbutton.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/pbutton.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/pixmaps.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/playback.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/playback.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/playlist.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/playlist.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/playlist_list.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/playlist_list.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/playlist_popup.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/playlist_popup.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/playlist_slider.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/playlist_slider.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/playlistwin.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/playlistwin.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/playstatus.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/playstatus.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/plugin.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/pluginenum.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/pluginenum.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/prefswin.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/prefswin.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/sbutton.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/sbutton.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/skin.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/skin.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/skinwin.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/skinwin.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/softvolume.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/softvolume.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/svis.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/svis.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/tbutton.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/tbutton.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/textbox.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/textbox.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/urldecode.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/urldecode.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/util.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/util.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/vis.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/vis.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/visualization.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/visualization.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/widget.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/widget.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/xml_document.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/beep/xml_document.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/bmp.pc.in
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/bmp.spec.in
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/config.h.in
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/config.h.in~
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/configure.ac
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/bg-music-player.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/btn-menu.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/btn-white-p.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/btn-white.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ico-list.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ico-nexttrack.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ico-pause.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ico-play.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ico-previoustrack.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ico-repeat.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ico-shuffle.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/icon-musicplayer-song.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/icon-musicplayer-time.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-eq-01.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-eq-02.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-eq-03.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-eq-04.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-eq-05.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-eq-06.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-eq-07.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-eq-08.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-eq-09.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-eq-10.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-eq-11.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-eq-12.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-pan--1.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-pan--2.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-pan--3.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-pan-0.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-pan-1.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-pan-2.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-pan-3.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-volume-00.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-volume-01.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-volume-02.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-volume-03.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-volume-04.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-volume-05.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-volume-06.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-volume-07.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-volume-08.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-volume-09.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/ind-music-volume-10.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/slider-bar.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/images/slider_btn.png
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/ChangeLog
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/VERSION
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/bindtextdom.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/config.charset
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/dcgettext.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/dcigettext.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/dcngettext.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/dgettext.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/dngettext.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/eval-plural.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/explodename.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/finddomain.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/gettext.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/gettextP.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/gmo.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/hash-string.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/intl-compat.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/l10nflist.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/libgnuintl.h.in
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/loadinfo.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/loadmsgcat.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/localcharset.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/localcharset.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/locale.alias
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/localealias.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/localename.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/log.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/ngettext.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/os2compat.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/os2compat.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/osdep.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/plural-exp.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/plural-exp.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/plural.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/plural.y
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/ref-add.sin
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/ref-del.sin
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/relocatable.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/relocatable.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/intl/textdomain.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/beepctrl.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/beepctrl.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/configdb.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/configdb_gconf.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/configdb_rcfile.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/configfile.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/configfile.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/dirbrowser.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/dirbrowser.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/formatter.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/formatter.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/rcfile.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/rcfile.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/titlestring.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/titlestring.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/util.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/util.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/vfs.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/vfs_gnome.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/vfs_stdio.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/xconvert.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/xconvert.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/xentry.c
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/libbeep/xentry.h
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/ltmain.sh
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/ChangeLog
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/LINGUAS
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/Makevars
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/Makevars.template
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/POTFILES.in
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/Rules-quot
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/bmp.pot
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/boldquot.sed
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/br.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/br.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/cs.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/cs.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/cy.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/cy.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/de.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/de.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/el.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/el.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/en at boldquot.header
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/en at quot.header
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/es.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/es.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/fi.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/fi.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/fr.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/fr.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/hi.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/hi.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/hu.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/hu.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/insert-header.sin
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/it.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/it.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/ja.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/ja.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/ka.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/ka.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/ko.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/ko.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/lt.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/lt.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/mk.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/mk.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/nl.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/nl.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/pl.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/pl.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/pt_BR.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/pt_BR.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/quot.sed
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/remove-potcdate.sin
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/ro.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/ro.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/ru.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/ru.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/sk.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/sk.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/stamp-po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/sv.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/sv.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/uk.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/uk.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/zh_CN.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/zh_CN.po
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/zh_TW.gmo
   trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/po/zh_TW.po
Log:
This commit operation commit the source of simplemediaplayer to svn server for the first time.


Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/ABOUT-NLS
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/ABOUT-NLS	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/ABOUT-NLS	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,625 @@
+Notes on the Free Translation Project
+*************************************
+
+   Free software is going international!  The Free Translation Project
+is a way to get maintainers of free software, translators, and users all
+together, so that will gradually become able to speak many languages.
+A few packages already provide translations for their messages.
+
+   If you found this `ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU `gettext' internally,
+itself available at your nearest GNU archive site.  But you do _not_
+need to install GNU `gettext' prior to configuring, installing or using
+this package with messages translated.
+
+   Installers will find here some useful hints.  These notes also
+explain how users should proceed for getting the programs to use the
+available translations.  They tell how people wanting to contribute and
+work at translations should contact the appropriate team.
+
+   When reporting bugs in the `intl/' directory or bugs which may be
+related to internationalization, you should tell about the version of
+`gettext' which is used.  The information can be found in the
+`intl/VERSION' file, in internationalized packages.
+
+Quick configuration advice
+==========================
+
+   If you want to exploit the full power of internationalization, you
+should configure it using
+
+     ./configure --with-included-gettext
+
+to force usage of internationalizing routines provided within this
+package, despite the existence of internationalizing capabilities in the
+operating system where this package is being installed.  So far, only
+the `gettext' implementation in the GNU C library version 2 provides as
+many features (such as locale alias, message inheritance, automatic
+charset conversion or plural form handling) as the implementation here.
+It is also not possible to offer this additional functionality on top
+of a `catgets' implementation.  Future versions of GNU `gettext' will
+very likely convey even more functionality.  So it might be a good idea
+to change to GNU `gettext' as soon as possible.
+
+   So you need _not_ provide this option if you are using GNU libc 2 or
+you have installed a recent copy of the GNU gettext package with the
+included `libintl'.
+
+INSTALL Matters
+===============
+
+   Some packages are "localizable" when properly installed; the
+programs they contain can be made to speak your own native language.
+Most such packages use GNU `gettext'.  Other packages have their own
+ways to internationalization, predating GNU `gettext'.
+
+   By default, this package will be installed to allow translation of
+messages.  It will automatically detect whether the system already
+provides the GNU `gettext' functions.  If not, the GNU `gettext' own
+library will be used.  This library is wholly contained within this
+package, usually in the `intl/' subdirectory, so prior installation of
+the GNU `gettext' package is _not_ required.  Installers may use
+special options at configuration time for changing the default
+behaviour.  The commands:
+
+     ./configure --with-included-gettext
+     ./configure --disable-nls
+
+will respectively bypass any pre-existing `gettext' to use the
+internationalizing routines provided within this package, or else,
+_totally_ disable translation of messages.
+
+   When you already have GNU `gettext' installed on your system and run
+configure without an option for your new package, `configure' will
+probably detect the previously built and installed `libintl.a' file and
+will decide to use this.  This might be not what is desirable.  You
+should use the more recent version of the GNU `gettext' library.  I.e.
+if the file `intl/VERSION' shows that the library which comes with this
+package is more recent, you should use
+
+     ./configure --with-included-gettext
+
+to prevent auto-detection.
+
+   The configuration process will not test for the `catgets' function
+and therefore it will not be used.  The reason is that even an
+emulation of `gettext' on top of `catgets' could not provide all the
+extensions of the GNU `gettext' library.
+
+   Internationalized packages have usually many `po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language.  Unless
+translations have been forbidden at `configure' time by using the
+`--disable-nls' switch, all available translations are installed
+together with the package.  However, the environment variable `LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+`LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+Using This Package
+==================
+
+   As a user, if your language has been installed for this package, you
+only have to set the `LANG' environment variable to the appropriate
+`LL_CC' combination.  Here `LL' is an ISO 639 two-letter language code,
+and `CC' is an ISO 3166 two-letter country code.  For example, let's
+suppose that you speak German and live in Germany.  At the shell
+prompt, merely execute `setenv LANG de_DE' (in `csh'),
+`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
+This can be done from your `.login' or `.profile' file, once and for
+all.
+
+   You might think that the country code specification is redundant.
+But in fact, some languages have dialects in different countries.  For
+example, `de_AT' is used for Austria, and `pt_BR' for Brazil.  The
+country code serves to distinguish the dialects.
+
+   The locale naming convention of `LL_CC', with `LL' denoting the
+language and `CC' denoting the country, is the one use on systems based
+on GNU libc.  On other systems, some variations of this scheme are
+used, such as `LL' or `LL_CC.ENCODING'.  You can get the list of
+locales supported by your system for your country by running the command
+`locale -a | grep '^LL''.
+
+   Not all programs have translations for all languages.  By default, an
+English message is shown in place of a nonexistent translation.  If you
+understand other languages, you can set up a priority list of languages.
+This is done through a different environment variable, called
+`LANGUAGE'.  GNU `gettext' gives preference to `LANGUAGE' over `LANG'
+for the purpose of message handling, but you still need to have `LANG'
+set to the primary language; this is required by other parts of the
+system libraries.  For example, some Swedish users who would rather
+read translations in German than English for when Swedish is not
+available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
+
+   In the `LANGUAGE' environment variable, but not in the `LANG'
+environment variable, `LL_CC' combinations can be abbreviated as `LL'
+to denote the language's main dialect.  For example, `de' is equivalent
+to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
+(Portuguese as spoken in Portugal) in this context.
+
+Translating Teams
+=================
+
+   For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list.  The up-to-date list of
+teams can be found at the Free Translation Project's homepage,
+`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams"
+area.
+
+   If you'd like to volunteer to _work_ at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is _not_ the same as the list itself, it has
+`-request' appended.  For example, speakers of Swedish can send a
+message to `sv-request at li.org', having this message body:
+
+     subscribe
+
+   Keep in mind that team members are expected to participate
+_actively_ in translations, or at solving translational difficulties,
+rather than merely lurking around.  If your team does not exist yet and
+you want to start one, or if you are unsure about what to do or how to
+get started, please write to `translation at iro.umontreal.ca' to reach the
+coordinator for all translator teams.
+
+   The English team is special.  It works at improving and uniformizing
+the terminology in use.  Proven linguistic skill are praised more than
+programming skill, here.
+
+Available Packages
+==================
+
+   Languages are not equally supported in all packages.  The following
+matrix shows the current state of internationalization, as of May 2003.
+The matrix shows, in regard of each package, for which languages PO
+files have been submitted to translation coordination, with a
+translation percentage of at least 50%.
+
+     Ready PO files       am az be bg ca cs da de el en en_GB eo es
+                        +-------------------------------------------+
+     a2ps               |       []          [] [] []                |
+     aegis              |                      ()                   |
+     anubis             |                                           |
+     ap-utils           |                                           |
+     bash               |                      []             [] [] |
+     batchelor          |                                           |
+     bfd                |                   []                   [] |
+     binutils           |                   []                   [] |
+     bison              |                   [] []                [] |
+     bluez-pin          |                []                   []    |
+     clisp              |                                           |
+     clisp              |                      []    []          [] |
+     coreutils          |             []    [] []                [] |
+     cpio               |                   [] []                [] |
+     darkstat           |                   ()                   [] |
+     diffutils          |             [] [] [] [] []          [] [] |
+     e2fsprogs          |                []    []                   |
+     enscript           |             []    [] []        []         |
+     error              |             []    [] []        []      [] |
+     fetchmail          |             [] () [] [] []             [] |
+     fileutils          |                   [] []                [] |
+     findutils          |             []    [] [] []          [] [] |
+     flex               |             []    [] []                [] |
+     gas                |                                        [] |
+     gawk               |             []    [] []                [] |
+     gcal               |             []                            |
+     gcc                |                   []                   [] |
+     gettext            |       []    []    [] []                [] |
+     gettext-runtime    |       []    []    [] []                [] |
+     gettext-tools      |                      []                [] |
+     gimp-print         |                [] [] []        []      [] |
+     gliv               |                                           |
+     glunarclock        |    []             [] []                   |
+     gnucash            |                      ()        []         |
+     gnucash-glossary   |                   [] ()                [] |
+     gnupg              |             [] ()    [] []          [] [] |
+     gpe-calendar       |                      []                   |
+     gpe-conf           |                      []                   |
+     gpe-contacts       |                      []                   |
+     gpe-edit           |                                           |
+     gpe-login          |                      []                   |
+     gpe-ownerinfo      |                      []                   |
+     gpe-sketchbook     |                      []                   |
+     gpe-timesheet      |                                           |
+     gpe-today          |                      []                   |
+     gpe-todo           |                      []                   |
+     gphoto2            |                [] [] []                [] |
+     gprof              |                   []                   [] |
+     gpsdrive           |                      ()    ()          () |
+     grep               |          [] []       [] []             [] |
+     gretl              |                                        [] |
+     hello              |             []    [] [] []          [] [] |
+     id-utils           |                   [] []                   |
+     indent             |             []       []             [] [] |
+     jpilot             |                [] [] []                [] |
+     jwhois             |                                        [] |
+     kbd                |                [] [] [] []             [] |
+     ld                 |                   []                   [] |
+     libc               |             [] [] [] [] []             [] |
+     libgpewidget       |                      []                   |
+     libiconv           |             []    [] []             [] [] |
+     lifelines          |                   [] ()                   |
+     lilypond           |                   []                      |
+     lingoteach         |                                           |
+     lingoteach_lessons |                      ()                () |
+     lynx               |             [] [] [] []                   |
+     m4                 |                [] [] [] []                |
+     mailutils          |             []                         [] |
+     make               |                   [] []                [] |
+     man-db             |             [] () [] []                () |
+     mysecretdiary      |                   [] []                [] |
+     nano               |             [] () [] []                [] |
+     nano_1_0           |             [] () [] []                [] |
+     opcodes            |                   []                   [] |
+     parted             |             [] [] [] []                [] |
+     ptx                |             []    [] []             [] [] |
+     python             |                                           |
+     radius             |                                           |
+     recode             |       []          [] [] []          [] [] |
+     screem             |                                           |
+     sed                |             []    [] []             [] [] |
+     sh-utils           |                   [] []                [] |
+     sharutils          |             [] [] [] [] []             [] |
+     sketch             |                   [] ()                [] |
+     soundtracker       |                   [] []                [] |
+     sp                 |                      []                   |
+     tar                |                [] [] []                [] |
+     texinfo            |                [] [] []             []    |
+     textutils          |             []    [] []                [] |
+     tin                |                      ()        ()         |
+     util-linux         |             [] [] [] []                [] |
+     vorbis-tools       |                [] []                   [] |
+     wastesedge         |                      ()                   |
+     wdiff              |             []    [] []                [] |
+     wget               |          [] [] [] [] [] []             [] |
+     xchat              |             []          []             [] |
+     xpad               |                                           |
+                        +-------------------------------------------+
+                          am az be bg ca cs da de el en en_GB eo es
+                           0  1  4  2 31 17 54 60 14  1   4   12 56
+     
+                          et fa fi fr ga gl he hr hu id it ja ko
+                        +----------------------------------------+
+     a2ps               | []    [] []                   ()    () |
+     aegis              |                                        |
+     anubis             |          []                            |
+     ap-utils           |          []                            |
+     bash               |          []             []             |
+     batchelor          |             []                         |
+     bfd                |          []                      []    |
+     binutils           |          []                      []    |
+     bison              | []       []                [] []       |
+     bluez-pin          |          [] []          [] []          |
+     clisp              |                                        |
+     clisp              |          []                            |
+     coreutils          | []       []                   [] []    |
+     cpio               |          []    []       []          [] |
+     darkstat           |          () []          [] []          |
+     diffutils          |       [] []    [] []    [] []    []    |
+     e2fsprogs          |                                        |
+     enscript           |          []          []                |
+     error              |       [] [] []          []             |
+     fetchmail          |                                  []    |
+     fileutils          | []       []             []    [] []    |
+     findutils          | []    [] [] [] []    [] [] [] [] [] [] |
+     flex               |          []                         [] |
+     gas                |          []                            |
+     gawk               |          []       []                   |
+     gcal               |          []                            |
+     gcc                |          []                            |
+     gettext            |          []                      [] [] |
+     gettext-runtime    |          []                []    [] [] |
+     gettext-tools      |                                  []    |
+     gimp-print         |          []                      []    |
+     gliv               |          ()                            |
+     glunarclock        |             [] []       []       []    |
+     gnucash            |                               []       |
+     gnucash-glossary   |                               []       |
+     gnupg              | []    [] []    []          [] [] []    |
+     gpe-calendar       |                            []          |
+     gpe-conf           |                                        |
+     gpe-contacts       |          []                            |
+     gpe-edit           |          []                []          |
+     gpe-login          |          []                            |
+     gpe-ownerinfo      |          []             [] []          |
+     gpe-sketchbook     |          []                            |
+     gpe-timesheet      |          [] []             []          |
+     gpe-today          |          [] []                         |
+     gpe-todo           |          []                []          |
+     gphoto2            |          []             []       []    |
+     gprof              |          []                []          |
+     gpsdrive           |          ()             []    () ()    |
+     grep               | []    [] [] [] [] [] [] [] [] [] []    |
+     gretl              |          []                            |
+     hello              | [] [] [] [] [] [] [] [] [] [] [] [] [] |
+     id-utils           |          []             [] []          |
+     indent             | []    [] []    []       [] [] [] []    |
+     jpilot             |          []                      ()    |
+     jwhois             |          []             [] [] []       |
+     kbd                |          []                            |
+     ld                 |          []                            |
+     libc               |       [] []    []       []       [] [] |
+     libgpewidget       |          [] []             []          |
+     libiconv           |       [] [] [] []    [] [] [] []       |
+     lifelines          |          ()                            |
+     lilypond           |          []                            |
+     lingoteach         |          []                []          |
+     lingoteach_lessons |                                        |
+     lynx               | []                      []    [] []    |
+     m4                 |          []    []          []    []    |
+     mailutils          |                                        |
+     make               |          []    [] [] []          [] [] |
+     man-db             |          []                   () ()    |
+     mysecretdiary      |          []                []          |
+     nano               |          []    []          [] []       |
+     nano_1_0           |          []    []          [] []       |
+     opcodes            |          []                []          |
+     parted             |          []    []                []    |
+     ptx                | []    [] [] [] []       [] []          |
+     python             |                                        |
+     radius             |                                        |
+     recode             |          []    [] []    [] [] []       |
+     screem             |                                        |
+     sed                | []       [] [] []       [] [] [] []    |
+     sh-utils           | []    [] []             []    [] []    |
+     sharutils          | []       []    []       []       []    |
+     sketch             |          []                            |
+     soundtracker       |          []    []    []                |
+     sp                 |          []                      ()    |
+     tar                | []    [] []    []    [] [] [] [] []    |
+     texinfo            |          []       [] []          []    |
+     textutils          |          []    []       []       [] [] |
+     tin                | []       ()                            |
+     util-linux         | []    [] []             []    () []    |
+     vorbis-tools       |          []                            |
+     wastesedge         |          ()                            |
+     wdiff              | []       []    []       [] []          |
+     wget               | []    [] []    [] [] [] []       []    |
+     xchat              | []       []                      []    |
+     xpad               |                                        |
+                        +----------------------------------------+
+                          et fa fi fr ga gl he hr hu id it ja ko
+                          20  1 15 73 14 24  8 10 30 31 19 31  9
+     
+                          lg lt lv ms nb nl nn no pl pt pt_BR ro
+                        +----------------------------------------+
+     a2ps               |          []    []    () () ()  []   [] |
+     aegis              |                ()                      |
+     anubis             |          []                         [] |
+     ap-utils           |                         ()             |
+     bash               |                                []      |
+     batchelor          |                                        |
+     bfd                |                                        |
+     binutils           |                                        |
+     bison              |          []    []              []   [] |
+     bluez-pin          |                                     [] |
+     clisp              |                                        |
+     clisp              |                []                      |
+     coreutils          |                         []             |
+     cpio               |                []       []     []      |
+     darkstat           |          []    []              []   [] |
+     diffutils          |          []             []     []      |
+     e2fsprogs          |                                        |
+     enscript           |                []              []      |
+     error              |                []              []      |
+     fetchmail          |                         ()     ()      |
+     fileutils          |                         []             |
+     findutils          |                []       []     []   [] |
+     flex               |                                []      |
+     gas                |                                        |
+     gawk               |                                []      |
+     gcal               |                                        |
+     gcc                |                                        |
+     gettext            |                         []             |
+     gettext-runtime    |                         []             |
+     gettext-tools      |                                        |
+     gimp-print         |                []                      |
+     gliv               |                                []      |
+     glunarclock        |          []                            |
+     gnucash            |                                        |
+     gnucash-glossary   |                []          []          |
+     gnupg              |                                        |
+     gpe-calendar       |                            []       [] |
+     gpe-conf           |                            []       [] |
+     gpe-contacts       |                            []          |
+     gpe-edit           |                            []       [] |
+     gpe-login          |                            []       [] |
+     gpe-ownerinfo      |                            []       [] |
+     gpe-sketchbook     |                            []       [] |
+     gpe-timesheet      |                            []       [] |
+     gpe-today          |                            []       [] |
+     gpe-todo           |                            []       [] |
+     gphoto2            |                                        |
+     gprof              |                                []      |
+     gpsdrive           |                ()    ()        ()      |
+     grep               |                         [] []  []   [] |
+     gretl              |                                        |
+     hello              |       [] [] [] [] [] [] []     []   [] |
+     id-utils           |                []              []   [] |
+     indent             |                []              []   [] |
+     jpilot             |                ()    ()                |
+     jwhois             |                []              []   [] |
+     kbd                |                                        |
+     ld                 |                                        |
+     libc               |             []       [] []     []      |
+     libgpewidget       |                            []       [] |
+     libiconv           |                                []   [] |
+     lifelines          |                                        |
+     lilypond           |                []                      |
+     lingoteach         |                                        |
+     lingoteach_lessons |                                        |
+     lynx               |                []              []      |
+     m4                 |                []       []     []   [] |
+     mailutils          |                                        |
+     make               |                []              []      |
+     man-db             |                                []      |
+     mysecretdiary      |                                []      |
+     nano               |          []    []       []          [] |
+     nano_1_0           |          [] []    []    []             |
+     opcodes            |                []              []   [] |
+     parted             |                   []       []  []      |
+     ptx                |             [] []    [] [] []  []   [] |
+     python             |                                        |
+     radius             |                                        |
+     recode             |                         []     []   [] |
+     screem             |                                        |
+     sed                |                                []   [] |
+     sh-utils           |             []                         |
+     sharutils          |                []                      |
+     sketch             |                                []      |
+     soundtracker       |                                        |
+     sp                 |                                        |
+     tar                |          [] []       [] []     []   [] |
+     texinfo            |                                     [] |
+     textutils          |             []                         |
+     tin                |                                        |
+     util-linux         |                []              []      |
+     vorbis-tools       |                []                   [] |
+     wastesedge         |                                        |
+     wdiff              |          []             []     []   [] |
+     wget               |                []       []          [] |
+     xchat              |       []       []                      |
+     xpad               |                                     [] |
+                        +----------------------------------------+
+                          lg lt lv ms nb nl nn no pl pt pt_BR ro
+                           0  0  2 11  7 26  3  4 18 15  34   34
+     
+                          ru sk sl sr sv ta tr uk vi wa zh_CN zh_TW
+                        +-------------------------------------------+
+     a2ps               | []    []    []    [] []                   | 16
+     aegis              | ()                                        |  0
+     anubis             |                   [] []                   |  5
+     ap-utils           |                      ()                   |  1
+     bash               | []                                        |  7
+     batchelor          |                                           |  1
+     bfd                |             []    []           []         |  7
+     binutils           |             []    []           []         |  7
+     bison              | []          []                            | 13
+     bluez-pin          |                                           |  7
+     clisp              |                                           |  0
+     clisp              |                                           |  5
+     coreutils          | []    []    []    []                 []   | 14
+     cpio               | []          []                 []         | 13
+     darkstat           |             []                 ()    ()   |  9
+     diffutils          | []          []    []                 []   | 21
+     e2fsprogs          |                   []                      |  3
+     enscript           | []          []    []                      | 11
+     error              |    []             []                 []   | 14
+     fetchmail          |                   []                      |  7
+     fileutils          | []    []    []    []           []    []   | 15
+     findutils          | [] [] []    []    []           []         | 27
+     flex               | []          []    []                      | 10
+     gas                |                   []                      |  3
+     gawk               |             []    []                      |  9
+     gcal               |             []    []                      |  4
+     gcc                |                   []                      |  4
+     gettext            | [] [] []    []    []                 []   | 15
+     gettext-runtime    | [] [] []    []    []                 []   | 16
+     gettext-tools      |    [] []                                  |  5
+     gimp-print         |    []       []                            | 10
+     gliv               |                                           |  1
+     glunarclock        | []          []             []             | 11
+     gnucash            |    []                                []   |  4
+     gnucash-glossary   |    []       []                       []   |  8
+     gnupg              |    []       []    []                 []   | 16
+     gpe-calendar       |                                      []   |  5
+     gpe-conf           |                                           |  3
+     gpe-contacts       |                                      []   |  4
+     gpe-edit           |                                      []   |  5
+     gpe-login          |                                      []   |  5
+     gpe-ownerinfo      |                                      []   |  7
+     gpe-sketchbook     |                                      []   |  5
+     gpe-timesheet      |                                      []   |  6
+     gpe-today          |                                      []   |  6
+     gpe-todo           |                                      []   |  6
+     gphoto2            |             []                 []         |  9
+     gprof              |             []    []                      |  7
+     gpsdrive           |    []       []                            |  3
+     grep               | []    []          [] []                   | 24
+     gretl              |                                           |  2
+     hello              | [] []       []    [] []                   | 33
+     id-utils           | []          []    []                      | 11
+     indent             | [] []       []    []                      | 19
+     jpilot             |             []    []    []     []    []   | 10
+     jwhois             | ()          ()    []                 []   | 10
+     kbd                |             []    []                      |  8
+     ld                 |             []    []                      |  5
+     libc               |    []       []    []           []         | 20
+     libgpewidget       |                                           |  6
+     libiconv           | [] [] []    []    [] []                   | 21
+     lifelines          |             []                            |  2
+     lilypond           |             []                            |  4
+     lingoteach         |                                           |  2
+     lingoteach_lessons |                                ()         |  0
+     lynx               | []          []    [] []                   | 14
+     m4                 | []          []                 []         | 15
+     mailutils          |                                           |  2
+     make               | []          []    []           []         | 15
+     man-db             |             []                            |  6
+     mysecretdiary      |             []    []                      |  8
+     nano               | []          []       []                   | 15
+     nano_1_0           | []          []       []                   | 15
+     opcodes            |             []    []                      |  9
+     parted             |             []    []                      | 13
+     ptx                | []          []    []                      | 22
+     python             |                                           |  0
+     radius             |                                           |  0
+     recode             | []    []    []    []                      | 19
+     screem             |             []                            |  1
+     sed                |    [] []    []    [] []                   | 20
+     sh-utils           | []    []          []                      | 13
+     sharutils          | []          []    []                 []   | 16
+     sketch             |             []                            |  5
+     soundtracker       |             []                            |  7
+     sp                 |                   []                      |  3
+     tar                |    [] []    []    []           []         | 24
+     texinfo            | []          []    []           []         | 13
+     textutils          | []    []    []    []                 []   | 15
+     tin                |                                           |  1
+     util-linux         |             []    []                      | 14
+     vorbis-tools       | []                                        |  7
+     wastesedge         |                                           |  0
+     wdiff              | [] []       []    []                      | 17
+     wget               | [] [] []    []    [] []              []   | 25
+     xchat              |    [] []    []                            | 11
+     xpad               |                                           |  1
+                        +-------------------------------------------+
+       50 teams           ru sk sl sr sv ta tr uk vi wa zh_CN zh_TW
+       97 domains         32 19 16  0 56  0 48 10  1  1  12    23    913
+
+   Some counters in the preceding matrix are higher than the number of
+visible blocks let us expect.  This is because a few extra PO files are
+used for implementing regional variants of languages, or language
+dialects.
+
+   For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and
+distributed as such by its maintainer.  There might be an observable
+lag between the mere existence a PO file and its wide availability in a
+distribution.
+
+   If May 2003 seems to be old, you may fetch a more recent copy of
+this `ABOUT-NLS' file on most GNU archive sites.  The most up-to-date
+matrix with full percentage details can be found at
+`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'.
+
+Using `gettext' in new packages
+===============================
+
+   If you are writing a freely available program and want to
+internationalize it you are welcome to use GNU `gettext' in your
+package.  Of course you have to respect the GNU Library General Public
+License which covers the use of the GNU `gettext' library.  This means
+in particular that even non-free programs can use `libintl' as a shared
+library, whereas only free software can use `libintl' as a static
+library or use modified versions of `libintl'.
+
+   Once the sources are changed appropriately and the setup can handle
+the use of `gettext' the only thing missing are the translations.  The
+Free Translation Project is also available for packages which are not
+developed inside the GNU project.  Therefore the information given above
+applies also for every other Free Software Project.  Contact
+`translation at iro.umontreal.ca' to make the `.pot' files available to
+the translation teams.
+

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/AUTHORS
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/AUTHORS	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/AUTHORS	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,138 @@
+BMP - beep media player (C) GPL 2003-2005
+
+Authors alphabetically
+----------------------
+
+Artem Baguinski <artm at v2.nl>
+Edward Brocklesby <ejb at goth.net>
+Chong Kai Xiong <descender at phreaker.net>
+Milosz Derezynski <m.derezynski at arcor.de>
+David Lau <coder_sku at users.sourceforge.net>
+Ole Andre Vadla Ravnaas <oleavr at jblinux.net>
+Michiel Sikkes <michiel at eyesopened.nl>
+
+ClearSky skin by Will Reinhart <willsan at xepher.net>
+
+
+Patch Authors
+-------------
+
+Andrei Badea
+Peter Behroozi
+Bernard Blackham
+Oliver Blin
+David Le Brun
+Tomas Bzatek
+Liviu Danicel
+Jon Dowland
+Artur Frysiak
+Sebastian Kapfer
+Lukas Koberstein
+Dan Korostelev
+Oliver Lehmann
+Jolan Luff
+Mike Lundy
+Michael Marineau
+Tim-Philipp Muller
+Julien Portalier
+Andrew Ruder
+Olivier Samyn
+John Spray
+Takashi Iwai
+Martijn Vernooij
+Thierry Vignaud
+
+
+Translators
+-----------
+
+Brazilian Portuguese - Philipi Pinto <philipi at gmx.net>
+Breton               - Thierry Vignaud <tvignaud at mandrakesoft.com>
+Czech                - Jan Narovec <jnarovec at students.zcu.cz>
+Dutch                - Laurens Buhler <masterpe at xs4all.nl>
+German               - Matthias Debus <psic4t at netbands.de>
+Georgian             - George Machitidze <giomac at global-erty.net>
+Greek                - Kouzinopoulos Haris <haris at mpa.gr>
+                       Stavros Giannouris <stavrosg2002 at freemail.gr>
+Finnish              - Pauli Virtanen <pauli.virtanen at hut.fi>
+French               - David Le Brun <david at dyn-ns.net>
+Hindi                - Dhananjaya Sharma <dysxhi at yahoo.co.in>
+Hungarian            - Laszlo Dvornik <dvornik at gnome.hu>
+Italian              - Alessio D'Ascanio <otaku at fastwebnet.it>
+Japanese             - Takeshi Aihana <aihana at gnome.gr.jp>
+Korean               - DongCheon Park <dcpark at kaist.ac.kr>
+Lithuanian           - Rimas Kudelis <rq at akl.lt>
+Macedonian 	     - Arangel Angov <ufo at linux.net.mk>
+Polish               - Jacek Wolszczak <shutdownrunner at o2.pl>
+Romanian             - Liviu Danicel <liviu.danicel at spymac.com>
+Russian              - Pavlo Bohmat <bohm at ukr.net>
+                       Dan Korostelev <dan at ats.energo.ru>
+                       Vitaly Lipatov <lav at altlinux.ru>
+Simplified Chinese   - Chong Kai Xiong <descender at phreaker.net>
+Traditional Chinese  - Chao-Hsiung Liao <pesder.liao at msa.hinet.net>
+Slovak               - Pavel Kanzelsberger <kanzels at zmail.sk>
+Spanish              - Francisco Javier F. Serrador <serrador at cvs.gnome.org>
+Swedish              - Martin Persenius <martin at persenius.net>
+Ukrainian            - Mykola Lynnyk<definer at users.sf.net>
+Welsh                - Edward Brocklesby <ejb at goth.net>
+                       (Based on XMMS from Rhoslyn Prys <rhoslyn.prys at meddal.org.uk>)
+
+
+(please tell us if we left your name out)
+
+-
+
+Based on:
+
+XMMS - X Multimedia System (C)1998-2003
+
+       Main Programming: Peter Alm
+
+ Additional Programming: Håvard Kvålen
+                         Derrik Pates
+
+   With Additional Help: Sean Atkinson
+                         Jorn Baayen
+                         James M. Cape
+                         Anders Carlsson (effect plugins)
+                         Chun-Chung Chen (xfont patch)
+                         Tim Ferguson (joystick plugin)
+                         Ben Gertzfield
+                         Vesa Halttunen
+                         Logan Hanks
+                         Eric L. Hernes (FreeBSD patches)
+                         Ville Herva
+                         higway (MMX)
+                         Michael Hipp and others (MPG123 engine)
+                         Olle Hällnäs (compiling fixes)
+                         David Jacoby
+                         Osamu Kayasono (3DNow!)
+                         Lyle B Kempler
+                         J. Nick Koston (MikMod plugin)
+                         Aaron Lehmann
+                         Johan Levin (echo + stereo plugin)
+                         Eric Lindvall
+                         Colin Marquardt
+                         Willem Monsuwe
+                         John Riddoch (Solaris plugin)
+                         Josip Rodin
+                         Pablo Saratxaga (i18n)
+                         Carl van Schaik (pro logic plugin)
+                         Jörg Schuler
+                         Charles Sielski (irman plugin)
+                         Espen Skoglund
+                         Matthieu Sozeau (ALSA plugin)
+                         Kimura Takuhiro (3DNow!)
+                         Zinx Verituse
+                         Ryan Weaver (RPMs among other things)
+                         Chris Wilson
+                         Dave Yearke
+                         Stephan K. Zitz
+
+           Default skin: Leonard "Blayde" Tan
+                         Robin Sylvestre (Equalizer and Playlist)
+                         Thomas Nilsson (New titles, and cleanups)
+
+  Homepage and Graphics: Thomas Nilsson
+
+       Support and Docs: Olle Hällnäs

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/COPYING
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/COPYING	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/COPYING	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/ChangeLog
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/ChangeLog	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/ChangeLog	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,8259 @@
+2005-10-22 18:41  descender
+
+	* bmp.spec.in, icons/Makefile.am (release_0_9_7_1):
+	  * bmp.spec.in, icons/Makefile.am: Relocate icon back into
+	  $prefix/share/pixmaps/.
+
+2005-10-22 18:27  descender
+
+	* configure.ac (release_0_9_7_1):
+	  * configure.ac: Add hack to stop libtool from checking for
+	  C++/F77.
+
+2005-10-22 18:20  descender
+
+	* AUTHORS, NEWS, bmp.spec.in (release_0_9_7_1):
+	  * bmp.spec.in: See %changelog * NEWS: Add note on BMPx.  *
+	  AUTHORS: Update.
+
+2005-10-22 17:46  descender
+
+	* m4/libtool.m4 (release_0_9_7_1):
+	  * libtool.m4: Remove, let autoconf find the system installed file
+	  to avoid  version mismatches with libtool, etc. script when using
+	  libtoolize.
+
+2005-10-22 17:08  descender
+
+	* scripts/armageddon.sh (release_0_9_7_1):
+	  * armageddon.sh: Remove Makevars.template, not Makevars.
+
+2005-10-22 16:59  descender
+
+	* compile, depcomp, install-sh, ltmain.sh (release_0_9_7_1):
+	  * depcomp, compile, ltmain.sh, install-sh: Remove, pulled in by
+	  autogen.sh.
+
+2005-10-22 16:45  descender
+
+	* configure.ac (release_0_9_7_1):
+	  * configure.ac: Replace C compiler check with AC_LANG([C]).
+
+2005-10-22 16:41  descender
+
+	* autogen.sh, scripts/armageddon.sh, scripts/cleanall.sh,
+	  scripts/code-stats.sh, scripts/cvs2cl.pl,
+	  scripts/gen-auto-scripts.sh, scripts/genesis.sh,
+	  scripts/make-dist.sh, scripts/rm-backups.sh (release_0_9_7_1):
+	  * autogen.sh: Update from HEAD.  * scripts/: Update scripts from
+	  HEAD.
+
+2005-10-22 16:38  descender
+
+	* po/insert-header.sin, po/quot.sed, po/remove-potcdate.sin,
+	  config.guess, config.rpath, config.sub (release_0_9_7_1):
+	  * Remove.
+
+2005-10-22 16:36  descender
+
+	* m4/: codeset.m4, gettext.m4, glibc21.m4, iconv.m4, intdiv0.m4,
+	  inttypes-pri.m4, inttypes.m4, inttypes_h.m4, isc-posix.m4,
+	  lcmessage.m4, lib-ld.m4, lib-link.m4, lib-prefix.m4, nls.m4,
+	  po.m4, progtest.m4, stdint_h.m4, uintmax_t.m4, ulonglong.m4
+	  (release_0_9_7_1):
+	  * Remove, pulled in by autogen.sh.
+
+2005-10-22 16:32  descender
+
+	* po/: Rules-quot, boldquot.sed (release_0_9_7_1):
+	  * Rules-quot, boldquot.sed: Remove, pulled in by autogen.sh.
+
+2005-10-22 16:31  descender
+
+	* po/: Makefile.in.in, Makevars.template, en at boldquot.header,
+	  en at quot.header (release_0_9_7_1):
+	  * Makevars.template: Remove unneeded.  * Makefile.in.in,
+	  en at boldquot.header, en at quot.header: Pulled in by  autogen.sh.
+
+2005-10-22 16:28  descender
+
+	* missing, mkinstalldirs (release_0_9_7_1):
+	  * missing, mkinstalldirs: Remove, pulled in by autogen.sh.
+
+2005-10-22 16:23  descender
+
+	* TODO (release_0_9_7_1):
+	  * TODO: Remove, unused.
+
+2005-10-22 16:21  descender
+
+	* skin/Makefile (release_0_9_7_1):
+	  * Makefile: Remove, generated by autoconf.
+
+2005-10-22 16:13  descender
+
+	* skin/Makefile.in (release_0_9_7_1):
+	  * Makefile.in: Remove, generated by automake.
+
+2005-10-22 15:43  descender
+
+	* NEWS (release_0_9_7_1):
+	  * NEWS: Add entry for 0.9.7.1 release.
+
+2005-10-22 15:39  descender
+
+	* FAQ, NEWS (release_0_9_7_1):
+	  * NEWS, FAQ: Add 'no longer maintained' note and point user to
+	  BMP Wiki.
+
+2005-10-22 14:47  descender
+
+	* po/zh_CN.po (release_0_9_7_1):
+	  * zh_CN.po: Update Simplified Chinese translation.
+
+2005-10-22 14:42  descender
+
+	* po/bmp.pot (release_0_9_7_1):
+	  * bmp.pot: Update PO template.
+
+2005-10-22 14:16  descender
+
+	* po/hu.po (release_0_9_7_1):
+	  * hu.po: Update Hungarian translation (Dvornik László).
+
+2005-10-16 22:53  quirk_fr
+
+	* po/fr.po: Updated french translation
+
+2005-10-16 22:45  descender
+
+	* AUTHORS, beep/about.c (release_0_9_7_1):
+	  * AUTHORS, beep/about.c: Update translation credits.
+
+2005-10-16 22:18  descender
+
+	* po/el.po (release_0_9_7_1):
+	  * el.po: Update Greek translation (Stavros Giannouris).
+
+2005-10-16 01:21  descender
+
+	* configure.ac (release_0_9_7_1):
+	  * configure.ac: Bump version to 0.9.7.1.
+
+2005-10-16 01:20  descender
+
+	* AUTHORS, beep/bmp.desktop.in, icons/Makefile.am, icons/bmp.png,
+	  icons/bmp.svg (release_0_9_7_1):
+	  * icons/bmp.svg: Remove.  * icons/Makefile.am: Install icon in
+	  $(datadir)/icons/hicolor/48x48/pixmaps.  * beep/bmp.desktop.in,
+	  icons/bmp.png: New icon from BMPx.  * AUTHORS: Update copyleft
+	  date.
+
+2005-10-16 00:48  descender
+
+	* po/ka.po (release_0_9_7_1):
+	  * ka.po: Update Georgian translation (George Machitidze).
+
+2005-09-13 09:47  descender
+
+	* po/uk.po (release_0_9_7_1):
+	  * uk.po: Merge Ukrainian translation update from HEAD.
+
+2005-09-13 09:46  descender
+
+	* po/uk.po:
+	  * uk.po: Update Ukrainian translation (Mykola Lynnyk).
+
+2005-09-05 06:36  descender
+
+	* beep/controlsocket.c (release_0_9_7_1):
+	  * beep/controlsocket.c: Merge fix for #331 from HEAD.
+
+2005-09-05 06:20  descender
+
+	* beep/controlsocket.c:
+	  * controlsocket.c (ctrlsocket_func): Fix crash when output plugin
+	  returns zero volume for one channel, and does not return the
+	  other i.e. -1 (#331, Mike Lundy).
+
+2005-08-28 04:10  descender
+
+	* beep/input.c (release_0_9_7_1):
+	  * input.c (input_get_song_info): Merge crash fix from HEAD.
+
+2005-08-28 04:07  descender
+
+	* beep/input.c:
+	  * input.c (input_get_song_info): Initialize tmp to NULL to avoid
+	  crashing if input plugins do not set the title when getting song
+	  info.
+
+2005-08-27 19:20  descender
+
+	* beep/main.c, beep/main.h, libbeep/vfs.h, libbeep/vfs_gnome.c,
+	  libbeep/vfs_stdio.c (release_0_9_7_1):
+	  * beep/main.c, beep/main.h, libbeep/vfs.h, libbeep/vfs_gnome.c,
+	  libbeep/vfs_stdio.h: Merge VFS initialization changes from HEAD.
+
+2005-08-27 19:04  descender
+
+	* beep/signals.c:
+	  * signals.c (signal_install_handler_full): New function.
+	  (signal_handlers_init): Register handler for SIGINT.
+
+2005-08-27 19:01  descender
+
+	* beep/main.c, beep/main.h, libbeep/vfs.h, libbeep/vfs_gnome.c,
+	  libbeep/vfs_stdio.c:
+	  * beep/main.h: Remove unnecessary GNOME VFS header file #include.
+	  * beep/main.c: Use vfs_init() to initialize VFS subsystem.  *
+	  libbeep/vfs_gnome.c, libbeep/vfs_stdio.c: New vfs_init()
+	  function.
+
+2005-08-22 13:56  descender
+
+	* AUTHORS, beep/about.c, po/LINGUAS, po/hi.po (release_0_9_7_1):
+	  * po/LINGUAS, po/hi.po, AUTHORS, beep/about.c: Merge new Hindi
+	  translation from HEAD.
+
+2005-08-22 13:51  descender
+
+	* po/LINGUAS, po/hi.po, AUTHORS, beep/about.c:
+	  * po/LINGUAS, po/hi.po: New Hindi translation by Dhananjaya
+	  Sharma.  * AUTHORS, beep/about.c: Update translator list.
+
+2005-08-22 13:51  descender
+
+	* po/hi.po (release_0_9_7_1): file hi.po was added on branch
+	  release_0_9_7_1 on 2005-08-22 05:56:03 +0000
+
+2005-08-11 15:25  descender
+
+	* libbeep/beepctrl.c, libbeep/beepctrl.h, beep/controlsocket.c,
+	  beep/controlsocket.h, beep/playlist.c, beep/playlist.h
+	  (release_0_9_7_1):
+	  * libbeep/beepctrl.c, libbeep/beepctrl.h, beep/controlsocket.c,
+	  beep/controlsocket.h, beep/playlist.c, beep/playlist.h: Merge new
+	  XMMS 1.2.11 remote queue and playlist advancement control code
+	  from HEAD.
+
+2005-08-11 15:15  descender
+
+	* beep/controlsocket.c:
+	  controlsocket.c (ctrlsocket_func): Replace tab with spaces.
+
+2005-08-11 15:06  descender
+
+	* beep/controlsocket.h:
+	  * controlsocket.h: XMMS moved CMD_IS_ADVANCE and
+	  CMD_TOGGLE_ADVANCE to the end for backward compatibility (after
+	  Fatal overheard my complaint in #bmp
+	  >:), we follow suit.
+
+2005-08-09 13:54  descender
+
+	* beep/: prefswin.c, glade/prefswin.glade:
+	  * prefswin.glade: Remove redundant hbox which contains only
+	  category_view's  scrolled window.  * prefswin.c
+	  (on_category_view_realize): Move size allocation code for
+	  category view from on_category_view_realize1, remove needless
+	  run-time typecasts, fix problem restoring category_view item
+	  selection across sessions, remove unused code, rename iconview to
+	  icon_view.  (change_category): Rename treepath to tree_path.
+
+2005-08-09 12:15  descender
+
+	* beep/prefswin.c:
+	  * prefswin.c (on_category_view_realize1): Replace incorrect use
+	  of gtk_tree_path_new_from_indices() with
+	  gtk_tree_path_new_first().  (prefswin_keypress): Rename to
+	  on_prefswin_key_press_event.
+
+2005-08-09 11:54  descender
+
+	* beep/: controlsocket.c, playlist.c, playlist.h:
+	  * controlsocket.c (ctrlsocket_func): Wrong function name, should
+	  be playlist_queue_get_length() instead of
+	  get_playlist_queue_length().	* playlist.c
+	  (playlist_queue_remove): Change pos to guint.  * playlist.h
+	  (playlist_queue_remove, playlist_queue_get_length): Add
+	  prototype.
+
+2005-08-09 11:31  descender
+
+	* libbeep/: beepctrl.c, beepctrl.h:
+	  * beepctrl.c, beepctrl.h (xmms_remote_toggle_advance,
+	  xmms_remote_is_ advance): New libxmms 1.2.11 functions.
+
+2005-08-09 11:21  descender
+
+	* beep/: controlsocket.c, controlsocket.h:
+	  * controlsocket.h: Match protocol command numbers with XMMS CVS.
+	  * controlsocket.c (ctrlsocket_func): Add playlist queue control
+	  handling (#299), add handler for CMD_IS_ADVANCE.
+
+2005-08-09 10:32  descender
+
+	* beep/playlist.c, libbeep/beepctrl.c, libbeep/beepctrl.h:
+	  * beep/playlist.c, beep/playlist.h, libbeep/beepctrl.c,
+	  libbeep/beepctrl.h: Add XMMS 1.2.11 remote playlist queue control
+	  (patch by Erik Jensen, with minor modifications).
+
+2005-08-09 10:14  descender
+
+	* Output/: esd/mixer.c, OSS/mixer.c (release_0_9_7_1):
+	  * esd/mixer.c, OSS/mixer.c: Merge fix for #300 from HEAD.
+
+2005-08-09 10:09  descender
+
+	* Output/: OSS/mixer.c, esd/mixer.c:
+	  * OSS/mixer.c (oss_get_volume, oss_set_volume): Change cmd to
+	  long (Oliver Lehmann, fixes #300).  * ESD/mixer.c
+	  (esd_get_oss_volume, esd_set_oss_volume): Change cmd to long
+	  (Oliver Lehmann, fixes #300).
+
+2005-08-09 09:29  descender
+
+	* beep/glade/prefswin.glade:
+	  * prefswin.glade: Remove redundant GtkAlignment for Playback
+	  page, name label for Playback page for easier identification.
+
+2005-08-09 09:20  descender
+
+	* beep/mainwin.c:
+	  * mainwin.c, ui/mainwin.xml: Restore window roll-up toggles in
+	  player window popup.
+
+2005-08-09 08:41  descender
+
+	* beep/Makefile.am, Input/Makefile.am, Input/mpg123/Makefile.am,
+	  libbeep/Makefile.am, Input/vorbis/Makefile.am,
+	  Input/wav/Makefile.am, Visualization/Makefile.am,
+	  Visualization/blur_scope/Makefile.am, Output/Makefile.am,
+	  Output/OSS/Makefile.am, Output/alsa/Makefile.am,
+	  Output/esd/Makefile.am (release_0_9_7_1):
+	  * beep/Makefile.am, libbeep/Makefile.am, Input/Makefile.am,
+	  Input/mpg123/Makefile.am, Input/vorbis/Makefile.am,
+	  Input/wav/Makefile.am, Visualization/Makefile.am,
+	  Visualization/blur_scope/Makefile.am, Output/Makefile.am,
+	  Output/OSS/Makefile.am, Output/alsa/Makefile.am,
+	  Output/esd/Makefile.am: Merge GNOME VFS and GConf linkage fixes
+	  from HEAD, merge Autoconf output variable to Makefile variable
+	  changes from HEAD.
+
+2005-08-09 08:28  descender
+
+	* beep/Makefile.am:
+	  * Makefile.am (beep_CFLAGS): Change $(top_builddir) to
+	  $(top_srcdir).
+
+2005-08-09 08:00  descender
+
+	* libbeep/Makefile.am:
+	  * Makefile.am (libbeep_la_LIBADD): Break up flags. (INCLUDES):
+	  Break up flags, correct path to libintl and top directory.
+
+2005-08-09 07:40  descender
+
+	* beep/: mainwin.c, playlistwin.c:
+	  * mainwin.c (mainwin_create_popups): Unref action group after
+	  insert.  * playlistwin.c (mainwin_create_popup_menus): Unref
+	  action group after insert, rename function to
+	  playlistwin_create_popups().
+
+2005-08-09 06:04  descender
+
+	* beep/pluginenum.c (release_0_9_7_1):
+	  * pluginenum.c (plugin_system_cleanup): Print plugin filename
+	  along with error when plugin fails to load.
+
+2005-08-09 06:01  descender
+
+	* beep/pluginenum.c:
+	  * pluginenum.c: Print plugin filename along with error when
+	  plugin fails to load.
+
+2005-08-09 05:35  descender
+
+	* bmp.spec.in:
+	  * bmp.spec.in: Fix typo in %changelog.
+
+2005-08-09 05:08  descender
+
+	* bmp.spec.in:
+	  * bmp.spec.in: Update BuildRequires.
+
+2005-08-09 04:08  descender
+
+	* beep/: Makefile.am, signals.c, signals.h:
+	  * Makefile.am, signals.c, signals.h: New signal handler setup
+	  code using sigaction().
+
+2005-08-09 03:11  descender
+
+	* beep/main.c:
+	  * main.c: Remove unused #includes (gdk/gdkx.h, X11/Xlib.h,
+	  X11/xatom.h).
+
+2005-08-09 02:59  descender
+
+	* beep/main.c:
+	  * main.c (get_feature_list): Add SMlib to feature list string.
+	  (main): Add session management support.
+
+2005-08-09 02:43  descender
+
+	* Input/Makefile.am, Input/mpg123/Makefile.am,
+	  Input/vorbis/Makefile.am, Input/wav/Makefile.am,
+	  Output/Makefile.am, Output/OSS/Makefile.am,
+	  Output/alsa/Makefile.am, Output/esd/Makefile.am,
+	  Visualization/Makefile.am, Visualization/blur_scope/Makefile.am:
+	  * Input/Makefile.am Input/mpg123/Makefile.am,
+	  Input/vorbis/Makefile.am, Input/wav/Makefile.am,
+	  Output/Makefile.am, Output/OSS/Makefile.am,
+	  Output/alsa/Makefile.am Output/esd/Makefile.am,
+	  Visualization/Makefile.am, Visualization/blur_scope/Makefile.am:
+	  Replace @VAR@ with $(VAR), remove all redundant linkage with
+	  GNOME VFS and GConf.
+
+2005-08-09 02:25  descender
+
+	* configure.ac:
+	  * configure.ac: Add test for SMlib, rename BEEP_DEFINES to
+	  BMP_DEFINES, use AC_LANG(C) in place of
+	  AC_PROG_CC/AC_C_INLINE/AC_C_CONST, replace 'test "x$var" =
+	  "xyes"' with 'test "$var" = "yes"', revert deadchip's change of
+	  AC_CONFIG_HEADERS to AM_CONFIG_HEADER.  * beep/Makefile.am:
+	  Remove redundant linkage with GNOME VFS and GConf, replace @VAR@
+	  with $(VAR) for better customizability.  * libbeep/Makefile.am:
+	  Add linkage with GNOME VFS and GConf.
+
+2005-08-07 11:43  descender
+
+	* beep/session.c:
+	  * session.c (session_start): Fix typo.
+
+2005-08-07 03:24  descender
+
+	* po/LINGUAS, AUTHORS, beep/about.c, po/ka.po (release_0_9_7_1):
+	  * po/LINGUAS, po/ka.po: Add Georgian translation from HEAD.  *
+	  AUTHORS, beep/about.c: Merge translation credits update from
+	  HEAD.
+
+2005-08-07 03:16  descender
+
+	* po/ka.po (release_0_9_7_1): file ka.po was added on branch
+	  release_0_9_7_1 on 2005-08-06 19:24:40 +0000
+
+2005-08-07 03:16  descender
+
+	* AUTHORS, beep/about.c, po/LINGUAS, po/ka.po:
+	  * po/LINGUAS, po/ka.po: New Georgian translation by George
+	  Machitidze.  * AUTHORS, beep/about.c: Add Georgian translator.
+
+2005-08-04 04:22  descender
+
+	* beep/Makefile.am:
+	  * Makefile.am: Include new SMlib code into build.
+
+2005-08-04 03:54  descender
+
+	* beep/: session.c, session.h:
+	  * session.c, session.h: New session management code using SMlib.
+
+2005-08-02 08:25  descender
+
+	* README:
+	  * README: Update Glib, GTK+ and libglade version requirements
+	  (Ashar Voultoiz, #310).
+
+2005-08-02 08:12  descender
+
+	* beep/: playlist.c (release_0_9_7_1), playlist.c:
+	  * playlist.c (playback_check_pos_current): Change local variables
+	  to gint, fixes #289.
+
+2005-08-02 02:49  descender
+
+	* beep/: input.h (release_0_9_7_1), input.h:
+	  * input.h (get_input_paused, get_input_playing): Remove
+	  prototypes, the actual functions are already renamed.
+
+2005-08-02 02:16  descender
+
+	* beep/: util.c, util.h (release_0_9_7_1), util.c, util.h:
+	  * util.c, util.h (create_dblsize_image): Remove doublesize
+	  scaler, unused.
+
+2005-08-02 01:21  descender
+
+	* beep/playlistwin.c:
+	  * playlistwin.c (playlistwin_keypress): Restore accidentally
+	  removed handling code for Page Up (#302, Ashar Voultoiz).
+
+2005-08-01 04:09  descender
+
+	* beep/main.c:
+	  * main.c (segfault_handler): Restore original message and add
+	  text to tell user settings and playlist has been saved.
+	  (sigint_handler, sigterm_handler): Don't print message for normal
+	  termination. (main): Remove needless (void) casts.
+
+2005-08-01 04:04  descender
+
+	* beep/input.c:
+	  * input.c (input_show_unplayable_files): Use gtk_container_add()
+	  to add scroll window instead.
+
+2005-08-01 03:20  descender
+
+	* beep/glade/prefswin.glade:
+	  * prefswin.glade: Rename mouse wheel options (suggested in #315).
+
+2005-08-01 03:14  descender
+
+	* beep/about.c:
+	  * about.c (show_about_window): Comment out or remove unused
+	  variables, remove errorneous freeing of 'filename' which is a
+	  literal string.
+
+2005-08-01 02:59  descender
+
+	* beep/textbox.h:
+	  * textbox.h: Remove TEXTBOX_SCROLL_TIMEOUT macro, not used
+	  anymore.
+
+2005-08-01 02:56  descender
+
+	* beep/: util.c, glade/addfiles.glade:
+	  * util.c, glade/addfiles.glade: Revert last changes, need to
+	  review the way we handle windows so that focus and always-on-top
+	  works reasonably uniformly or sanely across various WMs.
+
+2005-07-31 15:59  descender
+
+	* beep/glade/prefswin.glade (release_0_9_7_1):
+	  * prefswin.glade: Rename mouse wheel options (suggested in #315).
+
+2005-07-07 05:12  mderezynski
+
+	* configure.ac, beep/about.c, beep/images/Makefile.am,
+	  beep/images/logo.png, beep/images/logo.xpm: [no log message]
+
+2005-07-05 22:28  mderezynski
+
+	* beep/glade/: prefswin.glade: [no log message]
+
+2005-07-05 21:57  mderezynski
+
+	* beep/prefswin.c: [no log message]
+
+2005-07-05 21:56  mderezynski
+
+	* beep/images/logo.xpm: beep/images/logo.xpm: New logo!
+
+2005-07-05 20:33  mderezynski
+
+	* TODO: TODO: Added items for 0.9.7.1
+
+2005-07-05 18:30  mderezynski
+
+	* skin/: README, balance.bmp, cbuttons.bmp, eq_ex.bmp, eqmain.bmp,
+	  main.bmp, monoster.bmp, nums_ex.bmp, playpaus.bmp, pledit.bmp,
+	  pledit.txt, posbar.bmp, shufrep.bmp, text.bmp, titlebar.bmp,
+	  viscolor.txt, volume.bmp: beep/skin: Re-added skin
+
+2005-07-05 18:29  mderezynski
+
+	* skin/: README, balance.bmp, cbuttons.bmp, eq_ex.bmp, eqmain.bmp,
+	  main.bmp, monoster.bmp, nums_ex.bmp, playpaus.bmp, pledit.bmp,
+	  pledit.txt, posbar.bmp, shufrep.bmp, text.bmp, titlebar.bmp,
+	  viscolor.txt, volume.bmp: -nil-
+
+2005-07-05 18:26  mderezynski
+
+	* skin/: README, eqmain.bmp, main.bmp, nums_ex.bmp, pledit.bmp,
+	  shufrep.bmp, titlebar.bmp: bmp/skin: Made modifications to the
+	  ClearSky skin to make it "more BMPish"
+
+2005-07-05 18:22  mderezynski
+
+	* beep/: about.c, main.c, main.h, mainwin.c, mainwin.h, prefswin.c,
+	  skinwin.c, textbox.c, textbox.h, images/logo.xpm:
+	  beep/playlistwin.c: Window focusing fixes beep/skinwin.c: Changes
+	  in the code to accomodate for the new "Resume playback on
+	  startup" option beep/textbox.c: Removed the "***" seperator
+	  string (looks silly) beep/util.c: (Don't remember)
+	  beep/mainwin.c, beep/main.c: Signal handling fixes. SIGSEGV,
+	  SIGTERM and SIGINT now properly exit the application (save
+	  configuration and current playlist and do general system
+	  shutdown) beep/hints.h: Made functions for keep windows always on
+	  top public beep/about.c: Changes to accomodate for new about logo
+	  images/logo.xpm: New about logo
+
+2005-07-05 18:17  mderezynski
+
+	* beep/: prefswin.c, glade/prefswin.glade: [no log message]
+
+2005-07-04 22:13  mderezynski
+
+	* beep/: hints.c, hints.h, mainwin.c, playlistwin.c, skinwin.c,
+	  util.c, images/Makefile.am, images/appearance.png,
+	  images/bmp_eq.xpm, images/bmp_player.xpm,
+	  images/bmp_playlist.xpm, images/eq.png, images/mouse.png,
+	  images/playback.png, images/playlist.png, images/plugins.png:
+	  beep/hints.c: beep/hints.h:	     Made functions for setting
+	  always-on-top public
+
+	  beep/playlistwin.c:	  Added/Fixed accelerators and focusing
+
+	  beep/prefswin.c: beep/skinwin.c:	  Preferences functionality
+	  fixes
+
+	  beep/images/:   Fixed/Changed prefswin icons
+
+	  beep/images/bmp_player.xpm: beep/images/bmp_playlist.xpm:
+	  beep/images/bmp_eq.xpm:	New backdrop like the new prefswin
+	  icons
+
+	  beep/ui/mainwin.xml: beep/mainwin.c:	  Removed "Roll up" (shade)
+	  actions from the menu as discussed previously on #bmp
+
+	  glade/addfiles.glade:   Changes in the Filechooser dialog to
+	  close on ESC
+
+	  glade/prefswin.glade:   Preferences window changes
+
+2005-07-04 22:11  mderezynski
+
+	* beep/prefswin.c: [no log message]
+
+2005-07-04 22:07  mderezynski
+
+	* beep/: glade/addfiles.glade, glade/prefswin.glade, prefswin.c:
+	  [no log message]
+
+2005-07-02 22:02  descender
+
+	* beep/glade/prefswin.glade:
+	  * prefswin.glade: Fix realize signal for output_plugin_cbox, name
+	  and rename some widgets.
+
+2005-06-30 19:18  descender
+
+	* po/it.po (release_0_9_7_1):
+	  * it.po: Merge Italian translation update from HEAD.
+
+2005-06-28 20:14  descender
+
+	* beep/: main.c, mainwin.c:
+	  * main.c (main): Change GTK+ version check to check for 2.6.0.  *
+	  mainwin.c: Change Play/Pause/Previous/Next/Stop actions to use
+	  the new GTK_STOCK_MEDIA* icons in GTK+ 2.6, use GTK_STOCK_ABOUT
+	  for About.
+
+2005-06-28 14:11  descender
+
+	* po/LINGUAS, po/uk.po, AUTHORS, beep/about.c (release_0_9_7_1):
+	  * AUTHORS, beep/about.c, po/LINGUAS, po/uk.po: Merge new
+	  Ukrainian translation in HEAD.
+
+2005-06-28 14:02  descender
+
+	* po/uk.po (release_0_9_7_1): file uk.po was added on branch
+	  release_0_9_7_1 on 2005-06-28 06:11:04 +0000
+
+2005-06-28 14:02  descender
+
+	* AUTHORS, beep/about.c, po/LINGUAS, po/uk.po:
+	  * AUTHORS, beep/about.c: Update translation credits.	* LINGUAS,
+	  po/uk.po: New Ukrainian translation by Mykola Lynnyk.
+
+2005-06-28 13:24  descender
+
+	* po/it.po:
+	  * it.po: Update Italian translation (Alessio D'Ascanio).
+
+2005-06-23 05:21  descender
+
+	* configure.ac:
+	  * configure.ac: Bump GLib and GTK+ version requirement to 2.6.0,
+	  and libglade to 2.5.0 for use of GtkIconView in Preferences
+	  Window.
+
+2005-06-23 05:02  descender
+
+	* beep/prefswin.c:
+	  * prefswin.c: Fix alignment of categories[] initializer list.
+	  (on_category_view_realize)  Replace incorrect use of
+	  gtk_tree_path_new_from_indices() with gtk_tree_path_new_first(),
+	  remove unused variables and code.
+
+2005-06-20 05:40  mderezynski
+
+	* beep/: mainwin.c, prefswin.c: * Fixed Drag-n-Drop with/from KDE
+
+2005-06-20 05:30  descender
+
+	* skin/: Makefile, Makefile.in:
+	  * Makefile, Makefile.in: remove, accidentally checked in,
+	  generated by autotools
+
+2005-06-20 04:09  mderezynski
+
+	* PLAYLIST, beep/mainwin.h, beep/playback.c, beep/playlist.c,
+	  beep/playlistwin.c, beep/prefswin.c, beep/glade/prefswin.glade,
+	  beep/images/Makefile.am, beep/images/appearance.png,
+	  beep/images/eq.png, beep/images/mouse.png,
+	  beep/images/playback.png, beep/images/playlist.png,
+	  beep/images/plugins.png, beep/images/skin.png, po/cy.po,
+	  po/de.po, po/el.po, po/it.po, po/ko.po, po/pt_BR.po, po/ro.po,
+	  po/sk.po, po/sv.po, skin/Makefile, skin/Makefile.in: * Migrated
+	  preferences window category list from GtkTreeView to GtkIconView
+	  * New icons for preferences window * Fixed problem where main
+	  window song information would remain even when playback stopped
+	  and/or playlist is empty
+
+2005-06-15 08:28  descender
+
+	* beep/main.h (release_0_9_7_1):
+	  * main.h: rename log file to 'log'
+
+2005-06-13 21:12  descender
+
+	* po/zh_CN.po:
+	  * zh_CN.po: Merge typo fix from release_0_9_7_1.
+
+2005-06-13 21:10  descender
+
+	* po/zh_CN.po (release_0_9_7_1):
+	  * zh_CN.po: Correct typo.
+
+2005-06-13 21:01  descender
+
+	* configure.ac (release_0_9_7_1):
+	  * configure.ac: Forgot to remove beep/defskin/Makefile from
+	  output list.
+
+2005-06-13 19:43  descender
+
+	* beep/playlistwin.c (release_0_9_7_1):
+	  * playlistwin.c: Change 'New Playlist' accelerator to ctrl-N,
+	  clean up GtkItemFactory code slightly.
+
+2005-06-13 19:11  descender
+
+	* AUTHORS, beep/about.c (release_0_9_7_1):
+	  * AUTHORS, beep/about.c: Merge skin credits change from HEAD.
+
+2005-06-13 19:04  descender
+
+	* Makefile.am, configure.ac, beep/Makefile.am, skin/Makefile,
+	  skin/Makefile.am, skin/Makefile.in, skin/README,
+	  skin/balance.bmp, skin/cbuttons.bmp, skin/eq_ex.bmp,
+	  skin/eqmain.bmp, skin/main.bmp, skin/monoster.bmp,
+	  skin/nums_ex.bmp, skin/playpaus.bmp, skin/pledit.bmp,
+	  skin/pledit.txt, skin/posbar.bmp, skin/shufrep.bmp,
+	  skin/text.bmp, skin/titlebar.bmp, skin/viscolor.txt,
+	  skin/volume.bmp (release_0_9_7_1):
+	  * Merge new skin from HEAD
+
+2005-06-08 02:09  descender
+
+	* AUTHORS, beep/about.c:
+	  * AUTHORS, beep/about.c: Update skin credits.
+
+2005-06-08 02:01  descender
+
+	* skin/Makefile (release_0_9_7_1): file Makefile was added on
+	  branch release_0_9_7_1 on 2005-06-13 11:04:57 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/Makefile.am (release_0_9_7_1): file Makefile.am was added on
+	  branch release_0_9_7_1 on 2005-06-13 11:04:57 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/Makefile.in (release_0_9_7_1): file Makefile.in was added on
+	  branch release_0_9_7_1 on 2005-06-13 11:04:57 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/README (release_0_9_7_1): file README was added on branch
+	  release_0_9_7_1 on 2005-06-13 11:04:57 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/balance.bmp (release_0_9_7_1): file balance.bmp was added on
+	  branch release_0_9_7_1 on 2005-06-13 11:04:58 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/cbuttons.bmp (release_0_9_7_1): file cbuttons.bmp was added
+	  on branch release_0_9_7_1 on 2005-06-13 11:04:58 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/eq_ex.bmp (release_0_9_7_1): file eq_ex.bmp was added on
+	  branch release_0_9_7_1 on 2005-06-13 11:04:58 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/eqmain.bmp (release_0_9_7_1): file eqmain.bmp was added on
+	  branch release_0_9_7_1 on 2005-06-13 11:04:58 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/main.bmp (release_0_9_7_1): file main.bmp was added on
+	  branch release_0_9_7_1 on 2005-06-13 11:04:59 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/monoster.bmp (release_0_9_7_1): file monoster.bmp was added
+	  on branch release_0_9_7_1 on 2005-06-13 11:04:59 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/nums_ex.bmp (release_0_9_7_1): file nums_ex.bmp was added on
+	  branch release_0_9_7_1 on 2005-06-13 11:04:59 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/playpaus.bmp (release_0_9_7_1): file playpaus.bmp was added
+	  on branch release_0_9_7_1 on 2005-06-13 11:04:59 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/pledit.bmp (release_0_9_7_1): file pledit.bmp was added on
+	  branch release_0_9_7_1 on 2005-06-13 11:04:59 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/pledit.txt (release_0_9_7_1): file pledit.txt was added on
+	  branch release_0_9_7_1 on 2005-06-13 11:05:00 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/posbar.bmp (release_0_9_7_1): file posbar.bmp was added on
+	  branch release_0_9_7_1 on 2005-06-13 11:05:00 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/shufrep.bmp (release_0_9_7_1): file shufrep.bmp was added on
+	  branch release_0_9_7_1 on 2005-06-13 11:05:00 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/text.bmp (release_0_9_7_1): file text.bmp was added on
+	  branch release_0_9_7_1 on 2005-06-13 11:05:00 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/titlebar.bmp (release_0_9_7_1): file titlebar.bmp was added
+	  on branch release_0_9_7_1 on 2005-06-13 11:05:00 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/viscolor.txt (release_0_9_7_1): file viscolor.txt was added
+	  on branch release_0_9_7_1 on 2005-06-13 11:05:00 +0000
+
+2005-06-08 02:01  descender
+
+	* skin/volume.bmp (release_0_9_7_1): file volume.bmp was added on
+	  branch release_0_9_7_1 on 2005-06-13 11:05:00 +0000
+
+2005-06-08 02:01  descender
+
+	* Makefile.am, configure.ac, beep/Makefile.am, skin/Makefile,
+	  skin/Makefile.am, skin/Makefile.in, skin/README,
+	  skin/balance.bmp, skin/cbuttons.bmp, skin/eq_ex.bmp,
+	  skin/eqmain.bmp, skin/main.bmp, skin/monoster.bmp,
+	  skin/nums_ex.bmp, skin/playpaus.bmp, skin/pledit.bmp,
+	  skin/pledit.txt, skin/posbar.bmp, skin/shufrep.bmp,
+	  skin/text.bmp, skin/titlebar.bmp, skin/viscolor.txt,
+	  skin/volume.bmp:
+	  * replace default skin with ClearSky by Will Reinhart *
+	  configure.ac, {,beep}/Makefile.am: move skin directory from
+	  beep/defskin/ to skin/
+
+2005-05-19 23:19  descender
+
+	* po/mk.po:
+	  * mk.po: Merge Macedonian translation update from
+	  release_0_9_7_1.
+
+2005-05-19 23:08  descender
+
+	* po/mk.po (release_0_9_7_1):
+	  * mk.po: Macedonian translation update (Arangel Angov).
+
+2005-05-13 17:39  descender
+
+	* beep/mainwin.c:
+	  * mainwin.c: Merge fix for bogus values returned by
+	  xmms_remote_get_info() from RELEASE_0_9_7_1.
+
+2005-05-10 02:34  mderezynski
+
+	* beep/: equalizer.c, main.c, mainwin.c, playlistwin.c (HEADLESS):
+	  Beginn of making BMP run headless
+
+2005-05-10 02:13  mderezynski
+
+	* Input/mpg123/fileinfo.c, beep/input.c: Removed internal used of
+	  deprecatd XmmsEntry and replaced it with standard GtkEntry
+
+2005-05-09 16:45  larne
+
+	* beep/mainwin.c (release_0_9_7_1): disable mainwin_info scrolling
+	  when shaded, fixes high CPU utilisation problem (#288)
+
+2005-05-09 16:42  larne
+
+	* beep/mainwin.c: disable mainwin_info scrolling when shaded, fixes
+	  high CPU utilisation problem (#288)
+
+2005-05-02 08:54  descender
+
+	* beep/prefswin.c (release_0_9_7_1):
+	  * prefswin.c: Merge general/visualization plugin About dialog fix
+	  from HEAD.
+
+2005-05-02 08:42  descender
+
+	* beep/prefswin.c:
+	  * prefswin.c: Fix general/visualization plugin About dialogs not
+	  opening correctly.
+
+2005-04-22 05:39  mderezynski
+
+	* PLAYLIST:
+
+	  This file describes the features of the current playlist systems.
+	  It's a small help for us for redesigning the playlist subsystem.
+
+2005-04-12 17:27  descender
+
+	* po/pl.po:
+	  * pl.po: Update Polish translation (Jacek Wolszczak).
+
+2005-03-30 21:35  descender
+
+	* autogen.sh:
+	  * autogen.sh: Remove redundant gettextize call.
+
+2005-03-29 15:28  descender
+
+	* po/Makevars:
+	  * po/Makevars: Re-add (Carl Fûrstenberg).
+
+2005-03-28 10:07  descender
+
+	* AUTHORS, beep/about.c, po/ru.po:
+	  * AUTHORS, beep/about.c, po/ru.po: Merge Russian translation
+	  update from release_0_9_7_1.
+
+2005-03-28 09:55  descender
+
+	* AUTHORS, beep/about.c (release_0_9_7_1):
+	  * AUTHORS, beep/about.c: Update translation credits.
+
+2005-03-28 09:45  descender
+
+	* po/ru.po (release_0_9_7_1):
+	  * ru.po: Update Russian translation (Vitaly Lipatov).
+
+2005-03-28 09:36  descender
+
+	* beep/: about.c, equalizer.c (release_0_9_7_1):
+	  * about.c: Update copyright end year to 2005.  * equalizer.c:
+	  Bring 'delete preset' and 'delete autoload preset' dialog to
+	  front when activated if they already exist.
+
+2005-03-28 09:20  descender
+
+	* configure.ac, beep/Makefile.am, beep/equalizer.c, beep/mainwin.c,
+	  beep/playlistwin.c:
+	  * configure.ac, beep/ui/Makefile.am: New makefile for UI files.
+	  * beep/mainwin.c, beep/ui/mainwin.xml: Move UI XML description
+	  into external file.  * beep/equalizer.c,
+	  beep/ui/equalizerwin.xml: Move UI XML description into external
+	  file.  * beep/playlistwin.c, beep/ui/playlistwin.xml: Move UI XML
+	  description into external file.
+
+2005-03-28 08:50  descender
+
+	* beep/: about.c, controlsocket.c, equalizer.c, main.c, main.h,
+	  mainwin.c, playlistwin.c, pluginenum.c:
+	  about.c: Change copyright string end year to 2005.
+	  (generate_credit_list): Split *item++ into *item and item++ to
+	  fix crash.  controlsocket.c: Print debug messages when binding
+	  and closing control socket.  equalizer.c: Port equalizer preset
+	  popup menu to GtkUIManager.  main.c: Print debug messages when
+	  loading and saving settings.	main.h: Change log filename from
+	  'bmp.log' to 'log' for consistency sake.  mainwin.c
+	  (mainwin_create_window): Trap delete event instead of destroy for
+	  main window for quitting BMP. (action_quit): Hide windows after
+	  removing idle function to avoid drawing into them in idle
+	  function.  playlistwin.c: Fix 'sort selected by full path' and
+	  'sort selected by date' options not triggering the appropriate
+	  handlers.  pluginenum.c: Print debug message when shutting down
+	  plugin system, minor spacing cleanups.
+
+2005-03-28 05:32  descender
+
+	* beep/playlistwin.c:
+	  * playlistwin.c: Fix playlist selection popup menu, fix missing
+	  queue toggle option.
+
+2005-03-26 05:29  descender
+
+	* scripts/cvs2cl.pl:
+	  * cvs2cl.pl: Update to latest.
+
+2005-03-26 05:25  descender
+
+	* autogen.sh, scripts/armageddon.sh, scripts/cleanall.sh,
+	  scripts/gen-auto-scripts.sh, scripts/make-dist.sh,
+	  scripts/rm-backups.sh:
+	  * autogen.sh: Add help screen, informational messages and option
+	  to skip cvs2cl.pl run from gen-auto-scripts.sh.  * armageddon.sh:
+	  Update.  * scripts/rm-backups.sh: Use 'grep x y' instead of 'cat
+	  y | grep x'.	* scripts/gen-auto-scripts.sh: Remove, replaced by
+	  autogen.sh.  * scripts/make-dist.sh: Remove, pretty much useless.
+	  * scripts/cleanall.sh: Remove, replaced by armageddon.sh.
+
+2005-03-26 05:01  descender
+
+	* scripts/: code-stats.sh, genesis.sh:
+	  * code-stats.sh: Remove, sloccount is better anyway.	*
+	  genesis.sh: Replaced by autogen.sh.
+
+2005-03-26 04:39  descender
+
+	* configure.ac:
+	  * configure.ac: Jack gettext version up to 0.14.1.
+
+2005-03-26 04:38  descender
+
+	* ABOUT-NLS, autogen.sh, config.guess, config.rpath, config.sub,
+	  depcomp, install-sh, ltmain.sh, missing, mkinstalldirs,
+	  po/Makefile.in.in, po/Makevars, po/Makevars.template,
+	  po/Rules-quot, po/boldquot.sed, po/en at boldquot.header,
+	  po/en at quot.header, po/insert-header.sin, po/quot.sed,
+	  po/remove-potcdate.sin:
+	  * Remove auto-generated files.  * autogen.sh: Don't call
+	  gen-auto-scripts.sh, run autotools manually.
+
+2005-03-26 04:20  descender
+
+	* m4/: codeset.m4, gettext.m4, glibc21.m4, iconv.m4, intdiv0.m4,
+	  inttypes-pri.m4, inttypes.m4, inttypes_h.m4, isc-posix.m4,
+	  lcmessage.m4, lib-ld.m4, lib-link.m4, lib-prefix.m4, nls.m4,
+	  po.m4, progtest.m4, stdint_h.m4, uintmax_t.m4, ulonglong.m4:
+	  * Remove gettext m4 files.
+
+2005-03-26 04:12  descender
+
+	* m4/libtool.m4:
+	  * libtool.m4: Update to 1.5.14.
+
+2005-03-26 03:35  descender
+
+	* beep/playlist.c (release_0_9_7_1):
+	  * playlist.c: Apply fix for #260 from HEAD.
+
+2005-03-26 03:32  descender
+
+	* beep/playlist.c:
+	  * playlist.c (playlist_remove_dead_files): Fix NULL pointer
+	  dereference when playlist position is the last entry and the
+	  associated file is 'dead' (#260, Simon Morgan).
+
+2005-03-25 23:33  descender
+
+	* beep/: Makefile.am, beep.wmconfig (release_0_9_7_1):
+	  * Makefile.am, beep.wmconfig: Remove beep.wmconfig.
+
+2005-03-25 23:03  descender
+
+	* beep/: about.c, beep_logo.xpm, images/Makefile.am,
+	  images/logo.xpm:
+	  * Makefile.am, about.c, beep_logo.xpm, images/logo.xpm: Move and
+	  rename beep_logo.xpm to images/logo.xpm, fixes make distcheck
+	  error (was missing beep_logo.xpm).
+
+2005-03-25 20:40  descender
+
+	* beep/: Makefile.am, beep.wmconfig:
+	  * Makefile.am: Add bmp.schemas to distribution, remove
+	  beep.wmconfig.  * beep.wmconfig: Remove obsolete file.
+
+2005-03-25 20:37  descender
+
+	* beep/bmp.schemas:
+	  * bmp.schemas: New GConf schema.
+
+2005-03-25 17:52  descender
+
+	* beep/: bmp.desktop.in (release_0_9_7_1), bmp.desktop.in:
+	  * bmp.desktop.in: Put in trailing semicolon for MimeType value.
+
+2005-03-23 22:49  descender
+
+	* Output/OSS/OSS.c, Output/OSS/about.c, Output/OSS/configure.c,
+	  Output/alsa/about.c, Output/alsa/alsa.c, Output/alsa/audio.c,
+	  Output/alsa/configure.c, Output/esd/about.c,
+	  Output/esd/configure.c, Output/esd/esd.c,
+	  Visualization/blur_scope/blur_scope.c,
+	  Visualization/blur_scope/config.c:
+	  * Output/OSS/OSS.c, Output/OSS/about.c, Output/OSS/configure.c,
+	  Output/alsa/about.c, Output/alsa/alsa.c, Output/alsa/configure.c,
+	  Output/esd/about.c, Output/esd/configure.c, Output/esd/esd.c,
+	  Visualization/blur_scope/blur_scope.c,
+	  Visualization/blur_scope/config.c: * Output/alsa/audio.c
+	  (alsa_setup): Make alsa_buffer_time unsigned.
+
+2005-03-23 22:31  descender
+
+	* Input/: cdaudio/cdaudio.c, cdaudio/cdinfo.c, cdaudio/configure.c,
+	  mpg123/configure.c, mpg123/fileinfo.c, mpg123/http.c,
+	  mpg123/id3_frame_content.c, mpg123/mpg123.c, vorbis/configure.c,
+	  vorbis/fileinfo.c, vorbis/http.c, vorbis/vorbis.c, wav/wav.c:
+	  * cdaudio/cdaudio.c, cdaudio/cdinfo.c, cdaudio/configure.c,
+	  mpg123/configure.c, mpg123/fileinfo.c,
+	  mpg123/id3_frame_content.c, mpg123/mpg123.c, vorbis/configure.c,
+	  vorbis/fileinfo.c, vorbis/vorbis.c, wav/wav.c: Change _() to
+	  Q_().  * mpg123/http.c, vorbis/http.c (http_buffer_loop): Change
+	  err_len to type socklen_t. Change _() to Q_().
+
+2005-03-23 20:33  descender
+
+	* beep/Makefile.am:
+	  * Makefile.am: Remove entries for non-existent files (were
+	  removed during shuffling of image files).
+
+2005-03-23 20:15  descender
+
+	* beep/about.c, beep/eq_slider.c, beep/equalizer.c, beep/glade.c,
+	  beep/input.c, beep/logger.c, beep/main.c, beep/mainwin.c,
+	  beep/playback.c, beep/playlistwin.c, beep/prefswin.c,
+	  beep/util.c, libbeep/titlestring.c:
+	  * beep/about.c beep/eq_slider.c beep/equalizer.c beep/glade.c,
+	  beep/input.c, beep/logger.c, beep/main.c, beep/mainwin.c,
+	  beep/playback.c, beep/playlistwin.c, beep/prefswin.c,
+	  beep/util.c, libbeep/titlestring.c: Use Q_() instead of _() for
+	  translation.
+
+2005-03-23 19:34  descender
+
+	* configure.ac:
+	  * configure.ac: Replace AC_TRY_COMPILE with AC_COMPILE_IFELSE,
+	  use AS_HELP_STRING to mark help strings, remove AC_C_BIGENDIAN,
+	  lower case of first character of each option help string.
+
+2005-03-23 12:55  descender
+
+	* beep/: main.c, main.h, mainwin.c, skinwin.c (release_0_9_7_1):
+	  * main.[ch], mainwin.c, skinwin.c: Merge accelerator map support
+	  from HEAD.
+
+2005-03-23 12:10  descender
+
+	* beep/playlist.h (release_0_9_7_1):
+	  * playlist.h: Merge gcc4 error fix from HEAD.
+
+2005-03-23 12:09  descender
+
+	* beep/playlist.h:
+	  * playlist.c: Remove superfluous extern declaration of
+	  playlist_format_suffixes causing gcc4 to error.
+
+2005-03-14 11:53  descender
+
+	* beep/: main.c, main.h, mainwin.c, skinwin.c:
+	  * main.[ch], mainwin.c, skinwin.c: Load and save accelerator map
+	  to ~/.bmp/accels.
+
+2005-03-14 07:29  descender
+
+	* AUTHORS, beep/about.c, po/LINGUAS, po/fi.po (release_0_9_7_1):
+	  * AUTHORS, beep/about.c, po/LINGUAS, po/fi.po: Add new Finnish
+	  translation from HEAD.
+
+2005-03-14 07:05  descender
+
+	* AUTHORS, po/LINGUAS, po/fi.po, beep/about.c:
+	  * po/fi.po, po/LINGUAS: Add Finnish translation by Pauli
+	  Virtanen.  * AUTHORS, beep/about.c: Update translation credits.
+
+2005-03-07 07:08  descender
+
+	* Output/alsa/: configure.c, init.c (release_0_9_7_1):
+	  * configure.c, init.c: Merge fix for #253 from HEAD.
+
+2005-03-07 07:05  descender
+
+	* Output/alsa/: configure.c, init.c:
+	  * configure.c, init.c: Change multi-thread mode setting value
+	  type to bool, save period time (#253, Andrei Badea).
+
+2005-02-27 07:52  descender
+
+	* beep/logger.c:
+	  * logger.c: Merge infinite recursion fix from release_0_9_7_1.
+
+2005-02-26 18:34  descender
+
+	* Input/vorbis/fileinfo.c (release_0_9_7_1):
+	  * fileinfo.c: Merge fix for #244 from HEAD.
+
+2005-02-26 18:33  descender
+
+	* Input/vorbis/fileinfo.c:
+	  * fileinfo.c: Fix typo in date field name (#244, Kazuki Shimura).
+
+2005-02-23 06:15  descender
+
+	* beep/logger.c (release_0_9_7_1):
+	  * logger.c (log_to_file): Avoid infinite recursion when a
+	  g_return_if_fail() predicate fails.
+
+2005-02-05 20:28  descender
+
+	* AUTHORS, beep/about.c, po/LINGUAS, po/zh_TW.po:
+	  * AUTHORS, beep/about.c, po/LINGUAS, po/zh_TW.po: Merge
+	  translation update from release_0_9_7_1 branch.
+
+2005-02-05 20:24  descender
+
+	* AUTHORS, beep/about.c, po/LINGUAS, po/zh_TW.po (release_0_9_7_1):
+
+	  * po/zh_TW.po, po/LINGUAS: Add Traditional Chinese translation by
+	  Chao-Hsiung Liao.  * AUTHORS, beep/about.c: Update translation
+	  credits.
+
+2005-02-05 19:57  descender
+
+	* beep/mainwin.c (release_0_9_7_1):
+	  * mainwin.c (playback_get_sample_params): Fix assignments; fixes
+	  bogus values returned by xmms_remote_get_info().
+
+2005-01-30 23:05  descender
+
+	* beep/images/play.png:
+	  * play.png: Re-add, went missing after image file migration from
+	  beep/.
+
+2005-01-28 11:11  descender
+
+	* beep/: controlsocket.c, equalizer.c, mainwin.c, mainwin.h,
+	  playback.c, playlistwin.c, prefswin.c, util.c, util.h:
+	  * mainwin.[ch], equalizer.c, playlistwin.c, controlsocket.c,
+	  playback.c, prefswin.c, util.[ch]: Port main window popup code to
+	  GtkUIManager.
+
+2005-01-28 07:03  descender
+
+	* beep/play.png:
+	  * play.png: Forgot to remove during last commit.
+
+2005-01-28 06:57  descender
+
+	* beep/: Makefile.am, build.list, info.h, info.png, main.c,
+	  mainwin.c, mainwin.h, na.xpm, playlist.c, playlist.png,
+	  playlistwin.c, queue.png, images/Makefile.am, images/info.png,
+	  images/na.xpm:
+	  * Makefile.am, images/Makefile.am: Adjust build depedencies due
+	  to icon relocation.  * info.png, na.xpm: Move to images/.  *
+	  build.list: Remove, no longer needed.  * queue.png: Remove unused
+	  icon.  * info.h: Redundant, info.png already exists.	* main.c:
+	  Add custom stock (oxymoron?) icon registration, remove some
+	  redundant constants.	* mainwin.[ch], playlist.c, playlistwin.c:
+	  Port playlist editor menus to GtkUIManager.
+
+2005-01-27 05:27  descender
+
+	* po/br.po:
+	  * br.po: Update Breton translation (Thierry Vignaud).
+
+2005-01-26 13:56  descender
+
+	* beep/: effect.c, effect.h, general.c, general.h, input.c,
+	  input.h, output.c, output.h, playback.c, playlist.c, playlist.h,
+	  plugin.h, pluginenum.c, visualization.c, visualization.h:
+	  * playlist.[ch]: Change playlist entry comparators to take const
+	  PlaylistEntry * arguments.  * pluginenum.c: Factor out code from
+	  add_plugin().  * general.[ch], input.[ch], output.[ch],
+	  effect.[ch], visualization.[ch]: Change plugin system data to
+	  statically allocated structs.
+
+2005-01-22 03:32  descender
+
+	* po/br.po:
+	  * br.po: Update Breton translation (Thierry Vignaud).
+
+2005-01-15 18:14  descender
+
+	* beep/playlistwin.c:
+	  * playlistwin.c: Invert delete options in playlist editor's
+	  delete popup menu.
+
+2005-01-15 18:09  descender
+
+	* Output/alsa/audio.c:
+	  audio.c: Use GThread instead of pthread for new multi-thread
+	  mode, untabify code from last patch.
+
+2005-01-15 17:56  descender
+
+	* libbeep/titlestring.c:
+	  * titlestring.c: Replace macro statement wrappers with
+	  G_STMT_BEGIN/G_STMT_END.
+
+2005-01-15 17:06  descender
+
+	* beep/playlist_list.c:
+	  * playlist_list.c: Fix text clipping for 'non-ASCII' playlist
+	  entries.
+
+2005-01-15 04:40  descender
+
+	* beep/playlistwin.c: playlistwin.c: Work around #214 by ignoring
+	  double/triple clicks on playlist editor resize hotspot (David Le
+	  Brun).
+
+2005-01-15 04:33  descender
+
+	* Output/alsa/: alsa.h, audio.c, configure.c, init.c:
+	  * alsa.h, audio.c, configure.c, init.c: Apply BMP port of XMMS
+	  ALSA patch by Takashi Iwai (Thierry Vignaud).
+
+2005-01-08 13:39  descender
+
+	* beep/playlistwin.c:
+	  playlistwin.c: Add .m3u if user does not specify extension when
+	  saving playlists (John Spray).
+
+2005-01-08 13:23  descender
+
+	* beep/: playlist.c, playlist.h, playlistwin.c:
+	  * playlist.[ch]: Add playlist_format_get_from_name().  *
+	  playlistwin.c: HIGify unknown playlist format dialog message.
+
+2005-01-08 11:55  descender
+
+	* beep/playlistwin.c:
+	  * playlistwin.c: Fix capitalization of Load/Save Playlist dialog,
+	  change reject button to Cancel.
+
+2005-01-08 11:41  descender
+
+	* beep/: playback.c, playlist.c, playlist.h:
+	  * playlist.[ch], playback.c: Limit
+	  playlist/shuffle_list/queued_list to file scope (static).
+
+2005-01-07 01:10  descender
+
+	* beep/: equalizer.c, main.c, main.h, mainwin.c, pluginenum.c,
+	  skin.c, skinwin.c:
+	  * mainwin.c: Readd Queue button for JTF dialog.  * main.[ch],
+	  pluginenum.c, skin.c, skinwin.c, equalizer.c: Use one single
+	  array to hold path strings.
+
+2004-12-31 07:13  descender
+
+	* beep/: eq_graph.c, eq_slider.c, equalizer.c, hslider.c,
+	  mainwin.c, menurow.c, monostereo.c, number.c, pbutton.c,
+	  playlist_list.c, playlist_slider.c, playlistwin.c, playstatus.c,
+	  sbutton.c, svis.c, tbutton.c, textbox.c, vis.c, widget.c,
+	  widget.h:
+	  * Rename Widget methods.
+
+2004-12-25 01:57  descender
+
+	* beep/: playlist.c, playlist.h, playlistwin.c:
+	  * playlist.[ch] Refactor playlist saving code according to format
+	  type. turn playlist_add*() macros to actual functions.  *
+	  playlistwin.c: Minor renaming, factor out dialog code from
+	  playlistwin_save_playlist().
+
+2004-12-12 03:28  descender
+
+	* beep/playlist.c (release_0_9_7):
+	  * playlist.c: Merge fix for #186 from HEAD.
+
+2004-12-12 02:46  descender
+
+	* beep/playlist.c:
+	  * playlist.c (playlist_load_m3u): Initialize ext_len to -1, fixes
+	  #186 (David Le Brun).
+
+2004-12-11 13:14  descender
+
+	* po/: cs.po, es.po, hu.po, lt.po (release_0_9_7):
+	  * cs.po, es.po, hu.po, lt.po: Merge updated translations from
+	  HEAD.
+
+2004-12-11 00:08  msikkes
+
+	* po/: cs.po, es.po, hu.po, ja.po: * Updated cs, es, hu and ja
+	  translations.
+
+2004-12-09 02:01  descender
+
+	* po/de.po (release_0_9_7):
+	  * de.po: Update German translation (Matthias Debus).
+
+2004-12-07 06:11  descender
+
+	* po/ja.po (release_0_9_7):
+	  * ja.po: Update Japanese translation (Takeshi Aihana).
+
+2004-12-07 01:02  er-ku
+
+	* po/lt.po: New release coming, eh?
+
+2004-12-05 04:47  descender
+
+	* beep/mainwin.c (release_0_9_7):
+	  * mainwin.c: Merge repeat/shuffle menu fix from HEAD.
+
+2004-12-05 04:11  descender
+
+	* beep/mainwin.c:
+	  * mainwin.c: Fix shuffle/repeat status synchronization with play
+	  menu, remove playlist advance option from play menu,
+	  miscellaneous code cosmetic changes.
+
+2004-12-04 21:11  masterpe
+
+	* po/nl.po: - Fixed some added fuzzies in the dutch translation
+
+2004-12-04 20:29  quirk_fr
+
+	* po/fr.po: - Updated french translation for the coming release
+
+2004-12-04 20:10  descender
+
+	* po/: bmp.pot, zh_CN.po:
+	  * bmp.pot: Update template (hopefully the last time for 0.9.7).
+	  * zh_CN.po: Fix/add translations.
+
+2004-12-04 20:05  descender
+
+	* beep/: controlsocket.c, mainwin.c, playlistwin.c,
+	  glade/addfiles.glade:
+	  * glade/addfiles.glade: Remove trailing space after 'Close Dialog
+	  on Add'.  * mainwin.c, controlsocket.c: Fixed repeat and shuffle
+	  accelerators, push repeat/shuffle GUI feedback into
+	  mainwin_repeat/shuffle_pushed(), move 'No Playlist Advance'
+	  ItemFactoryEntry into play menu, remove 'BMP' suffix from 'Add
+	  Folders' dialog title, correct 'Add Internet Address' dialog
+	  title (was 'Add URL').  * playlistwin.c: Fix capitalization of
+	  'Add Internet Address...' option.
+
+2004-12-04 18:21  masterpe
+
+	* po/nl.po: - Updated the dutch translation for pending 0.9.7
+	  release
+
+2004-12-04 18:16  descender
+
+	* NEWS, README, TODO:
+	  * README: Add note on BMP Wiki.  * NEWS: Update changes since
+	  0.9.7 RC2.  * TODO: Reorganise the information a little.
+
+2004-12-04 17:29  descender
+
+	* Input/cdaudio/configure.c, Input/mpg123/fileinfo.c,
+	  Input/mpg123/http.c, Input/vorbis/fileinfo.c,
+	  Input/vorbis/http.c, Input/wav/wav.c, Output/OSS/OSS.c,
+	  Visualization/blur_scope/blur_scope.c, Output/OSS/OSS.h,
+	  Output/OSS/about.c, Output/OSS/audio.c, Output/OSS/configure.c,
+	  Output/OSS/init.c, Output/OSS/mixer.c, Output/esd/audio.c,
+	  Output/esd/configure.c, Output/esd/esdout.h, Output/esd/mixer.c:
+	  * Fix up license headers.
+
+2004-12-04 17:04  descender
+
+	* beep/: controlsocket.c, controlsocket.h, dock.c, dock.h,
+	  effect.c, effect.h, eq_graph.c, eq_graph.h, eq_slider.c,
+	  eq_slider.h, equalizer.c, equalizer.h, general.c, general.h,
+	  glade.c, glade.h, hints.c, hints.h, input.c, input.h, logger.c,
+	  logger.h, main.c, main.h, mainwin.c, mainwin.h, menurow.c,
+	  menurow.h, monostereo.c, monostereo.h, number.c, number.h,
+	  output.c, output.h, pbutton.c, pbutton.h, playback.c, playback.h,
+	  playlist_list.c, playlist_list.h, playlist_popup.c,
+	  playlist_popup.h, playlist_slider.c, playlist_slider.h,
+	  playlistwin.c, playlistwin.h, plugin.h, pluginenum.c,
+	  pluginenum.h, prefswin.c, prefswin.h, sbutton.c, sbutton.h,
+	  skin.c, skin.h, skinwin.c, skinwin.h, svis.c, svis.h, tbutton.c,
+	  tbutton.h, textbox.c, textbox.h, urldecode.c, urldecode.h,
+	  util.c, util.h, vis.c, vis.h, visualization.c, visualization.h,
+	  widget.c, widget.h, xml_document.h:
+	  * Fix up license headers.
+
+2004-12-04 17:03  descender
+
+	* beep/: about.c, xml_document.c:
+	  * about.c (show_about_window): Set dialog hint for About window.
+	  * xml_document.c: Add license header, fix up ugliness of last run
+	  of indent.
+
+2004-12-04 15:21  descender
+
+	* bmp.spec.in:
+	  * bmp.spec.in: See %changelog.
+
+2004-12-04 14:41  descender
+
+	* beep/: mainwin.c, mainwin.h, playlistwin.c:
+	  * mainwin.[ch], playlistwin.c: Remove last hack used to fix
+	  playback accelerators.
+
+2004-12-04 10:18  descender
+
+	* po/: POTFILES.in, bmp.pot:
+	  * POTFILES.in: Add file glade/addfiles.glade (was missing).  *
+	  bmp.pot: Update template.
+
+2004-12-04 07:09  msikkes
+
+	* NEWS: * Added some items for the release.
+
+2004-12-04 05:33  msikkes
+
+	* README: * Cleaned up the readme a bit.
+
+2004-12-04 04:29  msikkes
+
+	* beep/playlistwin.c: * Added accels from the mainwindow to the
+	  playlist.
+
+2004-12-03 06:38  descender
+
+	* beep/: controlsocket.c, equalizer.c, main.c, mainwin.c,
+	  mainwin.h, playlistwin.c:
+	  * main.c, mainwin.[ch], equalizer.c, playlistwin.c,
+	  controlsocket.c: Refactor menu related code (a few more
+	  accelerators not recognized when playlist editor is in focus),
+	  miscellaneous cleanups.
+
+2004-12-03 05:12  descender
+
+	* configure.ac:
+	  * configure.ac: Set libglade version requirement (2.3.1).
+
+2004-12-01 22:08  descender
+
+	* AUTHORS, beep/about.c, beep/util.c:
+	  AUTHORS, beep/about.c: Update patch credits.	beep/util.c: Fix
+	  problem with relaunching Add Files dialog after Esc was pressed
+	  to close it.
+
+2004-12-01 21:35  descender
+
+	* configure.ac, Input/mpg123/layer3.c, beep/output.c:
+	  * configure.ac: Add switch to use XMMS (mpg123-only)
+	  equalization.  * beep/output.c (produce_audio): Split out filter
+	  independent code into output_to_plugin(), don't apply IIR filter
+	  if XMMS equalization enabled.  * Input/mpg123/layer3.c
+	  (mpg123_do_layer3): Filter samples if XMMS equalization enabled.
+
+2004-12-01 19:09  descender
+
+	* beep/: util.c, glade/addfiles.glade:
+	  * util.c, glade/addfiles.glade: Push some Add Files dialog widget
+	  creation code into glade file, skip taskbar hint.
+
+2004-12-01 07:58  descender
+
+	* AUTHORS:
+	  * AUTHORS: fix name spelling.
+
+2004-12-01 05:57  msikkes
+
+	* beep/mainwin.c: * Changed 'Always On Top' accel to <control>o
+
+2004-11-30 06:31  msikkes
+
+	* beep/playlistwin.c: Modified some accels to fix ambigous ones.
+
+2004-11-30 05:50  msikkes
+
+	* AUTHORS:
+	  * Changed my addy.
+
+2004-11-30 03:41  descender
+
+	* AUTHORS:
+	  * AUTHORS: Update patch credits.
+
+2004-11-30 03:20  msikkes
+
+	* README, beep/main.c: * Added note for packagers to README about
+	  experimental gnome-vfs support.  * HACK: Added workaround for bug
+	  #129 so the playlist is always unshaded at   startup
+
+2004-11-30 03:13  descender
+
+	* po/bmp.pot:
+	  * bmp.pot: Update POT file.
+
+2004-11-30 03:08  descender
+
+	* beep/mainwin.c:
+	  * mainwin.c (mainwin_eject_pushed): Revert eject button behaviour
+	  (#194).
+
+2004-11-28 01:06  quirk_fr
+
+	* po/fr.po: - Updated french translation
+
+2004-11-21 03:34  descender
+
+	* po/de.po:
+	  * de.po: Update German translation (Matthias Debus).
+
+2004-11-20 17:29  descender
+
+	* m4/pkg.m4:
+	  * pkg.m4: Update (function name is now quoted).
+
+2004-11-20 15:08  descender
+
+	* beep/: controlsocket.c, mainwin.c, mainwin.h:
+	  * mainwin.c, mainwin.h, controlsocket.h: Hide some playback
+	  sample parameters (bitrate, frequency, channels).
+
+2004-11-17 17:22  descender
+
+	* AUTHORS, beep/about.c, po/LINGUAS, po/pt_BR.po:
+	  * po/LINGUAS, po/pt_BR.po: Add Brazilian Portuguese translation
+	  by Philipi Pinto.  * AUTHORS: Fix unknowningly encoded
+	  characters.  * AUTHORS, beep/about.c: Update translators.
+
+2004-11-16 13:50  descender
+
+	* configure.ac, Output/alsa/audio.c:
+	  * configure.ac: Add endianness check using AC_C_BIGENDIAN.  *
+	  Output/alsa/audio.c: Fix warning message typo (#199).
+
+2004-11-16 12:46  descender
+
+	* Output/alsa/configure.c:
+	  * configure.c: Fix (swap) ALSA preferences dialog Ok and Cancel
+	  button order.
+
+2004-11-16 12:30  descender
+
+	* beep/: equalizer.h, input.c, input.h, main.c:
+	  * main.c, equalizer.h, input.[ch]: Rewrite
+	  get_disabled_iplugins_str() with GString, use macros for default
+	  preset filenames.
+
+2004-11-07 22:58  er-ku
+
+	* po/lt.po: Updating lithuanian translation. However, * "View"
+	  isn't translated perfectly (yet); * 19 quite specific to audio
+	  strings not yet translated at all...
+
+2004-11-06 08:53  descender
+
+	* beep/: input.h, main.c, mainwin.c, pluginenum.c, pluginenum.h:
+	  * main.c: Remove trailing colon from 'disabled_iplugins' config
+	  value string output.	* mainwin.c, pluginenum.*, input.h: Minor
+	  renamings.
+
+2004-11-01 13:05  descender
+
+	* beep/mainwin.c:
+	  * mainwin.c: Fix toggle button state for shuffle and repeat on
+	  start (Andrei Badea).
+
+2004-10-31 15:22  masterpe
+
+	* po/nl.po: - Updated the dutch translation
+
+2004-10-24 08:24  descender
+
+	* Input/mpg123/: configure.c, mpg123.c:
+	  * Input/mpg123/configure.c, Input/mpg123/mpg123.c: Remove Glib
+	  warning when mpg123_id3_encoding_list is NULL (SF #1020503).
+
+2004-10-24 07:54  descender
+
+	* beep/: util.c, glade/addfiles.glade:
+	  * util.c: Fixed 'Add Files' dialog not opening, fixed all
+	  compiler warnings, correctly mark all translatable strings,
+	  miscellaneous cleanups.  * glade/addfiles.glade: Set dialog hint
+	  for 'Add Files' dialog window.
+
+2004-10-22 03:41  mderezynski
+
+	* beep/: mainwin.c, playlistwin.c, util.c:
+
+	  * Fixed Shuffle and Repeat
+
+2004-10-22 01:55  descender
+
+	* po/mk.po:
+	  * mk.po: Update Macedonian translation (Arangel Angov).
+
+2004-10-17 16:58  descender
+
+	* beep/: controlsocket.c, mainwin.h:
+	  * controlsocket.c (ctrlsocket_func): Change type of len to
+	  socklen_t.  * mainwin.h: Remove externs that were declared as
+	  statics in mainwin.c.
+
+2004-10-17 09:16  descender
+
+	* beep/images/bmp_playlist.xpm:
+	  * bmp_playlist.xpm: Revert playlist window icon.
+
+2004-10-16 05:59  descender
+
+	* beep/controlsocket.c, beep/controlsocket.h, beep/main.c,
+	  libbeep/beepctrl.c, libbeep/beepctrl.h:
+	  * beep/controlsocket.[ch], libbeep/beepctrl.[ch]: Add ability to
+	  activate main window remotely (Andrei Badea).  * beep/main.c: Add
+	  command option (-a,--activate) to activate main window (Andrei
+	  Badea).
+
+2004-10-16 00:26  descender
+
+	* AUTHORS, beep/about.c, po/LINGUAS, po/mk.po:
+	  * po/LINGUAS, po/mk.po: Add Macedonian translation by Arangel
+	  Angov.  * AUTHORS, beep/about.c: Add Macedonian translator.
+
+2004-10-08 20:28  descender
+
+	* acinclude.m4, bmp.pc.in, configure.ac:
+	  * acinclude.m4: Add ADD_PC_REQUIRES macro.  * configure.ac,
+	  bmp.pc.in: Set pkg-config file requires for optional
+	  dependencies.
+
+2004-10-08 19:35  descender
+
+	* beep/main.c:
+	  * main.c (dump_version): Print list of features (eg. GConf, GNOME
+	  VFS), and print full application name (instead of package name).
+
+2004-10-08 19:14  descender
+
+	* beep/: mainwin.c, playlistwin.c, playlistwin.h:
+	  * mainwin.c, playlistwin.[ch]: Eject button now invokes playlist
+	  selection dialog instead.
+
+2004-10-08 15:31  descender
+
+	* beep/: mainwin.c, playlistwin.c:
+	  * mainwin.c, playlistwin.c: Fix compiler warnings and GTK+
+	  runtime warnings.
+
+2004-10-08 13:51  descender
+
+	* beep/playlistwin.c:
+	  * playlistwin.c: Remove unused code, fix track info dialog launch
+	  with shortcut (#176), miscellaneous clean ups.
+
+2004-10-08 12:34  descender
+
+	* beep/skin.c:
+	  * skin.c (skin_draw_pixmap): Check if pixmap is NULL (Artur
+	  Frysiak, #185).
+
+2004-10-01 23:55  mderezynski
+
+	* beep/images/appearance.png:
+
+	  New appearance icon
+
+2004-09-27 06:00  mderezynski
+
+	* beep/: mainwin.c, playlistwin.c:
+
+	  blah! BLAH!
+
+2004-09-27 05:40  mderezynski
+
+	* beep/: mainwin.c, playlistwin.c, glade/prefswin.glade:
+
+	  Some menu changes, some this-and-that
+
+2004-09-26 20:14  descender
+
+	* revision.h, beep/main.c:
+	  * beep/main.c, revision.h: Revert revision printing code for now
+	  (until revup.py can be properly called with ciabot).
+
+2004-09-26 19:50  descender
+
+	* revision.h: * Bump revision (revup.py)
+
+2004-09-26 19:50  descender
+
+	* configure.ac:
+	  * configure.ac: Test commit.
+
+2004-09-26 19:05  descender
+
+	* beep/main.c:
+	  * Dummy commit to test revup.py
+
+2004-09-26 18:45  descender
+
+	* beep/main.c:
+	  * Test commit.
+
+2004-09-26 18:21  descender
+
+	* beep/main.c:
+	  * main.c: Test commit.
+
+2004-09-26 17:52  descender
+
+	* beep/main.c:
+	  * main.c (dump_version): Print revision number.
+
+2004-09-26 17:48  descender
+
+	* revision.h:
+	  * revision.h: Add include guard (also to test commit).
+
+2004-09-26 15:51  descender
+
+	* beep/main.c:
+	  * main.c: Include "revision.h" for tree revision number (also to
+	  test revup script).
+
+2004-09-26 15:44  descender
+
+	* revision.h:
+	  * revision.h: New include file to track tree revision
+
+2004-09-26 06:49  mderezynski
+
+	* beep/images/bmp_eq.xpm:
+
+	  Revert to old red icons (the green ones were butt ugly weren't
+	  they)
+
+2004-09-26 06:41  descender
+
+	* AUTHORS, beep/about.c:
+	  * AUTHORS, about.c: Add Czech translator to credits.
+
+2004-09-26 05:48  descender
+
+	* po/: LINGUAS, cs.po:
+	  * LINGUAS, cs.po: Add Czech translation by Jan Narovec.
+
+2004-09-25 21:05  quirk_fr
+
+	* po/fr.po: - Improved few translations
+
+2004-09-25 09:49  mderezynski
+
+	* beep/playlistwin.c:
+
+	  Fixed queue_pixbuf compile problem
+
+2004-09-25 09:18  mderezynski
+
+	* beep/: mainwin.c, playlistwin.c, util.c:
+
+	  Some updates
+
+2004-09-23 06:58  quirk_fr
+
+	* po/fr.po: - Updated french translation
+
+2004-09-20 02:01  mderezynski
+
+	* beep/: mainwin.c, mainwin.h, playlistwin.c, util.c:
+
+	  Changes to the filechooser, menu changes
+
+2004-09-19 11:53  mderezynski
+
+	* beep/: beep_logo.xpm, mainwin.c, playlistwin.c, prefswin.c,
+	  util.c:
+
+	  revised about logo; menu changes; removed Add Folders because of
+	  currently broken GtkFileChooser
+
+2004-09-19 08:16  mderezynski
+
+	* beep/: mainwin.c, playlistwin.c:
+
+	  Changed menu order once again
+
+2004-09-19 08:13  mderezynski
+
+	* beep/: mainwin.c, playlistwin.c:
+
+	  Menus now pop up to the top (over pl window) instead of to the
+	  bottom out of it
+
+2004-09-19 07:15  mderezynski
+
+	* beep/: mainwin.c, playlist.c, playlistwin.c, util.c:
+
+	  Menu changes, GTK menus for playlist buttons instead of custom
+	  ones
+
+2004-09-19 02:59  oleavr
+
+	* beep/glade/Makefile.am: Added a missing backslash so that
+	  addfiles.glade gets installed.
+
+2004-09-19 02:42  mderezynski
+
+	* beep/queue.png:
+
+	  Added icon for queue toggle
+
+2004-09-19 02:41  mderezynski
+
+	* beep/glade/addfiles.glade:
+
+	  Added .glade file for filebrowser
+
+2004-09-19 02:40  mderezynski
+
+	* beep/: build.list, main.c, main.h, mainwin.c, playlist.h,
+	  playlistwin.c, util.c, glade/Makefile.am:
+
+	  Changed and fixed up filebrowser
+
+2004-09-17 07:45  mderezynski
+
+	* Input/cdaudio/cdaudio.c:
+
+	  Commit enable Equalizer for CD Audio patch
+
+2004-09-17 07:42  mderezynski
+
+	* beep/beep_logo.xpm:
+
+	  Replaced green logo with red one (Should have been commited long
+	  time ago)
+
+2004-09-08 16:27  descender
+
+	* beep/playlist.c:
+	  * playlist.c (playlist_queue_position): Remove #ifdef (Michael
+	  Marineau, #169).
+
+2004-09-06 23:26  er-ku
+
+	* po/lt.po: very minor fix for one string
+
+2004-09-06 23:23  er-ku
+
+	* po/lt.po: new translations and translators added.
+
+2004-09-03 09:29  descender
+
+	* AUTHORS, beep/about.c, po/sk.po:
+	  * AUTHORS, beep/about.c: Update translation credits.	* po/sk.po:
+	  Fix mismatched fields.
+
+2004-09-03 07:53  descender
+
+	* po/: LINGUAS, sk.po:
+	  * LINGUAS, sk.po: Add Slovak translation by Pavel Kanzelsberger.
+
+2004-09-02 06:04  descender
+
+	* po/hu.po:
+	  * hu.po: Update Hungarian translation (Laszlo Dvornik).
+
+2004-09-01 07:18  descender
+
+	* po/el.po:
+	  * el.po: Update Greek translation (Kouzinopoulos Haris).
+
+2004-08-31 18:23  descender
+
+	* scripts/gen-auto-scripts.sh:
+	  * gen-auto-scripts.sh (run_or_die): Fix exit code output.
+
+2004-08-31 18:16  descender
+
+	* autogen.sh, scripts/gen-auto-scripts.sh:
+	  * autogen.sh, scripts/gen-auto-scripts.sh: Fix portability issues
+	  with '!' (damn Bash).
+
+2004-08-31 17:12  descender
+
+	* beep/: equalizer.c, mainwin.c, skin.c, skin.h:
+	  * skin.c, skin.h: Reorder and rename window mask IDs, remove
+	  'shaded' parameter from skin_get_mask().  * equalizer.c,
+	  mainwin.c: Fix window-shade transparency problem (closes #109).
+
+2004-08-31 16:28  descender
+
+	* beep/mainwin.c:
+	  * mainwin.c (mainwin_create): Remove call to
+	  mainwin_set_shape_mask (removes startup warning about skin !=
+	  NULL).
+
+2004-08-29 12:59  descender
+
+	* beep/equalizer.c:
+	  * equalizer.c (equalizer_presets_menu_cb): Remove residue break
+	  statement.
+
+2004-08-29 12:53  descender
+
+	* beep/: equalizer.c, mainwin.c, util.c, util.h:
+	  * equalizer.c, util.c, util.h: Refactor preset load/save UI code,
+	  port preset load/save to VFS.  * mainwin.c: Remove unused code.
+
+2004-08-29 11:03  descender
+
+	* beep/playlistwin.h:
+	  * playlistwin.h: Change playlist default font size to point 10.
+
+2004-08-29 09:29  descender
+
+	* beep/skin.c:
+	  * skin.c (init_skins): Fix crash on Solaris during first run of
+	  BMP (#165).
+
+2004-08-29 09:23  descender
+
+	* beep/plugin.h:
+	  * plugin.h: Remove plugin struct comments, replace
+	  xmms_get_gentitle_format()'s const with G_CONST_RETURN.
+
+2004-08-29 09:03  descender
+
+	* NEWS:
+	  * NEWS: Update changes.
+
+2004-08-29 08:51  descender
+
+	* Input/mpg123/: configure.c, mpg123.c, mpg123.h:
+	  * configure.c, mpg123.c, mpg123.h: Add multiple encoding support
+	  for trying ID3 title conversion.
+
+2004-08-29 07:35  descender
+
+	* beep/: effect.c, effect.h, input.c, input.h, main.c, mainwin.c,
+	  output.c, output.h, pluginenum.c, pluginenum.h, util.c,
+	  visualization.c, visualization.h:
+	  * effect.[ch], input.[ch], output.[ch], visualization.[ch]: Use
+	  typedef'ed  structs for *PluginData.	* main.c: Use
+	  PLUGIN_FILENAME to construct OSS plugin filename.  * mainwin.c:
+	  Make some functions static, rename scan_cd_input_plugin() to
+	  can_play_cd().  * pluginenum.h: Add PLUGIN_FILENAME macro.  *
+	  util.c: Change close button to cancel for preset file selector.
+
+2004-08-29 07:22  quirk_fr
+
+	* po/fr.po: - Update French translation
+
+2004-08-29 07:01  descender
+
+	* AUTHORS:
+	  * AUTHORS: Correct typo.
+
+2004-08-29 06:59  descender
+
+	* po/bmp.pot:
+	  * bmp.pot: Sync PO template.
+
+2004-08-29 06:54  descender
+
+	* po/pl.po:
+	  * pl.po: Update Polish translation (Jacek Wolszczak).
+
+2004-08-29 06:47  descender
+
+	* beep/mainwin.c:
+	  * mainwin.c: Replaced unnecessary gtk_item_factory_get_widget()
+	  calls in menu callbacks with their 3rd parameter, replace
+	  CHECK_SET macro with check_set() function, replace gtk_exit()
+	  with gtk_main_quit().
+
+2004-08-28 09:38  descender
+
+	* beep/mainwin.c:
+	  * mainwin.c: Replace deprecated gtk_timeout_*() calls with
+	  g_timeout_add() and  g_source_remove().
+
+2004-08-28 07:40  descender
+
+	* AUTHORS, po/LINGUAS, po/ro.po, beep/about.c:
+	  * po/LINGUAS, po/ro.po: Add Romanian translation by Liviu
+	  Danicel.  * AUTHORS, beep/about.c: Update translation credits.
+
+2004-08-28 06:12  descender
+
+	* AUTHORS, beep/about.c:
+	  * AUTHORS, beep/about.c: Change LD's name on request.
+
+2004-08-27 04:06  masterpe
+
+	* po/nl.po: - Updated the dutch translation
+
+2004-08-27 04:02  descender
+
+	* beep/about.c:
+	  * about.c: Left out artm :p
+
+2004-08-27 03:32  descender
+
+	* beep/about.c, po/LINGUAS, po/el.po, AUTHORS:
+	  * po/LINGUAS, po/el.po: Add Greek translation by Kouzinopoulos
+	  Haris.  * beep/about.c, AUTHORS: Update translation credits.
+
+2004-08-27 01:04  mderezynski
+
+	* beep/images/bmp_player.xpm:
+
+	  reverted icon to red style one
+
+2004-08-26 18:49  descender
+
+	* AUTHORS, beep/about.c, po/LINGUAS, po/br.po:
+	  * po/br.po: New Breton translation by Thierry Vignaud.  *
+	  LINGUAS: Add Breton and Hungarian (was missing).  * AUTHORS,
+	  beep/about.c: Update translation credits.
+
+2004-08-25 01:27  descender
+
+	* AUTHORS, beep/about.c, po/hu.po:
+	  * po/hu.po: Add Hungarian translation by Laszlo Dvornik.  *
+	  AUTHORS, beep/about.c: Update credits.
+
+2004-08-25 01:13  descender
+
+	* po/de.po:
+	  * de.po: Update German translation (Matthias Debus).
+
+2004-08-24 05:33  mderezynski
+
+	* beep/: beep_logo.xpm, glade/prefswin.glade, images/bmp_eq.xpm,
+	  images/bmp_player.xpm, images/bmp_playlist.xpm:
+
+	  New GFX!
+
+2004-08-24 01:30  mderezynski
+
+	* beep/util.c:
+
+	  Fixed usage semantics also for Add files and improved visual
+	  response
+
+2004-08-24 01:23  mderezynski
+
+	* beep/mainwin.c:
+
+	  Fixed usage semantics (Add dir dialog does now first close, then
+	  the directory contents are added instead of reverse)
+
+2004-08-23 21:16  descender
+
+	* po/: it.po, ja.po:
+	  * it.po: Update Italian translation (Alessio D'Ascanio).  *
+	  ja.po: Update Japanese translation (Takeshi Aihana).
+
+2004-08-23 20:35  descender
+
+	* beep/about.c:
+	  * about.c: Removed superfluous ':'.
+
+2004-08-23 19:46  descender
+
+	* beep/controlsocket.c, Output/OSS/audio.c:
+	  * beep/controlsocket.c, Output/OSS/audio.c: Add missing
+	  <sys/time.h> includes (Closes #162).
+
+2004-08-23 06:31  er-ku
+
+	* po/lt.po: no comments
+
+2004-08-22 21:30  descender
+
+	* beep/Makefile.am, po/POTFILES.in:
+	  * beep/Makefile.am: Add build.list for distribution.	*
+	  po/POTFILES.in: Remove equalizerwin_preset_menu.glade.
+
+2004-08-22 07:31  descender
+
+	* beep/: playlist.c, playlistwin.c:
+	  * playlist.c (playlist_remove_dead_files): Proper fix for
+	  removing unavailable ('dead') files, log invalid playlist
+	  entries.  * playlistwin.c (playlistwin_set_geometry_hints): Fix
+	  incorrect base width.
+
+2004-08-22 06:33  descender
+
+	* beep/mainwin.c:
+	  * mainwin.c (mainwin_jump_to_file): Replaced gtk_widget_show()
+	  calls with gtk_widget_show_all().  (mainwin_jump_to_file,
+	  mainwin_jump_to_file_edit_cb): Use alias for playlist entry.
+
+2004-08-22 04:51  descender
+
+	* beep/glade/: Makefile.am, equalizerwin_preset_menu.glade:
+	  * Makefile.am, equalizer_preset_menu.glade: Remove unused Glade
+	  file.
+
+2004-08-22 04:49  descender
+
+	* beep/about.c:
+	  * about.c: Fix indentation (perfectionism at work).
+
+2004-08-22 04:47  descender
+
+	* beep/about.c:
+	  * about.c: Update credits, fix compiler warning.
+
+2004-08-22 04:39  descender
+
+	* AUTHORS:
+	  * AUTHORS: Update credits.
+
+2004-08-22 04:28  descender
+
+	* NEWS:
+	  * NEWS: Add notes on 0.9.7 rc1.
+
+2004-08-22 00:24  mderezynski
+
+	* beep/: playlist.c, playlistwin.c:
+
+	  Fixed playlist sort functions
+
+2004-08-21 23:49  mderezynski
+
+	* beep/playlist.c:
+
+	  Removed unused variables declarations
+
+2004-08-21 23:48  mderezynski
+
+	* beep/playlist.c:
+
+	  Fixed "remove dead files"
+
+2004-08-21 23:35  mderezynski
+
+	* beep/playlist.c:
+
+	  intermediate changes
+
+2004-08-21 21:15  descender
+
+	* beep/playlist.c:
+	  * playlist.c: Fix "/tmp" error when m3u playlist contains empty
+	  lines (Julien Portalier, #133).
+
+2004-08-21 21:04  descender
+
+	* Input/mpg123/id3_frame_text.c:
+	  * id3_get_text(): Fix ID3v2 comments (Peter Behroozi). Closes
+	  #153.
+
+2004-08-21 20:05  descender
+
+	* Input/vorbis/vorbis.c:
+	  * vorbis.c (vorbis_process_data): Remove superfluous
+	  g_mutex_unlock() call.
+
+2004-08-21 19:38  descender
+
+	* Output/alsa/configure.c:
+	  * configure.c (alsa_configure): Fix GTK+ warning (using
+	  gtk_widget_grab_default before packing button into window).
+
+2004-08-21 10:20  descender
+
+	* beep/playlistwin.c:
+	  * playlistwin.c: Remove unused physical file deletion functions.
+
+2004-08-21 10:01  descender
+
+	* beep/: Makefile.am, audio.inf, audio.png, build.list, folder.png:
+
+	  * Remove unused icons.
+
+2004-08-21 09:57  descender
+
+	* beep/play.png:
+	  * play.png: Crop and resized icon to 16x16.
+
+2004-08-21 09:20  descender
+
+	* po/zh_CN.po:
+	  * Updated zh_CN translation.
+
+2004-08-21 08:28  descender
+
+	* beep/: mainwin.c, util.c:
+	  * util.c: Use GtkComboBoxEntry for 'Add URL' dialog, fix memory
+	  leak when   cropping URL history, make 'Add URL' dialog close
+	  when user enters URL	 in entry box.	* mainwin.c: Move
+	  mainwin_url_window into mainwin_show_add_url_window().
+
+2004-08-21 06:45  mderezynski
+
+	* beep/: about.c, beep_logo.xpm, glade/prefswin.glade:
+
+	  about.c: small fixes for the list view (remove selection, add
+	  shadow) beep_logo.xpm: new logo glade/prefswin.glade: made skin
+	  list taller
+
+2004-08-21 04:19  mderezynski
+
+	* beep/playlist_list.c:
+
+	  Fixed track times would overdraw parts of the skin
+
+2004-08-17 03:28  quirk_fr
+
+	* po/fr.po: - Updated translations for new function copy/paste tags
+
+2004-08-17 03:25  quirk_fr
+
+	* po/fr.po: - Updated translations
+
+2004-08-15 06:30  descender
+
+	* beep/mainwin.c:
+	  * mainwin.c: Make JTT dialog non-modal, remove track length
+	  display since   it not sync with track changes.
+
+2004-08-15 06:09  descender
+
+	* beep/: mainwin.c, util.c, util.h, equalizer.c, mainwin.h,
+	  playlistwin.c:
+	  * util.c, util.h: Added functions create_menu() and
+	  make_submenu().  * mainwin.c, mainwin.h: Fix accelerators (#152);
+	  use stock buttons, reverse   button order and set window type
+	  hint for 'Jump to Time' dialog; use new   convenience functions
+	  (above).  * playlistwin.c: Fix 'Playback' menu accelerators,
+	  remove jump options from   'Playlist' menu, use new convenience
+	  functions.  * equalizerwin.c: Use new convenience functions.
+
+2004-08-14 02:47  descender
+
+	* Input/vorbis/fileinfo.c:
+	  * fileinfo.c: Activate save button when genre is changed (#148).
+
+2004-08-14 02:25  masterpe
+
+	* po/nl.po: - Some small updates and sanifications to the dutch
+	  translation
+
+2004-08-13 19:27  descender
+
+	* po/bmp.pot:
+	  * bmp.pot: Update PO template.
+
+2004-08-13 19:14  descender
+
+	* beep/: main.c, mainwin.c, mainwin.h, playlistwin.c:
+	  * main.c, mainwin.c, mainwin.h, playlistwin.c: Fix playback
+	  submenu of   playlist editor.
+
+2004-08-13 18:39  descender
+
+	* beep/main.c:
+	  * main.c: Removed unused code, mark options no longer in use.
+
+2004-08-13 18:14  descender
+
+	* beep/: main.c, playlistwin.c, prefswin.c, textbox.c,
+	  glade/prefswin.glade:
+	  * main.c, prefswin.c, textbox.c, glade/prefswin.glade: Remove
+	  option to   disable smooth title scrolling.  * playlistwin.c: Fix
+	  up indentation screw-ups by last run of indent.
+
+2004-08-13 17:55  descender
+
+	* beep/: equalizer.c, mainwin.c, playlistwin.c:
+	  * equalizer.c, mainwin.c, playlistwin.c: Renamed some items in
+	  'Options'   menu.
+
+2004-08-13 17:31  descender
+
+	* Input/mpg123/fileinfo.c:
+	  * Input/mpg123/fileinfo.c: Mark copy/paste album tags buttons as
+	  translatable.
+
+2004-08-13 04:16  descender
+
+	* beep/: equalizer.c, mainwin.c:
+	  * mainwin.c, equalizer.c: Removed 'Reload skin' option, renamed
+	  'Show   Graphical Equalizer' to 'Show Equalizer' (yes I'm
+	  fickle-minded).
+
+2004-08-13 04:04  descender
+
+	* beep/: equalizer.c, mainwin.c:
+	  * mainwin.c, equalizer.c: Removed 'Focus Playlist Editor' from
+	  Options menu,   renamed 'Show Graphical EQ' option to 'Show
+	  Graphical Equalizer'.
+
+2004-08-13 03:41  descender
+
+	* beep/: equalizer.c, equalizer.h, main.c, main.h, mainwin.c,
+	  playlistwin.c, skin.c, skin.h, svis.c, vis.c, vis.h:
+	  * Removed doublesize and easymove.
+
+2004-08-12 21:05  descender
+
+	* beep/mainwin.c:
+	  * mainwin.c (mainwin_jump_to_file): Prevent spawning of multiple
+	  JTF dialogs	(#149), set JTF window type hint to dialog (#150).
+
+2004-08-12 06:16  masterpe
+
+	* po/nl.po: - Small update to the dutch translation
+
+2004-08-10 12:26  descender
+
+	* beep/playback.c:
+	  * playback.c: Fixed compilation problem with gcc 2.95.x (Jolan
+	  Luff, closes	 #144).
+
+2004-08-08 23:12  quirk_fr
+
+	* po/fr.po: - Better translation
+
+2004-08-04 20:33  artm
+
+	* beep/: Makefile.am, bmp-playlist.c, bmp-playlist.h
+	  (new-playlist): new playlist - now compiles :-)
+
+2004-08-04 19:09  artm
+
+	* beep/: bmp-playlist.c, bmp-playlist.h (new-playlist): new
+	  playlist - initial version, gtktreemodel implementation
+
+2004-08-03 18:02  mderezynski
+
+	* beep/: playlist.c, playlist_list.c:
+
+	  Fix crash when queueing remote files (Closes #106)
+
+2004-08-02 16:12  artm
+
+	* Input/mpg123/fileinfo.c: id3v2 editing user interface
+	  enhancements: - validating tracknumbers - show tracknumbers
+	  padding zero on saving / copying - tab jumps out of the comment
+	  field
+
+2004-07-31 08:48  descender
+
+	* po/de.po:
+	  * de.po: Fixed "Queue Toggle" translation (closes #117).
+
+2004-07-31 05:01  descender
+
+	* beep/main.c:
+	  * main.c: Equalizer preamp is now saved (Eugene Marcotte, closes
+	  #136).
+
+2004-07-31 03:57  artm
+
+	* Input/mpg123/fileinfo.c: Album tags copy'n'paste version 1
+
+2004-07-31 02:15  descender
+
+	* Input/mpg123/: configure.c, http.c, mpg123.c, mpg123.h:
+	  * configure.c, http.c, mpg123.c, mpg123.h: Enable Shoutcast title
+	  metadata   all the time.
+
+2004-07-31 01:09  artm
+
+	* Input/mpg123/fileinfo.c: Fixed warnings about unused functions in
+	  fileinfo.c
+
+2004-07-31 00:09  larne
+
+	* configure.ac, Input/mpg123/Makefile.am, Input/mpg123/fileinfo.c,
+	  po/bmp.pot, po/cy.po, po/de.po, po/es.po, po/fr.po, po/it.po,
+	  po/ja.po, po/ko.po, po/lt.po, po/nl.po, po/pl.po, po/ru.po,
+	  po/sv.po, po/zh_CN.po: Next iteration of id3v2 patch from artm.
+	  His changelog:
+
+	  * no more id3v1/v2 tabs -> user doesn't care.  * comment field is
+	  multiline text editor (try to enter something long, you can press
+	  enter to add newlines) * total album tracks editing support
+	  (saved in track number frame as <TRACK NO>/<TOTAL TRACKS> *
+	  better autoconfig test (will work with compression disabled
+	  builds of id3lib on systems without libz) + prints wether id3v2
+	  is enabled in the configure summary
+
+2004-07-30 16:57  larne
+
+	* beep/mainwin.c, beep/mainwin.h, beep/playlistwin.c, po/cy.po,
+	  po/de.po, po/es.po, po/it.po, po/ko.po, po/nl.po, po/pl.po,
+	  po/sv.po: - make mainwin_jump_to_{file,time} in mainwin.c public;
+	  used for the new "Jump to File" and "Jump to Time" menu   items
+	  in the playlistwin's popup menu.  This fixes	 JTF shortcuts
+	  being broken.
+
+2004-07-30 05:20  descender
+
+	* Input/mpg123/mpg123.c:
+	  * mpg123.c (get_song_info): Fix check for HTTP streams (David Le
+	  Brun,   closes #128).
+
+2004-07-30 05:19  quirk_fr
+
+	* po/fr.po: Updated translations
+
+2004-07-29 00:53  descender
+
+	* po/ru.po, beep/mainwin.c:
+	  * po/ru.po: Russian translation update (Dan Korostelev).  *
+	  beep/mainwin.c: Hiding main window now hides from taskbar and
+	  Alt-Tab   list (Dan Korostelev).
+
+2004-07-27 00:09  er-ku
+
+	* po/lt.po: New strings arrived!
+
+2004-07-26 19:58  descender
+
+	* AUTHORS, beep/about.c:
+	  * AUTHORS, beep/about.c: Added Italian translator to credits
+	  list.
+
+2004-07-26 19:53  descender
+
+	* po/: ja.po, LINGUAS, it.po:
+	  * LINGUAS, it.po: Added Italian translation by Alessio D'Ascanio.
+	  * ja.po: Updated Japanese translation (Takeshi Aihana).
+
+2004-07-26 18:26  masterpe
+
+	* po/nl.po: - Final tweaks for 0.9.7 (I hope)
+
+2004-07-24 10:00  descender
+
+	* bmp.spec.in:
+	  * bmp.spec.in: Fix GNOME VFS configure flag (closes #130).
+
+2004-07-21 20:47  masterpe
+
+	* po/nl.po: Adherence to standard translations, more polishing.
+	  Must be getting tiresome reading this.
+
+2004-07-21 19:49  descender
+
+	* Input/wav/wav.h:
+	  * wav.h: Fix localization of WAV plugin name.
+
+2004-07-21 19:47  descender
+
+	* Input/vorbis/configure.c:
+	  * configure.c: Fix localization.
+
+2004-07-21 17:00  masterpe
+
+	* po/nl.po: Finally found a good translation for "presets", some
+	  other small tweaks aswell
+
+2004-07-21 05:47  descender
+
+	* configure.ac, Input/mpg123/Makefile.am, Input/mpg123/common.c,
+	  Input/mpg123/fileinfo.c, Input/mpg123/id3.c, Input/mpg123/id3.h,
+	  Input/mpg123/id3_frame.c, Input/mpg123/id3_frame_content.c,
+	  Input/mpg123/id3_frame_text.c, Input/mpg123/id3_frame_url.c,
+	  Input/mpg123/id3_tag.c, Input/mpg123/mpg123.h,
+	  Input/mpg123/xmms-id3.h:
+	  * Applied Artem Baguinski's id3v2 editing patch, rename
+	  Input/mpg123/id3.h   to xmms-id3.h.
+
+2004-07-20 17:57  masterpe
+
+	* po/nl.po: Oops, forgot something, corrected.
+
+2004-07-20 17:45  masterpe
+
+	* po/nl.po: Updated the Dutch translation
+
+2004-07-19 21:43  descender
+
+	* AUTHORS, beep/about.c:
+	  * AUTHORS, beep/about.c: Add Dan Korostelev (Russian translation
+	  update,   mpg123 plugin id3 encoding patch) and Laurens Buhler
+	  (Dutch translator).
+
+2004-07-19 20:04  masterpe
+
+	* po/nl.po:	* po/nl.po: Polished up the translation
+
+2004-07-19 05:09  masterpe
+
+	* po/nl.po: Modified Files:	po/nl.po
+
+	  * L. Buhler	  Updated the dutch translation
+
+2004-07-19 04:43  quirk_fr
+
+	* po/fr.po: - Updated french translation
+
+2004-07-19 04:26  masterpe
+
+	* po/nl.po: Modified Files:	po/nl.po
+
+	  * L. Buhler	  Updated the Dutch translation
+
+2004-07-18 16:49  descender
+
+	* po/: bmp.pot, zh_CN.po:
+	  * bmp.pot: Update PO template.  * zh_CN.po: Update Simplified
+	  Chinese translation.
+
+2004-07-18 16:36  descender
+
+	* Input/: mpg123/configure.c, vorbis/configure.c:
+	  * Input/mpg123/configure.c, Input/vorbis/configure.c: HIGify
+	  mpg123/vorbis   plugin configuration dialog title.
+
+2004-07-18 16:30  descender
+
+	* beep/: Makefile.am, beep_eq.xpm, beep_mini.xpm,
+	  beep_playlist.xpm, equalizer.c, main.c, playlistwin.c,
+	  images/Makefile.am, images/bmp_eq.xpm, images/bmp_player.xpm,
+	  images/bmp_playlist.xpm:
+	  * main.c, playlistwin.c, equalizer.c: Use new window icons.  *
+	  beep_mini.xpm: Remove.  * images/bmp_player.xpm: New BMP player
+	  window icon (from icons/bmp.svg).  * images/bmp_eq.xpm,
+	  images/bmp_playlist.xpm: Moved and renamed from
+	  beep_playlist.xpm and beep_eq.xpm * Makefile.am: Update according
+	  to file changes.
+
+2004-07-18 16:03  descender
+
+	* beep/: Makefile.am, build.list, cda.png, harddisk.png,
+	  jump_time.png, jump_to.h, jump_to.png:
+	  * Makefile.am, build.list: Remove unused icons.  * cda.png,
+	  harddisk.png, jump_time.png, jump_to.png: Remove unused icons.  *
+	  jump_to.h: Remove unused file.
+
+2004-07-18 15:33  descender
+
+	* beep/glade/prefswin.glade:
+	  * prefswin.glade: Remove Plugin->Settings tab.
+
+2004-07-18 14:10  descender
+
+	* beep/glade/prefswin.glade:
+	  * prefswin.glade: Changed Preferences window's 'delete-event'
+	  handler to   gtk_widget_hide_on_delete() (was gtk_widget_hide()).
+
+2004-07-18 12:04  descender
+
+	* po/nl.po:
+	  * nl.po: Fixed broken msgstrs.
+
+2004-07-17 20:05  descender
+
+	* Input/mpg123/mpg123.c: * mpg123.c: Applied ID3 encoding patch
+	  update (Dan Korostelev).
+
+2004-07-16 08:11  msikkes
+
+	* AUTHORS: Woops, forgot to add Laurens last name. Here it is.
+
+2004-07-16 08:10  msikkes
+
+	* po/ru.po: Russian translation update by Dan Korostelev
+	  <dan at ats.energo.ru>
+
+2004-07-16 08:08  msikkes
+
+	* AUTHORS: Added Laurens to the Translators section in AUTHORS file
+	  for his Dutch translation.  CVS:
+
+2004-07-16 08:06  msikkes
+
+	* po/: LINGUAS, nl.po: - Added nl to LINGUAS - Added Dutch
+	  translation by Laurens <masterpe at xs4all.nl>
+
+2004-07-12 17:21  descender
+
+	* beep/playlistwin.c:
+	  * playlistwin.c (playlistwin_create_window): Undo last change
+	  (put back   playlistwin_set_geometry_hints).
+
+2004-07-12 16:32  descender
+
+	* beep/: main.c, mainwin.c, playlist.c, skinwin.c, util.c:
+	  * util.c (filebrowser_on_response): Close (destroy) dialog on
+	  add.	* mainwin.c (dirbrowser_on_response): Close (hide) dialog
+	  on add.  * main.c (main): Show main window last and playlist
+	  editor second last so   that main window gets initial focus (if
+	  it's not visible, then playlist   editor gets the focus).
+
+2004-07-12 16:05  descender
+
+	* beep/: main.c, mainwin.c, mainwin.h, playlistwin.c:
+	  * main.c (bmp_default_config): Make BMP load metadata on view
+	  (demand) by	default.  * main.c (main), mainwin.[ch]
+	  (create_popups): Fix crash when starting with   main window
+	  shaded.  * playlistwin.c (playlistwin_create_window): Don't set
+	  geometry hints here,	 it is already set via the main window menu
+	  handler.
+
+2004-07-11 21:25  descender
+
+	* beep/: main.c, main.h, prefswin.c:
+	  * main.c, main.h: Fixed incorrect default titlestring preset
+	  (should be   'ARTIST - TITLE', was 'TITLE'), removed some unused
+	  code.  * prefswin.c (on_titlestring_cbox_realize): Test for
+	  preset with	n_titlestring_presets.
+
+2004-07-11 18:52  descender
+
+	* beep/: prefswin.c, skinwin.c, glade/prefswin.glade:
+	  * skinwin.c (skin_view_realize): Don't update skin view here.
+	  (skin_vew_update):   Set skin view cursor (skin) after update
+	  loop.  * prefswin.c: Skin view now updates only the first time it
+	  turns visible   after Preferences window is launched, added some
+	  convenience functions,   fixed compiler warnings.  *
+	  glade/prefswin.glade: Give skin view scrolled window a name, add
+	  visibility   notify event callback for skin view, remove requires
+	  on GNOME (ugh).
+
+2004-07-10 22:49  mderezynski
+
+	* beep/: prefswin.c, glade/prefswin.glade:
+
+	  prefswin.c: Added effect plugins view, configuration etc
+	  glade/prefswin.glade: GtkHPane instead of fixed layout, effect
+	  plugins tab
+
+2004-07-10 21:33  mderezynski
+
+	* beep/: prefswin.c, glade/prefswin.glade:
+
+	  prefswin.c: Enabled visualization plugins configure and info
+	  glade/prefswin.glade: Set the category selection view width to
+	  140px default
+
+2004-07-10 20:39  quirk_fr
+
+	* po/fr.po: -Updated translations
+
+2004-07-10 13:04  descender
+
+	* Input/mpg123/: configure.c, mpg123.c, mpg123.h:
+	  * configure.ac, mpg123.c, mpg123.h: Applied Dan Korostelev's
+	  patch to let	 user configure encoding to assume for ID3 tags.
+
+2004-07-09 12:37  descender
+
+	* beep/: main.c, mainwin.c, mainwin.h, playlistwin.c, skin.c,
+	  skin.h:
+	  * playlistwin.c: Remove playlistwin_play_menu* and use
+	  mainwin_play_menu*,	replaced icon for 'New List' with
+	  GTK_STOCK_NEW.  * main.c, mainwin.c, mainwin.h (create_popups):
+	  Rename function to   mainwin_create_popups(), call it in
+	  mainwin_create() instead of main().	 Added some more stock
+	  icons to menu popups.
+
+2004-07-09 01:54  descender
+
+	* Input/vorbis/fileinfo.c:
+	  * fileinfo.c (vorbis_file_info_box): Convert filename to UTF-8
+	  for display,	 fix compilation error with ALL_VORBIS_TAGS
+	  defined.
+
+2004-07-08 09:48  descender
+
+	* Input/mpg123/fileinfo.c, Input/vorbis/fileinfo.c,
+	  beep/playlist.c, libbeep/configdb_rcfile.c, libbeep/vfs.h,
+	  libbeep/vfs_gnome.c, libbeep/vfs_stdio.c:
+	  * configdb_rcfile.c (bmp_cfg_db_open): Use g_build_filename() in
+	  place of g_strconcat().  * vfs_stdio.c, vfs_gnome.c, vfs.h:
+	  Implement vfs_is_writeable() and   vfs_truncate().  *
+	  Input/*/fileinfo.c: Complete porting file handling code to VFS
+	  using the   two new functions above.	* playlist.c: Indentation
+	  fixes.
+
+2004-07-07 23:32  descender
+
+	* beep/util.h:
+	  * util.h (util_create_add_url_window): Rename to
+	  util_add_url_dialog_new(),   also fixes compiler warning.
+
+2004-07-07 23:30  descender
+
+	* beep/prefswin.c:
+	  * prefswin.c (create_prefs_window): Remove 'playlist_update'
+	  widget.
+
+2004-07-07 21:43  descender
+
+	* beep/: mainwin.c, mainwin.h, playlist.c, playlistwin.c,
+	  skinwin.c, util.c, util.h:
+	  * mainwin.c, mainwin.h, playlistwin.c, util.c, util.h: Clean up
+	  filebrowser	and dirbrowser code.  * skinwin.c
+	  (skin_view_update): Don't hide skin list during update.  *
+	  playlist.c (playlist_dir_find_files): Replace while loop with
+	  for.
+
+2004-07-07 20:47  descender
+
+	* beep/util.c:
+	  * util.c: Clean up file browser signal handling.
+	  (filebrowser_add_files):   Remove g_free() in loop (made
+	  extraneous by last commit).
+
+2004-07-07 19:57  descender
+
+	* beep/: equalizer.c, playlistwin.c, util.c:
+	  * equalizer.c, playlistwin.c, util.c: Fixed memory leaks
+	  associated with   filenames returned with
+	  gtk_file_chooser_get_filename*().
+
+2004-07-07 19:47  descender
+
+	* beep/mainwin.c:
+	  * mainwin.c: Generalize and rename directory browser functions.
+
+2004-07-07 18:25  descender
+
+	* beep/: input.c, visualization.c:
+	  * input.c: (input_show_unplayable_files): HIGify dialog i.e. use
+	  GtkMessageDialog, and expander to show/hide file list.  *
+	  visualization.c: Minor clean-ups.
+
+2004-07-07 18:01  descender
+
+	* beep/: playback.c, playlistwin.c, prefswin.c:
+	  * playback.c: HIGify 'No output plugin' dialog.  * prefswin.c:
+	  Stop playback when user changes output plugin.  * playlistwin.c:
+	  Removed unused code. (playlistwin_set_shade): Combine the   two
+	  gtk_window_resize(), put playlistwin_set_geometry_hints() after
+	  dock_shade() call.
+
+2004-07-07 16:07  descender
+
+	* beep/glade/prefswin.glade:
+	  * prefswin.glade: Remove GNOME requires line (wtf is wrong with
+	  Glade?).
+
+2004-07-07 15:56  descender
+
+	* beep/: bmp.desktop.in, main.c, mainwin.c, prefswin.c, prefswin.h,
+	  visualization.c:
+	  * bmp.desktop.in (Terminal): Replace 0 with false.  * prefswin.c
+	  (change_category): Swap arguments. (prefswin_set_category):	New
+	  function.  * prefswin.c, prefswin.h, visualization.c: Remove
+	  prefswin_plugins_rescan()   and prefswin_show_vis_plugins_page().
+	  * mainwin.c: Remove 'Visualization Plugins' option in
+	  mini-visualizer popup.  * main.c: Indentation fix.
+
+2004-07-07 15:30  descender
+
+	* bmp.pc.in:
+	  * bmp.pc.in (Name): Change to 'BMP'. (Requires): Remove
+	  gthread-2.0, add   glib-2.0.
+
+2004-07-07 15:27  descender
+
+	* beep/: prefswin.c, glade/prefswin.glade:
+	  * prefswin.glade: Hide equalizer preset list and action buttons.
+	  * prefswin.c: Moved change_category(), indentation fixes.
+
+2004-07-07 14:54  descender
+
+	* beep/glade/prefswin.glade:
+	  * prefswin.glade: Added missing 'realize' handler for
+	  playlist_show_pl_numbers.
+
+2004-07-07 14:08  descender
+
+	* libbeep/: configdb.h, configdb_gconf.c, configdb_rcfile.c:
+	  * configdb.h: Make ConfigDb opaque.  * configdb_gconf.c,
+	  configdb_rcfile.c: Define _ConfigDb, indentation fixes.
+
+2004-07-07 13:51  descender
+
+	* libbeep/: vfs.h, vfs_gnome.c, vfs_stdio.c:
+	  * vfs.h: changed 1st argument of vfs_fwrite() to type
+	  gconstpointer, make	VFSFile opaque, add <stdio.h> include for
+	  SEEK_* macros * vfs_gnome.c, vfs_stdio.c: define _VFSFile struct,
+	  indentation fixes
+
+2004-07-07 09:11  descender
+
+	* po/LINGUAS, po/ru.po, AUTHORS, beep/about.c:
+	  * LINGUAS, ru.po: added Russian translation by Pavlo Bohmat *
+	  AUTHORS, about.c: added Pavlo Bohmat to translator list
+
+2004-07-06 17:41  descender
+
+	* bmp.spec.in:
+	  * bmp.spec.in: follow Fedora packaging guidelines as far as
+	  possible
+
+2004-07-06 15:28  descender
+
+	* po/zh_CN.po:
+	  * zh_CN.po: updated Simplifie Chinese translation
+
+2004-07-06 13:20  descender
+
+	* AUTHORS, beep/about.c, po/LINGUAS, po/ko.po:
+	  LINGUAS, ko.po: added Korean translation by DongCheon Park
+	  AUTHORS, about.c: added Korean translator to credits list
+
+2004-07-06 05:55  quirk_fr
+
+	* po/fr.po: - Updated translation
+
+2004-07-06 05:44  msikkes
+
+	* Input/vorbis/fileinfo.c: Fixed a typo. A comment wasn't closed
+	  properly which blocked compiling.
+
+2004-07-05 09:54  mderezynski
+
+	* beep/mainwin.c:
+
+	  fix typo
+
+2004-07-05 09:33  mderezynski
+
+	* Input/mpg123/fileinfo.c, Input/vorbis/fileinfo.c, beep/skinwin.c,
+	  beep/util.c, beep/glade/prefswin.glade:
+
+	  Input/mpg123/fileinfo.c, Input/vorbis/fileinfo.c: Disabled file
+	  stat() check when using GNOME VFS beep/skinwin.c: hide skin
+	  treeview while building the list beep/glade/prefswin.glade: Some
+	  button order changes beep/util.c: Filebrowser changes. Open will
+	  invoke a dialog with "Open (files)" and "Close (dialog)" *only*
+	  now, and "Add" from the playlist with "Add" and "Close" only, so
+	  that there is a unique way for both procedures which is easier to
+	  grasp intuitively
+
+2004-07-04 20:22  descender
+
+	* Output/alsa/configure.c:
+	  * configure.c: replaced GTK signal calls with GSignal equivalents
+	  (also fixes compiler warnings)
+
+2004-07-04 20:08  descender
+
+	* beep/prefswin.c:
+	  * prefswin.c (on_pl_metadata_on_display_toggled):
+	  cfg.get_info_on_demand wrongly set (inverted)
+
+2004-07-04 19:54  descender
+
+	* beep/: main.c, plugin.h:
+	  * main.c, plugin.h: fixed compiler warning (make
+	  xmms_get_gentitle_format   return const gchar *, instead of gchar
+	  *)
+
+2004-07-04 19:39  descender
+
+	* beep/glade/prefswin.glade:
+	  * prefswin.glade: hide category notebook tabs (accidentally made
+	  visible during   last edit, silly Glade provides no better way to
+	  switch tabs)
+
+2004-07-04 19:36  descender
+
+	* beep/: main.c, prefswin.c, skin.c, glade/prefswin.glade:
+	  * main.c, skin.c: indentation fixes * prefswin.c,
+	  glade/prefswin.glade: fixed compiler warnings, pushed some signal
+	  connection   calls to libglade, custom title string entry now
+	  inserts tags at cursor position instead   of end, custom title
+	  string setting no longer lost after every session
+
+2004-07-03 08:29  descender
+
+	* beep/logger.h:
+	  * logger.h: fixed log file size threshold to 512kb (was 512)
+
+2004-07-02 00:27  mderezynski
+
+	* beep/: main.c, main.h, prefswin.c, skin.c, skin.h,
+	  glade/prefswin.glade:
+	  Added option to turn custom cursors off internally and into
+	  preferences window
+
+2004-07-01 17:09  mderezynski
+
+	* beep/: main.c, main.h, prefswin.c, util.c, util.h,
+	  glade/prefswin.glade:
+
+	  main.c, main.h, prefswin.c, util.c, util.h, glade/prefswin.glade
+
+2004-06-30 07:53  descender
+
+	* beep/glade.c:
+	  * glade.c (map_connect_func): add GCallback->gpointer cast to
+	  shut Sun CC up
+
+2004-06-30 06:07  mderezynski
+
+	* beep/logger.c:
+
+	  Removed unneccessary include for stdio_ext.h
+
+2004-06-30 05:53  mderezynski
+
+	* beep/logger.c:
+
+	  Fix compile problem (added include for sys/stat.h)
+
+2004-06-30 05:13  descender
+
+	* beep/: glade.h, logger.c, logger.h:
+	  * glade.h: change FuncMap::function type to GCallback * logger.c,
+	  logger.h: truncate log file on start-up, set threshold size to
+	  512kb (closes #89)
+
+2004-06-30 04:41  quirk_fr
+
+	* po/fr.po: - Updated translation - Fixed few mistakes
+
+2004-06-29 02:30  er-ku
+
+	* po/lt.po: Cosmetic changes to conform with common policy:
+
+	  Nuostatos >> nustatymai Katalogas >> aplankas
+
+2004-06-29 02:02  er-ku
+
+	* po/lt.po: translation update
+
+2004-06-28 22:19  larne
+
+	* configure.ac, beep/glade.c, beep/glade.h, po/fr.po: compile fixes
+
+2004-06-28 21:25  larne
+
+	* po/POTFILES.in: - lets try removing the correct file...
+
+2004-06-28 21:16  larne
+
+	* po/POTFILES.in: - remove dirbrowser.c
+
+2004-06-28 09:35  descender
+
+	* beep/: input.c, main.c, mainwin.c, plugin.h, pluginenum.c,
+	  pluginenum.h, prefswin.c, skinwin.c:
+	  - fixed compiler warnings introduced in last commit - renamed Add
+	  Folders dialog title to 'Add Folders' - hide instead of
+	  destroying Add Folders dialog on close - revert
+	  InputPlugin::set_info() signature to gchar * for title (save
+	  plugin writers' headaches) - renamed pluginmatrix to
+	  plugin_matrix - fixed memory leak when replacing keys in
+	  plugin_matrix - fixed incorrect value comparator for
+	  plugin_matrix - fixed memory leak in skin_view_update() - trivial
+	  clean-ups
+
+2004-06-28 06:30  mderezynski
+
+	* beep/playlist_list.c:
+	  rendering problem fixed (number column seperator was drawn too
+	  short)
+
+2004-06-28 06:11  mderezynski
+
+	* beep/: mainwin.c, prefswin.c:
+	  Dropping a font on mainwin now also updates the GtkFontButton in
+	  the preferences window
+
+2004-06-28 05:36  mderezynski
+
+	* beep/: mainwin.c, mainwin.h, prefswin.c:
+	  When dropping a skin file on the main window, the skin view gets
+	  updated accordingly now. I had to g_signal_connect() a mainwin
+	  signal inside prefswin.c for that because we only there have
+	  access to prefswin's glade XML. Well.
+
+2004-06-28 05:02  mderezynski
+
+	* beep/: mainwin.c, playlistwin.c, prefswin.c, skinwin.c,
+	  skinwin.h, util.c, glade/prefswin.glade:
+
+	  Skin view now always scrolls to the currently active skin
+
+2004-06-28 01:54  mderezynski
+
+	* beep/: mainwin.c, playlistwin.c:
+
+	  changed "Add Directories" to "Add Folders" (menus)
+
+2004-06-28 01:17  mderezynski
+
+	* beep/: main.c, mainwin.c, playlistwin.c, util.c,
+	  glade/Makefile.am, glade/dirbrowser.glade:
+
+	  indentation
+
+2004-06-28 00:56  mderezynski
+
+	* beep/: Makefile.am, dirbrowser.c, dirbrowser.h, main.c,
+	  mainwin.c, playlistwin.c, util.c, glade/dirbrowser.glade:
+
+	  dirbrowser.c, dirbrowser.h, Makefile.am, main.c, mainwin.c,
+	  playlistwin.c, glade/dirbrowser.glade, util.c: Replaced custom
+	  dirbrowser trough GtkFileChooser in SELECT_FOLDER mode, removed
+	  dirbrowser.c/.h, incorporated code into mainwin.c
+
+2004-06-27 08:54  descender
+
+	* Input/cdaudio/configure.c, Input/mpg123/configure.c,
+	  Input/mpg123/fileinfo.c, Input/vorbis/configure.c,
+	  Input/vorbis/fileinfo.c, Output/OSS/configure.c,
+	  Output/alsa/configure.c, Output/esd/configure.c,
+	  Visualization/blur_scope/blur_scope.c,
+	  Visualization/blur_scope/config.c, beep/equalizer.c,
+	  beep/output.c, beep/plugin.h, beep/prefswin.c, beep/util.c,
+	  beep/glade/dirbrowser.glade, libbeep/dirbrowser.c:
+	  - fixed various windows hidden below always-on-top main player
+	  windows (closes #107) - corrected preset dialogs' button order -
+	  replace gdk_window_raise() calls with gtk_window_present() -
+	  minor clean-ups
+
+2004-06-27 06:31  descender
+
+	* beep/glade/prefswin.glade:
+	  - revert window hint type to dialog
+
+2004-06-27 06:18  descender
+
+	* beep/glade/prefswin.glade:
+	  - HIGification - added title format combo box entry
+
+2004-06-26 20:16  descender
+
+	* Input/mpg123/mpg123.c, Visualization/blur_scope/blur_scope.c,
+	  beep/eq_graph.c, beep/main.c, beep/playlist_popup.c,
+	  beep/playlistwin.c, beep/skin.c, beep/skin.h, beep/textbox.c:
+	  - replaced gdk_{gc,pixmap,pixbuf}_unref()s with g_object_unref()
+	  - miscellaneous minor clean-ups
+
+2004-06-26 18:51  quirk_fr
+
+	* po/fr.po: - updated translation
+
+2004-06-26 16:25  descender
+
+	* beep/controlsocket.c:
+	  - fixed freeze when adding unplayable files with third-party
+	  applications, thanks to Bernard Blackham (closes #54)
+
+2004-06-26 01:06  descender
+
+	* AUTHORS, po/bmp.pot, po/cy.po, po/de.po, po/es.po, po/fr.po,
+	  po/ja.po, po/lt.po, po/pl.po, po/sv.po, po/zh_CN.po:
+	  - updated AUTHORS - sync po/pot files
+
+2004-06-26 01:02  descender
+
+	* configure.ac, libbeep/configdb_gconf.c, beep/Makefile.am,
+	  beep/about.c, beep/beep.desktop.in, beep/bmp.desktop.in,
+	  beep/logger.h, beep/main.c, libbeep/rcfile.c, libbeep/rcfile.h,
+	  beep/prefswin.c, beep/skin.c, beep/glade/prefswin.glade,
+	  icons/Makefile.am, icons/beep.svg, icons/bmp.svg:
+	  - renamed beep.{svg,desktop.in} to bmp.{svg,desktop.in} - renamed
+	  font labels to 'player:' and 'playlist:' - minor clean-ups
+
+2004-06-26 00:22  descender
+
+	* bmp.pc.in:
+	  - add search path to library flags (closes #110)
+
+2004-06-25 09:43  descender
+
+	* beep/controlsocket.c, libbeep/beepctrl.c:
+	  - fixed {write,read}_all() usage, thanks to Sebatian Kapfer
+	  (closes #102)
+
+2004-06-25 09:01  descender
+
+	* beep/controlsocket.c, libbeep/beepctrl.c:
+	  - fixed incorrect return count for write_all() and read_all()
+	  when socket read/writes time out
+
+2004-06-24 22:46  descender
+
+	* bmp.spec.in:
+	  - added optional build support for GConf and GNOME VFS - fixed
+	  file list
+
+2004-06-24 21:18  descender
+
+	* Input/: mpg123/fileinfo.c, vorbis/fileinfo.c, vorbis/vorbis.c:
+	  - fixed gtk_widget_grab_default() warnings with the MPEG tag
+	  editor - fixed crash when opening track information for vorbis
+	  streams (closes #30) - changed MPEG and vorbis tag editor title
+	  format to "filename - BMP" - removed some unused code
+
+2004-06-24 13:24  descender
+
+	* beep/: equalizer.c, mainwin.c, playlistwin.c:
+	  - set window roles for player, playlist and equalizer window
+	  (closes #88, thanks to Jon Dowland)
+
+2004-06-24 12:55  descender
+
+	* Input/vorbis/fileinfo.c, beep/prefswin.c:
+	  - stop BMP from crashing when vorbis file comments are not of the
+	  form "x=y" - removed superfluous empty category in preferences
+	  window
+
+2004-06-24 11:20  descender
+
+	* Input/vorbis/: fileinfo.c, vcedit.c, vcedit.h:
+	  - fixed vorbis tag editor treating comment field names in a
+	  case-sensitive manner - fixed memory leak in
+	  get_comment_list_hash() (now hash_table_from_vorbis_comment())
+
+2004-06-23 07:50  descender
+
+	* libbeep/: Makefile.am, configfile.c, configfile.h:
+	  - re-add configfile.[ch] for backward compatibility
+
+2004-06-23 07:19  descender
+
+	* beep/: dirbrowser.c, equalizer.c, glade.c, playlist_list.c,
+	  playlist_popup.c, playlistwin.c, prefswin.c, skin.c:
+	  - fixed compiler warnings - fixed screwed up indentations (indent
+	  is still too dumb) - removed some unused code
+
+2004-06-23 06:58  descender
+
+	* po/de.po:
+	  - update German translation (Matthias Debus)
+
+2004-06-22 01:59  mderezynski
+
+	* beep/: playlist_popup.c, skin.c:
+
+	  playlist_popup.c: Fixes Bug #84: Add files expanded list appears
+	  in upper left
+
+2004-06-22 00:39  mderezynski
+
+	* beep/skin.c:
+
+	  skin.c, util.c: Fixed bug when loading skin without custom
+	  cursors the app wouldn't set the current default theme's standard
+	  cursor
+
+2004-06-21 22:31  mderezynski
+
+	* beep/skin.c:
+
+	  skin.c: Added (simplified) support for Winamp2 skin cursors using
+	  Xcursor
+
+2004-06-21 22:00  mderezynski
+
+	* beep/: playback.c, prefswin.c, glade/prefswin.glade,
+	  images/Makefile.am, images/eq.png, images/mouse.png,
+	  images/playlist.png:
+
+	  beep/images/eq.png:		  New File
+	  beep/images/playlist.png:	 Small changes
+	  beep/images/mouse.png:	    Small changes
+	  beep/images/Makefile.am:  Added eq.png beep/glade/prefswin.glade:
+	  Default size of category list now 120px
+
+2004-06-21 20:04  mderezynski
+
+	* beep/: mainwin.c, playlist_list.c, playlistwin.c:
+
+	  dock.c, mainwin.c, playlist_list.c, playlistwin.c, util.c: Fixes
+	  Bug #24: cannot un-windowshade playlist when started as
+	  windowshade
+
+2004-06-21 02:48  mderezynski
+
+	* Input/cdaudio/cdaudio.c, Input/cdaudio/cddb.c,
+	  Input/cdaudio/cdinfo.c, Input/cdaudio/configure.c,
+	  Input/cdaudio/http.c, Input/mpg123/common.c,
+	  Input/mpg123/configure.c, Input/mpg123/dct64.c,
+	  Input/mpg123/dct64_i386.c, Input/mpg123/decode.c,
+	  Input/mpg123/decode_2to1.c, Input/mpg123/decode_4to1.c,
+	  Input/mpg123/decode_i386.c, Input/mpg123/dxhead.c,
+	  Input/mpg123/equalizer.c, Input/mpg123/fileinfo.c,
+	  Input/mpg123/getbits.c, Input/mpg123/http.c, Input/mpg123/id3.c,
+	  Input/mpg123/id3_frame.c, Input/mpg123/id3_frame_content.c,
+	  Input/mpg123/id3_frame_text.c, Input/mpg123/id3_frame_url.c,
+	  Input/mpg123/id3_tag.c, Input/mpg123/layer1.c,
+	  Input/mpg123/layer2.c, Input/mpg123/layer3.c,
+	  Input/mpg123/mpg123.c, Input/mpg123/tabinit.c,
+	  Input/vorbis/configure.c, Input/vorbis/fileinfo.c,
+	  Input/vorbis/http.c, Input/vorbis/vcedit.c,
+	  Input/vorbis/vorbis.c, Input/wav/wav.c, Output/OSS/OSS.c,
+	  Output/OSS/about.c, Output/OSS/audio.c, Output/OSS/configure.c,
+	  Output/OSS/convert.c, Output/OSS/init.c, Output/OSS/mixer.c,
+	  Output/alsa/about.c, Output/alsa/alsa.c, Output/alsa/audio.c,
+	  Output/alsa/configure.c, Output/alsa/init.c, Output/esd/about.c,
+	  Output/esd/audio.c, Output/esd/configure.c, Output/esd/esd.c,
+	  Output/esd/init.c, Output/esd/mixer.c,
+	  Visualization/blur_scope/blur_scope.c,
+	  Visualization/blur_scope/config.c, beep/about.c,
+	  beep/controlsocket.c, beep/dirbrowser.c, beep/dock.c,
+	  beep/dock.h, beep/effect.c, beep/eq_graph.c, beep/eq_slider.c,
+	  beep/eq_slider.h, beep/equalizer.c, beep/fft.c,
+	  beep/fullscreen.c, beep/general.c, beep/getopt.c, beep/getopt.h,
+	  beep/getopt1.c, beep/glade.c, beep/glade.h, beep/hints.c,
+	  beep/hslider.c, beep/iir.c, beep/iir.h, beep/input.c,
+	  beep/main.c, beep/main.h, beep/mainwin.c, beep/menurow.c,
+	  beep/mkdtemp.c, beep/monostereo.c, beep/number.c, beep/output.c,
+	  beep/output.h, beep/pbutton.c, beep/pbutton.h, beep/playback.c,
+	  beep/playlist.c, beep/playlist_list.c, beep/playlist_list.h,
+	  beep/playlist_popup.c, beep/playlist_slider.c,
+	  beep/playlistwin.c, beep/playstatus.c, beep/plugin.h,
+	  beep/pluginenum.c, beep/pluginenum.h, beep/prefswin.c,
+	  beep/sbutton.c, beep/skin.c, beep/skinwin.c, beep/softvolume.c,
+	  beep/svis.c, beep/tbutton.c, beep/textbox.c, beep/urldecode.c,
+	  beep/util.c, beep/util.h, beep/vis.c, beep/vis.h,
+	  beep/visualization.c, beep/widget.c, beep/widget.h,
+	  beep/xml_document.c, libbeep/beepctrl.c,
+	  libbeep/configdb_gconf.c, libbeep/configdb_rcfile.c,
+	  libbeep/dirbrowser.c, libbeep/formatter.c, libbeep/rcfile.c,
+	  libbeep/titlestring.c, libbeep/util.c, libbeep/vfs_gnome.c,
+	  libbeep/vfs_stdio.c, libbeep/xconvert.c, libbeep/xentry.c:
+
+	  indentation....
+
+2004-06-21 02:44  mderezynski
+
+	* beep/: mainwin.c, output.c, playlistwin.c:
+
+	  mainwin.c, playlistwin.c: Slight menu changes
+
+2004-06-21 01:22  mderezynski
+
+	* Input/vorbis/fileinfo.c:
+	  Input/vorbis/fileinfo.c	  Fixes another crash problem with
+	  OGG Vorbis file (replaced string vector	 usage with
+	  GHashTable, saved approx. 100 lines of code.....)
+
+2004-06-20 23:42  mderezynski
+
+	* Input/vorbis/fileinfo.c, Input/vorbis/vcedit.c,
+	  Input/vorbis/vcedit.h, beep/dirbrowser.c, beep/playlist_list.c,
+	  beep/util.c, beep/glade/dirbrowser.glade:
+
+	  Input/vorbis/*  Fixes Bug #46: Crash on vorbis file info dialog
+	  save
+
+	  beep/playlist_list.c	  Minor list rendering changes
+
+	  beep/dirbrowser.c beep/glade/dirbrowser.glade   Changes to make
+	  the main controls of dirbrowser look like our   GtkFileChooser
+
+2004-06-20 03:17  mderezynski
+
+	* beep/: dirbrowser.c, playlist_list.c, glade/dirbrowser.glade:
+
+	  dirbrowser.c: Added add file on double click functionality
+	  glade/dirbrowser.glade: Some more layout changes playlist_list.c:
+	  Reverted track number seperator to old behaviour (snap to zero if
+	  no files present)
+
+2004-06-20 02:05  mderezynski
+
+	* beep/: dirbrowser.c, playlist_list.c, playlistwin.c,
+	  glade/dirbrowser.glade:
+
+	  playlistwin.c, playlist_list.c: Fixes Bug #51: long text and file
+	  names overlap edge of playlist dirbrowser.c,
+	  glade/dirbrowser.glade: Removed "Add all" button ("Add" remains),
+	  and added "Select All" and "Select None" buttons instead
+
+2004-06-19 23:08  mderezynski
+
+	* beep/main.c:
+
+	  Fixes bug #70 and #72
+
+2004-06-14 22:24  er-ku
+
+	* po/lt.po: Commented out plural strings, as BMP wouldn't compile
+	  with them
+
+2004-06-14 22:10  er-ku
+
+	* po/lt.po: minor fix
+
+2004-06-14 21:59  er-ku
+
+	* po/lt.po: some stuff updated ;)`
+
+2004-06-14 01:27  mderezynski
+
+	* beep/: equalizer.c, main.c:
+
+	  Fixes Bug #21 (equalizer window not respecting always on top
+	  after restart) Patch provided by Patrick Sudowe
+	  (Patrick.Sudowe at web.de)
+
+2004-06-13 00:35  quirk_fr
+
+	* po/fr.po: Updated translations
+
+2004-06-03 12:27  descender
+
+	* beep/: dirbrowser.c, glade/dirbrowser.glade:
+	  - fixed add button - fixed memory leaks in
+	  on_dirview_row_selected() and fb_enq_play() - removed useless
+	  (and locale-incorrect) sort comparator for file view
+
+2004-06-03 10:10  descender
+
+	* beep/: dirbrowser.c, dirbrowser.h, glade.c, playlistwin.c,
+	  glade/dirbrowser.glade:
+	  beep/glade.c: make glade_xml_signal_autoconnect_map() resolve
+	  linked in symbols as well beep/dirbrowser.[ch],
+	  beep/glade/dirbrowser.glade: clean up beep/playlistwin.c: clean
+	  up
+
+2004-05-30 03:07  descender
+
+	* beep/playlistwin.c:
+	  - fixed loading and saving of playlist using playlist editor
+
+2004-05-28 06:35  mderezynski
+
+	* beep/prefswin.c:
+
+	  Enabled visualization plugin enable/disable toggle
+
+2004-05-28 06:06  descender
+
+	* po/pl.po:
+	  - update Polish translation (Jacek Wolszczak)
+
+2004-05-28 04:45  descender
+
+	* bmp.spec.in:
+	  - update RPM spec file (add libglade2 dependencies)
+
+2004-05-28 04:30  descender
+
+	* beep/equalizer.c:
+	  - remove client event callback for equalizer window widget
+
+2004-05-26 23:57  descender
+
+	* beep/prefswin.c:
+	  - fixed compiler warnings
+
+2004-05-26 09:09  descender
+
+	* beep/glade/prefswin.glade:
+	  - last commit broken
+
+2004-05-26 09:08  descender
+
+	* beep/: equalizer.c, prefswin.c:
+	  - moved equalizer configuration into preferences window, removed
+	  'Configure Equalizer' from equalizer menu
+
+2004-05-26 07:35  descender
+
+	* beep/glade/prefswin.glade:
+	  - added directory preset filename and file preset extension entry
+	  boxes - added GtkAlignments to mouse page - set plugin view
+	  scrolled window policies to automatic
+
+2004-05-26 06:27  mderezynski
+
+	* beep/glade/prefswin.glade:
+
+	  Changes to "Appearance" tab
+
+2004-05-26 05:39  mderezynski
+
+	* beep/prefswin.c:
+
+	  Added support and prefswin tab for visualization plugins
+	  (enable/disable not functional yet)
+
+2004-05-26 05:11  descender
+
+	* po/: bmp.pot, cy.po, de.po, es.po, fr.po, ja.po, lt.po, pl.po,
+	  sv.po, zh_CN.po:
+	  - sync pot/po files
+
+2004-05-26 05:00  descender
+
+	* beep/glade/prefswin.glade:
+	  - last commit broken
+
+2004-05-26 05:00  descender
+
+	* beep/prefswin.c:
+	  - added equalizer page to preferences window
+
+2004-05-26 03:37  descender
+
+	* beep/skinwin.c:
+	  - fixed memory leak in skin_view_on_cursor_changed() (temporary
+	  string not freed)
+
+2004-05-26 02:41  mderezynski
+
+	* beep/glade/prefswin.glade:
+
+	  Added vis plugins tab (not functional yet!)
+
+2004-05-26 01:33  descender
+
+	* beep/: general.c, general.h, input.c, input.h, main.c,
+	  pluginenum.c, util.c, util.h:
+	  - minor cleanups
+
+2004-05-25 23:40  descender
+
+	* beep/util.c:
+	  - fixed translation of '(invalid UTF-8)' text appended to
+	  non-UTF8 strings
+
+2004-05-25 08:35  descender
+
+	* beep/: mainwin.c, playlist.c:
+	  playlist.c: fixed memory leak in __playlist_ins_with_info()
+	  mainwin.c: fixed memory leak in play_medium()
+
+2004-05-25 06:27  mderezynski
+
+	* beep/glade/prefswin.glade:
+
+	  swapped main window font/playlist font (seems to be more handy
+	  now)
+
+2004-05-24 10:25  descender
+
+	* beep/: mainwin.c, playback.c, playback.h:
+	  - use GStaticMutex instead of GMutex for main window title lock -
+	  added bmp_playback_seek_relative() for relative time seeking
+
+2004-05-24 09:51  descender
+
+	* beep/: equalizer.c, hints.c, mainwin.c, mainwin.h, playlistwin.c,
+	  prefswin.c, util.c:
+	  - revert main window to app-paintable again
+
+2004-05-24 09:37  descender
+
+	* beep/mainwin.c:
+	  - fixed transparency problem with main window
+
+2004-05-24 09:07  descender
+
+	* beep/: equalizer.c, equalizer.h, mainwin.c, playlistwin.c:
+	  mainwin.c, playlistwin.c: don't trap client events for main
+	  window and playlist editor equalizer.[ch]: use
+	  gtk_window_present() instead of gdk_window_raise(), make
+	  equalizer_set_shape_mask() and equalizer_set_back_pixmp() static,
+	  added code to build preset list view with GtkTreeView
+
+2004-05-23 06:23  mderezynski
+
+	* beep/glade/prefswin.glade:
+
+	  Set plugin configuration/about buttons to insensitive by default
+	  (no plugins -> can't choose it)
+
+2004-05-22 08:37  mderezynski
+
+	* Output/alsa/: alsa.c, alsa.h, audio.c, configure.c, init.c:
+
+	  Updated to alsa from current XMMS CVS
+
+2004-05-22 07:11  descender
+
+	* po/de.po:
+	  - updated German translation (Matthias Debus)
+
+2004-05-22 05:57  larne
+
+	* beep/mainwin.c: - fix bug #68 (Main window position not saved) -
+	  configure_event signal   was connected to mainwin, not
+	  mainwin_window.
+
+2004-05-20 14:37  descender
+
+	* beep/about.c, beep/glade/prefswin.glade, Output/esd/esd.c:
+	  - last commit broken
+
+2004-05-20 14:36  descender
+
+	* po/zh_CN.po:
+	  - updated credits in About dialog - fixed ESD plugin title
+	  localization - fixed button box padding for general plugin tab -
+	  fixed and updated zh_CN translation
+
+2004-05-19 07:33  descender
+
+	* beep/glade/prefswin.glade:
+	  - last commit broken
+
+2004-05-19 07:32  descender
+
+	* po/zh_CN.po:
+	  - fixed pango markups of 'Preferences Window' plugin tab labels -
+	  updated and fixed zh_CN translations
+
+2004-05-19 02:44  larne
+
+	* beep/: main.c, mainwin.c, playback.c, playlist.c: - apply patch
+	  from Bernard B <mailto:b-lythebugzilla at blackham.com.au>   to fix
+	  Xlib/threading issues causing hangs.	This appears to close	bug
+	  #40 <URL:http://www.lythe.org.uk/bugs/show_bug.cgi?id=40>.  -
+	  restore saving of playlist position on exit which I broke in the
+	  config cleanups (this could do with a review because it's a bit
+	  of   a hack).
+
+2004-05-16 01:49  mderezynski
+
+	* beep/: equalizer.c, hints.c, mainwin.c, mainwin.h, playlistwin.c,
+	  prefswin.c, util.c:
+
+	  equalizer.c, hints.c, mainwin.c, mainwin.h, playlistwin.c,
+	  prefswin.c, util.c: (supposedly) fixed theme change bug
+
+2004-05-15 20:38  quirk_fr
+
+	* po/fr.po: Updated translations
+
+2004-05-13 10:09  descender
+
+	* beep/util.c:
+	  - 'Add URL' dialog now closes on adding (bug #60)
+
+2004-05-13 10:02  descender
+
+	* beep/: playlistwin.c, equalizer.c, mainwin.c:
+	  - fixed infamous GTK+ theme change bug (bug #36)
+
+2004-05-12 09:58  descender
+
+	* beep/glade/prefswin.glade:
+	  - last commit broken
+
+2004-05-12 09:57  descender
+
+	* beep/: glade.c, glade.h, prefswin.c:
+	  - added glade_xml_signal_autoconnect_map() - use
+	  glade_xml_signal_autoconnect() for 'Preferences window' - shorten
+	  spin buttons for mouse wheel scroll playlist / change volume
+	  settings
+
+2004-05-12 07:02  descender
+
+	* beep/: glade.c, glade.h, prefswin.c, glade/prefswin.glade:
+	  beep/glade.[ch]: added glade_xml_get_widget_warn()
+	  beep/prefswin.c, beep/glade/prefswin.glade: fixed GLib warnings
+	  and 'Pause between songs' widget ordering
+
+2004-05-12 05:54  descender
+
+	* beep/glade/prefswin.glade:
+	  - last commit broken
+
+2004-05-12 05:53  descender
+
+	* beep/prefswin.c:
+	  - give more intelligible names to widgets and respective
+	  callbacks - make plugin list view callbacks GtkTreeView-centric
+	  for easier auto-connection later - fixed memory leak with font
+	  name string when font is changed - set category/plugin list view
+	  headers with glade instead of using explicit GTK calls -
+	  miscellaneous cleanups
+
+2004-05-11 15:14  descender
+
+	* beep/: Makefile.am, dirbrowser.c, glade.c, glade.h, prefswin.c,
+	  util.c, util.h:
+	  - move glade_xml_new_or_die() into glade.c/glade.h
+
+2004-05-11 14:50  descender
+
+	* beep/glade/dirbrowser.glade:
+	  - give more intelligible names to dirbrowser widgets
+
+2004-05-11 13:07  descender
+
+	* beep/: dirbrowser.c, main.c, mainwin.c, playlistwin.c,
+	  prefswin.c, util.c, util.h:
+	  - HIGified and i18ned glade-file-load error dialog - marked 'Add
+	  Directories' dialog file list  headers as translatable - give
+	  intelligible names to dirbrowser widgets - fixed memory leaks in
+	  'Add Directories' dialog - speeded up 'Add Directories' word
+	  matching filter - cleaned up 'Add Directories' dialog code -
+	  avoid double calls to shade/unshade playlistwin when toggled with
+	  popup menu
+
+2004-05-11 08:58  descender
+
+	* bmp.pc.in:
+	  - removed bmp from include path provided with --cflags
+
+2004-05-11 07:39  descender
+
+	* AUTHORS:
+	  - update credits
+
+2004-05-10 23:42  descender
+
+	* beep/mainwin.c:
+	  - sped up Jump To File matching (bug #56, thanks to Bernard
+	  Blackham) - removed bogus g_free() on stack allocated time_str in
+	  mainwin_jump_to_time() (fixes #19, Bernard Blackham) - fixed
+	  memory leaks in mainwin_jump_to_file_match() - fixed memory leak
+	  in mainwin_jump_to_time_cb() (Bernard Blackham) - clicking Jump
+	  in Jump To File dialog without selections no longer crashes (bug
+	  #58, Bernard Blackham)
+
+2004-05-10 22:20  er-ku
+
+	* po/lt.po: media plugins table captions added
+
+2004-05-10 21:36  descender
+
+	* beep/prefswin.c:
+	  - added tab for general plugins (thanks to Oliver Blin)
+
+2004-05-10 01:03  quirk_fr
+
+	* po/fr.po: Updated translations
+
+2004-05-09 23:01  descender
+
+	* po/LINGUAS:
+	  - added Polish to LINGUAS
+
+2004-05-09 22:58  descender
+
+	* po/pl.po:
+	  - added Polish translation by Jacek Wolszczak
+	  <shutdownrunner at o2.pl>
+
+2004-05-07 12:46  descender
+
+	* beep/util.c:
+	  - standardize on "A_dd all" (button) for 'Add File' and 'Add
+	  Directory' dialog
+
+2004-05-07 12:39  descender
+
+	* beep/skinwin.c:
+	  - don't show n/a skins (without thumbnail and main.bmp)
+
+2004-05-07 12:04  descender
+
+	* po/zh_CN.po:
+	  - fixed colons and mpg123 plugin description spacing
+
+2004-05-07 11:54  descender
+
+	* beep/prefswin.c, Output/OSS/OSS.c, Output/alsa/alsa.c:
+	  - fixed localisation of visualization, output plugin descriptions
+	  and preferences window categories
+
+2004-05-07 11:52  descender
+
+	* po/zh_CN.po:
+	  - updated translations
+
+2004-05-07 08:31  descender
+
+	* libbeep/: Makefile.am, configdb.h, dirbrowser.h, formatter.h,
+	  rcfile.h, vfs.h:
+	  Makefile.am: add libbeep/rcfile.h to header installation
+	  libbeep/configdb.h, libbeep/dirbrowser.h, libbeep/rcfile.h:
+	  replace C linkage statements with G_BEGIN_DECLS/G_END_DECLS
+	  libbeep/formatter.h, libbeep/vfs.h: surround prototypes with
+	  G_BEGIN_DECLS/G_END_DECLS
+
+2004-05-05 05:45  descender
+
+	* beep/debug.h:
+	  - useless commit to test CIA bot script
+
+2004-05-05 05:35  descender
+
+	* beep/: dock.c, playlistwin.c:
+	  - shading/unshading playlist editor now pushes windows attached
+	  to its base again - removed useless function
+	  dock.c:configure_event()
+
+2004-05-05 05:02  descender
+
+	* beep/glade/dirbrowser.glade:
+	  - renamed directory browser window title to 'Add Directories',
+	  without the 'BMP:'
+
+2004-05-05 04:51  descender
+
+	* beep/: dock.c, dock.h, equalizer.c, equalizer.h, mainwin.c,
+	  mainwin.h, playlistwin.c, playlistwin.h:
+	  - {mainwin,playlistwin,equalizerwin}_set_decorated() factored
+	  into dock_window_set_decorated() - fixed equalizer and playlist
+	  window added twice into dock
+
+2004-05-05 04:24  descender
+
+	* beep/: dock.c, dock.h, equalizer.c, mainwin.c, playlist.c,
+	  playlistwin.c, pluginenum.c, util.c, visualization.c:
+	  - replaced dock_set_uposition(), dock_get_widget_pos(),
+	  gdk_window_get_size() with gtk_window_move(),
+	  gtk_window_get_position() and gtk_window_get_size().	- fixed
+	  some weird indentations
+
+2004-05-04 00:33  larne
+
+	* configure.ac, beep/dirbrowser.c: - change libbeep soversion to 2,
+	  with the cfg_db changes it's not compatible	to 0.9.6.1's.
+
+2004-05-03 23:51  larne
+
+	* beep/mainwin.c: - re-add 'no playlist advance' to Options menu
+	  which disappeared somewhere.	  Patch from
+	  b-lythebugzilla at blackham.com.au (Bernard B) (Closes: #49)
+
+2004-05-03 23:46  larne
+
+	* beep/dirbrowser.c, beep/prefswin.c, beep/util.c, beep/util.h,
+	  po/bmp.pot, po/cy.po, po/de.po, po/es.po, po/fr.po, po/ja.po,
+	  po/lt.po, po/sv.po, po/zh_CN.po: - give an error when glade files
+	  can't be loaded, rather than just crashing.
+
+2004-05-03 04:40  descender
+
+	* m4/pkg.m4:
+	  - added pkgconfig's aclocal script
+
+2004-05-03 01:50  descender
+
+	* beep/util.c:
+	  - ability to set the unzip/tar command (for decompressing skin
+	  archives) using UNZIPCMD/TARCMD environment variables restored
+
+2004-05-03 01:33  descender
+
+	* beep/prefswin.c:
+	  - marked preferences window category list as translatable
+
+2004-05-03 01:11  descender
+
+	* Input/cdaudio/configure.c, Input/mpg123/configure.c,
+	  Input/vorbis/configure.c, Input/vorbis/fileinfo.c,
+	  Output/OSS/about.c, Output/OSS/configure.c, Output/alsa/about.c,
+	  Output/alsa/configure.c, Output/esd/about.c,
+	  Output/esd/configure.c:
+	  - restore localisation of input and output plugin configuration
+	  and information dialogs - removed redundant code in
+	  Input/vorbis/fileinfo.c
+
+2004-05-02 11:20  descender
+
+	* beep/util.h:
+	  - restore localisation of playlist editor popup menu and mpg123
+	  file info dialog
+
+2004-05-02 10:47  descender
+
+	* beep/input.c, beep/main.c, beep/main.h, libbeep/beepctrl.c,
+	  Input/mpg123/fileinfo.c, Input/mpg123/mpg123.c,
+	  Input/vorbis/fileinfo.c, Input/vorbis/vorbis.c,
+	  libbeep/formatter.c:
+	  beep/main.c, beep/main.h: fixed compilation error with missing
+	  #define for BMP_SKIN_THUMB_DIR_BASENAME beep/util.h,
+	  Input/mpg123/fileinfo.c: restore localisation of playlist editor
+	  popup menu and mpg123 file info dialog Input/mpg123/mpg123.c,
+	  Input/vorbis/vorbis.c: removed unused return_tag_value_by_name()
+	  functions in mpg123 and vorbis plugins Input/vorbis/vorbis.c:
+	  removed superfluous and incorrect UTF-8 conversion of vorbis file
+	  tags input.c: fixed memory leak with temporary string in
+	  input_is_enabled() libbeep/formatter.c, libbeep/beepctrl.c: use
+	  '#ifdef HAVE_CONFIG_H' instead of '#if defined(HAVE_CONFIG_H)'
+	  for consistency
+
+2004-05-02 08:35  descender
+
+	* beep/prefswin.c:
+	  - plugin configuration and information dialogs are no longer
+	  hidden by preferences window - minor cleanups
+
+2004-05-02 07:42  descender
+
+	* beep/mainwin.c:
+	  - uncommented mainwin_set_title() call in mainwin_set_info_text()
+	  to fix freeze on changing to track with UTF-8 tags (bugzilla #40)
+
+2004-05-02 07:39  descender
+
+	* beep/: prefswin.c, skinwin.c, skinwin.h:
+	  - fixed memory leaks with temporary strings in
+	  skin_get_thumbnail() - moved skin view realization code in
+	  prefswin.c into skinwin.c
+
+2004-05-02 05:34  larne
+
+	* beep/playlistwin.h: - make playlist default width the same as the
+	  mainwin
+
+2004-05-02 04:50  larne
+
+	* libbeep/titlestring.c: - use gstring instead of a static buffer
+	  for titlestring
+
+2004-05-01 21:07  descender
+
+	* beep/util.c:
+	  - removed 'Add selected' button from 'Add Files' dialog
+	  (redundant, 'Add' button provides same functionality) - reordered
+	  'Add Files' dialog button order to match 'Add Directories' dialog
+
+2004-05-01 19:54  descender
+
+	* beep/playlist.c:
+	  - fixed freeze when removing a track that is being played
+	  (bugzilla #41)
+
+2004-05-01 00:14  larne
+
+	* beep/: equalizer.c, playlistwin.c, util.c, util.h: - change some
+	  more gtkfilebrowsers to gtkfilechoosers
+
+2004-04-30 11:35  larne
+
+	* beep/: equalizer.c, playlist.c, util.c, util.h: - use
+	  gtkfilechooser in equalizerwin
+
+2004-04-30 08:17  descender
+
+	* beep/: Makefile.am, mainwin.c:
+	  - fixed gtk_check_menu_item_set_active() warning - remove i18n.h
+	  from Makefile.am
+
+2004-04-30 05:57  larne
+
+	* Input/cdaudio/cdaudio.h: - solaris needs sys/types.h
+
+2004-04-30 04:38  descender
+
+	* compile, Input/cdaudio/cdaudio.c:
+	  - added 'compile' script from automake - fixed compilation error
+	  on FBSD with struct stat
+
+2004-04-29 22:53  descender
+
+	* configure.ac, beep/i18n.h.in:
+	  - removed beep/i18n.h.in
+
+2004-04-29 22:44  descender
+
+	* Output/OSS/OSS.c, Output/OSS/OSS.h, Output/OSS/about.c,
+	  Output/OSS/audio.c, Output/OSS/configure.c, Output/OSS/init.c,
+	  Output/OSS/mixer.c, Output/alsa/about.c, Output/alsa/alsa.c,
+	  Output/alsa/alsa.h, Output/alsa/configure.c, Output/alsa/init.c,
+	  Output/esd/about.c, Output/esd/audio.c, Output/esd/configure.c,
+	  Output/esd/esd.c, Output/esd/esdout.h, Output/esd/init.c,
+	  Output/esd/mixer.c, Visualization/blur_scope/blur_scope.c,
+	  Visualization/blur_scope/config.c:
+	  - use glib/gi18n.h instead of i18n.h - pushed config.h includes
+	  into main plugin headers - use #include <> for libbeep includes -
+	  moved out file specific includes out of main plugin headers -
+	  removed weird check for libasound.so.2 from ALSA output plugin
+
+2004-04-29 22:20  descender
+
+	* Input/: cdaudio/cdaudio.c, cdaudio/cdaudio.h, cdaudio/cddb.c,
+	  cdaudio/cdinfo.c, cdaudio/configure.c, mpg123/common.c,
+	  mpg123/configure.c, mpg123/equalizer.c, mpg123/fileinfo.c,
+	  mpg123/http.c, mpg123/id3.h, mpg123/id3_frame_content.c,
+	  mpg123/layer2.c, mpg123/layer3.c, mpg123/mpg123.c,
+	  mpg123/mpg123.h, mpg123/tabinit.c, vorbis/configure.c,
+	  vorbis/fileinfo.c, vorbis/http.c, vorbis/vorbis.c, wav/wav.c,
+	  wav/wav.h:
+	  - use glib/i18n.h instead of i18n.h - use #include <> for libbeep
+	  includes - shifted #includes around
+
+2004-04-29 22:00  descender
+
+	* libbeep/: dirbrowser.c, titlestring.c, util.c, xentry.c:
+	  - use glib/gi18n-lib.h instead of i18n.h
+
+2004-04-29 21:59  descender
+
+	* beep/: about.c, eq_slider.c, equalizer.c, input.c, logger.c,
+	  main.c, mainwin.c, playback.c, playlistwin.c, util.c, util.h:
+	  - use glib/gi18n.h instead of i18n.h
+
+2004-04-29 21:46  descender
+
+	* Input/vorbis/alternative.make:
+	  - removed redundant file
+
+2004-04-29 20:16  descender
+
+	* Input/mpg123/layer1.c, Input/mpg123/layer2.c,
+	  Input/mpg123/layer3.c, Input/vorbis/vorbis.c, beep/Makefile.am,
+	  Input/wav/wav.c:
+	  - fixed make distcheck i.e. included iir.h into Makefile.am, use
+	  #include "beep/output.h" instead of "output.h" in input plugin
+	  sources
+
+2004-04-29 19:16  er-ku
+
+	* po/lt.po: a small fix for a small typo...
+
+2004-04-29 19:12  descender
+
+	* configure.ac:
+	  - new usage of AC_INIT/AM_INIT_AUTOMAKE - added build host and
+	  target check (AC_CANONICAL_HOST/AC_CANONICAL_TARGET)
+
+2004-04-29 19:02  er-ku
+
+	* po/lt.po: latest updates
+
+2004-04-29 03:38  descender
+
+	* po/: bmp.pot, cy.po, de.po, es.po, fr.po, ja.po, lt.po, sv.po,
+	  zh_CN.po:
+	  - German translation update from Matthias - sync po/pot files
+	  with code
+
+2004-04-28 07:52  descender
+
+	* libbeep/util.c:
+	  - removal of real-time scheduling capability check,
+	  xmms_check_realtime_priority() now always return FALSE
+
+2004-04-28 07:20  descender
+
+	* configure.ac, libbeep/util.h:
+	  - removal of real-time scheduling capability check,
+	  xmms_check_realtime_priority() now always return FALSE
+
+2004-04-27 18:35  descender
+
+	* beep/prefswin.c:
+	  - fixed crash with closing preferences window (without clicking
+	  close button) and then reopening it
+
+2004-04-25 06:58  quirk_fr
+
+	* po/fr.po: Fixed display problem
+
+2004-04-25 06:45  quirk_fr
+
+	* po/fr.po: Better translations
+
+2004-04-22 16:51  er-ku
+
+	* po/lt.po: "\n" bug fixed. BMP wouldn't compile with yesterday's
+	  version. My fault....
+
+2004-04-22 15:46  descender
+
+	* beep/prefswin.c:
+	  - fixed incorrect object casts i.e. GtkTreeSelection<->GtkWidget,
+	  GtkWidget<->GtkTreeModel - introduced GtkToggleButton casts for
+	  radio buttons to avoid warnings - replaced plain C casts with
+	  GObject casts i.e. GTK_WIDGET() - replaced InputPlugin and
+	  OutputPlugin casts with INPUT_PLUGIN()/OUTPUT_PLUGIN() macros -
+	  commented out unused variables to avoid compiler warnings -
+	  removed semicolons after function scope end brace
+
+2004-04-22 06:05  mderezynski
+
+	* beep/: mainwin.c, prefswin.c, glade/prefswin.glade,
+	  images/Makefile.am, images/plugins.png:
+
+	  images/plugins.png, images/Makefile.am: added icon for "plugins"
+	  mainwin.c, prefswin.c, glade/Makefile.am glade/prefswin.glade:
+	  prefswin WIP
+
+2004-04-22 01:34  descender
+
+	* configure.ac:
+	  - fixed locale path problem causing BMP not to find translations
+
+2004-04-21 23:03  er-ku
+
+	* po/lt.po: updating stuff....
+
+2004-04-21 08:11  mderezynski
+
+	* beep/glade/prefswin.glade:
+
+	  prefswin.glade: reverted an accidental change
+
+2004-04-21 07:32  mderezynski
+
+	* configure.ac:
+
+	  configure.ac: added beep/images/Makefile
+
+2004-04-21 07:23  mderezynski
+
+	* beep/: Makefile.am, mainwin.c, prefswin.c, images/Makefile.am,
+	  images/appearance.png, images/mouse.png, images/playlist.png:
+
+	  Added icons to prefswin sections
+
+2004-04-21 05:15  quirk_fr
+
+	* po/fr.po: Update translations
+
+2004-04-21 04:21  mderezynski
+
+	* beep/: playlist.c, prefswin.c, glade/prefswin.glade:
+
+	  playlist.c, prefswin.c, glade/prefswin.glade: new prefswin WIP
+
+2004-04-20 12:12  descender
+
+	* po/: POTFILES.in, bmp.pot, cy.po, de.po, es.po, fr.po, ja.po,
+	  lt.po, sv.po, zh_CN.po:
+	  - removed libbeep/configfile.c (removed from CVS) from POTFILES -
+	  sync po/pot files
+
+2004-04-20 11:57  descender
+
+	* AUTHORS, beep/about.c, po/cy.po:
+	  - added basic project and copyright information into About dialog
+	  - moved Welsh translation history in About dialog into its po
+	  file - moved Ole Andre up to Developers section in AUTHORS -
+	  sorted contributor names according to last name - fixed spelling
+	  of Tim's last name
+
+2004-04-20 11:49  descender
+
+	* po/: LINGUAS, es.po:
+	  - added Spanish translation by Francisco Javier F. Serrador
+
+2004-04-20 10:12  larne
+
+	* beep/prefswin.c: more prefswin fixes
+
+2004-04-20 10:06  larne
+
+	* beep/: main.c, prefswin.c: fix sunpro cc warnings
+
+2004-04-20 08:42  mderezynski
+
+	* beep/prefswin.c:
+
+	  prefswin.c, glade/prefswin.glade: more prefswin WIP
+
+2004-04-20 08:03  mderezynski
+
+	* beep/playlistwin.c: [no log message]
+
+2004-04-20 07:44  mderezynski
+
+	* beep/: prefswin.c, glade/prefswin.glade:
+
+	  prefswin.c, glade/prefswin.glade: WIP
+
+2004-04-20 06:55  larne
+
+	* beep/: dirbrowser.c, dirbrowser.h, input.h, main.c, mainwin.c,
+	  mainwin.h, playback.c, pluginenum.c, prefswin.c: add standard
+	  copyright header to files without
+
+2004-04-20 06:23  larne
+
+	* AUTHORS, beep/about.c: change cy credits
+
+2004-04-20 05:53  mderezynski
+
+	* beep/: beep_logo.xpm, mainwin.c, prefswin.c,
+	  glade/prefswin.glade:
+
+	  beep_logo.xpm: changed mainwin.c: minor changes prefswin.c: WIP
+	  glade/prefswin.glade: WIP
+
+2004-04-20 05:38  larne
+
+	* beep/: equalizer.c, input.h, main.c, mainwin.c, playback.c,
+	  pluginenum.c, prefswin.c, skinwin.c, visualization.c: fix
+	  warnings in prefswin and a couple of other places
+
+2004-04-20 03:22  mderezynski
+
+	* beep/: main.c, main.h, prefswin.c:
+
+	  main.c, main.h, prefswin.c: fixed saving of disabled input
+	  plugins
+
+2004-04-20 02:17  mderezynski
+
+	* beep/prefswin.c:
+
+	  prefswin.c: readded
+
+2004-04-20 02:16  mderezynski
+
+	* beep/: input.c, input.h, main.c, mainwin.c, playback.c,
+	  playback.h, pluginenum.c, pluginenum.h, prefswin.c, skinwin.c,
+	  skinwin.h, glade/prefswin.glade: [no log message]
+
+2004-04-20 00:38  descender
+
+	* beep/about.c:
+	  - ported GtkCList code to GtkTreeView/GtkListStore - replaced
+	  XMMS credits text with BMP
+
+2004-04-19 21:51  descender
+
+	* beep/main.c:
+	  - ran indent - replaced sizeof(x)/sizeof(*x) with G_N_ELEMENTS -
+	  removed periods from '--help' screen option descriptions - change
+	  '-n' option description to include BMP
+
+2004-04-19 21:37  descender
+
+	* README:
+	  - revised README to fit BMP
+
+2004-04-19 19:54  descender
+
+	* FAQ:
+	  - adapted FAQ for BMP
+
+2004-04-19 18:34  descender
+
+	* po/POTFILES.in, beep/glade/Makefile.am,
+	  beep/glade/equalizerwin_preset_menu.glade:
+	  - added glade file for equalizerwin's preset menu
+
+2004-04-19 14:55  descender
+
+	* configure.ac, beep/Makefile.am, scripts/cvs2cl.pl,
+	  scripts/gen-auto-scripts.sh:
+	  configure.ac: fail if location of X11 headers and libraries are
+	  not found beep/Makefile.am: add "@X_PRE_LIBS@ -lX11
+	  @X_EXTRA_LIBS" scripts/cvs2cl.pl: update to 2.53
+	  scripts/gen-auto-scripts.sh: generate branch names, tags and tag
+	  dates in ChangeLog
+
+2004-04-19 13:52  descender
+
+	* configure.ac, beep/Makefile.am:
+	  - check for X11 using AC_PATH_XTRA
+
+2004-04-19 12:49  larne
+
+	* configure.ac, Input/mpg123/common.c, Input/mpg123/dxhead.c,
+	  Input/wav/wav.c, Visualization/blur_scope/blur_scope.c,
+	  beep/controlsocket.c, beep/dirbrowser.c, beep/getopt.c,
+	  beep/main.h, beep/mainwin.c, beep/mkdtemp.c, beep/playlist.c,
+	  beep/playlist_list.c, beep/playlistwin.c, beep/prefswin.c,
+	  beep/skin.c, beep/textbox.c, beep/util.c, beep/util.h,
+	  beep/visualization.c, libbeep/beepctrl.c, libbeep/dirbrowser.c,
+	  libbeep/xconvert.c: - fix compile warnings with sunpro cc
+
+2004-04-19 12:17  mderezynski
+
+	* beep/prefswin.c:
+
+	  prefswin.c: added seperate column for 'enabled' checkboxes (input
+	  plugins)
+
+2004-04-19 11:54  mderezynski
+
+	* po/POTFILES.in:
+
+	  POTFILES.in: added prefswin.glade
+
+2004-04-19 11:53  mderezynski
+
+	* beep/: input.c, main.c, playback.c, pluginenum.c, prefswin.c:
+
+	  input.c, main.c, playback.c, pluginenum.c, prefswin.c: Added
+	  capability to disable input plugins back, sanifications
+
+2004-04-19 11:51  mderezynski
+
+	* libbeep/rcfile.c:
+
+	  rcfile.c: sanifications
+
+2004-04-19 07:39  mderezynski
+
+	* beep/: Makefile.am, main.c, main.h, prefswin.c, skinwin.c:
+
+	  main.c, main.h, skinwin.c: Added functionality for persistent
+	  skin thumbnails
+
+2004-04-19 06:20  oleavr
+
+	* beep/Makefile.am: Added missing @GCONF_LIBS@ to LDADD.
+
+2004-04-19 03:13  oleavr
+
+	* .cvsignore, beep/main.c, beep/glade/.cvsignore,
+	  libbeep/.cvsignore: Renamed configuration key "convert_%20" to
+	  "convert_twenty" for compatibility with GConf.  Added missing
+	  .cvsignore entries and a .cvsignore file for beep/glade/.
+
+2004-04-19 02:44  oleavr
+
+	* configure.ac, Input/cdaudio/Makefile.am, Input/cdaudio/cdaudio.c,
+	  Input/cdaudio/cdaudio.h, Input/cdaudio/cdinfo.c,
+	  Input/cdaudio/configure.c, Input/mpg123/Makefile.am,
+	  Input/mpg123/configure.c, Input/mpg123/mpg123.c,
+	  Input/mpg123/mpg123.h, Input/vorbis/Makefile.am,
+	  Input/vorbis/configure.c, Input/vorbis/vorbis.c,
+	  Input/wav/Makefile.am, Output/OSS/Makefile.am, Output/OSS/OSS.h,
+	  Output/OSS/configure.c, Output/OSS/init.c,
+	  Output/alsa/Makefile.am, Output/alsa/alsa.h,
+	  Output/alsa/configure.c, Output/alsa/init.c,
+	  Output/esd/Makefile.am, Output/esd/configure.c,
+	  Output/esd/init.c, Visualization/blur_scope/Makefile.am,
+	  Visualization/blur_scope/blur_scope.c,
+	  Visualization/blur_scope/config.c, beep/Makefile.am,
+	  beep/equalizer.c, beep/main.c, beep/mainwin.c, beep/playback.c,
+	  beep/playlist.c, beep/softvolume.c, libbeep/Makefile.am,
+	  libbeep/configdb.h, libbeep/configdb_gconf.c,
+	  libbeep/configdb_rcfile.c, libbeep/configfile.c,
+	  libbeep/configfile.h, libbeep/rcfile.c, libbeep/rcfile.h: Merge
+	  new configuration backend abstraction API with gconf support.
+	  Ported existing code to use the new API.
+
+2004-04-19 00:44  oleavr
+
+	* libbeep/: vfs.h, vfs_gnome.c, vfs_stdio.c: The vfs-files back in
+	  their new home.
+
+2004-04-19 00:31  oleavr
+
+	* beep/: vfs.h, vfs_gnome.c, vfs_stdio.c: Removed beep/vfs*.[ch],
+	  as they're now in libbeep.
+
+2004-04-19 00:25  oleavr
+
+	* configure.ac, Input/mpg123/id3.h, Input/mpg123/mpg123.h,
+	  Input/vorbis/vcedit.h, Input/vorbis/vorbis.c,
+	  Input/vorbis/vorbis.h, Input/wav/wav.h, Output/OSS/configure.c,
+	  Output/alsa/configure.c, beep/Makefile.am, beep/output.c,
+	  beep/output.h, beep/playlist.c, beep/plugin.h, beep/pluginenum.c,
+	  libbeep/Makefile.am: Small adjustments related to beep/vfs*.[ch]
+	  being moved to libbeep, as well as misc fixes lead to by compiler
+	  warnings.
+
+2004-04-19 00:25  mderezynski
+
+	* beep/: dirbrowser.c, prefswin.c, glade/Makefile.am,
+	  glade/prefswin.glade:
+
+	  prefswin.c: Added new libglade-based prefs window
+
+2004-04-19 00:20  mderezynski
+
+	* beep/: prefswin.c, util.c:
+
+	  prefswin.c: Removed for readding new prefswin
+
+2004-04-18 19:57  descender
+
+	* Input/mpg123/Makefile.am, Input/vorbis/Makefile.am,
+	  Output/OSS/Makefile.am, Output/alsa/Makefile.am,
+	  Visualization/blur_scope/Makefile.am:
+	  - removed @PTHREAD_LIBS@ from all plugins' Makefile.am
+
+2004-04-18 19:37  descender
+
+	* configure.ac:
+	  - removed pthread check from configure
+
+2004-04-18 19:34  descender
+
+	* Output/: OSS/OSS.h, OSS/audio.c, esd/audio.c, esd/esdout.h:
+	  - replaced pthread usage with gthread in OSS/ESD output plugins
+
+2004-04-18 19:26  descender
+
+	* Input/: mpg123/http.c, mpg123/mpg123.c, vorbis/configure.c,
+	  vorbis/fileinfo.c, vorbis/http.c, wav/wav.h:
+	  - replaced pthread usage with gthread completely for vorbis and
+	  mpg123 plugins - removed unnecessary pthread.h #includes
+
+2004-04-18 19:16  descender
+
+	* Input/mpg123/mpg123.c, Input/vorbis/vorbis.c, beep/equalizer.c,
+	  beep/mainwin.c, beep/playlistwin.c:
+	  - use gthread instead of pthread usage with vorbis and mpg123
+	  plugins - removed gdk_window_set_group() calls for mainwin,
+	  equalizerwin and playlistwin
+
+2004-04-18 10:47  larne
+
+	* configure.ac, Input/vorbis/vorbis.c, beep/iir.c, beep/iir.h: -
+	  iir fixes.. remove the aligned stuff 'cos its not useful afaics -
+	  warnings in libvorbis missing output.h - change configure to
+	  check for XOpenDisplay in libX11
+
+2004-04-18 10:21  larne
+
+	* configure.ac, beep/iir.c, beep/iir.h: - solaris/non-gcc fixes
+
+2004-04-18 07:12  larne
+
+	* beep/main.c: - clean up config stuff to use tables rather than a
+	  load	 of read/write_blah()
+
+2004-04-17 20:14  descender
+
+	* configure.ac, scripts/gen-auto-scripts.sh:
+	  - fixed configure check for existing BMP installtion -
+	  autogen.sh/gen-auto-scripts.sh now defaults to autoreconf if
+	  available
+
+2004-04-15 21:02  descender
+
+	* beep/glade/dirbrowser.glade:
+	  - fixed dirbrowser hpane position (was all the way to the left)
+
+2004-04-15 19:43  descender
+
+	* po/POTFILES.in:
+	  - added beep/glade/dirbrowser.glade into POTFILES - removed
+	  beep/sm.c (gone) from POTFILES
+
+2004-04-15 15:57  descender
+
+	* beep/: dirbrowser.h, equalizer.c, main.c, mainwin.c, mainwin.h,
+	  skin.c, skin.h, skinwin.c, skinwin.h, widget.c, widget.h:
+	  - fixed compiler warnings on undeclared functions - fall back to
+	  default skin if the one configured is not found - show error
+	  dialog and exit when BMP cannot find default skin to fallback on
+	  (bug #932008) - fixed always-on-top not honoured on startup (bug
+	  #932995) - hook gnome_vfs_shutdown() to exit()
+
+2004-04-15 12:01  descender
+
+	* beep/mainwin.c:
+	  - factored out code from mainwin_idle_func() into
+	  idle_func_change_song() and idle_func_update_song_info()
+
+2004-04-15 09:45  descender
+
+	* beep/mainwin.c:
+	  - move 'About BMP' option from 'Options' submenu to top-level -
+	  replace sizeof(x)/sizeof(x[0]) with G_N_ELEMENTS()
+
+2004-04-15 06:43  descender
+
+	* libbeep/: dirbrowser.c, titlestring.h, util.c:
+	  - util.h: replaced extern "C" {} with G_BEGIN_DECLS and
+	  G_END_DECLS - text in xmms_show_message() dialogs not longer
+	  editable by user - pack xmms_show_dialog() text view and button
+	  widgets into GtkDialog's vbox and action_area instead
+
+2004-04-15 04:38  descender
+
+	* indent.pro:
+	  - added profile for formatting BMP code with the indent utility
+
+2004-04-15 03:50  descender
+
+	* beep/mainwin.c:
+	  - fixed no-output-device error dialog not showing -
+	  no-output-device error dialog is now modal - use HIG text markups
+	  for no-audio-cd and no-output-device error dialogs
+
+2004-04-14 22:16  larne
+
+	* beep/prefswin.c: fix a typo
+
+2004-04-14 18:26  larne
+
+	* beep/: main.c, main.h, playlistwin.c, prefswin.c: add 'mouse
+	  wheel scrolls playlist by' option
+
+2004-04-14 08:02  descender
+
+	* beep/: vfs.h, vfs_gnome.c, vfs_stdio.c:
+	  - add VFS source files from Ole Andre's GtkFileChooser and GNOME
+	  VFS patch
+
+2004-04-14 07:53  descender
+
+	* AUTHORS, configure.ac, Input/mpg123/Makefile.am,
+	  Input/mpg123/common.c, Input/mpg123/dxhead.c,
+	  Input/mpg123/fileinfo.c, Input/mpg123/http.c, Input/mpg123/id3.c,
+	  Input/mpg123/id3.h, Input/mpg123/id3_frame_content.c,
+	  Input/mpg123/id3_frame_text.c, Input/mpg123/id3_frame_url.c,
+	  Input/mpg123/id3_header.h, Input/mpg123/id3_tag.c,
+	  Input/mpg123/mpg123.c, Input/mpg123/mpg123.h,
+	  Input/vorbis/Makefile.am, Input/vorbis/fileinfo.c,
+	  Input/vorbis/http.c, Input/vorbis/vcedit.c,
+	  Input/vorbis/vcedit.h, Input/vorbis/vorbis.c,
+	  Input/vorbis/vorbis.h, Input/wav/Makefile.am, Input/wav/wav.c,
+	  Input/wav/wav.h, beep/Makefile.am, beep/input.c, beep/main.c,
+	  beep/main.h, beep/mainwin.c, beep/playlist.c, beep/sm.c,
+	  beep/sm.h, beep/util.c, libbeep/titlestring.c:
+	  - applied Ole Andre's GtkFileChooser and GNOME VFS patch -
+	  removed SMlib support code - removed AC_SUBSTs for corresponding
+	  PKG_CHECK_MODULES (PKG_CHECK_MODULES already runs AC_SUBSTs) -
+	  fixed compiler warnings with libbeep/titlestring.c - mark
+	  description of title format tag '%{n:...%}' as translatable
+
+2004-04-14 02:32  mderezynski
+
+	* TODO, beep/dirbrowser.c, beep/glade/Makefile.am,
+	  beep/glade/bmpxmlui.glade, beep/glade/dirbrowser.glade:
+
+	  TODO:   Updated beep/dirbrowser.c: Re-enabled code for checking
+	  files with the input plugins beep/glade/Makefile.am: renamed
+	  bmpxmlui.glade to dirbrowser.glade beep/glade/bmpxmlui.glade:
+	  removed/renamed beep/glade/dirbrowser.glade: added/renamed
+
+2004-04-12 11:49  larne
+
+	* libbeep/titlestring.c: - support for %{...%} in titlestring
+	  [merge from newplug]
+
+2004-04-12 09:43  larne
+
+	* beep/dirbrowser.c: - fix problem when dbrc didn't exist.. its now
+	  created.    (someone needs to review this and add code to warn
+	  the user     about it...)
+
+2004-04-12 09:00  larne
+
+	* beep/: dirbrowser.c, eq_slider.c: - fix all warnings in
+	  dirbrowser.c ... i'm not entirely sure what some   of this code
+	  does, but it appears to work.
+
+2004-04-12 08:32  larne
+
+	* beep/: eq_slider.c, equalizer.c, widget.c, widget.h: - make mouse
+	  wheel actually move eq sliders.    (this was a leftover from gtk1
+	  and never fixed)
+
+2004-04-12 08:09  larne
+
+	* beep/: iir.c, iir.h: - i forgot to add these files
+
+2004-04-12 08:02  larne
+
+	* Input/mpg123/Makefile.am, Input/mpg123/layer1.c,
+	  Input/mpg123/layer2.c, Input/mpg123/layer3.c,
+	  Input/vorbis/vorbis.c, Input/wav/wav.c, beep/Makefile.am,
+	  beep/equalizer.c, beep/main.c, beep/main.h, beep/output.c,
+	  beep/output.h, beep/playback.c, beep/prefswin.c: - new equalizer,
+	  based on eq-xmms. appears to work, but please test it   for any
+	  problems.. particularly non-mp3/vorbis plugins.
+
+	    note that this means non-bmp (ie: xmms) input plugins will not
+	    be passed through the eq.. this isn't really a problem ('cos
+	  they
+	    weren't before either) but a way to make it work might be nice.
+
+	    [merge from newplug (now a dead branch, everything on it will
+	     be merged into HEAD eventually (hi JK :))]
+
+2004-04-12 00:42  descender
+
+	* configure.ac, libbeep/acinclude.m4:
+	  - use AC_CONFIG_HEADERS instead of AM_CONFIG_HEADER - added
+	  missing beep/i18n.h to AC_CONFIG_HEADERS list - removed
+	  libbeep/acinclude.m4 (now unused)
+
+2004-04-10 10:45  descender
+
+	* Input/wav/wav.c:
+	  - minor string handling cleanups in wav.c:get_title()
+
+2004-04-10 10:35  descender
+
+	* Input/: mpg123/mpg123.c, vorbis/vorbis.c:
+	  - vorbis plugin now correctly returns directory name with titles
+	  with '%F' format tag - fixed silly UTF-8 conversion bug in vorbis
+	  plugin (g_locale_to_utf8() instead of g_locale_from_utf8()) - #if
+	  0'ed out mpg123 and vorbis_return_tag_value_by_name() - minor
+	  cleanups
+
+2004-04-10 08:01  descender
+
+	* acinclude.m4, configure.ac, m4/beep.m4, m4/libxml.m4:
+	  - set autoconf prerequisite version to >= 2.5 - replaced
+	  AM_{PROG_LIBTOOL,ENABLE_STATIC,ENABLE_SHARED} with new
+	  AC_{PROG_LIBTOOL,ENABLE_STATIC,ENABLE_SHARED} - removed macro
+	  aliases in acinclude.m4 - removed unused m4 macro files
+
+2004-04-10 07:30  descender
+
+	* configure.ac, beep/Makefile.am, beep/main.c,
+	  libbeep/configure.ac, scripts/gen-auto-scripts.sh:
+	  - fused configure scripts (configure.ac and libbeep/configure.ac)
+	  - removed ./configure check for zlib, OpenGL and SMlib - removed
+	  X11R6 session management code from main.c
+
+2004-04-06 13:40  descender
+
+	* AUTHORS, po/LINGUAS, po/bmp.pot, po/cy.po, po/de.po, po/fr.po,
+	  po/ja.po, po/lt.po, po/sv.po, po/zh_CN.po:
+	  - added Dutch translation (Matthias Debus) - sync po/pot files
+	  with code
+
+2004-04-05 05:13  descender
+
+	* configure.ac, beep/Makefile.am, beep/dirbrowser.c,
+	  beep/glade/Makefile.am:
+	  - added installation of glade XML files - fixed dirbrowser glade
+	  file path - use g_warning() instead of g_error() when glade UI
+	  for dirbrowser cannot be loaded
+
+2004-04-05 04:44  descender
+
+	* bmp.spec.in:
+	  - update RPM spec build dependencies (gtk 2.4, alsa 1.0)
+
+2004-04-05 04:37  descender
+
+	* Makefile.am, beep-config.in, beep.m4, beep.pc.in, beep.spec.in,
+	  bmp.pc.in, bmp.spec.in, configure.ac:
+	  - rename beep.pc.in and beep.spec.in to bmp.pc.in and bmp.spec.in
+	  respectively - remove m4 macro and beep-config - set name field
+	  to 'bmp' (from 'beep') in bmp.pc.in - update configure.ac
+	  accordingly
+
+2004-04-05 04:06  mderezynski
+
+	* beep/glade/bmpxmlui.glade:
+
+	  glade/bmpxmlui.glade: dirbrowser xml ui
+
+2004-04-05 04:02  mderezynski
+
+	* beep/: dirbrowser.c, dirbrowser.h:
+
+	  dirbrowser.c, dirbrowser.h: re-imported for libglade
+
+2004-04-05 03:43  mderezynski
+
+	* beep/: dirbrowser.c, dirbrowser.h, main.c:
+
+	  main.c: modified for libgladed dir browser dirbrowser.c,
+	  dirbrowser.h: removed for re-importing with libglade
+
+2004-04-05 03:37  descender
+
+	* configure.ac, beep/equalizer.c, beep/logger.c, beep/logger.h,
+	  beep/main.c, beep/mainwin.c, beep/playlist.c, beep/playlistwin.c,
+	  beep/playlistwin.h, beep/prefswin.c, beep/skinwin.c, beep/util.c:
+
+	  - use gtk_window_set_default_icon() instead of using
+	  gtk_window_set_icon() individually - use g_return_if_fail()
+	  instead of g_assert() in file logger - use
+	  gtk_window_has_toplevel_focus() to check window focus - minor
+	  cleanups
+
+2004-03-31 01:47  descender
+
+	* beep/: playlistwin.c, playlistwin.h, prefswin.c:
+	  - check and log illegal playlistwin sizes (hack to fix
+	  shade/unshade crash) - hide playlistwin_focus with
+	  playlistwin_has_focus()
+
+2004-03-27 19:44  descender
+
+	* beep/: equalizer.c, equalizer.h, main.c, prefswin.c:
+	  - added equalizerwin_has_focus() to hide equalizerwin_focus -
+	  hide various equalizerwin variables - update run-time GTK version
+	  check to 2.4
+
+2004-03-26 20:25  descender
+
+	* beep/controlsocket.c:
+	  - fixed libbeep/beepctrl.c compilation errors (moved XMMS
+	  protocol packet header structs back into beep/controlsocket.h)
+
+2004-03-26 19:00  descender
+
+	* beep/controlsocket.h:
+	  - fixed libbeep/beepctrl.c compilation errors (moved XMMS
+	  protocol packet header structs back into beep/controlsocket.h)
+
+2004-03-25 22:18  descender
+
+	* beep/: playlist.c, playlist.h, playlistwin.c, pluginenum.c:
+	  - generalized playlist sort function - miscellaneous trivial
+	  cleanups
+
+2004-03-25 21:54  descender
+
+	* beep/: controlsocket.c, controlsocket.h, effect.c, playlist.c,
+	  plugin.h, pluginenum.c:
+	  - plugin loading is now logged - removed unused code for
+	  prefix-ignore sort - use G_BEGIN_DECLS/G_END_DECLS in plugin.h -
+	  miscellaneous cleanups
+
+2004-03-25 05:05  descender
+
+	* AUTHORS, configure.ac, libbeep/Makefile.am, m4/alsa.m4,
+	  m4/beep-old.m4, m4/esd.m4:
+	  - use PKG_CHECK_MODULES for ALSA and ESounD check - removed check
+	  for sizeof(long) - miscellaneous configure.ac cleanups - added
+	  Liviu as contributor into AUTHORS
+
+2004-03-24 21:27  descender
+
+	* configure.ac:
+	  - remove specific version check for libglade2 (some distros have
+	  not caught up yet)
+
+2004-03-24 21:23  descender
+
+	* configure.ac, Input/vorbis/Makefile.am, beep/Makefile.am,
+	  m4/libmikmod.m4, m4/ogg.m4, m4/vorbis.m4:
+	  - added check for gtk/glib 2.4 - added check for libglade2 -
+	  removed check for langinfo - removed check for sched_setscheduler
+	  - use PKG_CHECK_MODULES for libogg, libvorbis and libvorbisfile -
+	  removed m4 scripts for libogg, libvorbis/libvorbisfile and
+	  libmikmod - miscellaneous configure.ac cleanups
+
+2004-03-22 09:42  descender
+
+	* po/: bmp.pot, cy.po, fr.po, ja.po, lt.po, sv.po, zh_CN.po:
+	  - sync po/pot files with code
+
+2004-03-22 09:37  descender
+
+	* libbeep/Makefile.am:
+	  - use absolute include path in libbeep/Makefile.am
+
+2004-03-22 09:10  descender
+
+	* beep.pc.in:
+	  - applied Tim's patch on beep.pc to use pkg-config generated
+	  dependencies for glib2/gtk2 (was hard-wired)
+
+2004-03-21 23:11  descender
+
+	* beep/: playlist.c, playlist.h:
+	  - fixed reading of m3u playlist metadata - fixed insertion of
+	  tracks after last entry in playlist
+
+2004-03-18 14:08  descender
+
+	* Input/vorbis/glibconfig.h:
+	  - removed Input/vorbis/glibconfig.h causing compilation error
+	  with glib 2.4 (WTF?!)
+
+2004-03-17 10:14  descender
+
+	* scripts/genesis.sh:
+	  - updated genesis script to recognize configure.ac instead of
+	  configure.in
+
+2004-03-17 10:11  descender
+
+	* configure.ac, configure.in, libbeep/configure.ac,
+	  libbeep/configure.in:
+	  - renamed configure.in to configure.ac
+
+2004-03-16 07:42  descender
+
+	* Makefile.am, beep/Makefile.am:
+	  - fixed make distcheck
+
+2004-03-16 05:14  quirk_fr
+
+	* po/fr.po: Update few translations
+
+2004-03-11 06:10  descender
+
+	* beep/dirbrowser.c:
+	  - applied Tim's fix to create ~/.dbrc if it does not exist -
+	  cleaned up bmp_fb_return_dirtree_model() slightly
+
+2004-03-06 09:42  descender
+
+	* beep/: mainwin.c, prefswin.c:
+	  - fixed typo in tool tip for 'Always show clutterbar' checkbox in
+	  Preferences->Options - applied Liviu's patch to close Jump to
+	  Track dialog on track jump
+
+2004-03-04 09:10  descender
+
+	* AUTHORS, po/LINGUAS, po/bmp.pot, po/cy.po, po/fr.po, po/ja.po,
+	  po/lt.po, po/sv.po, po/zh_CN.po:
+	  - added Swedish translation by Martin Persenius - fixed format
+	  errors with sv.po - sync po/pot files with code
+
+2004-03-04 08:59  descender
+
+	* beep/mainwin.c:
+	  - minor cleanups
+
+2004-03-04 05:03  descender
+
+	* beep/: equalizer.c, playlistwin.c:
+	  - restored playlist editor and equalizer window pager hints
+	  (don't ask why I disabled it)
+
+2004-03-03 08:06  descender
+
+	* Input/mpg123/: Makefile.am, fileinfo.c:
+	  - applied Artur's make-distcheck patch to mpg123 plugin sources
+
+2004-03-03 07:58  descender
+
+	* NEWS, TODO:
+	  - updated TODO
+
+2004-03-03 07:35  descender
+
+	* po/: cy.po, fr.po, bmp.pot, ja.po, lt.po, zh_CN.po:
+	  - sync po/pot files with code
+
+2004-03-03 07:32  descender
+
+	* beep/: mainwin.c, playlistwin.c:
+	  - changed error dialog response buttons from 'Close' to 'Ok' -
+	  use GtkMessageDialog for no-audio-cd error dialog
+
+2004-03-03 07:21  descender
+
+	* beep/: playlist.c, mainwin.c:
+	  - fixed jump button in jump-to-track dialog - change 'Jump to
+	  File' to 'Jump to Track' in main popup menu - edited
+	  jump-to-track and jump-to-time dialog titles to match main popup
+	  menu entries - miscellaneous cleanups
+
+2004-02-29 16:02  masterpe
+
+	* TODO: * TODO: - Updated some items for 0.9.8
+
+2004-02-28 22:19  msikkes
+
+	* beep/mainwin.c: - Fixed a bug where the unshaded mainwindow got
+	  shaded and vica versa when   DoubleSize was called.
+
+2004-02-28 21:26  descender
+
+	* beep/playlist.c:
+	  - applied and modified Tim's patch to fix duplicate entries in
+	  unplayable-files dialog
+
+2004-02-26 23:38  descender
+
+	* beep/Makefile.am:
+	  - fixed build problem with missing pixmaps.h by adding pixmaps.h
+	  to BUILT_SOURCES
+
+2004-02-26 21:43  descender
+
+	* po/: bmp.pot, cy.po, fr.po, ja.po, lt.po, zh_CN.po:
+	  - sync po/pot files with code
+
+2004-02-26 21:41  descender
+
+	* beep/.cvsignore:
+	  - add pixmaps.h to .cvsignore
+
+2004-02-26 21:40  descender
+
+	* beep/: dirbrowser.c, mainwin.c, util.c:
+	  - renamed Add URL window title to "Add URL" (from "bmp: Add
+	  Url...") - removed "bmp:" prefix in file selector titles
+
+2004-02-26 21:21  descender
+
+	* beep/: equalizer.c, playlist.c, prefswin.c, prefswin.h,
+	  skinwin.c, skinwin.h:
+	  - re-arranged Preferences->Options options (play options vs
+	  appearance options) - flipped Preferences->Fonts options (main
+	  window font entry on top now) - GNOME HIGified
+	  Preferences->Options and Preferences->Fonts labels - restore skin
+	  browser refreshing on show - renamed 'Configure Equalizer' window
+	  to 'BMP Equalizer Preferences' - removed option to turn on
+	  real-time priority
+
+2004-02-26 14:38  descender
+
+	* libbeep/: configure.in, titlestring.c, titlestring.h, util.c:
+	  - xmms_usleep() now uses g_usleep() - removed nanosleep() check -
+	  minor cleanups
+
+2004-02-26 02:28  descender
+
+	* beep/pixmaps.h:
+	  - removed pixmaps.h (automatically generated by make)
+
+2004-02-26 02:17  descender
+
+	* beep/: main.c, mainwin.c, playback.c, playlist.c, skin.c,
+	  skinwin.c, skinwin.h:
+	  - replaced skinwin_set_icon() with gtk_window_set_icon() - added
+	  'refresh' button to skin browser - 'random skin on play' no
+	  longer updates skin list independently - 'random skin on play'
+	  check button now occupies its own row in skin browser vbox, above
+	  the buttons - cleanups
+
+2004-02-26 00:00  descender
+
+	* AUTHORS, configure.in, beep/mkdtemp.c, beep/playback.c,
+	  beep/playlistwin.c, beep/skin.c, beep/skinwin.c:
+	  - updated contributor and translator credits - fixed wrong letter
+	  case in configure output message - cleanups
+
+2004-02-25 22:40  descender
+
+	* configure.in, beep/main.c, beep/mkdtemp.c, beep/playback.c,
+	  beep/playlist.c:
+	  - replaced usage of 'random() % x' with g_random_int_range(0, x)
+	  - removed srandomdev() check in configure - fixed off-by-1 error
+	  in bmp_playback_set_random_skin()
+
+2004-02-21 01:42  descender
+
+	* beep/build.list:
+	  - removed artist.png from icon list
+
+2004-02-20 20:02  descender
+
+	* beep/dirbrowser.c:
+	  - use gtk_window_set_icon() to set icon for dirbrowser - mark
+	  dirbrowser 'Filter' label as translatable - dirbrowser directory
+	  tree and file list view now have equal sizes - dirbrowser code
+	  cleanups
+
+2004-02-20 19:30  descender
+
+	* beep/dirbrowser.c:
+	  - indent -kr -nut - #if 0'ed out unused functions to prevent
+	  compiler warnings - renamed bmp_recurse to bmp_fb_recurse_dir,
+	  and changed it to have file scope
+
+2004-02-20 19:20  descender
+
+	* beep/: Makefile.am, pixmaps.mk:
+	  - move pixmaps.h build target into Makefile.am
+
+2004-02-20 18:03  descender
+
+	* beep/playlist.c:
+	  - fixed crash when loading some non-pls playlists without #EXT
+	  tags
+
+2004-02-20 16:08  descender
+
+	* beep/: mainwin.c, playlist.c:
+	  - fixed invert selection in playlist editor - minor cleanups
+
+2004-02-20 15:54  descender
+
+	* beep/: equalizer.c, mainwin.c, playlistwin.c:
+	  - fixed equalizerwin drawing error introduced by last commit -
+	  removed some unused code
+
+2004-02-20 15:00  descender
+
+	* beep/: equalizer.c, equalizer.h, playlistwin.c, prefswin.c, sm.c,
+	  util.h:
+	  - fixed str_replace_in() prototype - don't recreate equalizerwin
+	  on window decoration toggle - use gtk_window_set_icon() to set
+	  icons for playlistwin and equalizerwin - fixed sm.c compilation
+	  warnings - minor cleanups
+
+2004-02-20 14:15  descender
+
+	* beep/: playlistwin.c, skin.c, util.c, util.h:
+	  - added str_replace_in() string utility function - fix incorrect
+	  use of str_replace() with str_replace_in()
+
+2004-02-20 14:03  descender
+
+	* beep/: dock.c, main.c, mainwin.c, mainwin.h, prefswin.c,
+	  skinwin.c, skinwin.h:
+	  - use 'cursor-changed' callback to detect user selection in skin
+	  browser - GNOME HIGified mainwin titles - replaced ugly icon
+	  setting code for mainwin with gtk_window_set_icon() - fixed
+	  temporary string memory leak in skin_get_thumbnail() -
+	  miscellaneous cleanups
+
+2004-02-19 22:16  descender
+
+	* beep/: dock.c, mainwin.c, playlist.c, playlist.h,
+	  playlist_list.c, playlist_popup.c, playlistwin.c, widget.c,
+	  widget.h:
+	  - cleaned up playlistwin dialog code - use guint instead of
+	  glong/gint for track index parameters of playlist functions -
+	  miscellaneous cleanups
+
+2004-02-19 06:38  quirk_fr
+
+	* po/fr.po: New translations
+
+2004-02-18 21:44  descender
+
+	* beep/playlistwin.c:
+	  - forgot to remove g_message() debug messages (displayed when
+	  playlistwin is resized)
+
+2004-02-18 21:41  descender
+
+	* beep/: controlsocket.c, main.c, mainwin.c, playlist.c,
+	  playlistwin.c, playlistwin.h, prefswin.c, util.c, widget.h:
+	  - don't recreate playlistwin on window decoration toggle -
+	  cleanups
+
+2004-02-18 12:36  descender
+
+	* beep/widget.c:
+	  - minor cleanups
+
+2004-02-11 02:33  descender
+
+	* po/: bmp.pot, cy.po, fr.po, ja.po, lt.po, zh_CN.po:
+	  - synced po/pot files with code
+
+2004-02-11 02:32  descender
+
+	* Input/: mpg123/fileinfo.c, vorbis/fileinfo.c, vorbis/vorbis.c:
+	  - fixed missing translations in mpg123 file info dialog - renamed
+	  'Bitrate' to 'Bit rate', 'Samplerate' to 'Sample rate' and
+	  replaced 'n/a' with 'N/A'
+
+2004-02-10 06:36  descender
+
+	* po/zh_CN.po:
+	  - updated Simplified Chinese translation
+
+2004-02-10 00:02  descender
+
+	* po/zh_CN.po:
+	  - updated Simplified Chinese translation (merged with XMMS
+	  1.2.9's version)
+
+2004-02-09 02:23  descender
+
+	* scripts/cvs2cl.pl:
+	  - upgrade cvs2cl script to 2.52
+
+2004-02-05 12:31  descender
+
+	* beep/: mainwin.c, playlistwin.c, skin.c, skin.h:
+	  - fixed playlist editor shademode drawing bug
+
+2004-02-05 02:25  descender
+
+	* beep/: dock.c, equalizer.c, equalizer.h, main.c, mainwin.c,
+	  mainwin.h, playlist.c, playlist_list.c, playlistwin.c, skinwin.c,
+	  util.c, util.h:
+	  - re-engaged segfault handler by default to print error message,
+	  but abort() instead of exit() - removed
+	  gdk_window_set_icon_name() calls - renamed equalizer and playlist
+	  editor window titles to conform to HIG - added str_replace()
+	  convenience function - replaced gtk_widget_set_usize() calls with
+	  gtk_window_set_default_size() where possible - miscellaneous
+	  minor cleanups
+
+2004-02-04 07:34  larne
+
+	* po/cy.po: - cy fixes	 [merge from newplug]
+
+2004-02-04 07:29  larne
+
+	* po/cy.po (newplug): - cy fixes
+
+2004-02-04 05:02  descender
+
+	* beep/: dock.c, equalizer.c, hints.c, playlistwin.c, skin.c,
+	  widget.c:
+	  - replaced ugly XMMS playlist window resize hack with
+	  gtk_window_begin_resize_drag() - added
+	  gtk_window_skip_pager_hint() for equalizer and playlist window -
+	  changed playlist window title to "bmp: Playlist Editor" for
+	  consistency sake - miscellaneous cleanups
+
+2004-02-04 02:10  larne
+
+	* beep/prefswin.c (newplug): - fix cau/gosod which disappeared from
+	  prefswin due to bad merging
+
+2004-02-04 01:13  larne
+
+	* beep/mainwin.c (newplug): - 'details' -> 'Details'   [merge from
+	  HEAD]
+
+2004-02-04 01:11  larne
+
+	* beep/mainwin.c: - "details" -> "Details"
+
+2004-02-04 00:40  larne
+
+	* po/: LINGUAS, cy.po: - commit cy translation	 [merge from
+	  newplug]
+
+2004-02-02 22:21  larne
+
+	* po/cy.po (newplug): - more cy messages
+
+2004-02-02 16:26  larne
+
+	* po/cy.po (newplug): - more cy messages
+
+2004-02-02 00:21  larne
+
+	* libbeep/titlestring.c, libbeep/titlestring.h, beep/debug.h,
+	  beep/dirbrowser.c, beep/eq_graph.c, beep/eq_graph.h,
+	  beep/eq_slider.c, beep/eq_slider.h, beep/hslider.c,
+	  beep/hslider.h, beep/iir.c, beep/main.c, beep/mainwin.c,
+	  beep/mainwin.h, beep/menurow.c, beep/menurow.h,
+	  beep/monostereo.c, beep/monostereo.h, beep/number.c,
+	  beep/number.h, beep/pbutton.c, beep/pbutton.h,
+	  beep/playlist_list.c, beep/playlist_list.h,
+	  beep/playlist_slider.c, beep/playlist_slider.h,
+	  beep/playlistwin.c, beep/playstatus.c, beep/playstatus.h,
+	  beep/pluginenum.c, beep/prefswin.c, beep/sbutton.c,
+	  beep/sbutton.h, beep/skin.c, beep/skin.h, beep/skinwin.c,
+	  beep/svis.c, beep/svis.h, beep/tbutton.c, beep/tbutton.h,
+	  beep/textbox.c, beep/textbox.h, beep/util.c, beep/util.h,
+	  beep/vis.c, beep/vis.h, beep/widget.c, beep/widget.h (newplug): -
+	  merge with head
+
+2004-02-02 00:20  larne
+
+	* po/: LINGUAS, cy.po (newplug): - add cy locale
+
+2004-02-01 06:08  quirk_fr
+
+	* po/fr.po: Better translations and few typos
+
+2004-01-30 08:15  msikkes
+
+	* beep/: dirbrowser.c, mainwin.c: * mainwin.c: Added GTK_WINDOW()
+	  on line 2338 which fixes comipler warning.  * dirbrowser.c: GUI
+	  cleanups to make it more HIG.
+
+2004-01-30 03:00  descender
+
+	* beep/: equalizer.c, mainwin.c, playlist.c, playlist_list.c,
+	  playlistwin.c, skin.c, textbox.c, textbox.h, util.c, widget.c:
+	  - fixed mainwin focus draw when titlebar is clicked - fixed
+	  memory leak in textbox_set_xfont() - replaced gdk_image_get()
+	  calls with gdk_drawable_get_image() - replaced deprecated
+	  gtk_widget_set_usize() calls with appropriate calls - make
+	  mainwin, equalizerwin and  playlistwin focus in/out callbacks
+	  return TRUE - UTF-8 fixes for TextBox widget - fixed invalid
+	  memory reference to mainwin_jtf in mainwin_update_jtf() after
+	  getting destroyed - fixed constant string free in textbox_free()
+	  - minor cleanups
+
+2004-01-29 22:25  mderezynski
+
+	* beep/mainwin.c, beep/mainwin.h, beep/playlist_list.c,
+	  beep/playlistwin.c, beep/util.c, po/bmp.pot, po/fr.po, po/ja.po,
+	  po/lt.po, po/zh_CN.po:
+
+	  all *.c files: keybinding/accessibility fixes
+
+2004-01-29 19:24  descender
+
+	* beep/: playlistwin.c, playlistwin.h:
+	  - fixed playlist window resizing bug
+
+2004-01-29 05:20  descender
+
+	* configure.in:
+	  - fixed post-configuration option dump text alignment
+
+2004-01-29 05:14  masterpe
+
+	* TODO: TODO: - Added: "- Removal of all remaining GtkCList's to
+	  0.9.8"
+
+2004-01-29 04:33  descender
+
+	* configure.in:
+	  - changed version to 0.9.7 - removed ALL_LINGUAS
+
+2004-01-29 04:32  descender
+
+	* AUTHORS, beep.m4, beep.spec.in, configure.in:
+	  - tabs to spaces
+
+2004-01-29 03:59  masterpe
+
+	* TODO:
+	  ----------------------------------------------------------------------
+
+	  * Law: -Added the new TODO
+
+	  Modified Files:	  TODO
+
+	  ----------------------------------------------------------------------
+
+2004-01-26 20:06  mderezynski
+
+	* libbeep/titlestring.c:
+
+	  titlestring.c: removed g_message()'s
+
+2004-01-26 17:07  mderezynski
+
+	* beep/playlist_list.c, beep/util.c, libbeep/titlestring.c:
+
+	  libbeep/titlestring.c: beep/util.c: beep/playlist_list.c:
+	  fixed problems with displayed titles beep/mainwin.h: added macros
+	  MAINWIN_LOCK() / MAINWIN_UNLOCK(), but removed again
+
+2004-01-26 16:16  mderezynski
+
+	* beep/: mainwin.c, skin.c, skinwin.c, vis.c:
+
+	  mainwin.c: setup vis at mainiwin setup mainwin.h: (reverted
+	  changes) skin.c: (reverted changes) skinwin.c: (reverted) vis.c:
+	  (reverted)
+
+2004-01-26 05:46  mderezynski
+
+	* libbeep/: titlestring.c, titlestring.h:
+
+	  titlestring.c, titlestring.h: various fixes (patch by Tim
+	  Mueller)
+
+2004-01-26 05:45  mderezynski
+
+	* beep/: pluginenum.c, vis.c:
+
+	  vis.c: preliminary fix for crash with vis pluginenum.c: (?)
+
+2004-01-25 08:59  mderezynski
+
+	* beep/: dirbrowser.c, playlist_list.c, prefswin.c, skinwin.c:
+
+	  dirbrowser.c: editable set insensitive at adding files to prevent
+	  race condition prefswin.c: ui cleanups skinwin.c: fixed list
+	  stopping at currently selected skin playlist_list.c: fixed
+	  variable's 'text" in-memory length modification
+
+2004-01-23 12:08  descender
+
+	* beep/: textbox.h, menurow.h, monostereo.h, number.h,
+	  playlist_list.h:
+	  - cleanups
+
+2004-01-23 11:15  descender
+
+	* beep/: monostereo.c, monostereo.h, svis.c, svis.h:
+	  - cleanups
+
+2004-01-23 09:21  descender
+
+	* beep/: eq_graph.c, eq_graph.h, eq_slider.c, eq_slider.h,
+	  hslider.c, hslider.h, menurow.c, menurow.h, number.c, number.h,
+	  pbutton.c, pbutton.h, sbutton.c, sbutton.h, playlist_list.c,
+	  playlist_list.h, playlist_slider.c, playlist_slider.h,
+	  playstatus.c, playstatus.h, tbutton.c, tbutton.h, textbox.c,
+	  textbox.h, vis.c, vis.h, widget.c, widget.h:
+	  - cleanup
+
+2004-01-23 06:49  quirk_fr
+
+	* po/fr.po: Remove fuzzy translations and change some bad
+	  translations
+
+2004-01-23 05:05  descender
+
+	* libbeep/titlestring.c:
+	  - fixed wrong allocation count in bmp_title_input_new() (Thanks
+	  to Tim Muller)
+
+2004-01-23 05:02  descender
+
+	* beep/main.c:
+	  - disabled segfault handler by default (pass -DHANDLE_SIGSEGV to
+	  enable)
+
+2004-01-21 22:18  mderezynski
+
+	* beep/pbutton.c:
+
+	  skinwin.c: (touched) pbutton.c: set default state of buttons to
+	  not-pressed and not-inside (wasn't set at all before), patch by
+	  Honza Matejek (<spektrum at click.cz>)
+
+2004-01-21 21:20  mderezynski
+
+	* beep/: main.c, skinwin.c:
+
+	  skinwin.c: Fixed problem with skin list stopping after currently
+	  used skin main.c:
+
+2004-01-21 17:21  descender
+
+	* beep/debug.h:
+	  - missing definition of REQUIRE_STATIC_LOCK when NDEBUG is not
+	  defined - use G_STRLOC instead of __FILE__ and __LINE__
+
+2004-01-21 17:16  descender
+
+	* beep/: mainwin.c, mainwin.h, playlistwin.c, skin.c, skin.h:
+	  - made local functions in mainwin.c static - moved mainwin
+	  titlebar drawing code from mainwin.c into skin.c - don't dim
+	  titlebar now works again with playlistwin - mainwin keypress
+	  handler now returns TRUE for handled keys
+
+2004-01-21 12:06  descender
+
+	* beep/: prefswin.c, util.c, util.h:
+	  - moved out prefswin notebook pages creation into separate
+	  functions
+
+2004-01-21 06:47  descender
+
+	* beep/prefswin.c:
+	  - fixed illegal memory access with 'titles' array in
+	  create_prefs_window()
+
+2004-01-20 21:35  larne
+
+	* scripts/: gen-auto-scripts.sh, genesis.sh (newplug): - merge with
+	  head
+
+2004-01-20 21:34  larne
+
+	* libbeep/: beepctrl.c, beepctrl.h, configfile.c, configfile.h,
+	  dirbrowser.c, dirbrowser.h, formatter.c, formatter.h,
+	  titlestring.c, titlestring.h, util.c, util.h, xconvert.h,
+	  xentry.c, xentry.h (newplug): merge with head
+
+2004-01-20 21:31  larne
+
+	* Input/cdaudio/cddb.c, Input/cdaudio/configure.c,
+	  Input/mpg123/common.c, Input/mpg123/configure.c,
+	  Input/mpg123/dct64.c, Input/mpg123/dct64_i386.c,
+	  Input/mpg123/decode.c, Input/mpg123/decode_2to1.c,
+	  Input/mpg123/decode_4to1.c, Input/mpg123/decode_i386.c,
+	  Input/mpg123/dxhead.c, Input/mpg123/dxhead.h,
+	  Input/mpg123/equalizer.c, Input/mpg123/fileinfo.c,
+	  Input/mpg123/getbits.c, Input/mpg123/http.c, Input/mpg123/id3.c,
+	  Input/mpg123/id3.h, Input/mpg123/id3_frame.c,
+	  Input/mpg123/id3_frame_content.c, Input/mpg123/id3_frame_text.c,
+	  Input/mpg123/id3_frame_url.c, Input/mpg123/id3_header.h,
+	  Input/mpg123/id3_tag.c, Input/mpg123/layer1.c,
+	  Input/mpg123/layer2.c, Input/mpg123/layer3.c,
+	  Input/mpg123/mpg123.c, Input/mpg123/mpg123.h,
+	  Input/mpg123/tabinit.c, Input/vorbis/configure.c,
+	  Input/vorbis/fileinfo.c, Input/vorbis/glibconfig.h,
+	  Input/vorbis/http.c, Input/vorbis/http.h, Input/vorbis/vcedit.c,
+	  Input/vorbis/vcedit.h, Input/vorbis/vorbis.c,
+	  Input/vorbis/vorbis.h, Input/wav/wav.c, Output/OSS/OSS.c,
+	  Output/OSS/about.c, Output/OSS/configure.c, Output/OSS/convert.c,
+	  Output/OSS/init.c, Output/OSS/mixer.c, Output/OSS/soundcard.h,
+	  Output/alsa/about.c, Output/alsa/alsa.c, Output/alsa/configure.c,
+	  Output/alsa/init.c, Output/esd/about.c, Output/esd/configure.c,
+	  Output/esd/esd.c, Output/esd/init.c, Output/esd/mixer.c,
+	  Visualization/blur_scope/blur_scope.c,
+	  Visualization/blur_scope/config.c (newplug): - merge with head
+
+2004-01-20 21:27  larne
+
+	* po/LINGUAS, po/POTFILES.in, po/bmp.pot, po/fr.po, po/ja.po,
+	  po/lt.po, po/zh_CN.po, beep/Makefile.am, beep/about.c,
+	  beep/beep.desktop.in, beep/bmp.c, beep/bmp.h,
+	  beep/controlsocket.c, beep/dirbrowser.c, beep/dock.c,
+	  beep/dock.h, beep/effect.c, beep/eq_graph.c, beep/eq_graph.h,
+	  beep/eq_slider.c, beep/eq_slider.h, beep/equalizer.c, beep/fft.c,
+	  beep/fft.h, beep/fullscreen.c, beep/general.c, beep/getopt.c,
+	  beep/getopt.h, beep/getopt1.c, beep/hints.c, beep/hslider.c,
+	  beep/hslider.h, beep/info.h, beep/input.c, beep/input.h,
+	  beep/jump_to.h, beep/logger.c, beep/logger.h, beep/main.c,
+	  beep/main.h, beep/mainwin.c, beep/mainwin.h, beep/menurow.c,
+	  beep/menurow.h, beep/mkdtemp.c, beep/monostereo.c,
+	  beep/monostereo.h, beep/number.c, beep/number.h, beep/output.c,
+	  beep/pbutton.c, beep/pbutton.h, beep/pixmaps.h, beep/playback.c,
+	  beep/playlist.c, beep/playlist.h, beep/playlist_list.c,
+	  beep/playlist_list.h, beep/playlist_popup.c,
+	  beep/playlist_popup.h, beep/playlist_slider.c,
+	  beep/playlistwin.c, beep/playlistwin.h, beep/playstatus.c,
+	  beep/playstatus.h, beep/plugin.h, beep/pluginenum.c,
+	  beep/prefswin.c, beep/sbutton.c, beep/sbutton.h, beep/skin.c,
+	  beep/skin.h, beep/skinwin.c, beep/skinwin.h, beep/sm.c,
+	  beep/sm.h, beep/softvolume.c, beep/softvolume.h, beep/svis.c,
+	  beep/svis.h, beep/tbutton.c, beep/tbutton.h, beep/textbox.c,
+	  beep/textbox.h, beep/urldecode.c, beep/util.c, beep/util.h,
+	  beep/vis.c, beep/vis.h, beep/visualization.c, beep/widget.c,
+	  beep/xml_document.c (newplug): - merge with head
+
+2004-01-20 17:34  tag cvs-20040120-01-HEAD
+
+2004-01-20 17:34  mderezynski
+
+	* beep/main.c (tags: cvs-20040120-01-HEAD):
+
+	  main.c: fixed problem in make_directory() (check for return value
+	  of mkdir() instead of errno)
+
+2004-01-20 07:25  descender
+
+	* po/: POTFILES.in, bmp.pot, fr.po, ja.po, lt.po, zh_CN.po (utags:
+	  cvs-20040120-01-HEAD):
+	  - synced po/pot files with code - removed bmp.c and added
+	  logger.c to POTFILES.in
+
+2004-01-20 07:22  descender
+
+	* Input/cdaudio/cddb.c, Input/cdaudio/configure.c,
+	  Input/mpg123/configure.c, Input/mpg123/fileinfo.c,
+	  libbeep/configfile.c, Input/vorbis/configure.c,
+	  Input/vorbis/fileinfo.c, Input/wav/wav.c, Output/OSS/configure.c,
+	  Output/alsa/configure.c, Visualization/blur_scope/config.c
+	  (utags: cvs-20040120-01-HEAD):
+	  - replaced gtk_window_set_policy() calls with
+	  gtk_window_set_resizable() - removed G_LOG_DOMAIN #defines
+
+2004-01-20 06:54  descender
+
+	* Output/esd/configure.c (tags: cvs-20040120-01-HEAD):
+	  - flipped 'Apply' and 'Close' button order in ESD plugin
+	  configuration widnow
+
+2004-01-20 06:50  descender
+
+	* Output/esd/: about.c (tags: cvs-20040120-01-HEAD), configure.c,
+	  esd.c (tags: cvs-20040120-01-HEAD), init.c (tags:
+	  cvs-20040120-01-HEAD), mixer.c (tags: cvs-20040120-01-HEAD):
+	  - indent -kr -nut
+
+2004-01-20 06:49  descender
+
+	* Output/alsa/configure.c:
+	  - flipped 'Apply' and 'Close' button order in ALSA output
+	  configuration window
+
+2004-01-20 06:34  descender
+
+	* Output/alsa/: about.c (tags: cvs-20040120-01-HEAD), alsa.c (tags:
+	  cvs-20040120-01-HEAD), configure.c, init.c (tags:
+	  cvs-20040120-01-HEAD):
+	  - indent -kr -nut
+
+2004-01-20 06:33  descender
+
+	* Output/OSS/configure.c:
+	  - flipped 'Apply' and 'Close' button order in configuration
+	  window (OSS plugin)
+
+2004-01-20 06:29  descender
+
+	* Output/OSS/: about.c (tags: cvs-20040120-01-HEAD), OSS.c (tags:
+	  cvs-20040120-01-HEAD), configure.c, convert.c (tags:
+	  cvs-20040120-01-HEAD), init.c (tags: cvs-20040120-01-HEAD),
+	  mixer.c (tags: cvs-20040120-01-HEAD), soundcard.h (tags:
+	  cvs-20040120-01-HEAD):
+	  - indent -kr -nut
+
+2004-01-20 06:26  descender
+
+	* Visualization/blur_scope/: blur_scope.c (tags:
+	  cvs-20040120-01-HEAD), config.c:
+	  - flipped 'Ok' and 'Cancel' button order (blur_scope plugin) -
+	  renamed color selection dialog title to "Blur Scope: Color
+	  selection" (blur_scope plugin) - renamed visualization window
+	  title to "Blur Scope" (blur_scope plugin)
+
+2004-01-20 06:22  descender
+
+	* Visualization/blur_scope/: blur_scope.c, config.c:
+	  - indent -kr -nut
+
+2004-01-20 06:09  descender
+
+	* beep/prefswin.c (tags: cvs-20040120-01-HEAD):
+	  - marked font tab labels translatable - fixed memory leak in
+	  prefswin_font_browse_callback() involving (redundant) UTF-8
+	  conversion of preview text - flipped 'Apply' and 'Close' button
+	  order
+
+2004-01-20 05:40  descender
+
+	* beep/: equalizer.c, input.c, playlist.c, pluginenum.c, skin.c,
+	  xml_document.c (utags: cvs-20040120-01-HEAD):
+	  - removed G_LOG_DOMAIN #defines so that logger can catch all log
+	  messages - prepended G_STRLOC to log_messages
+
+2004-01-20 05:20  descender
+
+	* beep/: about.c (tags: cvs-20040120-01-HEAD), dock.c (tags:
+	  cvs-20040120-01-HEAD), equalizer.c, hints.c (tags:
+	  cvs-20040120-01-HEAD), mainwin.c (tags: cvs-20040120-01-HEAD),
+	  playlist_slider.c (tags: cvs-20040120-01-HEAD):
+	  - cleanups - corrected usage of g_list_append() when adding
+	  widgets to dock_window_list
+
+2004-01-20 03:01  descender
+
+	* beep/playlistwin.c (tags: cvs-20040120-01-HEAD):
+	  - playlistwin accelerators now work again - minor cleanups
+
+2004-01-20 02:25  descender
+
+	* beep/playlist.c:
+	  - make playlist_get_info thread lock before reading status flag
+
+2004-01-20 02:21  descender
+
+	* beep/: playlist_list.c (tags: cvs-20040120-01-HEAD), prefswin.c,
+	  output.c (tags: cvs-20040120-01-HEAD), pbutton.c (tags:
+	  cvs-20040120-01-HEAD), pbutton.h (tags: cvs-20040120-01-HEAD),
+	  playlist.h (tags: cvs-20040120-01-HEAD), skinwin.c (tags:
+	  cvs-20040120-01-HEAD), util.c (tags: cvs-20040120-01-HEAD):
+	  - minor cleanups - replaced gtk_window_set_policy() calls with
+	  gtk_window_set_resizable() - made preferences window resizable -
+	  removed #define G_LOG_DOMAIN __FILE__
+
+2004-01-20 02:14  descender
+
+	* beep/: visualization.c, widget.c (utags: cvs-20040120-01-HEAD):
+	  - minor cleanups
+
+2004-01-20 02:07  descender
+
+	* beep/input.c:
+	  - replace gtk_window_set_policy() with gtk_window_set_resizable()
+
+2004-01-20 01:59  descender
+
+	* beep/controlsocket.c (tags: cvs-20040120-01-HEAD):
+	  - control socket file descriptor is now properly set back to 0
+	  when BMP is unable to open socket
+
+2004-01-20 01:56  descender
+
+	* beep/Makefile.am (tags: cvs-20040120-01-HEAD):
+	  - removed bmp.c bmp.h from Makefile
+
+2004-01-20 01:55  descender
+
+	* beep/util.h (tags: cvs-20040120-01-HEAD):
+	  - added in argument names for function prototypes without them
+
+2004-01-20 01:53  descender
+
+	* beep/: bmp.c, bmp.h, skin.c:
+	  - skin loader now uses gdk_pixbuf to load pixmaps
+
+2004-01-20 01:50  descender
+
+	* beep/: logger.c (tags: cvs-20040120-01-HEAD), main.c:
+	  - logger now flushes after every line printed - BMP no longer
+	  aborts if logger is unabled to open log file - fixed
+	  unable-to-open-log-file error with users without ~/.bmp yet - BMP
+	  now prints error messages if it cannot create its user
+	  directories
+
+2004-01-19 03:13  descender
+
+	* beep/: bmp.c, effect.c (tags: cvs-20040120-01-HEAD), eq_graph.c
+	  (tags: cvs-20040120-01-HEAD), eq_graph.h (tags:
+	  cvs-20040120-01-HEAD), eq_slider.c (tags: cvs-20040120-01-HEAD),
+	  eq_slider.h (tags: cvs-20040120-01-HEAD), fft.c (tags:
+	  cvs-20040120-01-HEAD), fft.h (tags: cvs-20040120-01-HEAD),
+	  fullscreen.c (tags: cvs-20040120-01-HEAD), general.c (tags:
+	  cvs-20040120-01-HEAD), getopt.c (tags: cvs-20040120-01-HEAD),
+	  getopt.h (tags: cvs-20040120-01-HEAD), getopt1.c (tags:
+	  cvs-20040120-01-HEAD), hints.c, hslider.c (tags:
+	  cvs-20040120-01-HEAD), hslider.h (tags: cvs-20040120-01-HEAD),
+	  info.h (tags: cvs-20040120-01-HEAD), jump_to.h (tags:
+	  cvs-20040120-01-HEAD), main.h (tags: cvs-20040120-01-HEAD),
+	  menurow.c (tags: cvs-20040120-01-HEAD), menurow.h (tags:
+	  cvs-20040120-01-HEAD), mkdtemp.c (tags: cvs-20040120-01-HEAD),
+	  monostereo.c (tags: cvs-20040120-01-HEAD), monostereo.h (tags:
+	  cvs-20040120-01-HEAD), number.c (tags: cvs-20040120-01-HEAD),
+	  number.h (tags: cvs-20040120-01-HEAD), output.c, pbutton.c,
+	  pbutton.h, pixmaps.h (tags: cvs-20040120-01-HEAD), playback.c
+	  (tags: cvs-20040120-01-HEAD), playstatus.c (tags:
+	  cvs-20040120-01-HEAD), playstatus.h (tags: cvs-20040120-01-HEAD),
+	  sbutton.c (tags: cvs-20040120-01-HEAD), sbutton.h (tags:
+	  cvs-20040120-01-HEAD), sm.c (tags: cvs-20040120-01-HEAD), sm.h
+	  (tags: cvs-20040120-01-HEAD), softvolume.c (tags:
+	  cvs-20040120-01-HEAD), softvolume.h (tags: cvs-20040120-01-HEAD),
+	  svis.c (tags: cvs-20040120-01-HEAD), svis.h (tags:
+	  cvs-20040120-01-HEAD), tbutton.c (tags: cvs-20040120-01-HEAD),
+	  tbutton.h (tags: cvs-20040120-01-HEAD), textbox.c (tags:
+	  cvs-20040120-01-HEAD), textbox.h (tags: cvs-20040120-01-HEAD),
+	  urldecode.c (tags: cvs-20040120-01-HEAD), util.h, vis.c (tags:
+	  cvs-20040120-01-HEAD), vis.h (tags: cvs-20040120-01-HEAD),
+	  visualization.c, widget.c: - indent -kr -nut
+
+2004-01-19 01:05  descender
+
+	* beep/main.c, po/LINGUAS (tags: cvs-20040120-01-HEAD), po/bmp.pot,
+	  po/fr.po, po/ja.po, po/lt.po, po/zh_CN.po:
+	  - added missing '%s' in translated C format string in Japanese
+	  translation (ja.po) - added Japanese to LINGUAS - added missing
+	  space in SIGSEGV error message (main.c) - re-synced po/pot files
+	  with code
+
+2004-01-19 00:47  descender
+
+	* beep/main.h:
+	  - added BMP_LOG_BASENAME and bmp_log_filename declaration into
+	  main.h
+
+2004-01-19 00:31  descender
+
+	* po/ja.po:
+	  - added Japanese translation by Takeshi Aihana
+
+2004-01-19 00:27  descender
+
+	* beep/main.c:
+	  - print usage help screen to stdout instead of stderr
+
+2004-01-18 23:27  descender
+
+	* beep/: main.c, Makefile.am, logger.c, logger.h (tags:
+	  cvs-20040120-01-HEAD):
+	  - added logging functions
+
+2004-01-18 03:59  msikkes
+
+	* beep/mainwin.c: Changed Play CD keybinding to alt + c.
+
+2004-01-18 02:54  descender
+
+	* beep/: main.c, mainwin.h (tags: cvs-20040120-01-HEAD),
+	  playlistwin.h (tags: cvs-20040120-01-HEAD):
+	  - removed XInitThreads() call - rearranged UI creation calls in
+	  main() - added custom log handler (does nothing right now
+	  however) - added MAINWIN_DEFAULT_FONT and
+	  PLAYLISTWIN_DEFAULT_FONT to store default font name strings
+
+2004-01-18 02:46  descender
+
+	* beep/mainwin.c:
+	  - indent -kr -nut
+
+2004-01-18 00:56  msikkes
+
+	* beep/beep.desktop.in (tags: cvs-20040120-01-HEAD): Renamed to
+	  Beep Media Player.
+
+2004-01-17 23:46  msikkes
+
+	* beep/beep.desktop.in: Changed name to 'BMP' and comment to 'Play
+	  music'
+
+2004-01-17 23:34  descender
+
+	* Input/mpg123/mpg123.c (tags: cvs-20040120-01-HEAD):
+	  - fixed memory leak in mpg123_format_song_title() (mpg123 plugin)
+
+2004-01-17 22:21  descender
+
+	* beep/: skin.c, skinwin.c:
+	  - fixed temporary string memory leaks in update_skinlist() and
+	  skinwin.c:add_skin() - remove extra call to create_skin_window()
+	  in init_skins() (called in main())
+
+2004-01-17 18:25  descender
+
+	* libbeep/: beepctrl.c, beepctrl.h (utags: cvs-20040120-01-HEAD):
+	  - complete glibification - minor formatting cleanups
+
+2004-01-17 18:06  descender
+
+	* libbeep/: beepctrl.c, beepctrl.h, configfile.c, configfile.h
+	  (tags: cvs-20040120-01-HEAD), dirbrowser.c (tags:
+	  cvs-20040120-01-HEAD), dirbrowser.h (tags: cvs-20040120-01-HEAD),
+	  formatter.c (tags: cvs-20040120-01-HEAD), formatter.h (tags:
+	  cvs-20040120-01-HEAD), titlestring.c (tags:
+	  cvs-20040120-01-HEAD), titlestring.h (tags:
+	  cvs-20040120-01-HEAD), util.c (tags: cvs-20040120-01-HEAD),
+	  util.h (tags: cvs-20040120-01-HEAD), xconvert.h (tags:
+	  cvs-20040120-01-HEAD), xentry.c (tags: cvs-20040120-01-HEAD),
+	  xentry.h (tags: cvs-20040120-01-HEAD):
+	  - indent -kr -nut
+
+2004-01-17 17:36  descender
+
+	* beep/: input.c, pluginenum.c: 
CVS:
+	  ----------------------------------------------------------------------
+	  CVS: Enter Log.  Lines beginning with `CVS:' are removed
+	  automatically
CVS: 
CVS: Committing in .
CVS: 
CVS: Modified
+	  Files:
CVS:  input.c pluginenum.c 
CVS:
+	  ----------------------------------------------------------------------
+	  - UTF-8 fixes, use filename_to_utf8() instead of
+	  g_locale_to_utf8() for filename displays
- minor cleanups
+
+2004-01-17 17:00  descender
+
+	* beep/plugin.h (tags: cvs-20040120-01-HEAD):
+	  - indent -kr -nut
+
+2004-01-17 07:04  descender
+
+	* scripts/: gen-auto-scripts.sh, genesis.sh (utags:
+	  cvs-20040120-01-HEAD):
+	  - replaced use of pushd/popd with temporary variables
+
+2004-01-17 06:54  descender
+
+	* Input/vorbis/: fileinfo.c, http.c (tags: cvs-20040120-01-HEAD),
+	  vorbis.c (tags: cvs-20040120-01-HEAD):
+	  - fixed gcc 2.95/6 compilation errors
+
+2004-01-17 06:47  descender
+
+	* Input/vorbis/: configure.c, fileinfo.c, glibconfig.h (tags:
+	  cvs-20040120-01-HEAD), http.c, http.h (tags:
+	  cvs-20040120-01-HEAD), vcedit.c (tags: cvs-20040120-01-HEAD),
+	  vcedit.h (tags: cvs-20040120-01-HEAD), vorbis.h (tags:
+	  cvs-20040120-01-HEAD):
+	  - indent -kr -nut
+
+2004-01-17 06:08  mderezynski
+
+	* beep/dirbrowser.c (tags: cvs-20040120-01-HEAD):
+
+	  Fixed problems in bmp_fb_dirtree_enqueue() (uninitialized
+	  variable 'path')
+
+2004-01-17 06:08  descender
+
+	* Input/mpg123/: fileinfo.c, mpg123.c:
+	  - fixed gcc 2.95/6 compilation errors
+
+2004-01-17 05:53  descender
+
+	* beep/hints.c:
+	  - fixed 'ulong' compilation error
+
+2004-01-17 05:16  descender
+
+	* Input/mpg123/: common.c (tags: cvs-20040120-01-HEAD),
+	  configure.c, dct64.c (tags: cvs-20040120-01-HEAD), dct64_i386.c
+	  (tags: cvs-20040120-01-HEAD), decode.c (tags:
+	  cvs-20040120-01-HEAD), decode_2to1.c (tags:
+	  cvs-20040120-01-HEAD), decode_4to1.c (tags:
+	  cvs-20040120-01-HEAD), decode_i386.c (tags:
+	  cvs-20040120-01-HEAD), dxhead.c (tags: cvs-20040120-01-HEAD),
+	  dxhead.h (tags: cvs-20040120-01-HEAD), equalizer.c (tags:
+	  cvs-20040120-01-HEAD), fileinfo.c, getbits.c (tags:
+	  cvs-20040120-01-HEAD), http.c (tags: cvs-20040120-01-HEAD), id3.c
+	  (tags: cvs-20040120-01-HEAD), id3.h (tags: cvs-20040120-01-HEAD),
+	  id3_frame.c (tags: cvs-20040120-01-HEAD), id3_frame_content.c
+	  (tags: cvs-20040120-01-HEAD), id3_frame_text.c (tags:
+	  cvs-20040120-01-HEAD), id3_frame_url.c (tags:
+	  cvs-20040120-01-HEAD), id3_header.h (tags: cvs-20040120-01-HEAD),
+	  id3_tag.c (tags: cvs-20040120-01-HEAD), layer1.c (tags:
+	  cvs-20040120-01-HEAD), layer2.c (tags: cvs-20040120-01-HEAD),
+	  layer3.c (tags: cvs-20040120-01-HEAD), mpg123.c, mpg123.h (tags:
+	  cvs-20040120-01-HEAD), tabinit.c (tags: cvs-20040120-01-HEAD):
+	  - indent -kr -nut
+
+2004-01-17 04:56  descender
+
+	* beep/: input.c, input.h (tags: cvs-20040120-01-HEAD):
+	  - indent -kr -nut
+
+2004-01-17 03:21  descender
+
+	* beep/: main.c, skinwin.c, skinwin.h (tags: cvs-20040120-01-HEAD):
+
+	  - fixed gcc 2.95/6 compiler errors - cleanups
+
+2004-01-17 02:29  descender
+
+	* beep/: controlsocket.c, input.c, input.h, playlist.c,
+	  playlist_list.c, pluginenum.c, skinwin.c, util.c:
+	  - fixed warnings with bmp_playback_* functions being implicitly
+	  declared - put declaration of input_file_not_playable() into
+	  input.h - make input_info_text in input.h extern - change
+	  'selection' to GtkTreeSelection type in create_skin_window()
+
+2004-01-17 02:02  descender
+
+	* beep/: playlist.c, playlist.h, playlist_list.c, controlsocket.c,
+	  dock.c, dock.h (tags: cvs-20040120-01-HEAD), equalizer.c,
+	  playlist_list.h (tags: cvs-20040120-01-HEAD), playlist_popup.c
+	  (tags: cvs-20040120-01-HEAD), playlist_popup.h (tags:
+	  cvs-20040120-01-HEAD), playlistwin.c, pluginenum.c, prefswin.c,
+	  skin.c, skin.h (tags: cvs-20040120-01-HEAD), skinwin.c:
+	  - indent -kr -nut
+
+2004-01-17 00:42  larne
+
+	* beep/: dirbrowser.c, playlistwin.h (newplug): - merge with head
+
+2004-01-16 23:58  larne
+
+	* beep/: iir.c, main.c, main.h, prefswin.c (newplug): - added
+	  option to not reread playlist metadata on config changes   (hack:
+	  need a proper solution for this) - Add optional second filtering
+	  step from eq-xmms - really makes   a noticable difference to
+	  sound quality.
+
+2004-01-16 23:28  larne
+
+	* beep/iir.c (newplug): - added extra filter stage from eq-xmms.
+	  this takes more cpu, but improves   sounds quality.  i'll
+	  probably make this a configurable option.
+
+2004-01-16 21:55  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  added statusbar, UI changes WIP
+
+2004-01-16 11:49  larne
+
+	* beep/: mainwin.h, playlistwin.c: - fix compile error	 [merge
+	  from newplug]
+
+2004-01-16 11:46  larne
+
+	* beep/: mainwin.h, playlistwin.c (newplug): - fix compile error
+	  (missing defines and include)
+
+2004-01-16 11:26  larne
+
+	* Output/alsa/audio.c, beep/Makefile.am, beep/controlsocket.c,
+	  beep/dirbrowser.c, beep/equalizer.h, beep/input.c, beep/input.h,
+	  beep/main.c, beep/main.h, beep/mainwin.c, beep/output.c,
+	  beep/playback.c, beep/playback.h, beep/playlist.c,
+	  beep/playlist.h, beep/playlist_list.c, beep/playlist_slider.c,
+	  beep/playlist_slider.h, beep/playlistwin.c, beep/playlistwin.h,
+	  beep/pluginenum.c, beep/skinwin.c, beep/util.c,
+	  beep/visualization.c, beep/widget.c, beep/widget.h,
+	  libbeep/configfile.c, libbeep/configfile.h, m4/beep.m4,
+	  po/bmp.pot, po/fr.po, po/lt.po, po/zh_CN.po,
+	  scripts/gen-auto-scripts.sh (newplug): - merge with head.
+
+2004-01-16 08:34  descender
+
+	* m4/beep.m4:
+	  - applied Artur Frysiak's bmp-m4quote patch to quote function
+	  names in AC_DEFUN
+
+2004-01-16 05:55  descender
+
+	* libbeep/: configfile.c, configfile.h:
+	  - tabs to spaces
+
+2004-01-16 05:29  descender
+
+	* beep/: main.c, equalizer.h (tags: cvs-20040120-01-HEAD), main.h,
+	  playlistwin.h:
+	  - cleanups
+
+2004-01-16 05:02  descender
+
+	* beep/widget.c:
+	  - removed debug g_message() calls
+
+2004-01-16 04:04  descender
+
+	* scripts/gen-auto-scripts.sh:
+	  - applied Artur Frysiak's bmp-autogen patch to use #!/bin/bash
+	  instead of /bin/sh to specify the use of bash explicitly -
+	  converted tabs to spaces
+
+2004-01-16 04:00  descender
+
+	* beep/: widget.c, widget.h (tags: cvs-20040120-01-HEAD):
+	  - replaced widget list iteration loops with g_list_foreach -
+	  converted tabs to spaces
+
+2004-01-16 03:52  mderezynski
+
+	* beep/: Makefile.am, controlsocket.c, dirbrowser.c, input.c,
+	  input.h, mainwin.c, output.c, playback.c, playback.h (tags:
+	  cvs-20040120-01-HEAD), playlist.c, playlist.h, playlist_list.c,
+	  playlistwin.c, playlistwin.h, pluginenum.c, skinwin.c, util.c,
+	  visualization.c:
+
+	  test commit
+
+2004-01-15 22:29  descender
+
+	* beep/: widget.h, playlist_slider.c, playlist_slider.h (tags:
+	  cvs-20040120-01-HEAD):
+	  - indent -kr -nut
+
+2004-01-15 19:57  descender
+
+	* Output/alsa/audio.c (tags: cvs-20040120-01-HEAD):
+	  - ALSA output plugin: fixed endian check preprocessor directives
+
+2004-01-15 19:14  larne
+
+	* beep/: output.c, playlistwin.c (newplug): - check size is
+	  multiple of 2 in eq
+
+2004-01-15 19:02  larne
+
+	* beep/prefswin.c: - code cleanups - change 'xmms' to 'bmp'
+	  [merge from newplug]
+
+2004-01-15 18:59  larne
+
+	* beep/prefswin.c (newplug): - indentation cleanups - change 'xmms'
+	  to 'bmp' in tooltips
+
+2004-01-15 17:43  larne
+
+	* beep/prefswin.c: - fix 'pause between songs' and 'snap windows
+	  at' options.	  [merge from newplug]
+
+2004-01-15 17:42  larne
+
+	* beep/prefswin.c (newplug): - fix 'pause between songs' and 'snap
+	  windows at' to work properly.    the problem is that the textarea
+	  was being attached to the check    button;  this change only
+	  attachs the initial text to the check,    which has the slight
+	  change the 'seconds' and 'pixels' won't be	prelighted if your
+	  GTK+ theme does prelighting.	However, I'm not    sure there's a
+	  way to highlight all the text but not the textarea...
+
+2004-01-15 09:58  larne
+
+	* beep/output.c (newplug): - code cleanups
+
+2004-01-15 09:39  larne
+
+	* beep/output.c (newplug): - add code to byteswap audio data for eq
+	  when not native   endianness - not tested!
+
+2004-01-15 09:14  descender
+
+	* Output/alsa/audio.c:
+	  - replaced endian checks with Glib macros
+
+2004-01-15 08:58  descender
+
+	* po/: bmp.pot, fr.po, lt.po, zh_CN.po:
+	  - French translation update from David - updated po/pot files
+
+2004-01-15 08:15  tag merge-20040115-01
+
+2004-01-15 08:15  larne
+
+	* autogen.sh, beep-config.in, beep.pc.in, configure.in,
+	  Input/vorbis/vorbis.c, Output/OSS/OSS.h, Output/OSS/audio.c,
+	  Output/alsa/alsa.h, Output/esd/audio.c, beep/playlistwin.c,
+	  libbeep/xconvert.c (newplug) (utags: merge-20040115-01): - merge
+	  HEAD.
+
+2004-01-15 07:23  larne
+
+	* beep/prefswin.c: - typo: alphabetical -> alphabetically   [merge
+	  from newplug]
+
+2004-01-15 07:16  larne
+
+	* beep/prefswin.c (tags: merge-20040115-01) (newplug): -
+	  alphabetical -> alphabetically
+
+2004-01-15 06:57  descender
+
+	* autogen.sh:
+	  - autogen.sh for improved User Experience(TM)
+
+2004-01-15 06:43  descender
+
+	* configure.in, Input/vorbis/vorbis.c, Output/OSS/OSS.h (tags:
+	  cvs-20040120-01-HEAD), Output/OSS/audio.c (tags:
+	  cvs-20040120-01-HEAD), Output/alsa/alsa.h (tags:
+	  cvs-20040120-01-HEAD), Output/esd/audio.c (tags:
+	  cvs-20040120-01-HEAD), libbeep/xconvert.c (tags:
+	  cvs-20040120-01-HEAD):
+	  - applied Tim's patch to remove endian check in configure, and
+	  get endianness from Glib macros - indent -kr -nut
+
+2004-01-15 06:34  descender
+
+	* beep-config.in, beep.pc.in:
+	  - applied Artur's patch om beep-config/beep.pc to return
+	  visualization and effect plugin directories
+
+2004-01-15 06:25  descender
+
+	* beep/playlistwin.c:
+	  - fixed crash on keypress with shaded playlistwin in focus
+
+2004-01-15 06:15  larne
+
+	* beep/: about.c (tags: merge-20040115-01), debug.h (tags:
+	  merge-20040115-01), hints.c (tags: merge-20040115-01), main.c
+	  (tags: merge-20040115-01), mainwin.h (tags: merge-20040115-01),
+	  playlist.c (tags: merge-20040115-01), playlist.h (tags:
+	  merge-20040115-01), playlist_list.c (tags: merge-20040115-01),
+	  playlistwin.c, playlistwin.h (tags: merge-20040115-01), skin.c
+	  (tags: merge-20040115-01), skin.h (tags: merge-20040115-01)
+	  (newplug): - merge with HEAD.
+
+2004-01-15 06:07  descender
+
+	* beep/playlistwin.c:
+	  - partially fixed playlistwin resize draw error (still does not
+	  prevent itself from being resized to min. allowed dimensions)
+
+2004-01-15 06:04  larne
+
+	* Input/cdaudio/cdaudio.c (tags: merge-20040115-01),
+	  Input/mpg123/layer1.c (tags: merge-20040115-01),
+	  Input/mpg123/layer2.c (tags: merge-20040115-01),
+	  Input/mpg123/layer3.c (tags: merge-20040115-01),
+	  Input/vorbis/vorbis.c, Input/wav/wav.c (tags: merge-20040115-01),
+	  beep/output.c (tags: merge-20040115-01), beep/output.h (tags:
+	  merge-20040115-01) (newplug): - hopefully a real fix for hanging
+	  output bug.
+
+2004-01-15 05:29  larne
+
+	* beep/output.c, libbeep/titlestring.c (tags: merge-20040115-01)
+	  (newplug): - titlestring changes:  add %{n:...%} which shows ...
+	  only if element %n is present in tag.  - some temporary fix to
+	  stop hanging input bug (needs to be done   properly).
+
+2004-01-15 05:23  descender
+
+	* beep/about.c:
+	  - indent -kr -put
+
+2004-01-15 05:20  descender
+
+	* beep/: main.c, playlist.c, playlist.h, playlist_list.c:
+	  - converted playlist_mutex from GMutex back to GStaticMutex, and
+	  named it to 'playlist'
+
+2004-01-15 05:09  descender
+
+	* beep/hints.c:
+	  - set function pointers to NULL (wasn't set!!!!)
+
+2004-01-15 05:00  descender
+
+	* beep/: debug.h (tags: cvs-20040120-01-HEAD), mainwin.h,
+	  playlistwin.c, playlistwin.h, skin.c, skin.h:
+	  - added REQUIRE_STATIC_LOCK() for GStaticMutex locks - marked
+	  start and end of debug.h macros with G_STMT_START and G_STMT_END
+	  - shifted playlistwin frame drawing code from playlistwin.c to
+	  skin.c - corrected playlistwin min. width and height/width snap
+	  values
+
+2004-01-15 02:44  larne
+
+	* Input/cdaudio/cdaudio.c, Input/mpg123/layer1.c,
+	  Input/mpg123/layer2.c, Input/mpg123/layer3.c,
+	  Input/vorbis/vorbis.c, Input/wav/wav.c, beep/Makefile.am (tags:
+	  merge-20040115-01), beep/equalizer.c (tags: merge-20040115-01),
+	  beep/iir.c (tags: merge-20040115-01), beep/iir.h (tags:
+	  merge-20040115-01), beep/main.c, beep/output.c, beep/output.h
+	  (newplug): - start of new plugin 'pipe'.  new function
+	  produce_audio() is called   from the input plugin, which calls
+	  eq, output and (soon) effect	 plugins as needed.  a nice side
+	  effect is that eq now works for all	input, not just mp3! - a
+	  completely new eq, which is a slightly modified version of
+	  Felipe Rivera's "eq-xmms" plugin.
+
+2004-01-15 01:03  descender
+
+	* beep/: playlistwin.c, playlistwin.h:
+	  - moved size macros to playlistwin.h - indent -kr -nut
+
+2004-01-14 23:25  descender
+
+	* beep/: skin.c, skinwin.c (tags: merge-20040115-01), util.c (tags:
+	  merge-20040115-01):
+	  - fixed del_directory(), now uses dir_foreach() and properly
+	  removes directories - skin temp directories are now properly
+	  deleted - fixed temporary string memory leak in
+	  skin_get_thumbnail() - indent -kr -nut
+
+2004-01-14 21:21  descender
+
+	* Input/: cdaudio/cdaudio.c (tags: cvs-20040120-01-HEAD),
+	  wav/wav.c:
+	  - pthread->GThread code conversion - added missing
+	  g_thread_exit() call to CD audio plugin play loop - indent -kr
+	  -nut
+
+2004-01-14 21:05  descender
+
+	* Input/cdaudio/: cdaudio.c, cdaudio.h (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), cddb.c (tags: merge-20040115-01), cdinfo.c
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01), cdinfo.h (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), configure.c (tags:
+	  merge-20040115-01), http.c (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01):
+	  - indent -kr -nut
+
+2004-01-14 21:02  descender
+
+	* beep/: main.c, xml_document.c (tags: merge-20040115-01),
+	  xml_document.h (tags: cvs-20040120-01-HEAD, merge-20040115-01):
+	  - indent -kr -nut
+
+2004-01-14 20:03  mderezynski
+
+	* beep/dirbrowser.c (tags: merge-20040115-01):
+
+	  compile warning cleanups
+
+2004-01-14 19:54  descender
+
+	* Input/cdaudio/: cdaudio.c, cddb.c:
+	  - replaced pthread threads/mutexes with GThread
+
+2004-01-14 19:46  descender
+
+	* Input/mpg123/fileinfo.c (tags: merge-20040115-01):
+	  - another oopsie: text_utf8 misspelled
+
+2004-01-14 19:05  descender
+
+	* beep/main.c:
+	  - missing semicolon
+
+2004-01-14 18:51  descender
+
+	* configure.in:
+	  - make configure script plugin options dump at the end more
+	  informative
+
+2004-01-14 18:17  descender
+
+	* Input/mpg123/fileinfo.c, beep/Makefile.am, beep/fullscreen.c
+	  (tags: merge-20040115-01), beep/main.c, beep/widget.c (tags:
+	  merge-20040115-01), beep/widget.h (tags: merge-20040115-01):
+	  - glibification (basic data types, pthread_mutex_t to gthread
+	  mutexes) - marked mpg123 plugin fileinfo dialog tag fields as
+	  translatable - fixed temporary string memory leak mpg123 plugin's
+	  fileinfo.c:set_entry_tag() - more replacement of str(case()cmp)
+	  prefix checks with g_str_has_prefix() and str_has_prefix_nocase()
+
+2004-01-14 17:53  descender
+
+	* Input/vorbis/fileinfo.c, beep/softvolume.c, beep/softvolume.h
+	  (utags: merge-20040115-01):
+	  - applied Tim Muller's patches to fix Input/vorbis/fileinfo.c
+	  compiler warnings and cleanup softvolume.[ch]
+
+2004-01-14 11:41  coder_sku
+
+	* beep.spec.in (tags: merge-20040115-01), configure.in,
+	  Input/mpg123/Makefile.am (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01): enabled the disabling of the mp3 plugin in
+	  the build system and properly in the spec file
+
+2004-01-14 10:13  mderezynski
+
+	* .cvsignore (tags: merge-20040115-01):
+
+	  added file
+
+2004-01-14 09:33  descender
+
+	* beep/: mainwin.c (tags: merge-20040115-01), playlist.c:
+	  - mainwin scrolling text now displays converted strings properly
+
+2004-01-14 09:12  descender
+
+	* beep/: input.c (tags: merge-20040115-01), mainwin.c, playlist.c,
+	  playlist_list.c, util.c:
+	  - make '(invalid UTF-8)' (appended to failed UTF-8 string
+	  conversions) translatable - fixed crash with invalid UTF-8 titles
+	  in playlist - marked additional translatable strings in mainwin.c
+
+2004-01-14 08:43  descender
+
+	* beep/: dirbrowser.c, input.c, util.c, util.h (tags:
+	  merge-20040115-01):
+	  - added filename_to_utf8() - moved UTF-8 fallback conversion code
+	  to str_to_utf8_fallback() - dirbrowser now shows non-UTF-8
+	  strings
+
+2004-01-14 08:30  descender
+
+	* beep/util.c:
+	  - fixed str_to_utf8()'s fallback conversion
+
+2004-01-14 08:28  coder_sku
+
+	* beep.spec.in: unpackaged files fix
+
+2004-01-14 07:48  descender
+
+	* Input/mpg123/mpg123.c (tags: merge-20040115-01),
+	  beep/dirbrowser.c, beep/input.c, beep/main.c, beep/main.h (tags:
+	  merge-20040115-01), beep/playlist.c, beep/playlist.h,
+	  beep/pluginenum.c (tags: merge-20040115-01), beep/util.c,
+	  libbeep/configfile.c (tags: merge-20040115-01),
+	  libbeep/titlestring.c, libbeep/titlestring.h (tags:
+	  merge-20040115-01), po/.cvsignore (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01):
+	  - cleanups - added *.gmo and stamp.po to po/.cvsignore
+
+2004-01-14 06:28  descender
+
+	* beep/debug.h:
+	  - added REQUIRE_STR_UTF8() macro to validate UTF-8 strings (and
+	  complain if fails)
+
+2004-01-14 05:39  mderezynski
+
+	* Input/.cvsignore (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  Input/cdaudio/.cvsignore (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), Input/mpg123/.cvsignore (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), Input/vorbis/.cvsignore
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  Input/wav/.cvsignore (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), Output/.cvsignore (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), Output/OSS/.cvsignore
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  Output/alsa/.cvsignore (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), Output/esd/.cvsignore (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01),
+	  Visualization/.cvsignore (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), Visualization/blur_scope/.cvsignore (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), beep/.cvsignore (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), icons/.cvsignore (tags:
+	  merge-20040115-01), libbeep/.cvsignore (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), po/.cvsignore: new
+	  files: po/.cvsignore beep/defskin/.cvsignore beep/.cvsignore
+	  intl/.cvsignore Input/wav/.cvsignore Input/mpg123/.cvsignore
+	  Input/vorbis/.cvsignore Input/.cvsignore Input/cdaudio/.cvsignore
+	  icons/.cvsignore Output/OSS/.cvsignore Output/esd/.cvsignore
+	  Output/alsa/.cvsignore Output/.cvsignore libbeep/.cvsignore
+	  Visualization/blur_scope/.cvsignore Visualization/.cvsignore
+	  .cvsignore
+
+2004-01-14 04:02  descender
+
+	* beep/: util.c, util.h:
+	  - added str_to_utf8() for converting strings to UTF-8 with the
+	  &0x80 fallback
+
+2004-01-14 02:36  mderezynski
+
+	* beep/: dirbrowser.c, dirbrowser.h (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), mainwin.c, playlistwin.c, plugin.h (tags:
+	  merge-20040115-01), pluginenum.c:
+
+	  dirbrowser.c, dirbrowser.h: fixes etc mainwin.c: accredit to
+	  changes in dirbrowser.h plugin.h, pluginenum.h: removed/reverted
+	  return_tag_value_by_name()
+
+2004-01-14 00:37  descender
+
+	* beep/: dirbrowser.c, dirbrowser.h:
+	  - sanify dirbrowser.h - marked translatable strings, unmarked
+	  menu item separators
+
+2004-01-13 23:57  mderezynski
+
+	* beep/: dirbrowser.c, dirbrowser.h:
+
+	  dirbrowser.c, dirbrowser.h: fixed compile warnings
+
+2004-01-13 23:06  mderezynski
+
+	* Input/mpg123/configure.c (tags: merge-20040115-01),
+	  Input/mpg123/fileinfo.c, Input/vorbis/configure.c (tags:
+	  merge-20040115-01), Input/vorbis/fileinfo.c, beep/equalizer.c,
+	  beep/input.c, beep/mainwin.c, beep/playlistwin.c,
+	  beep/prefswin.c, beep/skinwin.c:
+
+	  Updated window titles
+
+2004-01-13 22:53  mderezynski
+
+	* beep/: dirbrowser.c, dirbrowser.h:
+
+	  dirbrowser.c, dirbrowser.h: re-added files after rewrite
+
+2004-01-13 22:52  mderezynski
+
+	* beep/: dirbrowser.c, dirbrowser.h: [no log message]
+
+2004-01-13 21:04  descender
+
+	* beep/equalizer.c, po/LINGUAS (tags: merge-20040115-01),
+	  po/bmp.pot (tags: merge-20040115-01), po/fr.po (tags:
+	  merge-20040115-01), po/lt.po (tags: merge-20040115-01),
+	  po/zh_CN.po (tags: merge-20040115-01):
+	  - stock-ize all stock-izable buttons - updated po/pot files
+	  accordingly
+
+2004-01-13 20:37  descender
+
+	* beep/: main.c, mainwin.c, playlist.c, playlistwin.c, urldecode.c
+	  (tags: merge-20040115-01), widget.h:
+	  - fixed DND crash - renamed "5 Seconds" forward/backward menu
+	  items to "5 seconds"
+
+2004-01-13 19:28  descender
+
+	* beep/: dirbrowser.c, equalizer.c, mainwin.c, playlistwin.c:
+	  - restore old file browser for Add Files - unmarked menu item
+	  separators as translatable
+
+2004-01-13 18:42  descender
+
+	* Visualization/blur_scope/config.c (tags: merge-20040115-01),
+	  beep/mainwin.c, beep/playlistwin.c, libbeep/dirbrowser.c (tags:
+	  merge-20040115-01), po/bmp.pot, po/fr.po, po/lt.po, po/zh_CN.po:
+	  - playlist window popup menu now shows translations properly -
+	  converted most of the remaining of "Ok/Cancel/Close/Apply..."
+	  buttons to stock - updated po/pot files accordingly
+
+2004-01-13 05:36  descender
+
+	* beep/: equalizer.c, mainwin.c, playlistwin.c, util.c, util.h:
+	  - readded item factory translations - renamed
+	  util_menu_translate() to bmp_menu_translate()
+
+2004-01-13 05:05  descender
+
+	* beep/equalizer.c, beep/main.c, po/bmp.pot, po/fr.po, po/lt.po,
+	  po/zh_CN.po:
+	  - use stock buttons for equalizer configuration dialog and fixed
+	  --help usage text, updated po/pot files accordingly - fixed
+	  --help option text alignment - updated Simplified Chinese
+	  translation
+
+2004-01-13 03:53  descender
+
+	* Input/vorbis/configure.c, po/bmp.pot, po/fr.po, po/lt.po,
+	  po/zh_CN.po:
+	  - unmarked GTK stock item name strings as translatable, updated
+	  po/pot files accordingly
+
+2004-01-13 03:41  descender
+
+	* AUTHORS (tags: merge-20040115-01), configure.in, beep/input.c,
+	  beep/prefswin.c, libbeep/titlestring.c, libbeep/titlestring.h,
+	  po/LINGUAS, po/bmp.pot, po/fr.po, po/lt.po, po/zh_CN.po:
+	  - added Chinese translation (Chong Kai Xiong, aka ME) - unmarked
+	  GTK stock item name strings as translatable and replaced them
+	  with macros - updated pot/po files accordingly
+
+2004-01-13 01:14  descender
+
+	* AUTHORS, configure.in, po/LINGUAS, po/lt.po,
+	  scripts/rm-auto-scripts.sh (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01):
+	  - added Lithuanian translation by Rimas Kudelis - updated
+	  rm-auto-scripts.sh to remove generated files in po/
+
+2004-01-13 00:53  descender
+
+	* beep/: input.c, input.h (tags: merge-20040115-01), playlist.c,
+	  pluginenum.c, skinwin.c, util.c, util.h:
+	  - renamed proxy strings (passed to plugins) - renamed vis_node to
+	  VisNode - plugin filename extensions do not need to be lower-case
+	  now - marked translatable strings in song-cannot-be-played error
+	  dialog
+
+2004-01-12 21:30  descender
+
+	* beep/: pluginenum.c, skinwin.c, util.c, util.h:
+	  - added dir_foreach() function - converted bmp_scan_plugins() and
+	  find_file_recursively() to use dir_foreach()
+
+2004-01-12 20:26  descender
+
+	* beep/: main.c, mainwin.c, mainwin.h, playlist.h:
+	  - attach mainwin idle function in mainwin_create() rather than
+	  main() - cleanups
+
+2004-01-12 20:08  descender
+
+	* beep/: controlsocket.c (tags: merge-20040115-01), dirbrowser.c,
+	  mainwin.c, playlist.c, playlist.h, playlistwin.c:
+	  - renamed playlist_add/ins_url_string to playlist_add/ins_url
+
+2004-01-12 19:51  descender
+
+	* beep/: about.c, input.c, mainwin.h, playlist.c, pluginenum.c:
+	  - added G_LOG_DOMAIN definitions - cleanups
+
+2004-01-12 17:05  descender
+
+	* beep/dirbrowser.c, beep/dnd.h (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), beep/main.c, beep/main.h, beep/mainwin.c,
+	  beep/playlist.c, beep/playlistwin.c, beep/pluginenum.h (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), beep/skin.c,
+	  beep/skinwin.c, beep/urldecode.c, beep/util.c, beep/util.h,
+	  libbeep/titlestring.c:
+	  - fixed case-sensitive issue with skin package extensions -
+	  marked translatable strings - cleanups
+
+2004-01-12 14:56  descender
+
+	* beep/: main.c, mainwin.c, prefswin.c, xml_document.c:
+	  - xml_document.c: replaced g_assert() with g_return_if_fail() -
+	  prefswin.c: renamed close button and related functions from 'ok'
+	  to 'close' - main.c, mainwin.c: removed useless rc load/save
+	  calls
+
+2004-01-12 04:11  mderezynski
+
+	* beep/dirbrowser.c: [no log message]
+
+2004-01-12 03:18  descender
+
+	* beep/: playlistwin.c, playlistwin.h:
+	  - playlist button popup menu now use new file selector
+	  (dirbrowser) for 'Add File'
+
+2004-01-12 01:03  descender
+
+	* po/: POTFILES.in (tags: merge-20040115-01), bmp.pot, fr.po,
+	  stamp-po:
+	  - removed old files and added new files to POTFILES.in - remove
+	  PO timestamp file from CVS
+
+2004-01-12 00:36  descender
+
+	* beep/dirbrowser.c:
+	  - marked translatable strings - renamed 'Scanning directories' to
+	  'Searching directories'
+
+2004-01-11 23:52  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  dirbrowser.c: Added code to scan directory's children to avoid
+	  subtrees becoming a dead end suddenly: bmp_db_dir_has_children();
+	  UI layout changes
+
+2004-01-11 20:08  descender
+
+	* beep/controlsocket.c, beep/dirbrowser.c, beep/eq_graph.c (tags:
+	  merge-20040115-01), beep/eq_slider.c (tags: merge-20040115-01),
+	  beep/equalizer.c, beep/hslider.c (tags: merge-20040115-01),
+	  beep/hslider.h (tags: merge-20040115-01), beep/main.c,
+	  beep/mainwin.c, beep/menurow.c (tags: merge-20040115-01),
+	  beep/menurow.h (tags: merge-20040115-01), beep/monostereo.c
+	  (tags: merge-20040115-01), beep/monostereo.h (tags:
+	  merge-20040115-01), beep/number.c (tags: merge-20040115-01),
+	  beep/number.h (tags: merge-20040115-01), beep/pbutton.c (tags:
+	  merge-20040115-01), beep/pbutton.h (tags: merge-20040115-01),
+	  beep/playlist.c, beep/playlist_list.c, beep/playlist_popup.c
+	  (tags: merge-20040115-01), beep/playlist_slider.c (tags:
+	  merge-20040115-01), beep/playlistwin.c, beep/playstatus.c (tags:
+	  merge-20040115-01), beep/skin.c, beep/skin.h, beep/skinwin.c,
+	  beep/svis.c (tags: merge-20040115-01), beep/tbutton.c (tags:
+	  merge-20040115-01), beep/tbutton.h (tags: merge-20040115-01),
+	  beep/textbox.c (tags: merge-20040115-01), beep/textbox.h (tags:
+	  merge-20040115-01), beep/vis.c (tags: merge-20040115-01),
+	  po/bmp.pot, po/fr.po:
+	  - skin functions generalized, now handles Skin instances instead
+	  of just the active skin - active skin renamed to bmp_active_skin
+	  - skin code cleanups
+
+2004-01-11 10:45  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  dirrowser.c: fixed compile warnings
+
+2004-01-11 09:05  mderezynski
+
+	* beep/: beep_logo.xpm (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), dirbrowser.c:
+
+	  beep_logo.xpm: Changed logo dirbrowser.c: dunno :\
+
+2004-01-11 07:58  mderezynski
+
+	* beep/: dirbrowser.c, playlist.c:
+
+	  dirbrowser.c playlist.c: Fixed locking issue
+
+2004-01-11 07:46  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  dirbrowser.c: Added info text to progressbar
+
+2004-01-11 07:35  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  dirbrowser.c: removed GtkFrame
+
+2004-01-11 07:25  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  dirbrowser.c: made recursing optional, changed UI layout
+
+2004-01-11 05:58  msikkes
+
+	* beep/: playlist.c, skinwin.c, skinwin.h (tags:
+	  merge-20040115-01): playlist.c: Song change with 'random skin on
+	  new song'-option now uses update_skinlist() in stead of
+	  update_skins() skinwin.c, skinwin.h: split update_skins() into
+	  update_skinlist and update_skinview()
+
+2004-01-11 03:19  descender
+
+	* beep/: xml_document.c, xml_document.h:
+	  - bmp_xml_document_load() now builds the entire tree
+
+2004-01-11 01:36  descender
+
+	* beep/: xml_document.c, Makefile.am, xml_document.h:
+	  - added basic XML parsing support (for BMP XML config)
+
+2004-01-10 18:15  descender
+
+	* beep/main.c:
+	  - use BMP path strings in main.c:bmp_config_save()
+
+2004-01-10 17:33  descender
+
+	* Input/mpg123/http.c (tags: merge-20040115-01), Input/wav/wav.c,
+	  beep/playlist.c, beep/plugin.h:
+	  - fixed compilation error (playlist.c used 'struct SkinNode'
+	  instead of just 'SkinNode') - glibize some plugin code
+
+2004-01-10 12:27  descender
+
+	* beep/: dirbrowser.c, equalizer.c, mainwin.c, pluginenum.c,
+	  skinwin.c:
+	  - fix temporary string memory leak in
+	  mainwin_drag_data_received()
+
+2004-01-10 12:07  descender
+
+	* beep/: controlsocket.c, controlsocket.h (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), main.c, mainwin.c:
+	  - lock 'going' in controlsocket thread loop condition - renamed
+	  control socket functions
+
+2004-01-10 11:24  descender
+
+	* beep/: controlsocket.c, mainwin.c, skin.c, skinwin.c, skinwin.h,
+	  vis.c:
+	  - fixed skin browser freeze - shorten GDK critical section in
+	  visualizer drawing code - minor cleanups
+
+2004-01-10 01:09  descender
+
+	* beep/: main.c, main.h, mainwin.c, skinwin.c:
+	  - added BMP path strings - temporary fix for skin browser freeze
+	  (nested lock issue)
+
+2004-01-10 00:15  descender
+
+	* Visualization/blur_scope/blur_scope.c (tags: merge-20040115-01),
+	  beep/main.c, beep/playlist.c, beep/prefswin.c:
+	  - fixed memory leak in create_prefs_window() (table_rb was
+	  allocated but not attached) - added playlist_skip_prefix() for
+	  ignore-prefix sorting support
+
+2004-01-09 23:59  mderezynski
+
+	* beep/: main.c, playlist.c, playlist_list.c, prefswin.c:
+
+	  resolved cvs merge conflicts
+
+2004-01-09 19:06  descender
+
+	* configure.in, beep/equalizer.c, beep/main.c, beep/playlist.c,
+	  beep/pluginenum.c, po/bmp.pot, po/fr.po:
+	  - fixed memory leak in playlist.c:playlist_get_info_text() -
+	  cleanups
+
+2004-01-09 18:12  descender
+
+	* beep/: Makefile.am, dynamic_lib.c, dynamic_lib.h, hints.c,
+	  main.c, playlist.c, pluginenum.c:
+	  - plugin loading is now done through GLib module functions
+
+2004-01-09 16:33  descender
+
+	* scripts/cleanall.sh (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01):
+	  - cleanall.sh script now removes .deps
+
+2004-01-09 16:28  descender
+
+	* Input/vorbis/fileinfo.c, Visualization/blur_scope/blur_scope.c,
+	  beep/main.c, beep/mainwin.c, beep/playlist.c, beep/playlistwin.c,
+	  beep/util.c, beep/util.h, po/bmp.pot, po/fr.po:
+	  - cleanups
+
+2004-01-09 04:21  mderezynski
+
+	* beep/: dirbrowser.c, mainwin.c, playlist.c, playlist_list.c,
+	  pluginenum.c, prefswin.c:
+
+	  dirbrowser.c, mainwin.c, playlist.c, playlist_list.c,
+	  playlistwin.c, pluginenum.c, prefswin.c: compile warnings fixed
+
+2004-01-09 02:44  descender
+
+	* beep/: playlist.c, playlist_list.c, util.c, util.h:
+	  - fixed temporary string leaks - added SWAP macro to util.h -
+	  convert_title_text(gchar *text) now returns text, allowing it to
+	  be chained with functions like g_strdup()
+
+2004-01-09 01:31  descender
+
+	* beep/: debug.h, main.c, mainwin.c, playlist.c, playlist.h,
+	  playlist_list.c, playlistwin.c, skinwin.c:
+	  - converted playlist_mutex from GStaticMutex to GMutex - added
+	  REQUIRE_LOCK() macro to check if a mutex is properly locked -
+	  added REQUIRE_LOCK checks for playlist_mutex - fixed 2 memory
+	  leaks involving temporary strings
+
+2004-01-08 06:04  mderezynski
+
+	* beep/: playlist.c, playlist_list.c:
+
+	  UTF8 fixes
+
+2004-01-07 18:05  mderezynski
+
+	* beep-config.in, beep/main.c, beep/playlist_list.c:
+
+	  beep-config.in: Re-added general plugin dir main.c: fixed order
+	  of initializations in main() playlist_list.c: rendering changes
+
+2004-01-07 01:09  msikkes
+
+	* libbeep/Makefile.am (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01): Changed beepincluddir to bmp/.
+
+2004-01-05 07:50  mderezynski
+
+	* beep/: dirbrowser.c, playlist_list.c:
+
+	  playlist_list.c: rendering changes dirbrowser.c: removed debug
+	  g_message()
+
+2004-01-04 21:53  mderezynski
+
+	* beep/: beep_logo.xpm, dirbrowser.c:
+
+	  beep_logo.xpm: Updated "about" logo dirbrowser.c: memleak fixes
+
+2004-01-03 23:42  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  More mem leak fixes
+
+2004-01-03 19:27  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  Fixed messed up bmp_db_mdb_sort_func
+
+2004-01-03 19:17  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  More memleak fixes
+
+2004-01-03 18:03  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  Memory usage cleanups (memleak fixes)
+
+2004-01-03 12:29  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  memleak fixes
+
+2004-01-03 12:04  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  leak fix in bmp_db_path_get_full()
+
+2004-01-03 09:18  descender
+
+	* beep/: main.c, sm.c (tags: merge-20040115-01):
+	  - fixed missing save_config() errors
+
+2004-01-03 02:55  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  Memory fixes
+
+2004-01-02 23:41  mderezynski
+
+	* beep/: dirbrowser.c, input.c, skinwin.c, util.c:
+
+	  Memleak fixes
+
+2004-01-02 20:38  descender
+
+	* beep.spec.in, configure.in, icons/Makefile.am (tags:
+	  merge-20040115-01):
+	  - restore configure script version to 0.9.6.2 (got reverted
+	  somehow) - install SVG icon in /usr/share/icons - updated RPM
+	  spec file
+
+2004-01-02 06:14  mderezynski
+
+	* TODO (tags: merge-20040115-01):
+
+	  Updated TODO
+
+2004-01-02 06:13  mderezynski
+
+	* TODO, beep/input.c, beep/mainwin.c, beep/playlistwin.c:
+
+	  Updated TODO
+
+	  mainwin.c: touched (actually changes, then reverted)
+	  playlistwin.c: touched
+
+2003-12-31 21:49  mderezynski
+
+	* beep/dirbrowser.c: [no log message]
+
+2003-12-31 21:07  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  Fixed empty browser on non-existant $HOME/.bmp/dbrc
+
+2003-12-31 19:41  mderezynski
+
+	* beep/: mainwin.c, playlist_list.c, util.c:
+
+	  mainwin.c: Fixed mainwin.c JTF always jumps to first file only
+
+	  playlist_list.c: Rendering changes
+
+	  util.c: No actual changes
+
+2003-12-31 18:06  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  Added label to filter, leak & structural cleanups
+
+2003-12-31 08:01  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  dirbrowser.c: Added optimizations to filter
+
+2003-12-31 07:42  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  dirbrowser.c: Structural cleanups in dirbrowser filtering code
+
+2003-12-31 07:20  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  Replaced filtering algorithms with those from mainwin.c JTF
+
+2003-12-31 07:03  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  Added filter to dirbrowser (WIP)
+
+2003-12-30 20:49  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  Removed static path for testing
+
+2003-12-30 20:15  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  Re-added for readding
+
+2003-12-30 20:14  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  Removed for re-adding
+
+2003-12-30 10:36  descender
+
+	* beep/dirbrowser.c:
+	  - fixed dirbrowser crash with invalid UTF-8 filenames, and when
+	  adding files with nothing selected
+
+2003-12-30 08:10  descender
+
+	* beep/dirbrowser.c:
+	  - fixed last merge of dirbrowser.c
+
+2003-12-30 07:32  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  indent -kr dirbrowser.c
+
+2003-12-30 07:16  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  Fixed problems introduced trough merger problem before last
+	  commit ...
+
+2003-12-30 07:12  mderezynski
+
+	* beep/: dirbrowser.c, mainwin.c, mainwin.h, playlistwin.c: [no log
+	  message]
+
+2003-12-30 07:04  descender
+
+	* beep/: controlsocket.c, dirbrowser.c, main.h:
+	  - main.c: replaced hard coded sizes with #defines -
+	  controlsocket.c: change int to gint - dirbrowser.c: dirbrowser
+	  now shows tree if dbrc does not exist
+
+2003-12-30 05:22  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  Readded "Add" button in dirbrowser
+
+2003-12-29 22:00  mderezynski
+
+	* beep/playlist_list.c:
+
+	  Fixed minor rendering problem in playlist_list.c
+
+2003-12-29 21:16  mderezynski
+
+	* beep/: skin.c: [no log message]
+
+2003-12-29 21:00  mderezynski
+
+	* beep/skin.c:
+
+	  Fixed compile problems with gcc 2.95.x
+
+2003-12-29 08:33  mderezynski
+
+	* TODO, TODO.bmp, configure.in:
+
+	  TODO: updated configure.in: Added fr to ALL_LINGUAS po/LINGUAS:
+	  touch due to check TODO.bmp: removed, use TODO
+
+2003-12-29 05:24  descender
+
+	* libbeep/: util.c, util.h (utags: merge-20040115-01):
+	  - reverted libbeep utility function names, add #define BMP name
+	  aliases instead
+
+2003-12-29 05:11  descender
+
+	* Input/vorbis/configure.c, Input/vorbis/fileinfo.c,
+	  Input/vorbis/http.c (tags: merge-20040115-01),
+	  Input/vorbis/http.h (tags: merge-20040115-01), beep/main.c,
+	  beep/main.h, beep/mainwin.c, beep/mainwin.h, beep/playlist.c,
+	  beep/playlistwin.c, beep/pluginenum.c, beep/prefswin.c,
+	  beep/prefswin.h (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  libbeep/util.c, libbeep/util.h:
+	  - fixed memory leak in vorbis/fileinfo.c:add_tag() - renamed
+	  Config to BmpConfig, option_info to BmpOptionInfo - renamed
+	  various *_cb() callback functions to *_callback() - renamed
+	  libbeep/util.c functions, added XMMS name aliases to keep
+	  compatibility - miscellaneous cleanups (Glibize types, add
+	  constness to string parameters etc.)
+
+2003-12-29 00:36  mderezynski
+
+	* beep/: playlist_list.c, playlistwin.c:
+
+	  playlistwin.c: fixed loading of playlists trough the file dialog
+
+2003-12-28 22:37  mderezynski
+
+	* beep/pluginenum.c:
+
+	  Added terminating null to pluginenum.c:
+	  init_plugins()::g_build_filename()
+
+2003-12-27 09:05  descender
+
+	* beep/: main.c, playlistwin.c, prefswin.c:
+	  - main.c: fixed double g_free() bug in save_config() (introduced
+	  in last commit) - cleanups
+
+2003-12-27 07:59  descender
+
+	* configure.in, beep/input.c, beep/input.h, beep/main.c,
+	  beep/playlist.c, beep/playlist.h, beep/playlist_list.c:
+	  - changed version number to 0.9.6.2 - fixed a few memory leaks
+	  with temp. g_build_filename() usage
+
+2003-12-27 05:19  mderezynski
+
+	* beep/: mainwin.c, playlist_list.c:
+
+	  Fixed JTF treeview needs focus for enter keypress to have an
+	  effect (now also works when the GtkEntry has focus)
+
+2003-12-27 04:16  descender
+
+	* beep/dirbrowser.c, po/bmp.pot, po/fr.po:
+	  - added translatable strings for dirbrowser - plugged some more
+	  leaks in dirbrowser
+
+2003-12-27 04:04  descender
+
+	* beep/: dirbrowser.c, prefswin.c:
+	  - plugged most memory leaks in dirbrowser - cleanups
+
+2003-12-26 23:55  descender
+
+	* beep/: equalizer.c, main.c, output.c, prefswin.c:
+	  - replaced sprintf()s with snprintf()s
+
+2003-12-26 23:47  descender
+
+	* beep/: playlist_list.c, playlistwin.c, prefswin.c, util.c,
+	  util.h:
+	  - cleanups
+
+2003-12-26 17:31  descender
+
+	* beep/: plugin.h, prefswin.c:
+	  - added typecast macros for plugin types - fixed memory leak in
+	  prefswin_font_browse_cb()
+
+2003-12-26 17:22  descender
+
+	* beep/: input.c, mainwin.c, playlist.c, playlist.h, textbox.c,
+	  textbox.h:
+	  - fixed memory leaks in mainwin - added const constraints to
+	  string arguments
+
+2003-12-26 16:48  descender
+
+	* configure.in, scripts/gen-auto-scripts.sh (tags:
+	  merge-20040115-01):
+	  - bump version up to 0.9.7 - turn off autopoint invocation for
+	  gen-auto-scripts by default
+
+2003-12-26 16:30  descender
+
+	* beep/: Makefile.am, about.c, beep.h, dirbrowser.c, dynamic_lib.c,
+	  effect.h (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  equalizer.c, equalizer.h (tags: merge-20040115-01), fft.c (tags:
+	  merge-20040115-01), fullscreen.c, fullscreen.h (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), general.h (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), hints.c, hslider.c,
+	  input.h, main.c, mainwin.h, menurow.c, monostereo.c,
+	  monostereo.h, number.c, number.h, output.c, output.h (tags:
+	  cvs-20040120-01-HEAD), pbutton.c, pbutton.h, playlist_popup.c,
+	  playlist_popup.h (tags: merge-20040115-01), playlist_slider.c,
+	  playlist_slider.h (tags: merge-20040115-01), playlistwin.h,
+	  playstatus.c, pluginenum.c, prefswin.c, sbutton.c (tags:
+	  merge-20040115-01), sbutton.h (tags: merge-20040115-01), skin.c,
+	  skin.h, skinwin.c, skinwin.h, sm.c, sm.h (tags:
+	  merge-20040115-01), svis.c, svis.h (tags: merge-20040115-01),
+	  tbutton.c, tbutton.h, textbox.c, textbox.h, util.h, vis.c, vis.h
+	  (tags: merge-20040115-01), visualization.c (tags:
+	  merge-20040115-01), visualization.h (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01):
+	  - removed all inclusion of "beep.h", removed beep.h
+
+2003-12-26 14:47  descender
+
+	* beep/: eq_graph.c, eq_graph.h (tags: merge-20040115-01),
+	  eq_slider.c, eq_slider.h (tags: merge-20040115-01), equalizer.c,
+	  equalizer.h, hints.h (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), hslider.h, menurow.h, prefswin.c, prefswin.h,
+	  util.c, widget.c, widget.h:
+	  - removed '#include "beep.h"'
+
+2003-12-26 14:15  descender
+
+	* beep/: about.c, bmp.c (tags: merge-20040115-01), bmp.h (tags:
+	  merge-20040115-01), dirbrowser.c, dirbrowser.h, dnd.h, dock.c
+	  (tags: merge-20040115-01), dock.h (tags: merge-20040115-01),
+	  general.c (tags: merge-20040115-01), general.h:
+	  - removed '#Include "beep.h"'
+
+2003-12-26 13:53  descender
+
+	* beep/playlist_list.c:
+	  - fixed playlist drawing error when list is short
+
+2003-12-26 13:29  descender
+
+	* beep/: dirbrowser.h, effect.c (tags: merge-20040115-01),
+	  effect.h, playlist_list.c, util.c, util.h:
+	  - cleanups
+
+2003-12-26 11:40  descender
+
+	* beep/playlist_list.c:
+	  - removed freetype2 header #include
+
+2003-12-26 11:33  descender
+
+	* beep/: dirbrowser.c, playlist.c, playlist.h, playlist_list.c,
+	  playlist_list.h (tags: merge-20040115-01), pluginenum.c,
+	  skinwin.c, util.c, util.h:
+	  - plugged all (I hope) memory leaks in playlist_list.c - more
+	  cleanups
+
+2003-12-26 07:26  descender
+
+	* beep/: controlsocket.c, dirbrowser.c, equalizer.c, main.c,
+	  mainwin.c, playlist.c, playlist.h, playlist_list.c,
+	  playlist_slider.c, playlistwin.c, prefswin.c:
+	  - cleanup - renamed get_playlist*() to playlist_get*()
+
+2003-12-25 08:58  descender
+
+	* beep/Makefile.am, scripts/cleanall.sh,
+	  scripts/rm-auto-scripts.sh:
+	  - updated helper scripts, cleanall.sh now removes .gmo files
+
+2003-12-25 08:07  descender
+
+	* beep/beep.desktop.in (tags: merge-20040115-01):
+	  - added 'Application' to Category field, added Encoding field
+
+2003-12-25 01:50  descender
+
+	* AUTHORS:
+	  - added David Le Brun (French translation) to AUTHORS
+
+2003-12-25 01:45  msikkes
+
+	* libbeep/util.c:
+	  - changed stock button to stock_close
+
+2003-12-25 01:30  descender
+
+	* beep/about.c, beep/main.c, po/LINGUAS, po/bmp.pot, po/fr.po:
+	  - last commit continued
+
+2003-12-25 01:29  descender
+
+	* beep.spec.in:
+	  - added French translation
+
+2003-12-25 01:17  mderezynski
+
+	* beep/: dirbrowser.c, mainwin.c:
+
+	  dirbrowser cleanups
+
+2003-12-25 00:11  descender
+
+	* beep/dirbrowser.c:
+	  - plugged a few leaks - fixed invalid memory reference
+
+2003-12-24 23:24  mderezynski
+
+	* beep/: dirbrowser.c, equalizer.c:
+
+	  Fixed possible unitialized str_parent in
+	  dirbrowser.c:dirbrowser_path_get_full()
+
+2003-12-24 23:11  mderezynski
+
+	* Visualization/blur_scope/blur_scope.c:
+
+	  Fixed blur_scope.c imported fscked up cvs merger code
+
+2003-12-24 22:06  mderezynski
+
+	* libbeep/: beepctrl.c (tags: merge-20040115-01), beepctrl.h (tags:
+	  merge-20040115-01), configfile.c, configfile.h (tags:
+	  merge-20040115-01), dirbrowser.c, dirbrowser.h (tags:
+	  merge-20040115-01), formatter.c (tags: merge-20040115-01),
+	  formatter.h (tags: merge-20040115-01), titlestring.c,
+	  titlestring.h, util.c, util.h, xconvert.c, xconvert.h (tags:
+	  merge-20040115-01), xentry.c (tags: merge-20040115-01), xentry.h
+	  (tags: merge-20040115-01): [no log message]
+
+2003-12-24 22:03  mderezynski
+
+	* beep/: about.c, bmp.c, controlsocket.c, controlsocket.h,
+	  dirbrowser.c, dirbrowser.h, dnd.h, dock.c, dock.h, dynamic_lib.c,
+	  dynamic_lib.h, effect.c, effect.h, eq_graph.c, eq_graph.h,
+	  eq_slider.c, eq_slider.h, equalizer.c, equalizer.h, fft.c, fft.h
+	  (tags: merge-20040115-01), fullscreen.c, fullscreen.h, general.c,
+	  general.h, getopt.c (tags: merge-20040115-01), getopt.h (tags:
+	  merge-20040115-01), getopt1.c (tags: merge-20040115-01), hints.c,
+	  hints.h, hslider.c, hslider.h, info.h (tags: merge-20040115-01),
+	  input.c, input.h, jump_to.h (tags: merge-20040115-01), main.c,
+	  main.h, mainwin.c, mainwin.h, menurow.c, menurow.h, mkdtemp.c
+	  (tags: merge-20040115-01), monostereo.c, monostereo.h, number.c,
+	  number.h, output.c, output.h, pbutton.c, pbutton.h, pixmaps.h
+	  (tags: merge-20040115-01), playlist.c, playlist.h,
+	  playlist_list.c, playlist_list.h, playlist_popup.c,
+	  playlist_popup.h, playlist_slider.c, playlist_slider.h,
+	  playlistwin.c, playstatus.c, playstatus.h (tags:
+	  merge-20040115-01), plugin.h, pluginenum.c, prefswin.c,
+	  prefswin.h, sbutton.c, sbutton.h, skin.c, skin.h, skinwin.c,
+	  skinwin.h, sm.c, softvolume.c, softvolume.h, svis.c, svis.h,
+	  tbutton.c, tbutton.h, textbox.c, textbox.h, urldecode.c, util.c,
+	  util.h, vis.c, vis.h, visualization.c, visualization.h, widget.c,
+	  widget.h:
+
+	  ...
+
+2003-12-24 22:01  mderezynski
+
+	* Output/alsa/about.c (tags: merge-20040115-01), Output/alsa/alsa.c
+	  (tags: merge-20040115-01), Output/alsa/alsa.h,
+	  Output/alsa/audio.c (tags: merge-20040115-01),
+	  Output/alsa/configure.c (tags: merge-20040115-01),
+	  Output/alsa/init.c (tags: merge-20040115-01), Output/esd/about.c
+	  (tags: merge-20040115-01), Output/esd/audio.c,
+	  Output/esd/configure.c (tags: merge-20040115-01),
+	  Output/esd/esd.c (tags: merge-20040115-01), Output/esd/esdout.h
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  Output/esd/init.c (tags: merge-20040115-01), Output/esd/mixer.c
+	  (tags: merge-20040115-01), Visualization/blur_scope/blur_scope.c,
+	  Visualization/blur_scope/blur_scope.h (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01),
+	  Visualization/blur_scope/config.c:
+
+	  Changed indentation style to K&R (using the "indent" utility) Now
+	  the 5th commit in a row because of broken SF cvs commiting...
+
+2003-12-24 21:59  mderezynski
+
+	* Input/wav/wav.c, Input/wav/wav.h (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), Output/OSS/OSS.c (tags: merge-20040115-01),
+	  Output/OSS/OSS.h, Output/OSS/about.c (tags: merge-20040115-01),
+	  Output/OSS/audio.c, Output/OSS/configure.c (tags:
+	  merge-20040115-01), Output/OSS/convert.c (tags:
+	  merge-20040115-01), Output/OSS/init.c (tags: merge-20040115-01),
+	  Output/OSS/mixer.c (tags: merge-20040115-01),
+	  Output/OSS/soundcard.h (tags: merge-20040115-01):
+
+	  Changed indentation style to K&R (using the "indent" utility)
+
+2003-12-24 21:55  mderezynski
+
+	* Input/: mpg123/common.c (tags: merge-20040115-01),
+	  mpg123/configure.c, mpg123/dct64.c (tags: merge-20040115-01),
+	  mpg123/dct64_i386.c (tags: merge-20040115-01), mpg123/decode.c
+	  (tags: merge-20040115-01), mpg123/decode_2to1.c (tags:
+	  merge-20040115-01), mpg123/decode_4to1.c (tags:
+	  merge-20040115-01), mpg123/decode_i386.c (tags:
+	  merge-20040115-01), mpg123/dxhead.c (tags: merge-20040115-01),
+	  mpg123/dxhead.h (tags: merge-20040115-01), mpg123/equalizer.c
+	  (tags: merge-20040115-01), mpg123/fileinfo.c, mpg123/getbits.c
+	  (tags: merge-20040115-01), mpg123/http.c, mpg123/huffman.h (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), mpg123/id3.c (tags:
+	  merge-20040115-01), mpg123/id3.h (tags: merge-20040115-01),
+	  mpg123/id3_frame.c (tags: merge-20040115-01),
+	  mpg123/id3_frame_content.c (tags: merge-20040115-01),
+	  mpg123/id3_frame_text.c (tags: merge-20040115-01),
+	  mpg123/id3_frame_url.c (tags: merge-20040115-01),
+	  mpg123/id3_header.h (tags: merge-20040115-01), mpg123/id3_tag.c
+	  (tags: merge-20040115-01), mpg123/l2tables.h (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), mpg123/layer1.c,
+	  mpg123/layer2.c, mpg123/layer3.c, mpg123/mpg123.c,
+	  mpg123/mpg123.h (tags: merge-20040115-01), mpg123/tabinit.c
+	  (tags: merge-20040115-01), vorbis/configure.c, vorbis/fileinfo.c,
+	  vorbis/glibconfig.h (tags: merge-20040115-01), vorbis/http.c,
+	  vorbis/http.h, vorbis/vcedit.c (tags: merge-20040115-01),
+	  vorbis/vcedit.h (tags: merge-20040115-01), vorbis/vorbis.c,
+	  vorbis/vorbis.h (tags: merge-20040115-01):
+
+	  Changed indentation style to K&R (using the "indent" utility)
+
+2003-12-24 21:27  mderezynski
+
+	* Input/cdaudio/: cdaudio.c, cdaudio.h, cddb.c, cddb.h (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), cdinfo.c, cdinfo.h,
+	  configure.c, http.c, http.h (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01):
+
+	  Changed indentation style to K&R (using the "indent" utility)
+
+2003-12-24 20:28  mderezynski
+
+	* Input/vorbis/vorbis.c:
+
+	  Fixed FreeBSD compile problem
+
+2003-12-24 19:47  msikkes
+
+	* AUTHORS:
+	  - added myself to AUTHORS :)
+
+2003-12-24 14:02  descender
+
+	* beep-media-player.1.in (tags: merge-20040115-01):
+	  - adapted xmms(1) manpage to fit beep-media-player(1)
+
+2003-12-24 13:41  descender
+
+	* beep.spec.in:
+	  - updated beep.spec changelog
+
+2003-12-24 13:37  descender
+
+	* icons/Makefile.am:
+	  - last cvs commit continued (got aborted halfway yet again)
+
+2003-12-24 13:35  descender
+
+	* Makefile.am (tags: merge-20040115-01), beep.spec.in,
+	  beep/Makefile.am:
+	  - fixed 'make dist' - first fully usable RPM spec file
+
+2003-12-24 11:34  descender
+
+	* scripts/: gen-auto-scripts.sh, make-dist.sh (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01):
+	  - improved customizability of gen-auto-scripts.sh
+
+2003-12-24 11:19  mderezynski
+
+	* beep/: beep_logo.xpm, dirbrowser.c, mainwin.c:
+
+	  * dirbrowser.c: Added the ability to add albums on double click
+	  in metadata view * beep_logo.xpm: Changed logo to bmp instead of
+	  beep * mainwinc: Changed menu entry to "About bmp" instead of
+	  "About ::beep."
+
+2003-12-24 09:28  msikkes
+
+	* Makefile.am, beep-media-player.1.in, beep.1.in, configure.in:
+	  - renamed beep.1.in -> beep.1
+
+2003-12-24 09:03  descender
+
+	* icons/: Makefile.am, beep-red.svg, beep.svg (tags:
+	  merge-20040115-01):
+	  - renamed beep-red.svg to beep.svg, removed original beep.svg
+
+2003-12-24 08:58  msikkes
+
+	* beep/Makefile.am:
+	  - includedir <dir>/beep -> <dir>/bmp
+
+2003-12-24 08:24  mderezynski
+
+	* beep/main.c:
+
+	  Changed playlist default font to Sans Bold 12
+
+2003-12-24 08:02  mderezynski
+
+	* beep/main.c:
+
+	  Fixed bmp playlist not loaded at startup
+
+2003-12-24 07:52  msikkes
+
+	* Visualization/blur_scope/blur_scope.c:
+	  - fixed compile warning
+
+2003-12-24 07:51  msikkes
+
+	* configure.in:
+	  - plugindir from <dir>/beep to <dir>/bmp
+
+2003-12-24 07:48  mderezynski
+
+	* beep/: equalizer.c, skinwin.c, util.c:
+
+	  Replaced window titles to bmp:
+
+2003-12-24 07:09  msikkes
+
+	* libbeep/util.c:
+	  - added automatic policy to scrollbars
+
+2003-12-24 07:03  mderezynski
+
+	* beep/input.c:
+
+	  Fixed memleak in input.c: input_check_file()
+
+2003-12-24 05:59  msikkes
+
+	* AUTHORS:
+	  - added vlad at softshape.com as the skin author
+
+2003-12-24 01:59  mderezynski
+
+	* beep/: input.c, playlist_list.c:
+
+	  Changes in playlist rendering
+
+2003-12-24 00:34  msikkes
+
+	* configure.in:
+	  - fixed DATA_DIR=$(datadir)/beep to /bmp
+
+2003-12-19 00:47  msikkes
+
+	* libbeep/util.c:
+	  - removed #include <string.h>, was used for debugging
+
+2003-12-18 23:13  msikkes
+
+	* libbeep/util.c:
+	  - xmms_show_message dialog now shows a scrolledwindow
+
+2003-12-16 18:23  descender
+
+	* Output/OSS/configure.c, Output/alsa/alsa.c,
+	  Output/alsa/configure.c, beep/Makefile.am, beep/controlsocket.c,
+	  beep/controlsocket.h, beep/main.c, beep/mainwin.h,
+	  icons/Makefile.am, libbeep/beepctrl.c:
+	  - Last commit was interrupted.
+
+2003-12-16 18:22  descender
+
+	* beep.m4 (tags: merge-20040115-01), beep.spec.in:
+	  - fixed GCC warnings - fixed memory leak in socket I/O timeout
+	  code - added socket I/O timeout to libbeep - updated RPM spec
+	  file - miscellaneous tweaks to installation paths
+
+2003-12-14 05:19  descender
+
+	* beep/: mainwin.c, playlist.c, playlist.h, playlist_list.c,
+	  playlistwin.c:
+	  - use GStaticMutex instead of pthread_mutex_t for playlist_mutex
+	  - renamed playlist mutex lock/unlock macros from PL_LOCK/UNLOCK
+	  to PLAYLIST_LOCK/UNLOCK
+
+2003-12-14 00:00  msikkes
+
+	* Output/OSS/configure.c:
+	  - fixed compiler warnings
+
+2003-12-13 23:42  msikkes
+
+	* Output/esd/configure.c:
+	  - fixed compiler warnings
+
+2003-12-13 22:48  msikkes
+
+	* Input/mpg123/configure.c:
+	  - fixed bug where mpg123 didn't save it's config variables to
+	  configfile
+
+2003-12-13 21:31  descender
+
+	* beep/: mainwin.c, mainwin.h, playlist.c, playlist.h,
+	  playlistwin.h:
+	  - replaced '#include "beep.h"' in playlist.h
+
+2003-12-13 21:15  descender
+
+	* beep/playlist.c:
+	  - fixed memory leak in playlist_get_info_text()
+
+2003-12-13 21:12  msikkes
+
+	* Input/wav/wav.c: fixed a warning at line 57, removed VERSION
+	  argument in g_strdup_printf (it wasn't used)
+
+2003-12-13 21:09  msikkes
+
+	* Makefile.am: added beep.pc to installation procedure
+
+2003-12-13 21:02  msikkes
+
+	* Makefile.am: added beep.pc to to install procedure
+
+2003-12-13 17:18  descender
+
+	* beep/: beep.h, dirbrowser.c, dirbrowser.h, dynamic_lib.c,
+	  equalizer.h, main.c, main.h, mainwin.c, mainwin.h,
+	  playlist_slider.h, playlistwin.c, playlistwin.h, util.h:
+	  - more cleanups
+
+2003-12-13 07:45  hyriand
+
+	* Input/mpg123/: common.c, mpg123.c: fixed compiler warnings
+
+2003-12-13 07:19  hyriand
+
+	* Input/cdaudio/: cdaudio.c, cdaudio.h, cddb.c, configure.c,
+	  http.c, http.h: fixed compiler warnings, fixed vorbistags
+	  changing GTK char buffers, fixed wav-plugin memleak
+
+2003-12-13 06:38  hyriand
+
+	* libbeep/xentry.c: fixed compiler warnings
+
+2003-12-13 06:30  hyriand
+
+	* beep/: about.c, beep.h, dirbrowser.c, eq_slider.c, hslider.c,
+	  input.c, main.h, mainwin.c, mainwin.h, playlist.c, playlist.h,
+	  playlist_list.c, playlist_popup.c, playlist_slider.c,
+	  playlistwin.c, pluginenum.c, prefswin.c, sbutton.c, util.c,
+	  util.h: fixed all compiler warnings
+
+2003-12-13 05:18  descender
+
+	* beep/: Makefile.am, main.c, main.h, mainwin.c, mainwin.h,
+	  number.h:
+	  - move monster mainwin code into mainwin.c
+
+2003-12-13 04:09  descender
+
+	* beep/playlistwin.c: - replaced playlistwin explicit hard coded
+	  sizes with macros
+
+2003-12-13 03:49  hyriand
+
+	* beep/util.c: fixes for add file dialog (the gtk one) for plugins
+	  that override dirs 1) don't add ./ and ../ to the file list 2)
+	  check the current dir when showing the dialog
+
+2003-12-13 03:29  descender
+
+	* beep/: main.c, pluginenum.c:
+	  - replaced mainwin hard coded sizes, which were specified in
+	  explicit values, with macros - removed commented out prototypes
+
+2003-12-13 01:45  mderezynski
+
+	* beep/: input.c, main.c, playlist_list.c, plugin.h, pluginenum.c,
+	  util.c:
+
+	  Fixed window title behaviour, made plugins return gint on plugin
+	  init()
+
+2003-12-12 21:40  descender
+
+	* beep/dynamic_lib.c:
+	  - forgot to include "config.h" to get definition of SYMBOL_PREFIX
+
+2003-12-12 21:37  descender
+
+	* beep/: Makefile.am, dynamic_lib.c, dynamic_lib.h, pluginenum.c:
+	  - moved out dynamic library handling code from pluginenum.c into
+	  dynamic_lib.c, added entries to Makefile.am accordingly
+
+2003-12-12 21:08  descender
+
+	* beep/: input.c, input.h, main.c, pluginenum.c, skin.h, textbox.h:
+
+	  - continued, last commit somehow excluded these files
+
+2003-12-12 21:02  descender
+
+	* beep.pc.in, configure.in, Input/vorbis/fileinfo.c:
+	  - added beep.pc output to ./configure - more clean ups
+
+2003-12-10 03:05  mderezynski
+
+	* beep/: equalizer.c, playlist_list.c, playlistwin.c:
+
+	  Forgot to make EQ transient again
+
+2003-12-10 02:25  msikkes
+
+	* beep.pc.in: Added beep pkg-config file.
+
+2003-12-08 14:01  descender
+
+	* beep/: input.c, input.h, main.h, playstatus.h, textbox.h, vis.h,
+	  widget.h:
+	  - start of '#include "beep.h"" replacement (with more specific
+	  includes) - miscellaneous clean ups
+
+2003-12-08 12:36  descender
+
+	* beep/playlist.c:
+	  - g_free() was not used correctly in playlist_set_current_name()
+
+2003-12-08 12:34  descender
+
+	* beep/: playlist.c, playlist.h:
+	  - unfsck and restore playlist_current_name accessor methods
+	  (someone reverted it to the old code)
+
+2003-12-08 09:43  descender
+
+	* beep/main.c, beep/skinwin.c, libbeep/configfile.c,
+	  libbeep/configfile.h:
+	  - fixed sigsegv with skin browser - added const constraints to
+	  config read/write functions - remove commented out g_strconcat()s
+	  and an unnecessary temp string allocation
+
+2003-12-07 22:14  descender
+
+	* beep/: urldecode.c, urldecode.h (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01):
+	  - fixed memory leaks and added const constraints on input strings
+	  for xmms_urldecode_*()
+
+2003-12-07 19:07  mderezynski
+
+	* beep/: Makefile.am, playlistwin.c:
+
+	  Reverted subwindows to transients (for now). That breaks alot of
+	  stuff again (no minimizing on entry click in GNOME window list),
+	  but at least no worries about the playlist window anymore.
+
+2003-12-07 02:53  mderezynski
+
+	* beep/: Makefile.am, main.c, playlist.c, playlist_list.c,
+	  pluginenum.c:
+
+	  beep/pluginenum.c * Renamed scan_plugins to bmp_scan_plugins to
+	  avoid DL problem on Linux w/ libxine (which has an own
+	  scan_plugins)
+
+2003-12-06 04:04  mderezynski
+
+	* beep/playlist.c:
+
+	  playlist.c: * removed debug messages
+
+2003-12-06 04:01  mderezynski
+
+	* beep/: dirbrowser.c, pixmaps.h, playlist.c, playlist_list.c,
+	  urldecode.c:
+
+	  playlist.c: * Fixed forgotten change from variables 'string' to
+	  'decoded' in playlist_ins_url_string()
+
+	  playlist_list.c: * Alignment of 1-digit track numbers right
+	  instead of left
+
+2003-12-05 13:36  coder_sku
+
+	* beep/tbutton.c: fixed typecasts
+
+2003-12-05 13:35  coder_sku
+
+	* beep/: dock.c, dock.h: removed totaly unused and somewhat wacky
+	  function
+
+2003-12-05 13:14  coder_sku
+
+	* beep/pbutton.c: type casting correction
+
+2003-12-05 13:08  coder_sku
+
+	* beep/controlsocket.c: commented out unused static variables
+
+2003-12-05 12:56  coder_sku
+
+	* beep/: playlist.c, skinwin.h: more compiler warning fixes
+
+2003-12-05 12:51  coder_sku
+
+	* beep/pluginenum.c: compiler warning fixes
+
+2003-12-05 12:40  coder_sku
+
+	* beep/: input.c, input.h, output.c: compiler warning fixes
+
+2003-12-05 12:30  coder_sku
+
+	* beep/equalizer.c: fixed a mistype, and commented out unused
+	  function
+
+2003-12-05 09:49  mderezynski
+
+	* beep/urldecode.c:
+
+	  Fixed free() problem in xmms_urldecode_path()
+
+2003-12-05 01:42  coder_sku
+
+	* beep/skinwin.c: converted scan_skindir to use glib and util.c
+	  archive stuff instead of unix code and repeated strcmp
+
+2003-12-04 23:14  mderezynski
+
+	* beep/dirbrowser.c:
+
+	  Fixed metadata view not showing any names
+
+2003-12-04 23:08  mderezynski
+
+	* beep/: dirbrowser.c, input.c, main.c, playlist.c, urldecode.c:
+
+	  Fixed crash whith DnD-ing files
+
+2003-12-04 21:20  mderezynski
+
+	* beep/urldecode.c: [no log message]
+
+2003-12-04 20:18  mderezynski
+
+	* beep/urldecode.c: [no log message]
+
+2003-12-04 20:12  mderezynski
+
+	* beep/urldecode.c: [no log message]
+
+2003-12-04 20:07  mderezynski
+
+	* Input/vorbis/vorbis.c, beep/dirbrowser.c, beep/main.c,
+	  beep/pluginenum.c, beep/urldecode.c, beep/urldecode.h:
+
+	  Partial revert of changes in urldecode.c
+
+2003-12-04 18:31  mderezynski
+
+	* Input/: mpg123/mpg123.c, vorbis/vorbis.c:
+
+	  Re-added code neccesary for browser metadata view
+
+2003-12-04 18:30  mderezynski
+
+	* beep/: build.list (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), dirbrowser.c, input.c, input.h, pixmaps.h,
+	  plugin.h:
+
+	  Re-introduced (?! how could it get lost) dirbrowser.c ALL
+	  warnings are back in (how could this happen?)
+
+2003-12-04 08:40  mderezynski
+
+	* beep/: Makefile.am, dirbrowser.c:
+
+	  Added new file dirbrowser.c
+
+2003-12-04 08:38  mderezynski
+
+	* beep/: Makefile.am, playlist.c, playlist.h:
+
+	  Browser updates, externalization into dirbrowser.c, dirbrowser.h
+
+2003-12-03 21:33  mderezynski
+
+	* beep/output.c:
+
+	  Fixed prefswin freeze trough reverting output plugin change
+	  behaviour
+
+2003-12-03 01:37  mderezynski
+
+	* beep/playlist.c:
+
+	  Compile cleanups
+
+2003-12-03 00:28  coder_sku
+
+	* beep/: skinwin.c, util.c, util.h: compiler warnings/small
+	  bugfixes
+
+2003-12-02 23:13  coder_sku
+
+	* beep/: skin.c, util.c: compiler warning fixes
+
+2003-12-02 21:29  descender
+
+	* beep/playlist.c:
+	  - fixed dirbrowser segfault
+
+2003-12-02 18:55  descender
+
+	* beep/beep.h, beep/effect.c, beep/effect.h, beep/equalizer.c,
+	  beep/equalizer.h, beep/input.c, beep/input.h, beep/main.c,
+	  beep/playlist.c, beep/playlist.h, beep/playlist_list.c,
+	  beep/playlistwin.c, beep/pluginenum.c, beep/skin.c,
+	  beep/skinwin.c, beep/urldecode.c, beep/urldecode.h,
+	  libbeep/configfile.c, libbeep/configfile.h,
+	  libbeep/titlestring.c, libbeep/titlestring.h:
+	  - added const constraints to gchar/char * string parameters
+	  wherever appropriate
+
+2003-12-02 11:49  descender
+
+	* beep/main.c:
+	  - removed redundant commented gtk_rc_* calls, make Beep exit with
+	  code 1 instead of 0 when gtk fails to init and wasn't run to
+	  command a remote session.
+
+2003-12-02 10:34  descender
+
+	* beep/playlist.c:
+	  - replaced stat() and S_ISDIR() with g_file_test()
+
+2003-12-02 08:04  descender
+
+	* beep/: playlist.c, playlist.h, playlistwin.c, playlistwin.h:
+	  - localized playlist_current_name - fixed memory leak in
+	  playlist_set_current_name() - fixed warped redundant code in
+	  playlist_get_current_name()
+
+2003-12-02 07:45  descender
+
+	* beep/controlsocket.c:
+	  - Glibize anything unglibized
+
+2003-12-02 05:53  mderezynski
+
+	* AUTHORS:
+
+	  Added authors to AUTHORS
+
+2003-12-01 17:02  descender
+
+	* Makefile.am, configure.in, icons/Makefile.am,
+	  libbeep/Makefile.am, scripts/gen-auto-scripts.sh:
+	  - added (gettext) autopoint invocation - added m4 search path in
+	  relevant Makefile.am files, macro errors due to re-aclocalizing
+	  by make should be fixed now - SVG icons are now installed (with
+	  make install)
+
+2003-12-01 03:03  descender
+
+	* beep.spec.in:
+	  - first functional RPM spec file (for Fedora)
+
+2003-12-01 00:48  descender
+
+	* Makefile.am, configure.in, icons/Makefile.am:
+	  - added make targets for icons/
+
+2003-12-01 00:37  descender
+
+	* configure.in:
+	  - added switch to disable building ALSA output plugin
+
+2003-11-29 12:13  descender
+
+	* beep/beep.desktop.in:
+	  - revised desktop entry file, added categories field (according
+	  to xdg-menu 0.8 specification)
+
+2003-11-29 07:30  descender
+
+	* Input/vorbis/: configure.c, fileinfo.c, vorbis.c:
+	  - use GLib mutex instead of pthread (vf_mutex) - plugged memory
+	  leaks due to double string allocations - replaced g_basename()
+	  (deprecated) with g_path_get_basename() - simplified some code
+
+2003-11-29 03:11  coder_sku
+
+	* configure.in, beep/Makefile.am: removed gnet stufferoo
+
+2003-11-28 17:49  descender
+
+	* config.h.in, libbeep/config.h.in:
+	  - remove config.h.in files, autogenerated by autoheader
+
+2003-11-28 10:33  descender
+
+	* Input/mpg123/Makefile.am, Visualization/blur_scope/Makefile.am
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  beep/Makefile.am:
+	  - updated Makefile.am files, 'make dist' now works.
+
+2003-11-28 10:09  descender
+
+	* Makefile.am, beep.desktop.in, configure.in,
+	  Output/OSS/configure.c, beep/Makefile.am, po/bmp.pot, po/fr.po,
+	  scripts/armageddon.sh (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), scripts/cleanall.sh,
+	  scripts/gen-auto-scripts.sh, scripts/genesis.sh (tags:
+	  merge-20040115-01), scripts/make-dist.sh,
+	  scripts/rm-auto-scripts.sh:
+	  - added French translation (David david at dyn-ns.net) (l10n not
+	  working yet) - removed duplicate beep.desktop.in /, updated
+	  helper scripts to use AUTHORS to test for top-level directory
+	  instead.
+
+2003-11-28 09:14  descender
+
+	* scripts/: armageddon.sh, cvs2cl.pl (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), gen-auto-scripts.sh, rm-auto-scripts.sh:
+	  - updated cvs2cl.pl to 2.5 - revised/updated helper scripts (use
+	  'test' instead of '[]', added changelog generation, remove some
+	  files previously missed, etc.)
+
+2003-11-28 08:41  descender
+
+	* configure.in, libbeep/configure.in (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01):
+	  * use new AC_OUTPUT macro * added beep.desktop to ./configure
+	  output
+
+2003-11-28 07:28  descender
+
+	* beep/controlsocket.c:
+	  - oopsie fix: setup_ctrlsocket() scan loop did not terminate
+	  immediately when socket file exists and cannot be unlinked (but
+	  no problem since bind()-ing the file fails anyway)
+
+2003-11-28 07:16  descender
+
+	* beep/controlsocket.c:
+	  - rearranged setup_ctrlsocket() logic - added timing out to
+	  control socket I/O (default: 0.1s)
+
+2003-11-27 13:37  descender
+
+	* beep-config.in, configure.in:
+	  - fixed beep-config(.in) borkage - added gnet2 checks
+
+2003-11-27 09:48  descender
+
+	* beep/: controlsocket.c, main.c:
+	  - ported control socket code to use GLib thread functions.  -
+	  fixed up xmms_compat_mode option handling
+
+2003-11-27 07:24  mderezynski
+
+	* Input/mpg123/mpg123.c, Input/vorbis/vorbis.c, beep/input.c,
+	  beep/input.h, beep/main.c, beep/playlist.c, beep/plugin.h,
+	  beep/pluginenum.c, beep/skin.c:
+
+	  Initial import of filebrowser revampness
+
+2003-11-27 07:00  coder_sku
+
+	* beep/: skin.c, skinwin.c, util.c, util.h: rewrote archive
+	  decompression functions, placed them in util.c
+
+2003-11-27 02:20  coder_sku
+
+	* beep/: skin.c, skin.h: finished removing def_pixmap stuff
+
+2003-11-26 15:08  descender
+
+	* ABOUT-NLS (tags: merge-20040115-01), acinclude.m4 (tags:
+	  merge-20040115-01), config.h.in, configure.in,
+	  libbeep/acinclude.m4 (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), scripts/gen-auto-scripts.sh,
+	  scripts/rm-auto-scripts.sh:
+	  - sanitized acinclude.m4 and libbeep/acinclude.m4
+
+2003-11-26 15:06  descender
+
+	* m4/: alsa.m4, beep-old.m4, beep.m4, codeset.m4, esd.m4,
+	  glibc21.m4, iconv.m4, intdiv0.m4, inttypes-pri.m4, inttypes.m4,
+	  inttypes_h.m4, isc-posix.m4, lcmessage.m4, lib-ld.m4,
+	  lib-link.m4, lib-prefix.m4, libmikmod.m4, libtool.m4, libxml.m4,
+	  nls.m4, ogg.m4, po.m4, progtest.m4, stdint_h.m4, uintmax_t.m4,
+	  ulonglong.m4, vorbis.m4 (utags: merge-20040115-01):
+	  - added libtool/gettext/libmikmod/alsa/libxml/libogg/libvorbis m4
+	  scripts
+
+2003-11-26 10:27  descender
+
+	* acinclude.m4, config.h.in, configure.in, m4/gettext.m4 (tags:
+	  merge-20040115-01), scripts/cleanall.sh,
+	  scripts/gen-auto-scripts.sh:
+	  - new m4/ directory for dumping m4 scripts - start of
+	  acinclude.m4 clean up
+
+2003-11-26 09:47  descender
+
+	* configure, depcomp (tags: merge-20040115-01),
+	  scripts/cleanall.sh, scripts/gen-auto-scripts.sh,
+	  scripts/genesis.sh, scripts/rm-auto-scripts.sh:
+	  - updated helper scripts - added automake 1.7 depcomp - removed
+	  wrongly checked in configure
+
+2003-11-26 09:21  descender
+
+	* po/: Makevars.template (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), stamp-po:
+	  - added new gettext files, part 2.
+
+2003-11-26 09:19  descender
+
+	* po/: ChangeLog (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  Makefile.in.in (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  beep.pot, bmp.pot, en at boldquot.header (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), en at quot.header (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01):
+	  - regenerated and renamed pot file - added/updated new gettext
+	  files
+
+2003-11-26 08:42  descender
+
+	* config.guess (tags: merge-20040115-01), config.h.in, config.rpath
+	  (tags: merge-20040115-01), config.sub (tags: merge-20040115-01),
+	  configure, install-sh (tags: merge-20040115-01), ltmain.sh (tags:
+	  merge-20040115-01), missing (tags: merge-20040115-01),
+	  mkinstalldirs (tags: merge-20040115-01):
+	  - putting back automake/autoconf-pulled scripts
+
+2003-11-26 08:21  descender
+
+	* scripts/: armageddon.sh, genesis.sh:
+	  - genesis and armageddon scripts (see respective files for more
+	  information)
+
+2003-11-25 08:21  mderezynski
+
+	* Input/: mpg123/mpg123.c, vorbis/vorbis.c:
+
+	  Fixed pthread nonsense code i've written before, heh
+
+2003-11-25 06:16  mderezynski
+
+	* beep/playlist.c:
+
+	  Fixed keybindings in dirbrowser
+
+2003-11-25 04:20  mderezynski
+
+	* Input/mpg123/mpg123.c, Input/vorbis/vorbis.c, beep/input.c,
+	  beep/main.c:
+
+	  - Various pthread fixes - Fixed Xlib async bug
+
+2003-11-24 22:04  mderezynski
+
+	* config.h.in: [no log message]
+
+2003-11-23 23:10  mderezynski
+
+	* beep/main.c:
+
+	  UTF-8 fix by David Le Brun
+
+2003-11-22 05:23  coder_sku
+
+	* beep/main.c: more replacing g_strconcat with g_build_filename
+
+2003-11-22 04:51  coder_sku
+
+	* beep/main.c: commented out useless code
+
+2003-11-22 04:49  coder_sku
+
+	* beep/: main.c, skin.c: g_build_filename fixes
+
+2003-11-22 04:05  coder_sku
+
+	* beep/beep.h: removed an xmms reference in #ifdef
+
+2003-11-22 03:32  coder_sku
+
+	* beep/skin.c: equilizer default index fix
+
+2003-11-22 02:33  coder_sku
+
+	* beep/skin.c: fixed "put path here"
+
+2003-11-22 01:52  coder_sku
+
+	* beep/skin.c: added loading of alternate gfx
+
+2003-11-22 01:50  coder_sku
+
+	* beep/main.c: removed a stray g_ascii_tolower
+
+2003-11-20 19:05  descender
+
+	* scripts/: cleanall.sh, gen-auto-scripts.sh, make-dist.sh,
+	  rm-auto-scripts.sh:
+	  - updated helper scripts
+
+2003-11-20 19:05  descender
+
+	* libbeep/aclocal.m4:
+	  - forgot to remove libbeep/aclocal.m4
+
+2003-11-20 01:14  descender
+
+	* beep/controlsocket.c, beep/controlsocket.h, beep/equalizer.c,
+	  beep/general.c, beep/input.c, beep/main.c, beep/main.h,
+	  beep/output.c, beep/playlist.c, beep/playlist_list.c,
+	  beep/pluginenum.c, beep/prefswin.c, beep/skin.c, beep/skin.h,
+	  beep/skinwin.c, beep/util.c, beep/visualization.c,
+	  libbeep/beepctrl.c, libbeep/util.c: [no log message]
+
+2003-11-20 00:39  descender
+
+	* aclocal.m4, confdefs.h, config.guess, config.h.in, config.sub,
+	  configure, depcomp, install-sh, ltconfig, ltmain.sh, missing,
+	  mkinstalldirs, libbeep/aclocal.m4, libbeep/configure,
+	  scripts/cleanall.sh, scripts/code-stats.sh (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), scripts/cvs2cl.pl,
+	  scripts/gen-auto-scripts.sh, scripts/make-dist.sh,
+	  scripts/rm-auto-scripts.sh, scripts/rm-backups.sh (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01):
+	  - added various helper scripts - remove auto-generated scripts
+
+2003-11-20 00:02  tag bmp-0_9_5
+
+2003-11-20 00:02  mderezynski
+
+	* FAQ (tags: merge-20040115-01), NEWS (tags: merge-20040115-01),
+	  TODO, depcomp, README (tags: merge-20040115-01), TODO.bmp,
+	  aclocal.m4, ltmain.sh, beep-config.in, confdefs.h, configure,
+	  configure.in, config.guess, beep.spec.in, config.rpath,
+	  config.sub, install-sh, missing, Makefile.am, beep.1.in,
+	  config.h.in, ltconfig, mkinstalldirs, AUTHORS, INSTALL (tags:
+	  merge-20040115-01), acinclude.m4, beep.desktop.in, beep.m4,
+	  ABOUT-NLS, COPYING (tags: merge-20040115-01), po/LINGUAS,
+	  po/Makevars (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  po/POTFILES.in, po/Rules-quot (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), po/beep.pot, po/boldquot.sed (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), po/insert-header.sin
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01), po/quot.sed
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  po/remove-potcdate.sin (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), beep/beep_mini.xpm (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), beep/sm.c, beep/sm.h,
+	  po/ChangeLog, po/Makefile.in.in, beep/playlist.c,
+	  beep/playlist.h, beep/bmp.c, beep/bmp.h, beep/dnd.h, beep/fft.c,
+	  beep/fft.h, beep/menurow.c, beep/menurow.h, beep/playlistwin.c,
+	  beep/playlistwin.h, beep/beep_logo.xpm, beep/mkdtemp.c,
+	  beep/pbutton.c, beep/pbutton.h, beep/pluginenum.c,
+	  beep/pluginenum.h, beep/vis.c, beep/vis.h, beep/effect.c,
+	  beep/effect.h, beep/playlist_list.c, beep/playlist_list.h,
+	  beep/equalizer.c, beep/equalizer.h, beep/fullscreen.c,
+	  beep/fullscreen.h, beep/hslider.c, beep/hslider.h, beep/audio.inf
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01), beep/audio.png
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01), beep/beep.h,
+	  beep/beep.wmconfig (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), beep/build.list, beep/eq_graph.c,
+	  beep/eq_graph.h, beep/eq_slider.c, beep/eq_slider.h,
+	  beep/jump_time.png (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), beep/monostereo.c, beep/monostereo.h,
+	  beep/pixmaps.mk (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  beep/playstatus.c, beep/playstatus.h, beep/prefswin.c,
+	  beep/prefswin.h, beep/skinwin.c, beep/skinwin.h, beep/tbutton.c,
+	  beep/tbutton.h, beep/dock.c, beep/dock.h, beep/i18n.h.in (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), beep/playlist_popup.c,
+	  beep/playlist_popup.h, beep/Makefile.am, beep/general.c,
+	  beep/general.h, beep/getopt.c, beep/getopt.h, beep/getopt1.c,
+	  beep/info.h, beep/softvolume.c, beep/softvolume.h, beep/widget.c,
+	  beep/widget.h, beep/main.c, beep/main.h, beep/about.c,
+	  beep/about.h (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  beep/controlsocket.c, beep/controlsocket.h, beep/folder.png
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01), beep/jump_to.png
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01), beep/na.xpm
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01), beep/output.c,
+	  beep/output.h, beep/textbox.c, beep/textbox.h, beep/urldecode.c,
+	  beep/urldecode.h, beep/skin.c, beep/skin.h,
+	  beep/beep_playlist.xpm (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), beep/hints.c, beep/hints.h, beep/pixmaps.h,
+	  beep/playlist.png (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), beep/playlist_slider.c,
+	  beep/playlist_slider.h, beep/svis.c, beep/svis.h, beep/util.c,
+	  beep/util.h, beep/beep.desktop.in, beep/beep_eq.xpm (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), beep/cda.png (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), beep/harddisk.png
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01), beep/info.png
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01), beep/jump_to.h,
+	  beep/number.c, beep/number.h, beep/play.png (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), beep/sbutton.c,
+	  beep/sbutton.h, beep/visualization.c, beep/visualization.h,
+	  beep/input.c, beep/input.h, beep/plugin.h, Input/Makefile.am
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  Input/mpg123/dct64.c, Input/wav/Makefile.am (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), Input/wav/wav.c,
+	  Input/wav/wav.h, Input/mpg123/README (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), Input/mpg123/dct64_MMX.s (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01),
+	  Input/mpg123/dct64_i386.c, Input/mpg123/decode_i386.c,
+	  Input/mpg123/equalizer.c, Input/mpg123/getcpuflags.s (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), Input/mpg123/id3.c,
+	  Input/mpg123/id3.h, Input/mpg123/id3_frame_text.c,
+	  Input/mpg123/warnings.txt (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), Input/mpg123/dct64_3dnow.s (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01),
+	  Input/mpg123/decode_i586.s (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), Input/mpg123/dxhead.c, Input/mpg123/dxhead.h,
+	  Input/mpg123/fileinfo.c, Input/mpg123/getbits.c,
+	  Input/mpg123/getbits.h (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), Input/mpg123/id3_frame_content.c,
+	  Input/mpg123/id3_tag.c, Input/mpg123/mp3.xpm (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01),
+	  Input/mpg123/Makefile.am, Input/mpg123/common.c,
+	  Input/mpg123/decode.c, Input/mpg123/id3_frame_url.c,
+	  Input/mpg123/mpg123.c, Input/mpg123/mpg123.h,
+	  Input/mpg123/decode_2to1.c, Input/mpg123/decode_4to1.c,
+	  Input/mpg123/http.c, Input/mpg123/huffman.h,
+	  Input/mpg123/l2tables.h, Input/mpg123/configure.c,
+	  Input/mpg123/dct36_3dnow.s (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), Input/mpg123/decode_3dnow.s (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01),
+	  Input/mpg123/decode_MMX.s (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), Input/mpg123/id3_frame.c,
+	  Input/mpg123/id3_header.h, Input/mpg123/layer1.c,
+	  Input/mpg123/tabinit.c, Input/mpg123/layer2.c,
+	  Input/mpg123/layer3.c, Input/vorbis/Makefile.am (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01),
+	  Input/vorbis/fileinfo.c, Input/vorbis/glibconfig.h,
+	  Input/vorbis/vcedit.c, Input/vorbis/vcedit.h,
+	  Input/vorbis/alternative.make (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), Input/vorbis/configure.c,
+	  Input/vorbis/http.c, Input/vorbis/http.h, Input/vorbis/ogg.xpm
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  Input/cdaudio/cddb.c, Input/vorbis/vorbis.c,
+	  Input/vorbis/vorbis.h, Input/cdaudio/Makefile.am (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), Input/cdaudio/cddb.h,
+	  Input/cdaudio/cdinfo.c, Input/cdaudio/cdinfo.h,
+	  Input/cdaudio/configure.c, Input/cdaudio/http.c,
+	  Input/cdaudio/http.h, Input/cdaudio/cdaudio.c,
+	  Input/cdaudio/cdaudio.h, Output/Makefile.am (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), Output/OSS/OSS.c,
+	  Output/OSS/OSS.h, icons/beep-red.svg, icons/beep.svg,
+	  Output/OSS/Makefile.am (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), Output/OSS/about.c, Output/OSS/convert.c,
+	  Output/OSS/init.c, Output/OSS/mixer.c, Output/OSS/soundcard.h,
+	  Output/OSS/audio.c, Output/OSS/configure.c,
+	  Output/alsa/Makefile.am (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), Output/alsa/about.c, Output/alsa/alsa.c,
+	  Output/alsa/alsa.h, Output/alsa/init.c, Output/esd/Makefile.am
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  Output/esd/about.c, Output/esd/audio.c, Output/esd/configure.c,
+	  Output/esd/esd.c, Output/esd/esdout.h, Output/esd/init.c,
+	  Output/esd/mixer.c, Output/alsa/audio.c, Output/alsa/configure.c,
+	  libbeep/configfile.c, libbeep/configfile.h, libbeep/aclocal.m4,
+	  libbeep/Makefile.am, libbeep/beepctrl.c, libbeep/beepctrl.h,
+	  libbeep/config.h.in, libbeep/configure, libbeep/configure.in,
+	  libbeep/dirbrowser.c, libbeep/dirbrowser.h, libbeep/folder.xpm
+	  (tags: cvs-20040120-01-HEAD, merge-20040115-01),
+	  libbeep/formatter.c, libbeep/formatter.h, libbeep/titlestring.c,
+	  libbeep/titlestring.h, Visualization/Makefile.am (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01),
+	  Visualization/blur_scope/xmms_logo.xpm (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01), libbeep/acinclude.m4,
+	  libbeep/util.c, libbeep/util.h, libbeep/xconvert.c,
+	  libbeep/xconvert.h, libbeep/xentry.c, libbeep/xentry.h,
+	  Visualization/blur_scope/Makefile.am,
+	  Visualization/blur_scope/blur_8.s (tags: cvs-20040120-01-HEAD,
+	  merge-20040115-01), Visualization/blur_scope/blur_scope.c,
+	  Visualization/blur_scope/blur_scope.h,
+	  Visualization/blur_scope/bscope_logo.xpm (tags:
+	  cvs-20040120-01-HEAD, merge-20040115-01),
+	  Visualization/blur_scope/config.c (utags: bmp-0_9_5): Initial CVS
+	  import at SF.net
+
+2003-11-20 00:02  mderezynski
+
+	* FAQ, NEWS, TODO, depcomp, README, TODO.bmp, aclocal.m4,
+	  ltmain.sh, beep-config.in, confdefs.h, configure, configure.in,
+	  config.guess, beep.spec.in, config.rpath, config.sub, install-sh,
+	  missing, Makefile.am, beep.1.in, config.h.in, ltconfig,
+	  mkinstalldirs, AUTHORS, INSTALL, acinclude.m4, beep.desktop.in,
+	  beep.m4, ABOUT-NLS, COPYING, po/LINGUAS, po/Makevars,
+	  po/POTFILES.in, po/Rules-quot, po/beep.pot, po/boldquot.sed,
+	  po/insert-header.sin, po/quot.sed, po/remove-potcdate.sin,
+	  beep/beep_mini.xpm, beep/sm.c, beep/sm.h, po/ChangeLog,
+	  po/Makefile.in.in, beep/playlist.c, beep/playlist.h, beep/bmp.c,
+	  beep/bmp.h, beep/dnd.h, beep/fft.c, beep/fft.h, beep/menurow.c,
+	  beep/menurow.h, beep/playlistwin.c, beep/playlistwin.h,
+	  beep/beep_logo.xpm, beep/mkdtemp.c, beep/pbutton.c,
+	  beep/pbutton.h, beep/pluginenum.c, beep/pluginenum.h, beep/vis.c,
+	  beep/vis.h, beep/effect.c, beep/effect.h, beep/playlist_list.c,
+	  beep/playlist_list.h, beep/equalizer.c, beep/equalizer.h,
+	  beep/fullscreen.c, beep/fullscreen.h, beep/hslider.c,
+	  beep/hslider.h, beep/audio.inf, beep/audio.png, beep/beep.h,
+	  beep/beep.wmconfig, beep/build.list, beep/eq_graph.c,
+	  beep/eq_graph.h, beep/eq_slider.c, beep/eq_slider.h,
+	  beep/jump_time.png, beep/monostereo.c, beep/monostereo.h,
+	  beep/pixmaps.mk, beep/playstatus.c, beep/playstatus.h,
+	  beep/prefswin.c, beep/prefswin.h, beep/skinwin.c, beep/skinwin.h,
+	  beep/tbutton.c, beep/tbutton.h, beep/dock.c, beep/dock.h,
+	  beep/i18n.h.in, beep/playlist_popup.c, beep/playlist_popup.h,
+	  beep/Makefile.am, beep/general.c, beep/general.h, beep/getopt.c,
+	  beep/getopt.h, beep/getopt1.c, beep/info.h, beep/softvolume.c,
+	  beep/softvolume.h, beep/widget.c, beep/widget.h, beep/main.c,
+	  beep/main.h, beep/about.c, beep/about.h, beep/controlsocket.c,
+	  beep/controlsocket.h, beep/folder.png, beep/jump_to.png,
+	  beep/na.xpm, beep/output.c, beep/output.h, beep/textbox.c,
+	  beep/textbox.h, beep/urldecode.c, beep/urldecode.h, beep/skin.c,
+	  beep/skin.h, beep/beep_playlist.xpm, beep/hints.c, beep/hints.h,
+	  beep/pixmaps.h, beep/playlist.png, beep/playlist_slider.c,
+	  beep/playlist_slider.h, beep/svis.c, beep/svis.h, beep/util.c,
+	  beep/util.h, beep/beep.desktop.in, beep/beep_eq.xpm,
+	  beep/cda.png, beep/harddisk.png, beep/info.png, beep/jump_to.h,
+	  beep/number.c, beep/number.h, beep/play.png, beep/sbutton.c,
+	  beep/sbutton.h, beep/visualization.c, beep/visualization.h,
+	  beep/input.c, beep/input.h, beep/plugin.h, Input/Makefile.am,
+	  Input/mpg123/dct64.c, Input/wav/Makefile.am, Input/wav/wav.c,
+	  Input/wav/wav.h, Input/mpg123/README, Input/mpg123/dct64_MMX.s,
+	  Input/mpg123/dct64_i386.c, Input/mpg123/decode_i386.c,
+	  Input/mpg123/equalizer.c, Input/mpg123/getcpuflags.s,
+	  Input/mpg123/id3.c, Input/mpg123/id3.h,
+	  Input/mpg123/id3_frame_text.c, Input/mpg123/warnings.txt,
+	  Input/mpg123/dct64_3dnow.s, Input/mpg123/decode_i586.s,
+	  Input/mpg123/dxhead.c, Input/mpg123/dxhead.h,
+	  Input/mpg123/fileinfo.c, Input/mpg123/getbits.c,
+	  Input/mpg123/getbits.h, Input/mpg123/id3_frame_content.c,
+	  Input/mpg123/id3_tag.c, Input/mpg123/mp3.xpm,
+	  Input/mpg123/Makefile.am, Input/mpg123/common.c,
+	  Input/mpg123/decode.c, Input/mpg123/id3_frame_url.c,
+	  Input/mpg123/mpg123.c, Input/mpg123/mpg123.h,
+	  Input/mpg123/decode_2to1.c, Input/mpg123/decode_4to1.c,
+	  Input/mpg123/http.c, Input/mpg123/huffman.h,
+	  Input/mpg123/l2tables.h, Input/mpg123/configure.c,
+	  Input/mpg123/dct36_3dnow.s, Input/mpg123/decode_3dnow.s,
+	  Input/mpg123/decode_MMX.s, Input/mpg123/id3_frame.c,
+	  Input/mpg123/id3_header.h, Input/mpg123/layer1.c,
+	  Input/mpg123/tabinit.c, Input/mpg123/layer2.c,
+	  Input/mpg123/layer3.c, Input/vorbis/Makefile.am,
+	  Input/vorbis/fileinfo.c, Input/vorbis/glibconfig.h,
+	  Input/vorbis/vcedit.c, Input/vorbis/vcedit.h,
+	  Input/vorbis/alternative.make, Input/vorbis/configure.c,
+	  Input/vorbis/http.c, Input/vorbis/http.h, Input/vorbis/ogg.xpm,
+	  Input/cdaudio/cddb.c, Input/vorbis/vorbis.c,
+	  Input/vorbis/vorbis.h, Input/cdaudio/Makefile.am,
+	  Input/cdaudio/cddb.h, Input/cdaudio/cdinfo.c,
+	  Input/cdaudio/cdinfo.h, Input/cdaudio/configure.c,
+	  Input/cdaudio/http.c, Input/cdaudio/http.h,
+	  Input/cdaudio/cdaudio.c, Input/cdaudio/cdaudio.h,
+	  Output/Makefile.am, Output/OSS/OSS.c, Output/OSS/OSS.h,
+	  icons/beep-red.svg, icons/beep.svg, Output/OSS/Makefile.am,
+	  Output/OSS/about.c, Output/OSS/convert.c, Output/OSS/init.c,
+	  Output/OSS/mixer.c, Output/OSS/soundcard.h, Output/OSS/audio.c,
+	  Output/OSS/configure.c, Output/alsa/Makefile.am,
+	  Output/alsa/about.c, Output/alsa/alsa.c, Output/alsa/alsa.h,
+	  Output/alsa/init.c, Output/esd/Makefile.am, Output/esd/about.c,
+	  Output/esd/audio.c, Output/esd/configure.c, Output/esd/esd.c,
+	  Output/esd/esdout.h, Output/esd/init.c, Output/esd/mixer.c,
+	  Output/alsa/audio.c, Output/alsa/configure.c,
+	  libbeep/configfile.c, libbeep/configfile.h, libbeep/aclocal.m4,
+	  libbeep/Makefile.am, libbeep/beepctrl.c, libbeep/beepctrl.h,
+	  libbeep/config.h.in, libbeep/configure, libbeep/configure.in,
+	  libbeep/dirbrowser.c, libbeep/dirbrowser.h, libbeep/folder.xpm,
+	  libbeep/formatter.c, libbeep/formatter.h, libbeep/titlestring.c,
+	  libbeep/titlestring.h, Visualization/Makefile.am,
+	  Visualization/blur_scope/xmms_logo.xpm, libbeep/acinclude.m4,
+	  libbeep/util.c, libbeep/util.h, libbeep/xconvert.c,
+	  libbeep/xconvert.h, libbeep/xentry.c, libbeep/xentry.h,
+	  Visualization/blur_scope/Makefile.am,
+	  Visualization/blur_scope/blur_8.s,
+	  Visualization/blur_scope/blur_scope.c,
+	  Visualization/blur_scope/blur_scope.h,
+	  Visualization/blur_scope/bscope_logo.xpm,
+	  Visualization/blur_scope/config.c: Initial revision
+

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/FAQ
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/FAQ	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/FAQ	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,173 @@
+Beep Media Player FAQ
+
+NOTE: This document is no longer maintained. Please check the FAQ on
+the BMP website (http://beepmp.sf.net)
+
+Contents
+========
+
+Compilation:
+
+  c1: The CVS version won't compile, but the tarball does
+
+Running:
+
+  r1: Why do I keep getting "Gdk-ERROR **: an x io error occurred" when I try
+      to use BMP?
+  r2: My X server crashes when I try to change skin, what can I do?
+  r3: When using GNOME / Enlightenment the playlist window got lost somewhere
+      in my virtual desktops what should I do? I'm all out of breadcrumbs.
+  r4: Why do I keep getting "Gdk-WARNING **: shmat failed!" in Solaris?
+  r5: Why do BMP windows behave differently than my other windows?
+  r6: Why does BMP have 5-6 running instances which each takes x% of my memory,
+      isn't 5-6*x% memory A REAL WASTE?
+
+General:
+
+  g1: Is there a mailing list for BMP?
+  g2: How do I unsubscribe from the mailing list?
+  g3: Can I use XMMS plugins with BMP?
+
+
+______________________________________________________________________________
+
+
+Compilation
+===========
+
+  c1: The CVS version won't compile, but the tarball does
+
+   This can happen for various reasons:
+
+   1. You do not have a sufficiently new version of autoconf and/or automake
+      installed. BMP requires at least autoconf 2.5 and automake 1.7 in order
+      to compile directly from CVS.
+
+   2. If your version of autoconf/automake is recent enough, you may have
+      multiple copies of them installed. To check, you can run this command:
+      
+      autoconf --version ; automake --version
+
+      Normally the commands "autoconf" and "automake" will run their latest
+      versions. If they do not, you can specify the correct versions to use
+      like this:
+
+        AUTOCONF=autoconf-xx AUTOMAKE=automake-yy ACLOCAL=aclocal-yy ./autogen.sh
+
+      (where xx, yy are the versions of autoconf/automake respectively)
+
+      For Gentoo users, use this instead:
+
+        WANT_AUTOCONF=xx WANT_AUTOMAKE=yy ./autogen.sh
+
+
+______________________________________________________________________________
+
+Running:
+
+  r1: Why do I keep getting "Gdk-ERROR **: an x io error occurred" when I
+      try to use BMP?
+
+   This is because you're running an older system with libc5 and you don't
+   have Thread Safe X libs. You might want to download these thread aware
+   X libs and install them, just untar them into /usr/X11R6/lib (or appropriate
+   path) NOTE: do NOT do this while X is running.
+______________________________________________________________________________
+
+  r2: My X server crashes when I try to change skin, what can I do?
+
+   This is because of your window manager, if you browse the configure file
+   for your window manager you'll find an option called SaveUnder somewhere.
+   In Window Maker change "UseSaveUnders = YES;" to "UseSaveUnders = NO;"
+   This will fix it for you.. (don't forget to restart your window manager)
+______________________________________________________________________________
+
+  r3: When using GNOME / Enlightenment the playlist window got lost somewhere
+      in my virtual desktops what should I do? I'm all out of breadcrumbs.
+
+   Edit the ~/.bmp/config file and change the playlist_x= and playlist_y=
+   to sane values.
+______________________________________________________________________________
+
+  r4: Why do I keep getting "Gdk-WARNING **: shmat failed!" in Solaris?
+
+   Solaris (2.5, 2.6, 2.7) has insufficient IPC settings by default for some
+   products that use shared memory.
+   You need to place this in /etc/system:
+   set shmsys:shminfo_shmmax = 8388608
+   set shmsys:shminfo_shmmni = 0x1000
+   set shmsys:shminfo_shmseg = 0x100
+   Thanks to Yuri Kulaghin and Jeff Johnson
+______________________________________________________________________________
+
+  r5: Why do BMP windows behave differently than my other windows?
+
+   Since BMP disables the window managers title bars, the window manager is
+   unable to raise/lower/move BMP as it's configured to do.
+______________________________________________________________________________
+
+  r6: Why does BMP have 5-6 running instances which each takes x% of my
+      memory, isn't 5-6*x% memory A REAL WASTE?
+
+   BMP is not using that memory for each instance, it shares the memory
+   between the instances. If you have 6 entries in your process list, each
+   claiming to take 5 MB, BMP is using 5 MB, and not 30 MB (5x6).
+______________________________________________________________________________
+
+
+General
+=======
+
+  g1: Is there a mailing list for BMP?
+
+   Yes there is. In fact there are 3, namely: 
+
+   a) beepmp-users
+   b) beepmp-devel
+   c) beepmp-cvs
+
+   You can subscribe each of them at:
+   http://sourceforge.net/mail/?group_id=95272
+
+   Please keep any messages sent to this list STRICTLY about BMP. Or we will
+   have to moderate it.
+______________________________________________________________________________
+
+  g2: How do I unsubscribe from the mailing lists?
+
+   You can use the page:
+   http://sourceforge.net/mail/?group_id=95272
+
+______________________________________________________________________________
+
+  g3: Can I use XMMS plugins with BMP?
+
+  Generally no in their binary form i.e. '.so' files [1]. You can however
+  attempt to compile them from source using GTK 2.4.
+
+  GTK 1.2 programs are usually compiled with a 'gtk-config --xx'
+  parameter passed to the compiler. You can try replacing that with   
+  'pkg-config gtk+-2.0 -xx'. For example, if the compile command is:
+
+    gcc -Wall -ansi -c `gtk-config --cflags --libs` plugin.c
+
+  Modify it to:
+
+    gcc -Wall -ansi -c `pkg-config gtk+-2.0 --cflags --libs` plugin.c
+
+  If this fails, you will need to modify the source code to use GTK 2.4. Refer
+  to the official guide on migrating the code:
+
+    http://developer.gnome.org/doc/API/2.2/gtk/migrating.html
+
+
+  [1] Bear in mind that BMP uses GTK 2.4 while XMMS uses GTK 1.2. Consequently,
+  XMMS plugins are compiled against 1.2 and will not work properly with BMP.
+
+  The technical reason for this is that GTK 1.2 and GTK 2.4 share the same
+  symbol names for the most part and there is no easy way to get the dynamic
+  linker to resolve to the right one.
+
+
+
+______________________________________________________________________________

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/INSTALL
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/INSTALL	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/INSTALL	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,229 @@
+Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
+Foundation, Inc.
+
+   This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory.  After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+   By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the `--target=TYPE' option to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+will cause the specified gcc to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+`configure' Invocation
+======================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+     Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/Makefile.am
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/Makefile.am	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/Makefile.am	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,2 @@
+ALL_PLUGINS = mpg123 vorbis cdaudio wav
+SUBDIRS = $(INPUT_PLUGINS)

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/Makefile.am
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/Makefile.am	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/Makefile.am	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,33 @@
+cdaudiosources = cdaudio.c \
+configure.c \
+cdaudio.h \
+cdinfo.c \
+cdinfo.h \
+cddb.c \
+cddb.h \
+http.c \
+http.h
+
+if HAVE_CDROM
+
+cdaudioltlibs = libcdaudio.la
+cdaudiobuildsources = $(cdaudiosources)
+
+else
+
+cdaudioltlibs =
+cdaudiobuildsources =
+
+endif
+
+EXTRA_DIST = $(cdaudiosources)
+
+lib_LTLIBRARIES = $(cdaudioltlibs)
+
+libdir = $(plugindir)/$(INPUT_PLUGIN_DIR)
+
+INCLUDES = @GTK_CFLAGS@ @GCONF_CFLAGS@ -I$(top_builddir)/intl -I$(top_srcdir)
+libcdaudio_la_LDFLAGS = @PLUGIN_LDFLAGS@
+libcdaudio_la_LIBADD = @GTK_LIBS@
+libcdaudio_la_SOURCES = $(cdaudiobuildsources)
+

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdaudio.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdaudio.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdaudio.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,1250 @@
+/*  XMMS - Cross-platform multimedia player
+ *  Copyright (C) 1998-2003  Peter Alm, Mikael Alm, Olle Hallnas,
+ *                           Thomas Nilsson and 4Front Technologies
+ *  Copyright (C) 1999-2003  Haavard Kvaalen <havardk at xmms.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "cdaudio.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib/gprintf.h>
+#include <string.h>
+
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+
+#include <libbeep/configdb.h>
+#include <libbeep/util.h>
+#include <libbeep/titlestring.h>
+#include "beep/output.h"
+
+#ifdef CDROMSTOP
+# define XMMS_STOP CDROMSTOP
+#elif defined CDIOCSTOP
+# define XMMS_STOP CDIOCSTOP
+#else
+# error "No stop ioctl"
+#endif
+
+#ifdef CDIOCPAUSE
+# define XMMS_PAUSE CDIOCPAUSE
+#elif defined CDROMPAUSE
+# define XMMS_PAUSE CDROMPAUSE
+#else
+# error "No pause ioctl"
+#endif
+
+#ifdef CDIOCRESUME
+# define XMMS_RESUME CDIOCRESUME
+#elif defined CDROMRESUME
+# define XMMS_RESUME CDROMRESUME
+#else
+# error "No resume ioctl"
+#endif
+
+/*
+ * Distributions should not patch this, but instead use the
+ * --with-cdda-device=path and --with-cdda-dir=path configure options.
+ */
+
+#ifndef CDDA_DEVICE
+# ifdef HAVE_SYS_CDIO_H
+#  ifdef __FreeBSD__
+#   define CDDA_DEVICE "/dev/acd0c"
+#  elif defined __OpenBSD__
+#   define CDDA_DEVICE "/dev/cd0c"
+#  else
+#   define CDDA_DEVICE "/vol/dev/aliases/cdrom0"
+#  endif
+# else
+#   define CDDA_DEVICE "/dev/cdrom"
+# endif
+#endif
+
+#ifndef CDDA_DIRECTORY
+# ifdef HAVE_SYS_CDIO_H
+#  ifdef __FreeBSD__
+#   define CDDA_DIRECTORY "/cdrom"
+#  elif defined __OpenBSD__
+#   define CDDA_DIRECTORY "/cdrom"
+#  else
+#   define CDDA_DIRECTORY "/cdrom/cdrom0"
+#  endif
+# else
+#   define CDDA_DIRECTORY "/mnt/cdrom"
+# endif
+#endif
+
+
+
+
+static char *cdda_get_title(cdda_disc_toc_t * toc, int track);
+static gboolean stop_timeout(gpointer data);
+
+static void cdda_init(void);
+static int is_our_file(char *filename);
+static GList *scan_dir(char *dir);
+static void play_file(char *filename);
+static void stop(void);
+static void cdda_pause(short p);
+static void seek(int time);
+static int get_time(void);
+static void get_song_info(char *filename, char **title, int *length);
+static void get_volume(int *l, int *r);
+static void set_volume(int l, int r);
+static void cleanup(void);
+void cdda_fileinfo(char *filename);
+
+InputPlugin cdda_ip = {
+    NULL,
+    NULL,
+    NULL,                       /* Description */
+    cdda_init,
+    NULL,                       /* about */
+    cdda_configure,
+    is_our_file,
+    scan_dir,
+    play_file,
+    stop,
+    cdda_pause,
+    seek,
+    NULL,                       /* set_eq */
+    get_time,
+    get_volume,
+    set_volume,
+    cleanup,
+    NULL,                       /* obsolete */
+    NULL,                       /* add_vis_pcm */
+    NULL,                       /* set_info, filled in by xmms */
+    NULL,                       /* set_info_text, filled in by xmms */
+    get_song_info,
+    NULL,                       /*  cdda_fileinfo, *//* file_info_box */
+    NULL                        /* output plugin handle */
+};
+
+CDDAConfig cdda_cfg;
+
+static struct {
+    struct driveinfo drive;
+    cdda_disc_toc_t cd_toc;
+    int track;
+    int fd;
+    gboolean playing;
+} cdda_playing;
+
+static struct {
+    GThread *thread;
+    gboolean audio_error, eof;
+    int seek;
+
+} dae_data;
+
+static gboolean is_paused;
+static int pause_time;
+
+struct timeout {
+    int id;
+    char *device;
+};
+
+static GList *timeout_list;
+
+/* Time to delay stop command in 1/10 second */
+#define STOP_DELAY 20
+
+InputPlugin *
+get_iplugin_info(void)
+{
+    cdda_ip.description = g_strdup_printf(_("CD Audio Plugin"));
+    return &cdda_ip;
+}
+
+
+
+#ifdef BEEP_CDROM_SOLARIS
+/*
+ * Lowlevel cdrom access, Solaris style (Solaris, Linux)
+ */
+
+static void
+play_ioctl(struct cdda_msf *start, struct cdda_msf *end)
+{
+    struct cdrom_msf msf;
+
+    msf.cdmsf_min0 = start->minute;
+    msf.cdmsf_sec0 = start->second;
+    msf.cdmsf_frame0 = start->frame;
+    msf.cdmsf_min1 = end->minute;
+    msf.cdmsf_sec1 = end->second;
+    msf.cdmsf_frame1 = end->frame;
+    ioctl(cdda_playing.fd, CDROMPLAYMSF, &msf);
+}
+
+static int
+get_current_frame(void)
+{
+    struct cdrom_subchnl subchnl;
+
+    subchnl.cdsc_format = CDROM_MSF;
+    if (ioctl(cdda_playing.fd, CDROMSUBCHNL, &subchnl) < 0)
+        return -1;
+
+    switch (subchnl.cdsc_audiostatus) {
+    case CDROM_AUDIO_COMPLETED:
+    case CDROM_AUDIO_ERROR:
+        return -1;
+    }
+
+    return (LBA(subchnl.cdsc_absaddr.msf));
+}
+
+#if !defined(CDROMVOLREAD)
+static int volume_left = 100, volume_right = 100;
+#endif
+
+static void
+drive_get_volume(int *l, int *r)
+{
+#if defined(CDROMVOLREAD)
+    struct cdrom_volctrl vol;
+
+    if (cdda_playing.fd != -1 && !ioctl(cdda_playing.fd, CDROMVOLREAD, &vol)) {
+        *l = (100 * vol.channel0) / 255;
+        *r = (100 * vol.channel1) / 255;
+    }
+#if 0
+    else if (cdda_playing.fd != -1)
+        g_message("CDROMVOLREAD failed");
+#endif
+#else
+    *l = volume_left;
+    *r = volume_right;
+#endif
+}
+
+static void
+drive_set_volume(int l, int r)
+{
+    struct cdrom_volctrl vol;
+
+    if (cdda_playing.fd != -1) {
+        vol.channel0 = vol.channel2 = (l * 255) / 100;
+        vol.channel1 = vol.channel3 = (r * 255) / 100;
+        ioctl(cdda_playing.fd, CDROMVOLCTRL, &vol);
+    }
+#if !defined(CDROMVOLREAD)
+    volume_left = l;
+    volume_right = r;
+#endif
+}
+
+#ifdef CDROMREADAUDIO
+int
+read_audio_data(int fd, int pos, int num, void *buf)
+{
+    struct cdrom_read_audio cdra;
+
+#if 1
+    cdra.addr.lba = pos - CDDA_MSF_OFFSET;
+    cdra.addr_format = CDROM_LBA;
+#else
+    cdra.addr.msf.minute = pos / (60 * 75);
+    cdra.addr.msf.second = (pos / 75) % 60;
+    cdra.addr.msf.frame = pos % 75;
+    cdra.addr_format = CDROM_MSF;
+#endif
+
+    cdra.nframes = num;
+    cdra.buf = buf;
+
+    if (ioctl(fd, CDROMREADAUDIO, &cdra) < 0)
+        return -errno;
+
+    return cdra.nframes;
+}
+#endif                          /* CDROMREADAUDIO */
+
+#if defined(CDROMCDDA)
+int
+read_audio_data(int fd, int pos, int num, void *buf)
+{
+    struct cdrom_cdda cdra;
+
+    cdra.cdda_addr = pos - CDDA_MSF_OFFSET;
+    cdra.cdda_length = num;
+    cdra.cdda_data = buf;
+    cdra.cdda_subcode = CDROM_DA_NO_SUBCODE;
+    if (ioctl(fd, CDROMCDDA, &cdra) < 0)
+        return -errno;
+
+    return cdra.cdda_length;
+}
+#endif
+
+static gboolean
+cdda_get_toc_lowlevel(int fd, cdda_disc_toc_t * info)
+{
+    struct cdrom_tochdr tochdr;
+    struct cdrom_tocentry tocentry;
+    int i;
+
+
+
+    if (ioctl(fd, CDROMREADTOCHDR, &tochdr))
+        return FALSE;
+
+    for (i = tochdr.cdth_trk0; i <= tochdr.cdth_trk1; i++) {
+        tocentry.cdte_format = CDROM_MSF;
+        tocentry.cdte_track = i;
+        if (ioctl(fd, CDROMREADTOCENTRY, &tocentry))
+            return FALSE;
+        info->track[i].minute = tocentry.cdte_addr.msf.minute;
+        info->track[i].second = tocentry.cdte_addr.msf.second;
+        info->track[i].frame = tocentry.cdte_addr.msf.frame;
+        info->track[i].flags.data_track =
+            tocentry.cdte_ctrl == CDROM_DATA_TRACK;
+
+    }
+
+    /* Get the leadout track */
+    tocentry.cdte_track = CDROM_LEADOUT;
+    tocentry.cdte_format = CDROM_MSF;
+
+    if (ioctl(fd, CDROMREADTOCENTRY, &tocentry))
+        return FALSE;
+    info->leadout.minute = tocentry.cdte_addr.msf.minute;
+    info->leadout.second = tocentry.cdte_addr.msf.second;
+    info->leadout.frame = tocentry.cdte_addr.msf.frame;
+
+    info->first_track = tochdr.cdth_trk0;
+    info->last_track = tochdr.cdth_trk1;
+
+    return TRUE;
+}
+
+#endif
+
+#ifdef BEEP_CDROM_BSD
+/*
+ * Lowlevel cdrom access, BSD style (FreeBSD, OpenBSD, NetBSD, Darwin)
+ */
+
+static void
+play_ioctl(struct cdda_msf *start, struct cdda_msf *end)
+{
+    struct ioc_play_msf msf;
+
+    msf.start_m = start->minute;
+    msf.start_s = start->second;
+    msf.start_f = start->frame;
+    msf.end_m = end->minute;
+    msf.end_s = end->second;
+    msf.end_f = end->frame;
+    ioctl(cdda_playing.fd, CDIOCPLAYMSF, &msf);
+}
+
+static int
+get_current_frame(void)
+{
+    struct ioc_read_subchannel subchnl;
+    struct cd_sub_channel_info subinfo;
+    subchnl.address_format = CD_MSF_FORMAT;
+    subchnl.data_format = CD_CURRENT_POSITION;
+    subchnl.track = 0;
+    subchnl.data_len = sizeof(subinfo);
+    subchnl.data = &subinfo;
+    if (ioctl(cdda_playing.fd, CDIOCREADSUBCHANNEL, &subchnl) < 0)
+        return -1;
+
+#ifdef BEEP_CDROM_BSD_DARWIN
+    return ((subchnl.data->what.position.absaddr[1] * 60
+             subchnl.data->what.position.absaddr[2]) * 75 +
+            subchnl.data->what.position.absaddr[3]);
+#else
+    return (LBA(subchnl.data->what.position.absaddr.msf));
+#endif
+}
+
+static void
+drive_get_volume(int *l, int *r)
+{
+    struct ioc_vol vol;
+
+    if (cdda_playing.fd != -1) {
+        ioctl(cdda_playing.fd, CDIOCGETVOL, &vol);
+        *l = (100 * vol.vol[0]) / 255;
+        *r = (100 * vol.vol[1]) / 255;
+    }
+}
+
+static void
+drive_set_volume(int l, int r)
+{
+    struct ioc_vol vol;
+
+    if (cdda_playing.fd != -1) {
+        vol.vol[0] = vol.vol[2] = (l * 255) / 100;
+        vol.vol[1] = vol.vol[3] = (r * 255) / 100;
+        ioctl(cdda_playing.fd, CDIOCSETVOL, &vol);
+    }
+}
+
+
+#if defined(CDIOCREADAUDIO)
+#ifdef __FreeBSD__
+int
+read_audio_data(int fd, int pos, int num, void *buf)
+{
+    struct ioc_read_audio cdra;
+
+    cdra.address.lba = pos - CDDA_MSF_OFFSET;
+    cdra.address_format = CD_LBA_FORMAT;
+    cdra.nframes = num;
+    cdra.buffer = buf;
+
+    if (ioctl(fd, CDIOCREADAUDIO, &cdra) < 0)
+        return -errno;
+
+    return cdra.nframes;
+}
+#else
+#error Please test on other <sys/cdio.h> platforms.
+#endif
+#endif                          /* CDIOCREADAUDIO */
+
+#ifdef BEEP_CDROM_BSD_NETBSD    /* NetBSD, OpenBSD */
+
+static gboolean
+cdda_get_toc_lowlevel(int fd, cdda_disc_toc_t * info)
+{
+    struct ioc_toc_header tochdr;
+    struct ioc_read_toc_entry tocentry;
+    struct cd_toc_entry tocentrydata;
+    int i;
+
+    if (ioctl(fd, CDIOREADTOCHEADER, &tochdr))
+        return FALSE;
+
+    for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) {
+        tocentry.address_format = CD_MSF_FORMAT;
+
+        tocentry.starting_track = i;
+        tocentry.data = &tocentrydata;
+        tocentry.data_len = sizeof(tocentrydata);
+        if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry))
+            return FALSE;
+        info->track[i].minute = tocentry.data->addr.msf.minute;
+        info->track[i].second = tocentry.data->addr.msf.second;
+        info->track[i].frame = tocentry.data->addr.msf.frame;
+        info->track[i].flags.data_track = (tocentry.data->control & 4) == 4;
+    }
+
+    /* Get the leadout track */
+    tocentry.address_format = CD_MSF_FORMAT;
+
+    tocentry.starting_track = 0xAA;
+    tocentry.data = &tocentrydata;
+    tocentry.data_len = sizeof(tocentrydata);
+    if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry))
+        return FALSE;
+    info->leadout.minute = tocentry.data->addr.msf.minute;
+    info->leadout.second = tocentry.data->addr.msf.second;
+    info->leadout.frame = tocentry.data->addr.msf.frame;
+
+    info->first_track = tochdr.starting_track;
+    info->last_track = tochdr.ending_track;
+
+    return TRUE;
+}
+
+#elif defined(BEEP_CDROM_BSD_DARWIN)
+
+static gboolean
+cdda_get_toc_lowlevel(int fd, cdda_disc_toc_t * info)
+{
+    struct ioc_toc_header tochdr;
+    struct ioc_read_toc_entry tocentry;
+    int i;
+
+    if (ioctl(fd, CDIOREADTOCHEADER, &tochdr))
+        return FALSE;
+
+    for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) {
+        tocentry.address_format = CD_MSF_FORMAT;
+
+        tocentry.starting_track = i;
+        if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry))
+            return FALSE;
+        info->track[i].minute = tocentry.data->addr[1];
+        info->track[i].second = tocentry.data->addr[2];
+        info->track[i].frame = tocentry.data->addr[3];
+        info->track[i].flags.data_track = (tocentry.data->control & 4) == 4;
+    }
+
+    /* Get the leadout track */
+    tocentry.address_format = CD_MSF_FORMAT;
+
+    tocentry.starting_track = 0xAA;
+    if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry))
+        return FALSE;
+    info->leadout.minute = tocentry.data->addr[1];
+    info->leadout.second = tocentry.data->addr[2];
+    info->leadout.frame = tocentry.data->addr[3];
+
+    return TRUE;
+}
+
+#else                           /* FreeBSD */
+
+static gboolean
+cdda_get_toc_lowlevel(int fd, cdda_disc_toc_t * info)
+{
+    struct ioc_toc_header tochdr;
+    struct ioc_read_toc_single_entry tocentry;
+    int i;
+
+    if (ioctl(fd, CDIOREADTOCHEADER, &tochdr))
+        return FALSE;
+
+    for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) {
+        tocentry.address_format = CD_MSF_FORMAT;
+
+        tocentry.track = i;
+        if (ioctl(fd, CDIOREADTOCENTRY, &tocentry))
+            return FALSE;
+        info->track[i].minute = tocentry.entry.addr.msf.minute;
+        info->track[i].second = tocentry.entry.addr.msf.second;
+        info->track[i].frame = tocentry.entry.addr.msf.frame;
+        info->track[i].flags.data_track = (tocentry.entry.control & 4) == 4;
+    }
+
+    /* Get the leadout track */
+    tocentry.address_format = CD_MSF_FORMAT;
+
+    tocentry.track = 0xAA;
+    if (ioctl(fd, CDIOREADTOCENTRY, &tocentry))
+        return FALSE;
+    info->leadout.minute = tocentry.entry.addr.msf.minute;
+    info->leadout.second = tocentry.entry.addr.msf.second;
+    info->leadout.frame = tocentry.entry.addr.msf.frame;
+
+    info->first_track = tochdr.starting_track;
+    info->last_track = tochdr.ending_track;
+
+    return TRUE;
+}
+#endif
+
+#endif
+
+
+
+
+
+
+
+
+
+
+
+extern gboolean
+is_mounted(const char *device_name)
+{
+#if defined(HAVE_MNTENT_H) || defined(HAVE_GETMNTINFO)
+    char devname[256];
+    struct stat st;
+#if defined(HAVE_MNTENT_H)
+    FILE *mounts;
+    struct mntent *mnt;
+#elif defined(HAVE_GETMNTINFO)
+    struct statfs *fsp;
+    int entries;
+#endif
+
+    if (lstat(device_name, &st) < 0)
+        return -1;
+
+    if (S_ISLNK(st.st_mode))
+        readlink(device_name, devname, 256);
+    else
+        strncpy(devname, device_name, 256);
+
+#if defined(HAVE_MNTENT_H)
+    if ((mounts = setmntent(MOUNTED, "r")) == NULL)
+        return TRUE;
+
+    while ((mnt = getmntent(mounts)) != NULL) {
+        if (strcmp(mnt->mnt_fsname, devname) == 0) {
+            endmntent(mounts);
+            return TRUE;
+        }
+    }
+    endmntent(mounts);
+#elif defined(HAVE_GETMNTINFO)
+    entries = getmntinfo(&fsp, MNT_NOWAIT);
+    if (entries < 0)
+        return NULL;
+
+    while (entries-- > 0) {
+        if (!strcmp(fsp->f_mntfromname, devname))
+            return TRUE;
+        fsp++;
+    }
+#endif
+#endif
+    return FALSE;
+}
+
+
+gboolean
+cdda_get_toc(cdda_disc_toc_t * info, const char *device)
+{
+    gboolean retv = FALSE;
+    int fd;
+
+    if (is_mounted(device))
+        return FALSE;
+
+    if ((fd = open(device, CDOPENFLAGS)) == -1)
+        return FALSE;
+
+    memset(info, 0, sizeof(cdda_disc_toc_t));
+
+    retv = cdda_get_toc_lowlevel(fd, info);
+    close(fd);
+
+    return retv;
+}
+
+static void
+cdda_init(void)
+{
+    ConfigDb *db;
+    struct driveinfo *drive = g_malloc0(sizeof(struct driveinfo));
+    int ndrives = 1, i;
+
+    cdda_playing.fd = -1;
+    memset(&cdda_cfg, 0, sizeof(CDDAConfig));
+
+#ifdef HAVE_OSS
+    drive->mixer = CDDA_MIXER_OSS;
+    drive->oss_mixer = SOUND_MIXER_CD;
+#endif
+
+    db = bmp_cfg_db_open();
+
+    /* These names are used for backwards compatibility */
+    bmp_cfg_db_get_string(db, "CDDA", "device", &drive->device);
+    bmp_cfg_db_get_string(db, "CDDA", "directory", &drive->directory);
+    bmp_cfg_db_get_int(db, "CDDA", "mixer", &drive->mixer);
+    bmp_cfg_db_get_int(db, "CDDA", "readmode", &drive->dae);
+
+    if (!drive->device)
+        drive->device = g_strdup(CDDA_DEVICE);
+    if (!drive->directory)
+        drive->directory = g_strdup(CDDA_DIRECTORY);
+
+    cdda_cfg.drives = g_list_append(cdda_cfg.drives, drive);
+
+    bmp_cfg_db_get_int(db, "CDDA", "num_drives", &ndrives);
+    for (i = 1; i < ndrives; i++) {
+        char label[20];
+        drive = g_malloc0(sizeof(struct driveinfo));
+
+        sprintf(label, "device%d", i);
+        bmp_cfg_db_get_string(db, "CDDA", label, &drive->device);
+
+        sprintf(label, "directory%d", i);
+        bmp_cfg_db_get_string(db, "CDDA", label, &drive->directory);
+
+        sprintf(label, "mixer%d", i);
+        bmp_cfg_db_get_int(db, "CDDA", label, &drive->mixer);
+
+        sprintf(label, "readmode%d", i);
+        bmp_cfg_db_get_int(db, "CDDA", label, &drive->dae);
+
+        cdda_cfg.drives = g_list_append(cdda_cfg.drives, drive);
+    }
+    bmp_cfg_db_get_bool(db, "CDDA", "title_override",
+                        &cdda_cfg.title_override);
+    bmp_cfg_db_get_string(db, "CDDA", "name_format", &cdda_cfg.name_format);
+    bmp_cfg_db_get_bool(db, "CDDA", "use_cddb", &cdda_cfg.use_cddb);
+    bmp_cfg_db_get_string(db, "CDDA", "cddb_server", &cdda_cfg.cddb_server);
+#ifdef WITH_CDINDEX
+    bmp_cfg_db_get_bool(db, "CDDA", "use_cdin", &cdda_cfg.use_cdin);
+#else
+    cdda_cfg.use_cdin = FALSE;
+#endif
+    bmp_cfg_db_get_string(db, "CDDA", "cdin_server", &cdda_cfg.cdin_server);
+    bmp_cfg_db_close(db);
+
+    if (!cdda_cfg.cdin_server)
+        cdda_cfg.cdin_server = g_strdup("www.cdindex.org");
+    if (!cdda_cfg.cddb_server)
+        cdda_cfg.cddb_server = g_strdup(CDDB_DEFAULT_SERVER);
+    if (!cdda_cfg.name_format)
+        cdda_cfg.name_format = g_strdup("%p - %t");
+}
+
+struct driveinfo *
+cdda_find_drive(char *filename)
+{
+    GList *node;
+
+    // FIXME: Will always return the first drive
+
+    for (node = cdda_cfg.drives; node; node = node->next) {
+        struct driveinfo *d = node->data;
+        if (!strncmp(d->directory, filename, strlen(d->directory)))
+            return d;
+    }
+
+    return NULL;
+
+}
+
+static void
+timeout_destroy(struct timeout *entry)
+{
+    g_free(entry->device);
+    g_free(entry);
+    timeout_list = g_list_remove(timeout_list, entry);
+}
+
+static void
+timeout_remove_for_device(char *device)
+{
+    GList *node;
+
+    for (node = timeout_list; node; node = node->next) {
+        struct timeout *t = node->data;
+
+        if (!strcmp(t->device, device)) {
+            gtk_timeout_remove(t->id);
+            timeout_destroy(t);
+            return;
+        }
+    }
+
+}
+
+static void
+cleanup(void)
+{
+    while (timeout_list) {
+        struct timeout *t = timeout_list->data;
+        gtk_timeout_remove(t->id);
+        stop_timeout(t);
+        timeout_destroy(t);
+    }
+    cddb_quit();
+}
+
+static int
+is_our_file(char *filename)
+{
+    char *ext = ".cda";
+
+    if (cdda_find_drive(filename) == NULL) {
+        return FALSE;
+    }
+
+    if (g_str_has_suffix(filename, ext)) {
+        return TRUE;
+    }
+    return FALSE;
+}
+
+
+static GList *
+scan_dir(char *dir)
+{
+    GList *list = NULL;
+    int i;
+    cdda_disc_toc_t toc;
+    struct driveinfo *drive;
+
+    if ((drive = cdda_find_drive(dir)) == NULL)
+        return NULL;
+
+    if (!cdda_get_toc(&toc, drive->device))
+        return NULL;
+
+    for (i = toc.last_track; i >= toc.first_track; i--)
+        if (!toc.track[i].flags.data_track) {
+            list = g_list_prepend(list, g_strdup_printf("Track %02d.cda", i));
+        }
+    return list;
+}
+
+guint
+cdda_calculate_track_length(cdda_disc_toc_t * toc, int track)
+{
+    if (track == toc->last_track)
+        return (LBA(toc->leadout) - LBA(toc->track[track]));
+    else
+        return (LBA(toc->track[track + 1]) - LBA(toc->track[track]));
+}
+
+static void *
+dae_play_loop(void *arg)
+{
+    char *buffer = g_malloc(CD_FRAMESIZE_RAW * CDDA_DAE_FRAMES);
+    int pos = LBA(cdda_playing.cd_toc.track[cdda_playing.track]);
+    int end, frames;
+
+    if (cdda_playing.track == cdda_playing.cd_toc.last_track)
+        end = LBA(cdda_playing.cd_toc.leadout);
+    else
+        end = LBA(cdda_playing.cd_toc.track[cdda_playing.track + 1]);
+
+    while (cdda_playing.playing) {
+        int left;
+        char *data;
+
+        if (dae_data.seek != -1) {
+            cdda_ip.output->flush(dae_data.seek * 1000);
+            pos = LBA(cdda_playing.cd_toc.track[cdda_playing.track])
+                + dae_data.seek * 75;
+            dae_data.seek = -1;
+            dae_data.eof = FALSE;
+        }
+        frames = MIN(CDDA_DAE_FRAMES, end - pos);
+        if (frames == 0)
+            dae_data.eof = TRUE;
+
+        if (dae_data.eof) {
+            xmms_usleep(30000);
+            continue;
+        }
+
+        frames = read_audio_data(cdda_playing.fd, pos, frames, buffer);
+        if (frames <= 0) {
+            int err = -frames;
+            if (err == EOPNOTSUPP)
+                dae_data.eof = TRUE;
+            else {
+                /*
+                 * If the read failed, skip ahead to
+                 * avoid getting stuck on scratches
+                 * and such.
+                 */
+                g_message("read_audio_data() failed:  %s (%d)",
+                          strerror(err), err);
+                pos += MIN(CDDA_DAE_FRAMES, end - pos);
+            }
+            continue;
+        }
+        left = frames * CD_FRAMESIZE_RAW;
+        data = buffer;
+        while (cdda_playing.playing && left > 0 && dae_data.seek == -1) {
+            int cur = MIN(512 * 2 * 2, left);
+            cdda_ip.add_vis_pcm(cdda_ip.output->written_time(),
+                                FMT_S16_LE, 2, cur, data);
+            while (cdda_ip.output->buffer_free() < cur &&
+                   cdda_playing.playing && dae_data.seek == -1)
+                xmms_usleep(30000);
+            if (cdda_playing.playing && dae_data.seek == -1)
+                produce_audio(cdda_ip.output->written_time(), FMT_S16_LE, 2, cur, data, &cdda_playing.playing);
+            left -= cur;
+            data += cur;
+        }
+        pos += frames;
+    }
+
+    cdda_ip.output->buffer_free();
+    cdda_ip.output->buffer_free();
+    g_free(buffer);
+
+    g_thread_exit(NULL);
+    return NULL;
+}
+
+static void
+dae_play(void)
+{
+    if (cdda_ip.output->open_audio(FMT_S16_LE, 44100, 2) == 0) {
+        dae_data.audio_error = TRUE;
+        cdda_playing.playing = FALSE;
+        return;
+    }
+    dae_data.seek = -1;
+    dae_data.eof = FALSE;
+    dae_data.audio_error = FALSE;
+    dae_data.thread = g_thread_create(dae_play_loop, NULL, TRUE, NULL);
+}
+
+static void
+play_file(char *filename)
+{
+    char *tmp;
+    struct driveinfo *drive;
+    int track;
+    int track_len;
+
+//      g_message(g_strdup_printf("** CD_AUDIO: trying to play file %s",filename));
+
+    if ((drive = cdda_find_drive(filename)) == NULL) {
+//              g_message("** CD_AUDIO: find drive check failed");
+        return;
+    }
+    if (is_mounted(drive->device)) {
+//              g_message("** CD_AUDIO: drive is mounted");
+        return;
+    }
+    tmp = strrchr(filename, '/');
+    if (tmp)
+        tmp++;
+    else
+        tmp = filename;
+
+    if (!sscanf(tmp, "Track %d.cda", &track)) {
+//              g_message("** CD_AUDIO: filename check failed");                
+        return;
+    }
+
+    if (!cdda_get_toc(&cdda_playing.cd_toc, drive->device) ||
+        cdda_playing.cd_toc.track[track].flags.data_track ||
+        track < cdda_playing.cd_toc.first_track ||
+        track > cdda_playing.cd_toc.last_track) {
+//              g_message("** CD_AUDIO: toc check failed");             
+        return;
+    }
+
+    if ((cdda_playing.fd = open(drive->device, CDOPENFLAGS)) == -1) {
+//              g_message("** CD_AUDIO: device open failed");           
+        return;
+    }
+    track_len = cdda_calculate_track_length(&cdda_playing.cd_toc, track);
+    cdda_ip.set_info(cdda_get_title(&cdda_playing.cd_toc, track),
+                     (track_len * 1000) / 75, 44100 * 2 * 2 * 8, 44100, 2);
+
+    memcpy(&cdda_playing.drive, drive, sizeof(struct driveinfo));
+#ifndef CDDA_HAS_READAUDIO
+    cdda_playing.drive.dae = FALSE;
+#endif
+
+    cdda_playing.track = track;
+
+    is_paused = FALSE;
+    timeout_remove_for_device(drive->device);
+
+    cdda_playing.playing = TRUE;
+    if (drive->dae)
+        dae_play();
+    else
+        seek(0);
+}
+
+static char *
+cdda_get_title(cdda_disc_toc_t * toc, int track)
+{
+    G_LOCK_DEFINE_STATIC(title);
+
+    static guint32 cached_id;
+    static cdinfo_t cdinfo;
+    TitleInput *input;
+    guint32 disc_id;
+    char *title;
+
+    disc_id = cdda_cddb_compute_discid(toc);
+
+    /*
+     * We want to avoid looking up a album from two threads simultaneously.
+     * This can happen since we are called both from the main-thread and
+     * from the playlist-thread.
+     */
+
+    G_LOCK(title);
+    if (!(disc_id == cached_id && cdinfo.is_valid)) {
+        /*
+         * We try to look up the disc again if the info is not
+         * valid.  The user might have configured a new server
+         * in the meantime.
+         */
+        cdda_cdinfo_flush(&cdinfo);
+        cached_id = disc_id;
+
+        if (!cdda_cdinfo_read_file(disc_id, &cdinfo)) {
+            if (cdda_cfg.use_cddb)
+                cdda_cddb_get_info(toc, &cdinfo);
+            if (cdinfo.is_valid)
+                cdda_cdinfo_write_file(disc_id, &cdinfo);
+        }
+    }
+    XMMS_NEW_TITLEINPUT(input);
+    cdda_cdinfo_get(&cdinfo, track, &input->performer, &input->album_name,
+                    &input->track_name);
+    G_UNLOCK(title);
+
+    input->track_number = track;
+    input->file_name = input->file_path =
+        g_strdup_printf(_("CD Audio Track %02u"), track);
+    input->file_ext = "cda";
+    title = xmms_get_titlestring(cdda_cfg.title_override ?
+                                 cdda_cfg.name_format :
+                                 xmms_get_gentitle_format(), input);
+    g_free(input->file_name);
+    g_free(input);
+
+    if (!title)
+        title = g_strdup_printf(_("CD Audio Track %02u"), track);
+    return title;
+}
+
+static gboolean
+stop_timeout(gpointer data)
+{
+    int fd;
+    struct timeout *to = data;
+
+    fd = open(to->device, CDOPENFLAGS);
+    if (fd != -1) {
+        ioctl(fd, XMMS_STOP, 0);
+        close(fd);
+    }
+    timeout_destroy(to);
+    return FALSE;
+}
+
+static void
+stop(void)
+{
+    struct timeout *to_info;
+    if (cdda_playing.fd < 0)
+        return;
+
+    cdda_playing.playing = FALSE;
+
+    if (cdda_playing.drive.dae) {
+        g_thread_join(dae_data.thread);
+        cdda_ip.output->close_audio();
+    }
+    else
+        ioctl(cdda_playing.fd, XMMS_PAUSE, 0);
+
+    close(cdda_playing.fd);
+    cdda_playing.fd = -1;
+
+    if (!cdda_playing.drive.dae) {
+        to_info = g_malloc(sizeof(*to_info));
+        to_info->device = g_strdup(cdda_playing.drive.device);
+        to_info->id = gtk_timeout_add(STOP_DELAY * 100, stop_timeout,
+                                      to_info);
+        timeout_list = g_list_prepend(timeout_list, to_info);
+    }
+}
+
+static void
+cdda_pause(short p)
+{
+    if (cdda_playing.drive.dae) {
+        cdda_ip.output->pause(p);
+        return;
+    }
+    if (p) {
+        pause_time = get_time();
+        ioctl(cdda_playing.fd, XMMS_PAUSE, 0);
+    }
+    else {
+        ioctl(cdda_playing.fd, XMMS_RESUME, 0);
+        pause_time = -1;
+    }
+    is_paused = p;
+}
+
+
+
+static void
+seek(int time)
+{
+    struct cdda_msf *end, start;
+    int track = cdda_playing.track;
+
+//      g_message("** CD_AUDIO: seeking...");
+    if (cdda_playing.drive.dae) {
+        dae_data.seek = time;
+        while (dae_data.seek != -1)
+            xmms_usleep(20000);
+        return;
+    }
+
+    start.minute = (cdda_playing.cd_toc.track[track].minute * 60 +
+                    cdda_playing.cd_toc.track[track].second + time) / 60;
+    start.second = (cdda_playing.cd_toc.track[track].second + time) % 60;
+    start.frame = cdda_playing.cd_toc.track[track].frame;
+    if (track == cdda_playing.cd_toc.last_track)
+        end = &cdda_playing.cd_toc.leadout;
+    else
+        end = &cdda_playing.cd_toc.track[track + 1];
+
+    play_ioctl(&start, end);
+
+    if (is_paused) {
+        cdda_pause(TRUE);
+        pause_time = time * 1000;
+    }
+}
+
+static int
+get_time_analog(void)
+{
+    int frame, start_frame, length;
+    int track = cdda_playing.track;
+
+    if (is_paused && pause_time != -1)
+        return pause_time;
+
+    frame = get_current_frame();
+
+    if (frame == -1)
+        return -1;
+
+    start_frame = LBA(cdda_playing.cd_toc.track[track]);
+    length = cdda_calculate_track_length(&cdda_playing.cd_toc, track);
+
+    if (frame - start_frame >= length - 20) /* 20 seems to work better */
+        return -1;
+
+    return ((frame - start_frame) * 1000) / 75;
+}
+
+static int
+get_time_dae(void)
+{
+    if (dae_data.audio_error)
+        return -2;
+    if (!cdda_playing.playing ||
+        (dae_data.eof && !cdda_ip.output->buffer_playing()))
+        return -1;
+    return cdda_ip.output->output_time();
+}
+
+static int
+get_time(void)
+{
+    if (cdda_playing.fd == -1)
+        return -1;
+
+    if (cdda_playing.drive.dae)
+        return get_time_dae();
+    else
+        return get_time_analog();
+}
+
+static void
+get_song_info(char *filename, char **title, int *len)
+{
+    cdda_disc_toc_t toc;
+    int t;
+    char *tmp;
+    struct driveinfo *drive;
+
+    *title = NULL;
+    *len = -1;
+
+//      g_message("** CD_AUDIO: getting song info");
+
+    if ((drive = cdda_find_drive(filename)) == NULL)
+        return;
+
+    tmp = strrchr(filename, '/');
+    if (tmp)
+        tmp++;
+    else
+        tmp = filename;
+
+    if (!sscanf(tmp, "Track %d.cda", &t))
+        return;
+    if (!cdda_get_toc(&toc, drive->device))
+        return;
+    if (t < toc.first_track || t > toc.last_track
+        || toc.track[t].flags.data_track)
+        return;
+
+    *len = (cdda_calculate_track_length(&toc, t) * 1000) / 75;
+    *title = cdda_get_title(&toc, t);
+}
+
+#ifdef HAVE_OSS
+static void
+oss_get_volume(int *l, int *r, int mixer_line)
+{
+    int fd, v;
+
+    fd = open(DEV_MIXER, O_RDONLY);
+    if (fd != -1) {
+        ioctl(fd, MIXER_READ(mixer_line), &v);
+        *r = (v & 0xFF00) >> 8;
+        *l = (v & 0x00FF);
+        close(fd);
+    }
+}
+
+static void
+oss_set_volume(int l, int r, int mixer_line)
+{
+    int fd, v;
+
+    fd = open(DEV_MIXER, O_RDONLY);
+    if (fd != -1) {
+        v = (r << 8) | l;
+        ioctl(fd, MIXER_WRITE(mixer_line), &v);
+        close(fd);
+    }
+}
+#else
+static void
+oss_get_volume(int *l, int *r, int mixer_line)
+{
+}
+static void
+oss_set_volume(int l, int r, int mixer_line)
+{
+}
+#endif
+
+
+static void
+get_volume(int *l, int *r)
+{
+    if (cdda_playing.drive.dae)
+        cdda_ip.output->get_volume(l, r);
+    else if (cdda_playing.drive.mixer == CDDA_MIXER_OSS)
+        oss_get_volume(l, r, cdda_playing.drive.oss_mixer);
+    else if (cdda_playing.drive.mixer == CDDA_MIXER_DRIVE)
+        drive_get_volume(l, r);
+}
+
+static void
+set_volume(int l, int r)
+{
+    if (cdda_playing.drive.dae)
+        cdda_ip.output->set_volume(l, r);
+    else if (cdda_playing.drive.mixer == CDDA_MIXER_OSS)
+        oss_set_volume(l, r, cdda_playing.drive.oss_mixer);
+    else if (cdda_playing.drive.mixer == CDDA_MIXER_DRIVE)
+        drive_set_volume(l, r);
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdaudio.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdaudio.h	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdaudio.h	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,158 @@
+/*  XMMS - Cross-platform multimedia player
+ *  Copyright (C) 1998-2002  Peter Alm, Mikael Alm, Olle Hallnas,
+ *                           Thomas Nilsson and 4Front Technologies
+ *  Copyright (C) 1999-2002  Haavard Kvaalen
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#ifndef CDAUDIO_H
+#define CDAUDIO_H
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include <glib.h>
+#include <gtk/gtk.h>
+#include "beep/plugin.h"
+
+#include "cdinfo.h"
+
+#ifdef HAVE_OSS
+#include <Output/OSS/soundcard.h>
+#endif
+
+#ifdef HAVE_MNTENT_H
+#include <mntent.h>
+#endif
+
+#ifdef HAVE_GETMNTINFO
+#include <sys/param.h>
+#include <sys/ucred.h>
+#include <sys/mount.h>
+#endif
+
+#ifndef CD_FRAMES
+#define CD_FRAMES 75
+#endif
+
+#include <sys/types.h>
+
+#ifdef HAVE_LINUX_CDROM_H
+#include <linux/cdrom.h>
+#elif defined HAVE_SYS_CDIO_H
+#include <sys/cdio.h>
+#endif
+
+#if defined(CDROMREADAUDIO) || defined(CDIOCREADAUDIO) || defined(CDROMCDDA)
+# define CDDA_HAS_READAUDIO
+#endif
+
+#ifndef CD_FRAMESIZE_RAW
+# define CD_FRAMESIZE_RAW 2352
+#endif
+
+/* Number of frames that are read at once in dae mode */
+#define CDDA_DAE_FRAMES 8
+
+#ifndef CDDA_HAS_READAUDIO
+#warning "Digital audio extraction has not been ported to this platform"
+#define read_audio_data(fd, pos, num, buf) -1
+#else
+int read_audio_data(int fd, int pos, int num, void *buf);
+#endif
+
+
+#ifdef __FreeBSD__
+/*
+ * FreeBSD won't be able to detect media changes if using O_NONBLOCK
+ */
+#define CDOPENFLAGS O_RDONLY
+#else
+#define CDOPENFLAGS (O_RDONLY | O_NONBLOCK)
+#endif
+
+
+#define CDDB_DEFAULT_SERVER "freedb.freedb.org"
+
+struct driveinfo {
+    gchar *device, *directory;
+    gint mixer, oss_mixer;
+    gboolean valid;
+    gint dae;
+};
+
+typedef struct {
+    GList *drives;
+
+    gchar *cddb_server;
+    gint cddb_protocol_level;
+    gboolean use_cddb;
+
+    gchar *cdin_server;
+    gboolean use_cdin;
+
+    gboolean title_override;
+    char *name_format;
+} CDDAConfig;
+
+struct cdda_msf {
+    guint8 minute;
+    guint8 second;
+    guint8 frame;
+    struct {
+        guint data_track:1;
+    } flags;
+};
+
+/*
+ * Note: This macro will convert to a LBA representation of the MSF
+ * address, not to a true LBA address, as we don't subtract the offset
+ */
+#define LBA(msf) ((msf.minute * 60 + msf.second) * 75 + msf.frame)
+
+#define CDDA_MSF_OFFSET 150
+
+typedef struct {
+    guint8 first_track, last_track;
+    struct cdda_msf leadout;
+    struct cdda_msf track[100];
+} cdda_disc_toc_t;
+
+extern CDDAConfig cdda_cfg;
+
+enum {
+    CDDA_MIXER_NONE,
+    CDDA_MIXER_DRIVE,
+    CDDA_MIXER_OSS,
+};
+
+enum {
+    CDDA_READ_ANALOG,
+    CDDA_READ_DAE,
+};
+
+void cdda_configure(void);
+gboolean cdda_get_toc(cdda_disc_toc_t * info, const gchar *device);
+guint32 cdda_cddb_compute_discid(cdda_disc_toc_t * info);
+void cdda_cddb_get_info(cdda_disc_toc_t * toc, cdinfo_t * info);
+void cdda_cdindex_get_idx(cdda_disc_toc_t * toc, cdinfo_t * cdinfo);
+struct driveinfo *cdda_find_drive(gchar *filename);
+
+void cdda_cddb_show_server_dialog(GtkWidget * w, gpointer data);
+void cdda_cddb_set_server(const gchar *new_server);
+void cddb_quit(void);
+
+#endif

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cddb.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cddb.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cddb.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,889 @@
+/*
+ *  cddb.c  Copyright 1999-2001 Håvard Kvålen <havardk at xmms.org>
+ *
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+
+#include "cddb.h"
+
+#include <glib.h>
+#include <glib/gprintf.h>
+#include <gtk/gtk.h>
+#include <stdarg.h>
+
+#include <libbeep/util.h>
+
+#include "http.h"
+#include "cdaudio.h"
+#include "cdinfo.h"
+
+
+static guint32 cached_id = 0;
+static GtkWidget *server_dialog, *server_clist;
+static GtkWidget *debug_window, *debug_clist;
+static GList *debug_messages = NULL;
+static GList *temp_messages = NULL;
+static guint cddb_timeout_id;
+
+G_LOCK_DEFINE_STATIC(list);
+
+void configure_set_cddb_server(gchar * server);
+
+static void
+cddb_log(gchar * str, ...)
+{
+    static GList *end_ptr = NULL;
+    static gint message_num = 0;
+    va_list args;
+    gchar *text;
+
+    va_start(args, str);
+    text = g_strdup_vprintf(str, args);
+    va_end(args);
+
+    message_num++;
+    debug_messages = g_list_prepend(debug_messages, text);
+    if (!end_ptr)
+        end_ptr = debug_messages;
+    if (message_num > CDDB_LOG_MAX) {
+        GList *temp;
+
+        temp = g_list_previous(end_ptr);
+        temp->next = NULL;
+        g_free(end_ptr->data);
+        g_list_free_1(end_ptr);
+        end_ptr = temp;
+        message_num--;
+    }
+    if (debug_window) {
+        G_LOCK(list);
+        temp_messages = g_list_append(temp_messages, g_strdup(text));
+        G_UNLOCK(list);
+    }
+}
+
+static gint
+cddb_sum(gint in)
+{
+    gint retval = 0;
+
+    while (in > 0) {
+        retval += in % 10;
+        in /= 10;
+    }
+    return retval;
+}
+
+guint32
+cdda_cddb_compute_discid(cdda_disc_toc_t * info)
+{
+    gint i;
+    guint high = 0, low;
+
+    for (i = info->first_track; i <= info->last_track; i++)
+        high += cddb_sum(info->track[i].minute * 60 + info->track[i].second);
+
+    low = (info->leadout.minute * 60 + info->leadout.second) -
+        (info->track[info->first_track].minute * 60 +
+         info->track[info->first_track].second);
+
+    return ((high % 0xff) << 24 | low << 8 | (info->last_track -
+                                              info->first_track + 1));
+}
+
+static gchar *
+cddb_generate_offset_string(cdda_disc_toc_t * info)
+{
+    gchar *buffer;
+    int i;
+
+    buffer = g_malloc(info->last_track * 7 + 1);
+
+    sprintf(buffer, "%d", LBA(info->track[info->first_track]));
+
+    for (i = info->first_track + 1; i <= info->last_track; i++)
+        sprintf(buffer, "%s+%d", buffer, LBA(info->track[i]));
+
+    return buffer;
+}
+
+static gchar *
+cddb_generate_hello_string(void)
+{
+    static gchar *buffer;
+
+    if (buffer == NULL) {
+        gchar *env, *client = NULL, *version = NULL, **strs = NULL;
+
+        env = getenv("XMMS_CDDB_CLIENT_NAME");
+        if (env) {
+            strs = g_strsplit(env, " ", 2);
+            if (strs && strs[0] && strs[1]) {
+                client = strs[0];
+                version = strs[1];
+            }
+        }
+
+        if (!client || !version) {
+            client = PACKAGE;
+            version = VERSION;
+        }
+
+        buffer = g_strdup_printf("&hello=nobody+localhost+%s+%s",
+                                 client, version);
+        if (strs)
+            g_strfreev(strs);
+    }
+    return buffer;
+}
+
+static gint
+cddb_http_open_connection(const gchar * server, gint port)
+{
+    gint sock;
+    gchar *status;
+
+    if ((sock = http_open_connection(server, 80)) == 0)
+        status = "Failed";
+    else
+        status = "Ok";
+
+    cddb_log("Connecting to CDDB-server %s: %s", server, status);
+    return sock;
+}
+
+
+static gboolean
+cddb_query(gchar * server, cdda_disc_toc_t * info,
+           cddb_disc_header_t * cddb_info)
+{
+    /*
+     * Query the cddb-server for the cd.
+     * Returns the *real* diskid and category.
+     */
+
+    gint sock;
+    gchar *offsets, *getstr;
+    gchar buffer[256];
+    gchar **response;
+    gint i;
+
+    if ((sock = cddb_http_open_connection(server, 80)) == 0)
+        return FALSE;
+
+    offsets = cddb_generate_offset_string(info);
+
+    cddb_log("Sending query-command. Disc ID: %08x",
+             cdda_cddb_compute_discid(info));
+
+    getstr =
+        g_strdup_printf
+        ("GET /~cddb/cddb.cgi?cmd=cddb+query+%08x+%d+%s+%d%s&proto=%d HTTP/1.0\r\n\r\n",
+         cdda_cddb_compute_discid(info),
+         info->last_track - info->first_track + 1, offsets,
+         (info->leadout.minute * 60 + info->leadout.second),
+         cddb_generate_hello_string(), cdda_cfg.cddb_protocol_level);
+
+    g_free(offsets);
+    write(sock, getstr, strlen(getstr));
+    g_free(getstr);
+
+    if (http_read_first_line(sock, buffer, 256) < 0) {
+        http_close_connection(sock);
+        return FALSE;
+    }
+
+    http_close_connection(sock);
+    response = g_strsplit(buffer, " ", 4);
+
+    cddb_log("Query response: %s", buffer);
+
+    switch (strtol(response[0], NULL, 10)) {
+    case 200:
+        /* One exact match */
+        for (i = 0; i < 4; i++) {
+            if (response[i] == NULL) {
+                g_strfreev(response);
+                return FALSE;
+            }
+        }
+        cddb_info->category = g_strdup(response[1]);
+        cddb_info->discid = strtoul(response[2], NULL, 16);
+        break;
+    default:                   /* FIXME: Handle other 2xx */
+        g_strfreev(response);
+        return FALSE;
+    }
+
+    g_strfreev(response);
+    return TRUE;
+}
+
+static gint
+cddb_check_protocol_level(const gchar * server)
+{
+    gint level = 0, sock, n;
+    gchar *str, buffer[256];
+
+    if ((sock = cddb_http_open_connection(server, 80)) == 0)
+        return 0;
+
+    str =
+        g_strdup_printf
+        ("GET /~cddb/cddb.cgi?cmd=stat%s&proto=1 HTTP/1.0\r\n\r\n",
+         cddb_generate_hello_string());
+
+    write(sock, str, strlen(str));
+    g_free(str);
+
+    if ((n = http_read_first_line(sock, buffer, 256)) < 0 ||
+        atoi(buffer) != 210) {
+        if (n > 0)
+            cddb_log("Getting cddb protocol level failed: %s", buffer);
+        else
+            cddb_log("Getting cddb protocol level failed.");
+
+        http_close_connection(sock);
+        return 0;
+    }
+
+    while (http_read_line(sock, buffer, 256) >= 0) {
+        g_strstrip(buffer);
+        if (!strncmp(buffer, "max proto:", 10))
+            level = atoi(buffer + 10);
+        if (!strcmp(buffer, "."))
+            break;
+    }
+    http_close_connection(sock);
+    cddb_log("Getting cddb protocol level. Got level %d", level);
+    return (MIN(level, CDDB_MAX_PROTOCOL_LEVEL));
+}
+
+#define BUF2SIZE (80*3)
+
+static gboolean
+cddb_read(gchar * server, cddb_disc_header_t * cddb_info, cdinfo_t * cdinfo)
+{
+    gint sock;
+    gchar *readstr;
+    gchar buffer[256], buffer2[BUF2SIZE];
+    gchar *realstr, *temp;
+    gint len, command, bufs;
+    gint num, oldnum;
+
+    if ((sock = cddb_http_open_connection(server, 80)) == 0)
+        return FALSE;
+
+    cddb_log("Sending read-command. Disc ID: %08x. Category: %s",
+             cddb_info->discid, cddb_info->category);
+
+    readstr =
+        g_strdup_printf
+        ("GET /~cddb/cddb.cgi?cmd=cddb+read+%s+%08x%s&proto=%d HTTP/1.0\r\n\r\n",
+         cddb_info->category, cddb_info->discid,
+         cddb_generate_hello_string(), cdda_cfg.cddb_protocol_level);
+
+    write(sock, readstr, strlen(readstr));
+    g_free(readstr);
+
+    if (http_read_first_line(sock, buffer, 256) < 0) {
+        http_close_connection(sock);
+        return FALSE;
+    }
+
+    cddb_log("Read response: %s", buffer);
+
+    command = 1;
+    bufs = 0;
+    oldnum = -1;
+    do {
+/*              fprintf(stderr,"%s\n",buffer); */
+        realstr = strchr(buffer, '=');
+        if (buffer[0] == '#' || !realstr)
+            continue;
+
+        realstr++;
+        len = strlen(realstr);
+
+        switch (command) {
+        case 1:
+            if (!strncmp(buffer, "DISCID", 6))
+                break;
+            command++;
+        case 2:
+            if (!strncmp(buffer, "DTITLE", 6)) {
+                strncpy(buffer2 + bufs, realstr, BUF2SIZE - bufs);
+                bufs += len;
+                break;
+            }
+            if (bufs > 0) {
+                buffer2[BUF2SIZE - 1] = '\0';
+                if ((temp = strstr(buffer2, " / ")) != NULL) {
+                    cdda_cdinfo_cd_set(cdinfo, g_strdup(temp + 3),
+                                       g_strndup(buffer2, temp - buffer2));
+                }
+                else
+                    cdda_cdinfo_cd_set(cdinfo, g_strdup(buffer2),
+                                       g_strdup(buffer2));
+                bufs = 0;
+            }
+            command++;
+        case 3:
+            if (!strncmp(buffer, "TTITLE", 6)) {
+                num = atoi(buffer + 6);
+                if (oldnum < 0 || num == oldnum) {
+                    strncpy(buffer2 + bufs, realstr, BUF2SIZE - bufs);
+                    bufs += len;
+                }
+                else {
+                    buffer2[BUF2SIZE - 1] = '\0';
+                    cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL,
+                                          g_strdup(buffer2));
+                    strncpy(buffer2, realstr, BUF2SIZE);
+                    bufs = len;
+                }
+                oldnum = num;
+                break;
+            }
+            if (oldnum >= 0)
+                cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL,
+                                      g_strdup(buffer2));
+            bufs = 0;
+            oldnum = -1;
+            command++;
+        case 4:
+            if (!strncmp(buffer, "EXTD", 4)) {
+                break;
+            }
+            command++;
+        case 5:
+            if (!strncmp(buffer, "EXTT", 4)) {
+                break;
+            }
+            command++;
+        case 6:
+            if (!strncmp(buffer, "PLAYORDER", 9)) {
+                break;
+            }
+            command++;
+        default:
+            g_log(NULL, G_LOG_LEVEL_WARNING, "%s: illegal cddb-data: %s",
+                  PACKAGE, buffer);
+            break;
+        }
+
+    } while (http_read_line(sock, buffer, 256) >= 0);
+
+    if (oldnum >= 0)
+        cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2));
+
+    http_close_connection(sock);
+    return TRUE;
+}
+
+static gint
+cddb_get_protocol_level(void)
+{
+    if (cdda_cfg.cddb_protocol_level < 1)
+        cdda_cfg.cddb_protocol_level =
+            cddb_check_protocol_level(cdda_cfg.cddb_server);
+
+    return cdda_cfg.cddb_protocol_level;
+}
+
+static GList *
+cddb_get_server_list(const gchar * server, gint protocol_level)
+{
+    gint sock;
+    gchar *getstr;
+    gchar buffer[256];
+    gchar **message;
+    GList *list = NULL;
+
+    if ((sock = cddb_http_open_connection(server, 80)) == 0)
+        return NULL;
+
+    cddb_log("Sending sites-command");
+
+    getstr =
+        g_strdup_printf
+        ("GET /~cddb/cddb.cgi?cmd=sites%s&proto=%d HTTP/1.0\r\n\r\n",
+         cddb_generate_hello_string(), protocol_level);
+
+    write(sock, getstr, strlen(getstr));
+    g_free(getstr);
+
+    if (http_read_first_line(sock, buffer, 256) < 0) {
+        http_close_connection(sock);
+        return NULL;
+    }
+
+    cddb_log("Sites response: %s", buffer);
+
+    switch (atoi(buffer)) {
+    case 210:
+        while ((http_read_line(sock, buffer, 256)) > 1) {
+            message = g_strsplit(buffer, " ", 6);
+            if (message && message[0] && message[1] &&
+                !strcasecmp(message[1], "http")) {
+                list = g_list_prepend(list, message);
+            }
+            else {
+                /* Ignore non-http servers */
+                g_strfreev(message);
+            }
+        }
+        list = g_list_reverse(list);
+        break;
+    case 401:
+        /* No site information available */
+        break;
+    default:
+        break;
+    }
+    http_close_connection(sock);
+    return list;
+}
+
+gint
+search_for_discid(gchar * abs_filename, gchar ** cddb_file, guint32 disc_id)
+{
+    GDir *dir;
+    const gchar *dir_entry;
+    gchar tmp_id[10];
+
+    if (!(dir = g_dir_open(abs_filename, 0, NULL)))
+        return (0);
+
+    memset(tmp_id, 0, 10);
+
+    snprintf(tmp_id, sizeof(tmp_id), "%08x", disc_id);
+    while ((dir_entry = g_dir_read_name(dir))) {
+        if (!strncmp(tmp_id, dir_entry, 8)) {
+            cddb_file[0] = g_build_filename(abs_filename, dir_entry, NULL);
+            g_dir_close(dir);
+            return (1);
+        }
+    }
+    g_dir_close(dir);
+
+    return (0);
+}
+
+gint
+scan_cddb_dir(gchar * server, gchar ** cddb_file, guint32 disc_id)
+{
+
+    GDir *dir;
+    const gchar *dir_entry;
+    gchar abs_filename[FILENAME_MAX];
+
+    if (!(dir = g_dir_open(&server[7], 0, NULL))) {
+        return 0;
+    }
+
+    while ((dir_entry = g_dir_read_name(dir))) {
+        strcpy(abs_filename, &server[7]);
+        if (abs_filename[strlen(abs_filename) - 1] != '/') {
+            strcat(abs_filename, "/");
+        }
+        strcat(abs_filename, dir_entry);
+
+        if (dir_entry[0] != '.' &&
+            g_file_test(abs_filename, G_FILE_TEST_IS_DIR) &&
+            search_for_discid(abs_filename, cddb_file, disc_id)) {
+            break;
+        }
+    }
+
+    g_dir_close(dir);
+    return (cddb_file[0] != NULL);
+}
+
+gint
+cddb_read_file(gchar * file, cddb_disc_header_t * cddb_info,
+               cdinfo_t * cdinfo)
+{
+    FILE *fd;
+    gchar buffer[256], buffer2[BUF2SIZE];
+    gchar *realstr, *temp;
+    gint len, command, bufs;
+    gint num, oldnum;
+
+    if ((fd = fopen(file, "r")) == NULL)
+        return 0;
+
+    command = 1;
+    bufs = 0;
+    oldnum = -1;
+    while (fgets(buffer, 256, fd) != NULL) {
+        realstr = strchr(buffer, '=');
+        if (buffer[0] == '#' || !realstr)
+            continue;
+
+        realstr++;
+        len = strlen(realstr);
+        if (realstr[len - 1] == '\n')
+            realstr[--len] = '\0';  /* remove newline */
+
+        switch (command) {
+        case 1:
+            if (!strncmp(buffer, "DISCID", 6))
+                break;
+            command++;
+        case 2:
+            if (!strncmp(buffer, "DTITLE", 6)) {
+                strncpy(buffer2 + bufs, realstr, BUF2SIZE - bufs);
+                bufs += len;
+                break;
+            }
+            if (bufs > 0) {
+                buffer2[BUF2SIZE - 1] = '\0';
+                if ((temp = strstr(buffer2, " / ")) != NULL) {
+                    cdda_cdinfo_cd_set(cdinfo, g_strdup(temp + 3),
+                                       g_strndup(buffer2, temp - buffer2));
+                }
+                else
+                    cdda_cdinfo_cd_set(cdinfo, g_strdup(buffer2),
+                                       g_strdup(buffer2));
+                bufs = 0;
+            }
+            command++;
+        case 3:
+            if (!strncmp(buffer, "TTITLE", 6)) {
+                num = atoi(buffer + 6);
+                if (oldnum < 0 || num == oldnum) {
+                    strncpy(buffer2 + bufs, realstr, BUF2SIZE - bufs);
+                    bufs += len;
+                }
+                else {
+                    buffer2[BUF2SIZE - 1] = '\0';
+                    cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL,
+                                          g_strdup(buffer2));
+                    strncpy(buffer2, realstr, BUF2SIZE);
+                    bufs = len;
+                }
+                oldnum = num;
+                break;
+            }
+            if (oldnum >= 0)
+                cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL,
+                                      g_strdup(buffer2));
+            bufs = 0;
+            oldnum = -1;
+            command++;
+        case 4:
+            if (!strncmp(buffer, "EXTD", 4)) {
+                break;
+            }
+            command++;
+        case 5:
+            if (!strncmp(buffer, "EXTT", 4)) {
+                break;
+            }
+            command++;
+        case 6:
+            if (!strncmp(buffer, "PLAYORDER", 9)) {
+                break;
+            }
+            command++;
+        default:
+            g_log(NULL, G_LOG_LEVEL_WARNING, "%s: illegal cddb-data: %s",
+                  PACKAGE, buffer);
+            break;
+        }
+
+    }
+
+    if (oldnum >= 0)
+        cdda_cdinfo_track_set(cdinfo, oldnum + 1, NULL, g_strdup(buffer2));
+
+    fclose(fd);
+    return (1);
+}
+
+
+void
+cdda_cddb_get_info(cdda_disc_toc_t * toc, cdinfo_t * cdinfo)
+{
+    guint32 disc_id;
+    cddb_disc_header_t cddb_disc_info;
+    gchar *cddb_file[1];
+    disc_id = cdda_cddb_compute_discid(toc);
+    cddb_file[0] = NULL;
+
+    if ((cached_id != disc_id)
+        && (strncmp(cdda_cfg.cddb_server, "file://", 7) != 0)) {
+        if (cddb_get_protocol_level() == 0)
+            return;
+
+        cached_id = disc_id;
+        if (!cddb_query(cdda_cfg.cddb_server, toc, &cddb_disc_info))
+            return;
+        if (!cddb_read(cdda_cfg.cddb_server, &cddb_disc_info, cdinfo))
+            return;
+        cdinfo->is_valid = TRUE;
+
+    }
+    else if ((cached_id != disc_id)
+             && (strncmp(cdda_cfg.cddb_server, "file://", 7) == 0)) {
+        cached_id = disc_id;
+        if (!scan_cddb_dir(cdda_cfg.cddb_server, cddb_file, disc_id))
+            return;
+        if (!cddb_read_file(cddb_file[0], &cddb_disc_info, cdinfo)) {
+            g_free(cddb_file[0]);
+            return;
+        }
+        cdinfo->is_valid = TRUE;
+        g_free(cddb_file[0]);
+    }
+}
+
+void
+cdda_cddb_set_server(const gchar * new_server)
+{
+    if (strcmp(cdda_cfg.cddb_server, new_server)) {
+        g_free(cdda_cfg.cddb_server);
+        cdda_cfg.cddb_server = g_strdup(new_server);
+        cdda_cfg.cddb_protocol_level = 0;
+        cached_id = 0;
+    }
+}
+
+
+static gchar *
+cddb_position_string(gchar * input)
+{
+    gchar deg[4], min[3];
+    if (input == NULL || strlen(input) < 7)
+        return g_strdup("");
+    strncpy(deg, input + 1, 3);
+    deg[3] = '\0';
+    strncpy(min, input + 5, 2);
+    min[2] = '\0';
+    return g_strdup_printf("%2d°%s'%c", atoi(deg), min, input[0]);
+}
+
+static void
+cddb_server_dialog_ok_cb(GtkWidget * w, gpointer data)
+{
+    gchar *text;
+    gint pos;
+    GtkEntry *entry = GTK_ENTRY(data);
+
+    if (!GTK_CLIST(server_clist)->selection)
+        return;
+    pos = GPOINTER_TO_INT(GTK_CLIST(server_clist)->selection->data);
+    gtk_clist_get_text(GTK_CLIST(server_clist), pos, 0, &text);
+    cdda_cddb_set_server(text);
+    gtk_entry_set_text(entry, text);
+    gtk_widget_destroy(server_dialog);
+}
+
+static void
+cddb_server_dialog_select(GtkWidget * w, gint row, gint column,
+                          GdkEvent * event, gpointer data)
+{
+    if (event->type == GDK_2BUTTON_PRESS)
+        cddb_server_dialog_ok_cb(NULL, NULL);
+}
+
+void
+cdda_cddb_show_server_dialog(GtkWidget * w, gpointer data)
+{
+    GtkWidget *vbox, *bbox, *okbutton, *cancelbutton;
+    GtkEntry *server_entry = GTK_ENTRY(data);
+    gchar *titles[] = { "Server", "Latitude", "Longitude", "Description" };
+    GList *servers;
+    const gchar *server;
+    gint level;
+
+    if (server_dialog)
+        return;
+
+    server = gtk_entry_get_text(server_entry);
+
+    if ((level = cddb_check_protocol_level(server)) < 3) {
+        if (!level)
+            xmms_show_message("CDDB",
+                              "Unable to connect to CDDB-server",
+                              "Ok", FALSE, NULL, NULL);
+        else
+            /* CDDB level < 3 has the "sites" command,
+               but the format is different. Not supported yet */
+            xmms_show_message("CDDB",
+                              "Can't get server list from the current CDDB-server\n"
+                              "Unsupported CDDB protocol level",
+                              "Ok", FALSE, NULL, NULL);
+        return;
+    }
+
+    if ((servers = cddb_get_server_list(server, level)) == NULL) {
+        xmms_show_message("CDDB",
+                          "No site information available",
+                          "Ok", FALSE, NULL, NULL);
+        return;
+    }
+
+    server_dialog = gtk_dialog_new();
+    g_signal_connect(G_OBJECT(server_dialog), "destroy",
+                     G_CALLBACK(gtk_widget_destroyed), &server_dialog);
+    gtk_window_set_title(GTK_WINDOW(server_dialog), "CDDB servers");
+    gtk_window_set_modal(GTK_WINDOW(server_dialog), TRUE);
+
+    vbox = gtk_vbox_new(FALSE, 0);
+    gtk_container_set_border_width(GTK_CONTAINER(vbox), 15);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(server_dialog)->vbox), vbox,
+                       TRUE, TRUE, 0);
+
+    server_clist = gtk_clist_new_with_titles(4, titles);
+    g_signal_connect(G_OBJECT(server_clist), "select-row",
+                     G_CALLBACK(cddb_server_dialog_select), NULL);
+    gtk_box_pack_start(GTK_BOX(vbox), server_clist, TRUE, TRUE, 0);
+
+    bbox = gtk_hbutton_box_new();
+    gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
+    gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(server_dialog)->action_area),
+                       bbox, TRUE, TRUE, 0);
+
+    okbutton = gtk_button_new_with_label("Ok");
+    g_signal_connect(G_OBJECT(okbutton), "clicked",
+                     G_CALLBACK(cddb_server_dialog_ok_cb), data);
+    gtk_box_pack_start(GTK_BOX(bbox), okbutton, TRUE, TRUE, 0);
+    cancelbutton = gtk_button_new_with_label("Cancel");
+    g_signal_connect_swapped(G_OBJECT(cancelbutton), "clicked",
+                             G_CALLBACK(gtk_widget_destroy),
+                             GTK_OBJECT(server_dialog));
+    gtk_box_pack_start(GTK_BOX(bbox), cancelbutton, TRUE, TRUE, 0);
+    GTK_WIDGET_SET_FLAGS(okbutton, GTK_CAN_DEFAULT);
+    GTK_WIDGET_SET_FLAGS(cancelbutton, GTK_CAN_DEFAULT);
+    gtk_widget_grab_default(okbutton);
+
+    while (servers) {
+        gchar *row[4];
+        gint i;
+
+        row[0] = g_strdup(((gchar **) servers->data)[0]);
+        row[1] = cddb_position_string(((gchar **) servers->data)[4]);
+        row[2] = cddb_position_string(((gchar **) servers->data)[5]);
+        row[3] = g_strdup(((gchar **) servers->data)[6]);
+        gtk_clist_append(GTK_CLIST(server_clist), row);
+        for (i = 0; i < 4; i++)
+            g_free(row[i]);
+        g_strfreev(servers->data);
+        servers = g_list_next(servers);
+    }
+    g_list_free(servers);
+    gtk_clist_columns_autosize(GTK_CLIST(server_clist));
+    gtk_widget_show_all(server_dialog);
+}
+
+static gboolean
+cddb_update_log_window(gpointer data)
+{
+    if (!debug_window) {
+        cddb_timeout_id = 0;
+        return FALSE;
+    }
+
+    G_LOCK(list);
+    if (temp_messages != NULL) {
+        GList *temp;
+        GDK_THREADS_ENTER();
+        gtk_clist_freeze(GTK_CLIST(debug_clist));
+        for (temp = temp_messages; temp; temp = temp->next) {
+            gchar *text = temp->data;
+            gtk_clist_append(GTK_CLIST(debug_clist), &text);
+            g_free(text);
+        }
+        gtk_clist_columns_autosize(GTK_CLIST(debug_clist));
+        gtk_clist_thaw(GTK_CLIST(debug_clist));
+        gtk_clist_moveto(GTK_CLIST(debug_clist),
+                         GTK_CLIST(debug_clist)->rows - 1, -1, 0.5, 0);
+        GDK_THREADS_LEAVE();
+        g_list_free(temp_messages);
+        temp_messages = NULL;
+    }
+    G_UNLOCK(list);
+    return TRUE;
+}
+
+
+void
+cdda_cddb_show_network_window(GtkWidget * w, gpointer data)
+{
+    GtkWidget *vbox, *bbox, *close, *scroll_win;
+    GList *temp;
+
+    if (debug_window)
+        return;
+
+    debug_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    g_signal_connect(G_OBJECT(debug_window), "destroy",
+                     G_CALLBACK(gtk_widget_destroyed), &debug_window);
+    gtk_window_set_title(GTK_WINDOW(debug_window), "CDDB networkdebug");
+    gtk_window_set_resizable(GTK_WINDOW(debug_window), TRUE);
+    gtk_window_set_default_size(GTK_WINDOW(debug_window), 400, 150);
+    gtk_container_border_width(GTK_CONTAINER(debug_window), 10);
+
+    vbox = gtk_vbox_new(FALSE, 10);
+    gtk_container_add(GTK_CONTAINER(debug_window), vbox);
+
+    scroll_win = gtk_scrolled_window_new(NULL, NULL);
+    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
+                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+    debug_clist = gtk_clist_new(1);
+    gtk_container_add(GTK_CONTAINER(scroll_win), debug_clist);
+    gtk_box_pack_start(GTK_BOX(vbox), scroll_win, TRUE, TRUE, 0);
+
+    temp = debug_messages;
+    while (temp) {
+        gtk_clist_prepend(GTK_CLIST(debug_clist), (gchar **) & temp->data);
+        temp = g_list_next(temp);
+    }
+
+    bbox = gtk_hbutton_box_new();
+    gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_SPREAD);
+    gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
+    gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
+
+    close = gtk_button_new_with_label("Close");
+    g_signal_connect_swapped(G_OBJECT(close), "clicked",
+                             G_CALLBACK(gtk_widget_destroy),
+                             GTK_OBJECT(debug_window));
+    GTK_WIDGET_SET_FLAGS(close, GTK_CAN_DEFAULT);
+    gtk_box_pack_start(GTK_BOX(bbox), close, TRUE, TRUE, 0);
+    gtk_widget_grab_default(close);
+
+    gtk_clist_columns_autosize(GTK_CLIST(debug_clist));
+    gtk_clist_set_button_actions(GTK_CLIST(debug_clist), 0,
+                                 GTK_BUTTON_IGNORED);
+    gtk_clist_moveto(GTK_CLIST(debug_clist),
+                     GTK_CLIST(debug_clist)->rows - 1, -1, 0, 0);
+
+    cddb_timeout_id = gtk_timeout_add(500, cddb_update_log_window, NULL);
+    gtk_widget_show_all(debug_window);
+}
+
+void
+cddb_quit(void)
+{
+    if (cddb_timeout_id)
+        gtk_timeout_remove(cddb_timeout_id);
+    cddb_timeout_id = 0;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cddb.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cddb.h	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cddb.h	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,35 @@
+/*
+ *  cddb.h  Copyright 1999 Håvard Kvålen <havardk at sol.no>
+ *
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef CDDB_H
+#define CDDB_H
+
+#include <glib.h>
+
+typedef struct {
+    gchar *category;
+    guint32 discid;
+} cddb_disc_header_t;
+
+#define CDDB_MAX_PROTOCOL_LEVEL 3
+#define CDDB_HOSTNAME_LEN 100
+#define CDDB_LOG_MAX 100
+
+#endif

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdinfo.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdinfo.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdinfo.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,270 @@
+/*
+ *  cdinfo.c   Copyright 1999 Espen Skoglund <esk at ira.uka.de>
+ *             Copyright 1999 Håvard Kvålen <havardk at sol.no>
+ *
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+
+#include "cdinfo.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib/gprintf.h>
+
+#include <libbeep/rcfile.h>
+
+#include "cdaudio.h"
+
+
+/*
+ * Function cdda_cdinfo_flush (cdinfo)
+ *
+ *    Free all information stored about the CD.
+ *
+ */
+void
+cdda_cdinfo_flush(cdinfo_t * cdinfo)
+{
+    trackinfo_t *t;
+    gint i;
+
+    if (cdinfo->albname)
+        g_free(cdinfo->albname);
+    if (cdinfo->artname)
+        g_free(cdinfo->artname);
+
+    cdinfo->albname = cdinfo->artname = NULL;
+
+    for (t = cdinfo->tracks, i = 0; i < 100; i++, t++) {
+        if (t->artist)
+            g_free(t->artist);
+        if (t->title)
+            g_free(t->title);
+
+        t->artist = t->title = NULL;
+        t->num = -1;
+    }
+    cdinfo->is_valid = FALSE;
+}
+
+
+/*
+ * Function cdda_cdinfo_delete (cdinfo)
+ *
+ *    Free the indicated `cdinfo' structure.
+ *
+ */
+void
+cdda_cdinfo_delete(cdinfo_t * cdinfo)
+{
+    cdda_cdinfo_flush(cdinfo);
+    g_free(cdinfo);
+}
+
+
+/*
+ * Function cdda_cdinfo_new ()
+ *
+ *    Allocate a new `cdinfo' structure and return it.
+ *
+ */
+cdinfo_t *
+cdda_cdinfo_new(void)
+{
+    cdinfo_t *ret;
+    ret = g_malloc0(sizeof(cdinfo_t));
+    cdda_cdinfo_flush(ret);
+
+    return ret;
+}
+
+
+/*
+ * Function cdda_cdinfo_track_set (cdinfo, num, artist, title)
+ *
+ *    Set `artist', and `title' for a track `num'.  If the CD is a
+ *    singleartist disc, the `artist' on each track should be set to
+ *    NULL.
+ *
+ */
+void
+cdda_cdinfo_track_set(cdinfo_t * cdinfo, gint num, gchar * artist,
+                      gchar * title)
+{
+    trackinfo_t *track = cdinfo->tracks + num;
+
+    /* Check bounds */
+    if (num < 1 || num >= 100)
+        return;
+
+    track->artist = artist;
+    track->title = title;
+    track->num = num;
+    cdinfo->is_valid = TRUE;
+}
+
+
+/*
+ * Function cdda_cdinfo_cd_set (cdinfo, cdname, cdartist)
+ *
+ *    Set name and artist for a cd.  If CD is a multiartist disc, the
+ *    `artist' should be set to NULL.
+ *
+ */
+void
+cdda_cdinfo_cd_set(cdinfo_t * cdinfo, gchar * cdname, gchar * cdartist)
+{
+    cdinfo->albname = cdname;
+    cdinfo->artname = cdartist;
+    cdinfo->is_valid = TRUE;
+}
+
+
+/*
+ * Function cdda_cdinfo_get (cdinfo, num, artist, album, title)
+ *
+ *    Get artist, album, and title of the indicated track (i.e. store
+ *    them in the specified pointers).  Return 0 upon success, or -1
+ *    of track did not exist.  The returned name must be subsequently
+ *    freed using g_free().
+ *
+ */
+gint
+cdda_cdinfo_get(cdinfo_t * cdinfo, gint num, gchar ** artist,
+                gchar ** album, gchar ** title)
+{
+    trackinfo_t *track = cdinfo->tracks + num;
+
+    /* Check validity */
+    if (!cdinfo->is_valid || num < 1 || num >= 100)
+        return -1;
+
+    *artist = track->artist ? track->artist :
+        cdinfo->artname ? cdinfo->artname : _("(unknown)");
+    *album = cdinfo->albname ? cdinfo->albname : _("(unknown)");
+    *title = track->title ? track->title : _("(unknown)");
+
+    return track->num == -1 ? -1 : 0;
+}
+
+
+/*
+ * Function cdda_cdinfo_write_file
+ *
+ * Writes the cdinfo_t structure to disk.
+ */
+
+
+void
+cdda_cdinfo_write_file(guint32 cddb_discid, cdinfo_t * cdinfo)
+{
+    /*
+     * We currently identify cdinfo on disk with the CDDB-discid.
+     * Maybe it would be smarter to use the cdindex id instead?
+     */
+
+    gchar *filename;
+    RcFile *rcfile;
+    gchar sectionname[10], trackstr[16];
+    gint i, numtracks = cddb_discid & 0xff;
+
+    sprintf(sectionname, "%08x", cddb_discid);
+
+    filename =
+        g_strconcat(g_get_home_dir(), "/", BMP_RCPATH, "/cdinfo", NULL);
+    if ((rcfile = bmp_rcfile_open(filename)) == NULL)
+        rcfile = bmp_rcfile_new();
+
+    if (cdinfo->albname)
+        bmp_rcfile_write_string(rcfile, sectionname, "Albumname",
+                                cdinfo->albname);
+    else
+        bmp_rcfile_write_string(rcfile, sectionname, "Albumname", "");
+    if (cdinfo->artname)
+        bmp_rcfile_write_string(rcfile, sectionname, "Artistname",
+                                cdinfo->artname);
+    for (i = 1; i <= numtracks; i++) {
+        if (cdinfo->tracks[i].artist) {
+            sprintf(trackstr, "track_artist%d", i);
+            bmp_rcfile_write_string(rcfile, sectionname, trackstr,
+                                    cdinfo->tracks[i].artist);
+        }
+        if (cdinfo->tracks[i].title) {
+            sprintf(trackstr, "track_title%d", i);
+            bmp_rcfile_write_string(rcfile, sectionname, trackstr,
+                                    cdinfo->tracks[i].title);
+        }
+    }
+    if (!bmp_rcfile_write(rcfile, filename))
+        /*FIXME */ ;
+    bmp_rcfile_free(rcfile);
+    g_free(filename);
+}
+
+/*
+ * Function cdda_cdinfo_read_file
+ *
+ * Tries to find and read a album from the disk-cache.
+ *
+ * Returns true if the album is found.
+ */
+
+gboolean
+cdda_cdinfo_read_file(guint32 cddb_discid, cdinfo_t * cdinfo)
+{
+    gchar *filename;
+    RcFile *rcfile;
+    gchar sectionname[10], trackstr[16];
+    gint i, numtracks = cddb_discid & 0xff;
+    gboolean track_found;
+
+    sprintf(sectionname, "%08x", cddb_discid);
+
+//      filename = g_strconcat(g_get_home_dir(), "/.beep/cdinfo", NULL);
+
+    filename =
+        g_strconcat(g_get_home_dir(), "/", BMP_RCPATH, "/cdinfo", NULL);
+    if ((rcfile = bmp_rcfile_open(filename)) == NULL) {
+        g_free(filename);
+        return FALSE;
+    }
+    g_free(filename);
+
+    if (!bmp_rcfile_read_string
+        (rcfile, sectionname, "Albumname", &cdinfo->albname))
+        return FALSE;
+
+    bmp_rcfile_read_string(rcfile, sectionname, "Artistname",
+                           &cdinfo->artname);
+
+    for (i = 1; i <= numtracks; i++) {
+        track_found = FALSE;
+        sprintf(trackstr, "track_artist%d", i);
+        if (bmp_rcfile_read_string
+            (rcfile, sectionname, trackstr, &cdinfo->tracks[i].artist))
+            track_found = TRUE;
+        sprintf(trackstr, "track_title%d", i);
+        if (bmp_rcfile_read_string
+            (rcfile, sectionname, trackstr, &cdinfo->tracks[i].title))
+            track_found = TRUE;
+        if (track_found)
+            cdinfo->tracks[i].num = i;
+    }
+    cdinfo->is_valid = TRUE;
+    bmp_rcfile_free(rcfile);
+    return TRUE;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdinfo.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdinfo.h	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/cdinfo.h	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,55 @@
+/*
+ *  cdinfo.h   Copyright 1999 Espen Skoglund <esk at ira.uka.de>
+ *             Copyright 1999 Håvard Kvålen <havardk at sol.no>
+ *
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#ifndef CDINFO_H
+#define CDINFO_H
+
+#include <glib.h>
+
+/*
+ * For holding info on a single CD track.
+ */
+typedef struct {
+    gchar *artist;
+    gchar *title;
+    gint num;
+} trackinfo_t;
+
+/*
+ * For holding info on a complete CD.
+ */
+typedef struct {
+    gboolean is_valid;
+    gchar *albname;
+    gchar *artname;
+    trackinfo_t tracks[100];
+} cdinfo_t;
+
+void cdda_cdinfo_flush(cdinfo_t * cdinfo);
+cdinfo_t *cdda_cdinfo_new(void);
+void cdda_cdinfo_delete(cdinfo_t * info);
+void cdda_cdinfo_track_set(cdinfo_t * cdinfo, gint, gchar *, gchar *);
+void cdda_cdinfo_cd_set(cdinfo_t * cdinfo, gchar *, gchar *);
+gint cdda_cdinfo_get(cdinfo_t * cdinfo, gint num, gchar **, gchar **,
+                     gchar **);
+gboolean cdda_cdinfo_read_file(guint32 cddb_discid, cdinfo_t * cdinfo);
+void cdda_cdinfo_write_file(guint32 cddb_discid, cdinfo_t * cdinfo);
+
+
+#endif

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/configure.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/configure.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/configure.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,705 @@
+/*  BMP - Cross-platform multimedia player
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "cdaudio.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib/gprintf.h>
+#include <string.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/stat.h>
+
+#include <libbeep/configdb.h>
+#include <libbeep/titlestring.h>
+
+
+#define GET_TB(b) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b))
+#define SET_TB(b) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b), TRUE)
+
+struct driveconfig {
+    GtkWidget *device, *directory;
+    GtkWidget *mixer_oss, *mixer_drive;
+    GtkWidget *remove_button;
+    GtkWidget *dae;
+};
+
+static GList *drives;
+
+static GtkWidget *cdda_configure_win;
+static GtkWidget *cdi_name, *cdi_name_override;
+static GtkWidget *cdi_use_cddb, *cdi_cddb_server, *cdi_use_cdin,
+    *cdi_cdin_server;
+
+void cdda_cddb_show_server_dialog(GtkWidget * w, gpointer data);
+void cdda_cddb_show_network_window(GtkWidget * w, gpointer data);
+void cdda_cddb_set_server(const char *new_server);
+
+static GtkWidget *configurewin_add_drive(struct driveinfo *drive,
+                                         gpointer nb);
+
+static void
+cdda_configurewin_ok_cb(GtkWidget * w, gpointer data)
+{
+    ConfigDb *db;
+    struct driveinfo *drive;
+    GList *node;
+    gint olddrives, ndrives, i;
+
+    olddrives = g_list_length(cdda_cfg.drives);
+    for (node = cdda_cfg.drives; node; node = node->next) {
+        drive = node->data;
+        g_free(drive->device);
+        g_free(drive->directory);
+        g_free(drive);
+    }
+    g_list_free(cdda_cfg.drives);
+    cdda_cfg.drives = NULL;
+
+    for (node = drives; node; node = node->next) {
+        struct driveconfig *config = node->data;
+        const gchar *tmp;
+
+        drive = g_new0(struct driveinfo, 1);
+        drive->device =
+            g_strdup(gtk_entry_get_text(GTK_ENTRY(config->device)));
+
+        tmp = gtk_entry_get_text(GTK_ENTRY(config->directory));
+//              if (strlen(tmp) < 2 || tmp[strlen(tmp) - 1] == '/')
+        drive->directory = g_strdup(tmp);
+//              else
+//                      drive->directory = g_strconcat(tmp, "/", NULL);
+
+//              drive->directory = "CD_AUDIO";
+
+        if (GET_TB(config->mixer_oss))
+            drive->mixer = CDDA_MIXER_OSS;
+        else if (GET_TB(config->mixer_drive))
+            drive->mixer = CDDA_MIXER_DRIVE;
+        else
+            drive->mixer = CDDA_MIXER_NONE;
+        if (GET_TB(config->dae))
+            drive->dae = CDDA_READ_DAE;
+        else
+            drive->dae = CDDA_READ_ANALOG;
+
+        cdda_cfg.drives = g_list_append(cdda_cfg.drives, drive);
+    }
+
+    cdda_cfg.title_override = GET_TB(cdi_name_override);
+    g_free(cdda_cfg.name_format);
+    cdda_cfg.name_format = g_strdup(gtk_entry_get_text(GTK_ENTRY(cdi_name)));
+
+    cdda_cfg.use_cddb = GET_TB(cdi_use_cddb);
+    cdda_cddb_set_server(gtk_entry_get_text(GTK_ENTRY(cdi_cddb_server)));
+
+    cdda_cfg.use_cdin = GET_TB(cdi_use_cdin);
+    if (strcmp
+        (cdda_cfg.cdin_server,
+         gtk_entry_get_text(GTK_ENTRY(cdi_cdin_server)))) {
+        g_free(cdda_cfg.cdin_server);
+        cdda_cfg.cdin_server =
+            g_strdup(gtk_entry_get_text(GTK_ENTRY(cdi_cdin_server)));
+    }
+
+    db = bmp_cfg_db_open();
+
+    drive = cdda_cfg.drives->data;
+    bmp_cfg_db_set_string(db, "CDDA", "device", drive->device);
+    bmp_cfg_db_set_string(db, "CDDA", "directory", drive->directory);
+//      bmp_cfg_db_set_string(db, "CDDA", "directory", "CD_AUDIO");
+    bmp_cfg_db_set_int(db, "CDDA", "mixer", drive->mixer);
+    bmp_cfg_db_set_int(db, "CDDA", "readmode", drive->dae);
+
+/*  	bmp_cfg_db_set_bool(db, "CDDA", "use_oss_mixer", cdda_cfg.use_oss_mixer); */
+
+    for (node = cdda_cfg.drives->next, i = 1; node; node = node->next, i++) {
+        char label[20];
+        drive = node->data;
+
+        sprintf(label, "device%d", i);
+        bmp_cfg_db_set_string(db, "CDDA", label, drive->device);
+
+        sprintf(label, "directory%d", i);
+//              bmp_cfg_db_set_string(db, "CDDA", label, "CD_AUDIO");
+        bmp_cfg_db_set_string(db, "CDDA", label, drive->directory);
+
+        sprintf(label, "mixer%d", i);
+        bmp_cfg_db_set_int(db, "CDDA", label, drive->mixer);
+
+        sprintf(label, "readmode%d", i);
+        bmp_cfg_db_set_int(db, "CDDA", label, drive->dae);
+    }
+
+    ndrives = g_list_length(cdda_cfg.drives);
+
+    for (i = ndrives; i < olddrives; i++)
+        /* FIXME: Clear old entries */ ;
+
+    bmp_cfg_db_set_int(db, "CDDA", "num_drives", ndrives);
+
+    bmp_cfg_db_set_bool(db, "CDDA", "title_override",
+                        cdda_cfg.title_override);
+    bmp_cfg_db_set_string(db, "CDDA", "name_format", cdda_cfg.name_format);
+    bmp_cfg_db_set_bool(db, "CDDA", "use_cddb", cdda_cfg.use_cddb);
+    bmp_cfg_db_set_string(db, "CDDA", "cddb_server", cdda_cfg.cddb_server);
+    bmp_cfg_db_set_int(db, "CDDA", "cddb_protocol_level",
+                       cdda_cfg.cddb_protocol_level);
+    bmp_cfg_db_set_bool(db, "CDDA", "use_cdin", cdda_cfg.use_cdin);
+    bmp_cfg_db_set_string(db, "CDDA", "cdin_server", cdda_cfg.cdin_server);
+    bmp_cfg_db_close(db);
+}
+
+static void
+configurewin_close(GtkButton * w, gpointer data)
+{
+    GList *node;
+
+    for (node = drives; node; node = node->next)
+        g_free(node->data);
+    g_list_free(drives);
+    drives = NULL;
+
+    gtk_widget_destroy(cdda_configure_win);
+}
+
+static void
+toggle_set_sensitive_cb(GtkToggleButton * w, gpointer data)
+{
+    gboolean set = gtk_toggle_button_get_active(w);
+    gtk_widget_set_sensitive(GTK_WIDGET(data), set);
+}
+
+static void
+configurewin_add_page(GtkButton * w, gpointer data)
+{
+    GtkNotebook *nb = GTK_NOTEBOOK(data);
+    GtkWidget *box = configurewin_add_drive(NULL, nb);
+    gchar *label = g_strdup_printf(_("Drive %d"), g_list_length(drives));
+
+    gtk_widget_show_all(box);
+    gtk_notebook_append_page(GTK_NOTEBOOK(nb), box, gtk_label_new(label));
+    g_free(label);
+}
+
+static void
+redo_nb_labels(GtkNotebook * nb)
+{
+    gint i;
+    GtkWidget *child;
+
+    for (i = 0; (child = gtk_notebook_get_nth_page(nb, i)) != NULL; i++) {
+        gchar *label = g_strdup_printf(_("Drive %d"), i + 1);
+
+        gtk_notebook_set_tab_label_text(nb, child, label);
+        g_free(label);
+    }
+}
+
+
+static void
+configurewin_remove_page(GtkButton * w, gpointer data)
+{
+    GList *node;
+    GtkNotebook *nb = GTK_NOTEBOOK(data);
+    gtk_notebook_remove_page(nb, gtk_notebook_get_current_page(nb));
+    for (node = drives; node; node = node->next) {
+        struct driveconfig *drive = node->data;
+
+        if (GTK_WIDGET(w) == drive->remove_button) {
+            if (node->next)
+                redo_nb_labels(nb);
+            drives = g_list_remove(drives, drive);
+            g_free(drive);
+            break;
+        }
+    }
+    if (g_list_length(drives) == 1) {
+        struct driveconfig *drive = drives->data;
+        gtk_widget_set_sensitive(drive->remove_button, FALSE);
+    }
+}
+
+
+static void
+configurewin_check_drive(GtkButton * w, gpointer data)
+{
+    struct driveconfig *drive = data;
+    GtkWidget *window, *vbox, *label, *bbox, *closeb;
+    const gchar *device, *directory;
+    gint fd, dae_track = -1;
+    GString *str = g_string_new("");
+    struct stat stbuf;
+
+    device = gtk_entry_get_text(GTK_ENTRY(drive->device));
+    directory = gtk_entry_get_text(GTK_ENTRY(drive->directory));
+
+    if ((fd = open(device, CDOPENFLAGS) < 0))
+        g_string_sprintfa(str, _("Failed to open device %s\n"
+                                 "Error: %s\n\n"), device, strerror(errno));
+    else {
+        cdda_disc_toc_t toc;
+        close(fd);
+        if (!cdda_get_toc(&toc, device))
+            g_string_append(str,
+                            _("Failed to read \"Table of Contents\""
+                              "\nMaybe no disc in the drive?\n\n"));
+        else {
+            gint i, data = 0;
+            g_string_sprintfa(str, _("Device %s OK.\n"
+                                     "Disc has %d tracks"), device,
+                              toc.last_track - toc.first_track + 1);
+            for (i = toc.first_track; i <= toc.last_track; i++)
+                if (toc.track[i].flags.data_track)
+                    data++;
+                else if (dae_track < 0)
+                    dae_track = i;
+            if (data > 0)
+                g_string_sprintfa(str, _(" (%d data tracks)"), data);
+            g_string_sprintfa(str, _("\nTotal length: %d:%d\n"),
+                              toc.leadout.minute, toc.leadout.second);
+#ifdef CDDA_HAS_READAUDIO
+            if (dae_track == -1)
+                g_string_sprintfa(str,
+                                  _("Digital audio extraction "
+                                    "not tested as the disc has "
+                                    "no audio tracks\n"));
+            else {
+                gint fd = open(device, CDOPENFLAGS);
+                gint start, end, fr;
+                gchar buffer[CD_FRAMESIZE_RAW];
+                start = LBA(toc.track[dae_track]);
+
+                if (dae_track == toc.last_track)
+                    end = LBA(toc.leadout);
+                else
+                    end = LBA(toc.track[dae_track + 1]);
+                fr = read_audio_data(fd, start + (end - start) / 2,
+                                     1, buffer);
+                if (fr > 0)
+                    g_string_sprintfa(str,
+                                      _("Digital audio extraction "
+                                        "test: OK\n\n"));
+                else
+                    g_string_sprintfa(str,
+                                      _("Digital audio extraction "
+                                        "test failed: %s\n\n"),
+                                      strerror(-fr));
+            }
+#else
+            g_string_sprintfa(str, "\n");
+#endif
+        }
+    }
+    if (stat(directory, &stbuf) < 0) {
+        g_string_sprintfa(str, _("Failed to check directory %s\n"
+                                 "Error: %s"), directory, strerror(errno));
+    }
+    else {
+        if (!S_ISDIR(stbuf.st_mode))
+            g_string_sprintfa(str,
+                              _("Error: %s exist, but is not a directory"),
+                              directory);
+        else
+            g_string_sprintfa(str, _("Directory %s OK."), directory);
+    }
+
+
+    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_transient_for(GTK_WINDOW(window),
+                                 GTK_WINDOW(cdda_configure_win));
+    gtk_container_set_border_width(GTK_CONTAINER(window), 10);
+    vbox = gtk_vbox_new(FALSE, 10);
+    gtk_container_add(GTK_CONTAINER(window), vbox);
+    label = gtk_label_new(str->str);
+    gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
+    gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
+
+    bbox = gtk_hbutton_box_new();
+    gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_SPREAD);
+    gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
+    gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
+
+    closeb = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
+    GTK_WIDGET_SET_FLAGS(closeb, GTK_CAN_DEFAULT);
+    g_signal_connect_swapped(G_OBJECT(closeb), "clicked",
+                             G_CALLBACK(gtk_widget_destroy),
+                             GTK_OBJECT(window));
+    gtk_box_pack_start(GTK_BOX(bbox), closeb, TRUE, TRUE, 0);
+    gtk_widget_grab_default(closeb);
+
+    g_string_free(str, TRUE);
+
+    gtk_widget_show_all(window);
+}
+
+static GtkWidget *
+configurewin_add_drive(struct driveinfo *drive, gpointer nb)
+{
+    GtkWidget *vbox, *bbox, *dev_frame, *dev_table, *dev_label;
+    GtkWidget *dev_dir_label, *check_btn;
+    GtkWidget *volume_frame, *volume_box, *volume_none;
+    GtkWidget *readmode_frame, *readmode_box, *readmode_analog;
+    struct driveconfig *d = g_new0(struct driveconfig, 1);
+
+    vbox = gtk_vbox_new(FALSE, 5);
+    gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
+
+    dev_frame = gtk_frame_new(_("Device:"));
+    gtk_box_pack_start(GTK_BOX(vbox), dev_frame, FALSE, FALSE, 0);
+    dev_table = gtk_table_new(2, 2, FALSE);
+    gtk_container_set_border_width(GTK_CONTAINER(dev_table), 5);
+    gtk_container_add(GTK_CONTAINER(dev_frame), dev_table);
+    gtk_table_set_row_spacings(GTK_TABLE(dev_table), 5);
+    gtk_table_set_col_spacings(GTK_TABLE(dev_table), 5);
+
+    dev_label = gtk_label_new_with_mnemonic(_("_Device:"));
+    gtk_misc_set_alignment(GTK_MISC(dev_label), 1.0, 0.5);
+    gtk_table_attach(GTK_TABLE(dev_table), dev_label, 0, 1, 0, 1,
+                     GTK_FILL, 0, 0, 0);
+
+    d->device = gtk_entry_new();
+    gtk_label_set_mnemonic_widget(GTK_LABEL(dev_label), d->device);
+    gtk_table_attach(GTK_TABLE(dev_table), d->device, 1, 2, 0, 1,
+                     GTK_FILL | GTK_EXPAND, 0, 0, 0);
+
+    dev_dir_label = gtk_label_new_with_mnemonic(_("Dir_ectory:"));
+    gtk_misc_set_alignment(GTK_MISC(dev_dir_label), 1.0, 0.5);
+    gtk_table_attach(GTK_TABLE(dev_table), dev_dir_label, 0, 1, 1, 2,
+                     GTK_FILL, 0, 0, 0);
+
+
+    d->directory = gtk_entry_new();
+    gtk_label_set_mnemonic_widget(GTK_LABEL(dev_dir_label), d->directory);
+    gtk_table_attach(GTK_TABLE(dev_table), d->directory, 1, 2, 1, 2,
+                     GTK_FILL | GTK_EXPAND, 0, 0, 0);
+
+
+    readmode_frame = gtk_frame_new(_("Play mode:"));
+    gtk_box_pack_start(GTK_BOX(vbox), readmode_frame, FALSE, FALSE, 0);
+
+    readmode_box = gtk_vbox_new(5, FALSE);
+    gtk_container_add(GTK_CONTAINER(readmode_frame), readmode_box);
+
+    readmode_analog = gtk_radio_button_new_with_label(NULL, _("Analog"));
+    gtk_box_pack_start(GTK_BOX(readmode_box), readmode_analog, FALSE,
+                       FALSE, 0);
+
+    d->dae =
+        gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON
+                                                    (readmode_analog),
+                                                    _
+                                                    ("Digital audio extraction"));
+    gtk_box_pack_start(GTK_BOX(readmode_box), d->dae, FALSE, FALSE, 0);
+#ifndef CDDA_HAS_READAUDIO
+    gtk_widget_set_sensitive(readmode_frame, FALSE);
+#endif
+
+    /*
+     * Volume config
+     */
+
+    volume_frame = gtk_frame_new(_("Volume control:"));
+    gtk_box_pack_start(GTK_BOX(vbox), volume_frame, FALSE, FALSE, 0);
+
+    volume_box = gtk_vbox_new(5, FALSE);
+    gtk_container_add(GTK_CONTAINER(volume_frame), volume_box);
+
+    volume_none = gtk_radio_button_new_with_label(NULL, _("No mixer"));
+    gtk_box_pack_start(GTK_BOX(volume_box), volume_none, FALSE, FALSE, 0);
+
+    d->mixer_drive =
+        gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON
+                                                    (volume_none),
+                                                    _("CDROM drive"));
+    gtk_box_pack_start(GTK_BOX(volume_box), d->mixer_drive, FALSE, FALSE, 0);
+
+    d->mixer_oss =
+        gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON
+                                                    (volume_none),
+                                                    _("OSS mixer"));
+    gtk_box_pack_start(GTK_BOX(volume_box), d->mixer_oss, FALSE, FALSE, 0);
+
+    g_signal_connect(G_OBJECT(readmode_analog), "toggled",
+                     G_CALLBACK(toggle_set_sensitive_cb), volume_frame);
+#ifndef HAVE_OSS
+    gtk_widget_set_sensitive(d->mixer_oss, FALSE);
+#endif
+    if (drive) {
+        gtk_entry_set_text(GTK_ENTRY(d->device), drive->device);
+        gtk_entry_set_text(GTK_ENTRY(d->directory), drive->directory);
+        if (drive->mixer == CDDA_MIXER_DRIVE)
+            SET_TB(d->mixer_drive);
+        else if (drive->mixer == CDDA_MIXER_OSS)
+            SET_TB(d->mixer_oss);
+        if (drive->dae == CDDA_READ_DAE)
+            SET_TB(d->dae);
+    }
+
+    bbox = gtk_hbutton_box_new();
+    gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
+    gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_SPREAD);
+
+    check_btn = gtk_button_new_with_label(_("Check drive..."));
+    GTK_WIDGET_SET_FLAGS(check_btn, GTK_CAN_DEFAULT);
+    gtk_box_pack_start_defaults(GTK_BOX(bbox), check_btn);
+    g_signal_connect(G_OBJECT(check_btn), "clicked",
+                     G_CALLBACK(configurewin_check_drive), d);
+
+    d->remove_button = gtk_button_new_with_label(_("Remove drive"));
+    GTK_WIDGET_SET_FLAGS(d->remove_button, GTK_CAN_DEFAULT);
+    gtk_box_pack_start_defaults(GTK_BOX(bbox), d->remove_button);
+    g_signal_connect(G_OBJECT(d->remove_button), "clicked",
+                     G_CALLBACK(configurewin_remove_page), nb);
+
+
+    if (drives == NULL)
+        gtk_widget_set_sensitive(d->remove_button, FALSE);
+    else {
+        struct driveconfig *tmp = drives->data;
+        gtk_widget_set_sensitive(tmp->remove_button, TRUE);
+    }
+
+    drives = g_list_append(drives, d);
+
+    return vbox;
+}
+
+void
+cdda_configure(void)
+{
+    GtkWidget *vbox, *notebook;
+    GtkWidget *dev_vbox, *dev_notebook, *add_drive, *add_bbox;
+    GtkWidget *cdi_vbox;
+    GtkWidget *cdi_cddb_frame, *cdi_cddb_vbox, *cdi_cddb_hbox;
+    GtkWidget *cdi_cddb_server_hbox, *cdi_cddb_server_label;
+    GtkWidget *cdi_cddb_server_list, *cdi_cddb_debug_win;
+    GtkWidget *cdi_cdin_frame, *cdi_cdin_vbox;
+    GtkWidget *cdi_cdin_server_hbox, *cdi_cdin_server_label;
+    GtkWidget *cdi_name_frame, *cdi_name_vbox, *cdi_name_hbox;
+    GtkWidget *cdi_name_label, *cdi_desc;
+    GtkWidget *cdi_name_enable_vbox;
+    GtkWidget *bbox, *ok, *cancel;
+
+    GList *node;
+    gint i = 1;
+
+    if (cdda_configure_win)
+        return;
+
+    cdda_configure_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    g_signal_connect(G_OBJECT(cdda_configure_win), "destroy",
+                     G_CALLBACK(gtk_widget_destroyed), &cdda_configure_win);
+    gtk_window_set_title(GTK_WINDOW(cdda_configure_win),
+                         _("CD Audio Player Configuration"));
+    gtk_window_set_type_hint(GTK_WINDOW(cdda_configure_win),
+                             GDK_WINDOW_TYPE_HINT_DIALOG);
+    gtk_window_set_resizable(GTK_WINDOW(cdda_configure_win), FALSE);
+    gtk_window_set_position(GTK_WINDOW(cdda_configure_win),
+                            GTK_WIN_POS_MOUSE);
+    gtk_container_border_width(GTK_CONTAINER(cdda_configure_win), 10);
+
+    vbox = gtk_vbox_new(FALSE, 10);
+    gtk_container_add(GTK_CONTAINER(cdda_configure_win), vbox);
+
+    notebook = gtk_notebook_new();
+    gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
+
+    /*
+     * Device config
+     */
+    dev_vbox = gtk_vbox_new(FALSE, 5);
+    gtk_container_set_border_width(GTK_CONTAINER(dev_vbox), 5);
+
+    dev_notebook = gtk_notebook_new();
+    gtk_notebook_set_scrollable(GTK_NOTEBOOK(dev_notebook), TRUE);
+    gtk_box_pack_start(GTK_BOX(dev_vbox), dev_notebook, FALSE, FALSE, 0);
+
+    for (node = cdda_cfg.drives; node; node = node->next) {
+        struct driveinfo *drive = node->data;
+        gchar *label = g_strdup_printf(_("Drive %d"), i++);
+        GtkWidget *w;
+
+        w = configurewin_add_drive(drive, dev_notebook);
+        gtk_notebook_append_page(GTK_NOTEBOOK(dev_notebook), w,
+                                 gtk_label_new(label));
+        g_free(label);
+
+    }
+
+    add_bbox = gtk_hbutton_box_new();
+    gtk_box_pack_start(GTK_BOX(dev_vbox), add_bbox, FALSE, FALSE, 0);
+    add_drive = gtk_button_new_with_label(_("Add drive"));
+    g_signal_connect(G_OBJECT(add_drive), "clicked",
+                     G_CALLBACK(configurewin_add_page), dev_notebook);
+    GTK_WIDGET_SET_FLAGS(add_drive, GTK_CAN_DEFAULT);
+    gtk_box_pack_start(GTK_BOX(add_bbox), add_drive, FALSE, FALSE, 0);
+
+
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), dev_vbox,
+                             gtk_label_new(_("Device")));
+
+    /*
+     * CD Info config
+     */
+    cdi_vbox = gtk_vbox_new(FALSE, 5);
+    gtk_container_set_border_width(GTK_CONTAINER(cdi_vbox), 5);
+
+
+    /* CDDB */
+    cdi_cddb_frame = gtk_frame_new(_("CDDB:"));
+    gtk_box_pack_start(GTK_BOX(cdi_vbox), cdi_cddb_frame, FALSE, FALSE, 0);
+
+    cdi_cddb_vbox = gtk_vbox_new(FALSE, 10);
+    gtk_container_border_width(GTK_CONTAINER(cdi_cddb_vbox), 5);
+    gtk_container_add(GTK_CONTAINER(cdi_cddb_frame), cdi_cddb_vbox);
+
+    cdi_cddb_hbox = gtk_hbox_new(FALSE, 10);
+    gtk_container_border_width(GTK_CONTAINER(cdi_cddb_hbox), 0);
+    gtk_box_pack_start(GTK_BOX(cdi_cddb_vbox),
+                       cdi_cddb_hbox, FALSE, FALSE, 0);
+    cdi_use_cddb = gtk_check_button_new_with_label(_("Use CDDB"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cdi_use_cddb),
+                                 cdda_cfg.use_cddb);
+    gtk_box_pack_start(GTK_BOX(cdi_cddb_hbox), cdi_use_cddb, FALSE, FALSE, 0);
+    cdi_cddb_server_list = gtk_button_new_with_label(_("Get server list"));
+    gtk_box_pack_end(GTK_BOX(cdi_cddb_hbox), cdi_cddb_server_list, FALSE,
+                     FALSE, 0);
+    cdi_cddb_debug_win = gtk_button_new_with_label(_("Show network window"));
+    g_signal_connect(G_OBJECT(cdi_cddb_debug_win), "clicked",
+                     G_CALLBACK(cdda_cddb_show_network_window), NULL);
+    gtk_box_pack_end(GTK_BOX(cdi_cddb_hbox), cdi_cddb_debug_win, FALSE,
+                     FALSE, 0);
+
+    cdi_cddb_server_hbox = gtk_hbox_new(FALSE, 5);
+    gtk_box_pack_start(GTK_BOX(cdi_cddb_vbox),
+                       cdi_cddb_server_hbox, FALSE, FALSE, 0);
+
+    cdi_cddb_server_label = gtk_label_new(_("CDDB server:"));
+    gtk_box_pack_start(GTK_BOX(cdi_cddb_server_hbox),
+                       cdi_cddb_server_label, FALSE, FALSE, 0);
+
+    cdi_cddb_server = gtk_entry_new();
+    gtk_entry_set_text(GTK_ENTRY(cdi_cddb_server), cdda_cfg.cddb_server);
+    gtk_box_pack_start(GTK_BOX(cdi_cddb_server_hbox), cdi_cddb_server,
+                       TRUE, TRUE, 0);
+    g_signal_connect(G_OBJECT(cdi_cddb_server_list), "clicked",
+                     G_CALLBACK(cdda_cddb_show_server_dialog),
+                     cdi_cddb_server);
+
+    /*
+     * CDindex
+     */
+    cdi_cdin_frame = gtk_frame_new(_("CD Index:"));
+    gtk_box_pack_start(GTK_BOX(cdi_vbox), cdi_cdin_frame, FALSE, FALSE, 0);
+
+    cdi_cdin_vbox = gtk_vbox_new(FALSE, 10);
+    gtk_container_border_width(GTK_CONTAINER(cdi_cdin_vbox), 5);
+    gtk_container_add(GTK_CONTAINER(cdi_cdin_frame), cdi_cdin_vbox);
+
+    cdi_use_cdin = gtk_check_button_new_with_label(_("Use CD Index"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cdi_use_cdin),
+                                 cdda_cfg.use_cdin);
+    gtk_box_pack_start(GTK_BOX(cdi_cdin_vbox), cdi_use_cdin, FALSE, FALSE, 0);
+
+    cdi_cdin_server_hbox = gtk_hbox_new(FALSE, 5);
+    gtk_box_pack_start(GTK_BOX(cdi_cdin_vbox), cdi_cdin_server_hbox, FALSE,
+                       FALSE, 0);
+
+    cdi_cdin_server_label = gtk_label_new(_("CD Index server:"));
+    gtk_box_pack_start(GTK_BOX(cdi_cdin_server_hbox),
+                       cdi_cdin_server_label, FALSE, FALSE, 0);
+
+    cdi_cdin_server = gtk_entry_new();
+    gtk_entry_set_text(GTK_ENTRY(cdi_cdin_server), cdda_cfg.cdin_server);
+    gtk_box_pack_start(GTK_BOX(cdi_cdin_server_hbox), cdi_cdin_server,
+                       TRUE, TRUE, 0);
+#ifndef WITH_CDINDEX
+    gtk_widget_set_sensitive(cdi_cdin_frame, FALSE);
+#endif
+
+    /*
+     * Track names
+     */
+    cdi_name_frame = gtk_frame_new(_("Track names:"));
+    gtk_box_pack_start(GTK_BOX(cdi_vbox), cdi_name_frame, FALSE, FALSE, 0);
+
+    cdi_name_vbox = gtk_vbox_new(FALSE, 10);
+    gtk_container_add(GTK_CONTAINER(cdi_name_frame), cdi_name_vbox);
+    gtk_container_border_width(GTK_CONTAINER(cdi_name_vbox), 5);
+    cdi_name_override =
+        gtk_check_button_new_with_label(_("Override generic titles"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cdi_name_override),
+                                 cdda_cfg.title_override);
+    gtk_box_pack_start(GTK_BOX(cdi_name_vbox), cdi_name_override, FALSE,
+                       FALSE, 0);
+
+    cdi_name_enable_vbox = gtk_vbox_new(FALSE, 10);
+    gtk_container_add(GTK_CONTAINER(cdi_name_vbox), cdi_name_enable_vbox);
+    gtk_widget_set_sensitive(cdi_name_enable_vbox, cdda_cfg.title_override);
+    g_signal_connect(G_OBJECT(cdi_name_override), "toggled",
+                     G_CALLBACK(toggle_set_sensitive_cb),
+                     cdi_name_enable_vbox);
+
+    cdi_name_hbox = gtk_hbox_new(FALSE, 5);
+    gtk_box_pack_start(GTK_BOX(cdi_name_enable_vbox), cdi_name_hbox, FALSE,
+                       FALSE, 0);
+    cdi_name_label = gtk_label_new(_("Name format:"));
+    gtk_box_pack_start(GTK_BOX(cdi_name_hbox), cdi_name_label, FALSE,
+                       FALSE, 0);
+    cdi_name = gtk_entry_new();
+    gtk_entry_set_text(GTK_ENTRY(cdi_name), cdda_cfg.name_format);
+    gtk_box_pack_start(GTK_BOX(cdi_name_hbox), cdi_name, TRUE, TRUE, 0);
+
+    cdi_desc = xmms_titlestring_descriptions("patn", 2);
+    gtk_box_pack_start(GTK_BOX(cdi_name_enable_vbox), cdi_desc, FALSE,
+                       FALSE, 0);
+
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), cdi_vbox,
+                             gtk_label_new(_("CD Info")));
+
+    bbox = gtk_hbutton_box_new();
+    gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
+    gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
+    gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
+
+
+    cancel = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
+    g_signal_connect(G_OBJECT(cancel), "clicked",
+                     G_CALLBACK(configurewin_close), NULL);
+    GTK_WIDGET_SET_FLAGS(cancel, GTK_CAN_DEFAULT);
+    gtk_box_pack_start(GTK_BOX(bbox), cancel, TRUE, TRUE, 0);
+
+    ok = gtk_button_new_from_stock(GTK_STOCK_OK);
+    g_signal_connect(G_OBJECT(ok), "clicked",
+                     G_CALLBACK(cdda_configurewin_ok_cb), NULL);
+    g_signal_connect(G_OBJECT(ok), "clicked",
+                     G_CALLBACK(configurewin_close), NULL);
+    GTK_WIDGET_SET_FLAGS(ok, GTK_CAN_DEFAULT);
+    gtk_box_pack_start(GTK_BOX(bbox), ok, TRUE, TRUE, 0);
+    gtk_widget_grab_default(ok);
+
+
+    gtk_widget_show_all(cdda_configure_win);
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/http.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/http.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/http.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,186 @@
+/*
+ *  http.c
+ *  Some simple routines for connecting to a remote tcp socket
+ *  Copyright 1999 Håvard Kvålen <havardk at sol.no>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/* FIXME: We need to have *one* place in xmms where you configure proxies */
+
+#include "http.h"
+
+gint
+http_open_connection(const gchar * server, gint port)
+{
+    gint sock;
+    struct hostent *host;
+    struct sockaddr_in address;
+
+    sock = socket(AF_INET, SOCK_STREAM, 0);
+    address.sin_family = AF_INET;
+
+    if (!(host = gethostbyname(server)))
+        return 0;
+
+    memcpy(&address.sin_addr.s_addr, *(host->h_addr_list),
+           sizeof(address.sin_addr.s_addr));
+    address.sin_port = g_htons(port);
+
+    if (connect
+        (sock, (struct sockaddr *) &address,
+         sizeof(struct sockaddr_in)) == -1)
+        return 0;
+
+    return sock;
+}
+
+void
+http_close_connection(gint sock)
+{
+    shutdown(sock, 2);
+    close(sock);
+}
+
+gint
+http_read_line(gint sock, gchar * buf, gint size)
+{
+    gint i = 0;
+
+    while (i < size - 1) {
+        if (read(sock, buf + i, 1) <= 0) {
+            if (i == 0)
+                return -1;
+            else
+                break;
+        }
+        if (buf[i] == '\n')
+            break;
+        if (buf[i] != '\r')
+            i++;
+    }
+    buf[i] = '\0';
+    return i;
+}
+
+gint
+http_read_first_line(gint sock, gchar * buf, gint size)
+{
+    /* Skips the HTTP-header, if there is one, and reads the first line into buf.
+       Returns number of bytes read. */
+
+    gint i;
+    /* Skip the HTTP-header */
+    if ((i = http_read_line(sock, buf, size)) < 0)
+        return -1;
+    if (!strncmp(buf, "HTTP", 4)) { /* Check to make sure its not HTTP/0.9 */
+        while (http_read_line(sock, buf, size) > 0)
+            /* nothing */ ;
+        if ((i = http_read_line(sock, buf, size)) < 0)
+            return -1;
+    }
+
+    return i;
+}
+
+gchar *
+http_get(gchar * url)
+{
+    gchar *server, *getstr, *buf = NULL, *bptr;
+    gchar *gs, *gc, *turl = url;
+    gint sock, n, bsize, port = 0;
+
+    /* Skip past ``http://'' part of URL */
+    if (!strncmp(turl, "http:", 5)) {
+        turl += 5;
+        if (!strncmp(turl, "//", 2))
+            turl += 2;
+    }
+
+    /* If path starts with a '/', we are referring to localhost */
+    if (turl[0] == '/')
+        server = "localhost";
+    else
+        server = turl;
+
+    /* Check if URL contains port specification */
+    gc = strchr(turl, ':');
+    gs = strchr(turl, '/');
+
+    if (gc != NULL && gc < gs) {
+        port = atoi(gc + 1);
+        *gc = '\0';
+    }
+    if (port == 0)
+        port = 80;
+
+    /* Make sure that server string is null terminated. */
+    if (gs)
+        *gs = '\0';
+
+
+    /*
+     * Now, open connection to server.
+     */
+    sock = http_open_connection(server, port);
+
+    /* Repair the URL string that we broke earlier on */
+    if (gs)
+        *gs = '/';
+    if (gc && gc == '\0')
+        *gc = ':';
+
+    if (sock == 0)
+        return NULL;
+
+    /*
+     * Send query to socket.
+     */
+    getstr = g_strdup_printf("GET %s HTTP/1.0\r\n\r\n", gs ? gs : "/");
+/*  	getstr = g_strdup_printf("GET %s HTTP/1.0\r\n\r\n", url ? url : "/"); */
+
+    if (write(sock, getstr, strlen(getstr)) == -1) {
+        http_close_connection(sock);
+        return NULL;
+    }
+
+    /*
+     * Start receiving result.
+     */
+    bsize = 4096;
+    bptr = buf = g_malloc(bsize);
+
+    if ((n = http_read_first_line(sock, bptr, bsize)) == -1) {
+        g_free(buf);
+        buf = NULL;
+        goto Done;
+    }
+
+    bsize -= n;
+    bptr += n;
+
+    while (bsize > 0 && (n = http_read_line(sock, bptr, bsize)) != -1) {
+        bptr += n;
+        bsize -= n;
+    }
+
+  Done:
+    http_close_connection(sock);
+
+    /*
+     * Return result buffer to caller.
+     */
+    return buf;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/http.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/http.h	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/cdaudio/http.h	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,42 @@
+/*
+ *  Copyright 1999 Håvard Kvålen <havardk at sol.no>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef XMMS_HTTP_H
+#define XMMS_HTTP_H
+
+#include "config.h"
+#include <glib.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <string.h>
+#include <netdb.h>
+#include <stdlib.h>
+
+
+gint http_open_connection(const gchar * server, gint port);
+void http_close_connection(gint sock);
+gint http_read_line(gint sock, gchar * buf, gint size);
+gint http_read_first_line(gint sock, gchar * buf, gint size);
+gchar *http_get(gchar * url);
+
+#endif

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/Makefile.am
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/Makefile.am	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/Makefile.am	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,54 @@
+if ENABLE_MPG123
+
+lib_LTLIBRARIES = libmpg123.la
+
+endif
+
+libdir = $(plugindir)/$(INPUT_PLUGIN_DIR)
+
+COMMON_SRC = mpg123.c configure.c fileinfo.c common.c \
+decode_2to1.c decode_4to1.c \
+layer1.c layer2.c layer3.c \
+tabinit.c equalizer.c http.c \
+huffman.h mpg123.h l2tables.h getbits.h \
+dxhead.c dxhead.h \
+id3.c xmms-id3.h id3_frame.c id3_frame_content.c id3_frame_text.c \
+id3_frame_url.c id3_header.h id3_tag.c
+
+if ARCH_X86
+
+if USE_X86ASM
+
+if USE_SIMD
+
+EXTRA_SRC = decode_i386.c dct64_i386.c decode_i586.s \
+            decode_3dnow.s dct64_3dnow.s dct36_3dnow.s getcpuflags.s \
+            dct64_MMX.s decode_MMX.s
+
+else
+
+EXTRA_SRC = decode_i386.c dct64_i386.c decode_i586.s
+
+endif # USE_SIMD
+
+else
+
+EXTRA_SRC = decode_i386.c dct64_i386.c
+
+endif # SE_X86_ASM
+
+else
+
+EXTRA_SRC = decode.c dct64.c
+
+endif # ARCH_X86
+
+EXTRA_DIST = decode.c decode_i386.c decode_i586.s decode_3dnow.s dct64_i386.c \
+             getbits.c dct64.c dct64_3dnow.s dct36_3dnow.s getcpuflags.s \
+             dct64_MMX.s decode_MMX.s \
+             mp3.xpm
+
+libmpg123_la_SOURCES = $(COMMON_SRC) $(EXTRA_SRC)
+libmpg123_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+libmpg123_la_LIBADD = $(ID3LIBS) $(GTK_LIBS) $(top_builddir)/libbeep/libbeep.la
+INCLUDES = $(GTK_CFLAGS) $(ARCH_DEFINES) -I$(top_srcdir)/intl -I$(top_srcdir)

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/README
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/README	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/README	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,9 @@
+Note about the mpg123 license!
+
+We have permission to release mpg123 source inside xmms as GPL!
+Using mpg123 source (at least in a commercial environment) may infringe 3rd party patents.
+Also Michael Hipp (hippm at informatik.uni-tuebingen.de) would like to know if you modify
+this sourcecode. Send him an email if you do, he would like to have an eye on external developments.
+
+Happy playing!
+

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/common.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/common.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/common.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,512 @@
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "mpg123.h"
+#include "xmms-id3.h"
+#include "id3_header.h"
+
+/* max = 1728 */
+#define MAXFRAMESIZE 1792
+
+const int tabsel_123[2][3][16] = {
+    {{0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416,
+      448,},
+     {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,},
+     {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,}},
+    {{0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,},
+     {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,},
+     {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}}
+};
+
+const int mpg123_freqs[9] =
+    { 44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000 };
+
+struct bitstream_info bsi;
+
+extern gint mpg123_bitrate, mpg123_frequency, mpg123_length;
+extern gchar *mpg123_title, *mpg123_filename;
+extern gboolean mpg123_stereo;
+
+static int fsizeold = 0, ssize;
+static unsigned char bsspace[2][MAXFRAMESIZE + 512];    /* MAXFRAMESIZE */
+static unsigned char *bsbuf = bsspace[1], *bsbufold;
+static int bsnum = 0;
+
+unsigned char *mpg123_pcm_sample;
+int mpg123_pcm_point = 0;
+
+static VFSFile *filept;
+static int filept_opened;
+
+static int get_fileinfo(void);
+
+static int
+fullread(VFSFile * fd, unsigned char *buf, int count)
+{
+    int ret, cnt = 0;
+
+    while (cnt < count) {
+        if (fd)
+            ret = vfs_fread(buf + cnt, 1, count - cnt, fd);
+        else
+            ret = mpg123_http_read(buf + cnt, count - cnt);
+        if (ret < 0)
+            return ret;
+        if (ret == 0)
+            break;
+        cnt += ret;
+    }
+    return cnt;
+}
+
+static int
+stream_init(void)
+{
+    if (get_fileinfo() < 0)
+        return -1;
+    return 0;
+}
+
+void
+mpg123_stream_close(void)
+{
+    if (filept)
+        vfs_fclose(filept);
+    else if (mpg123_info->network_stream)
+        mpg123_http_close();
+}
+
+/**************************************** 
+ * HACK,HACK,HACK: step back <num> frames 
+ * can only work if the 'stream' isn't a real stream but a file
+static int stream_back_bytes(int bytes)
+{
+	if (vfs_fseek(filept, -bytes, SEEK_CUR) < 0)
+		return -1;
+	return 0;
+}
+ */
+
+static int
+stream_head_read(unsigned long *newhead)
+{
+    unsigned char hbuf[4];
+
+    if (fullread(filept, hbuf, 4) != 4)
+        return FALSE;
+
+    *newhead = ((unsigned long) hbuf[0] << 24) |
+        ((unsigned long) hbuf[1] << 16) |
+        ((unsigned long) hbuf[2] << 8) | (unsigned long) hbuf[3];
+
+    return TRUE;
+}
+
+static int
+stream_head_shift(unsigned long *head)
+{
+    unsigned char hbuf;
+
+    if (fullread(filept, &hbuf, 1) != 1)
+        return 0;
+    *head <<= 8;
+    *head |= hbuf;
+    *head &= 0xffffffff;
+    return 1;
+}
+
+static int
+stream_mpg123_read_frame_body(unsigned char *buf, int size)
+{
+    long l;
+
+    if ((l = fullread(filept, buf, size)) != size) {
+        if (l <= 0)
+            return 0;
+        memset(buf + l, 0, size - l);
+    }
+    return 1;
+}
+
+static long
+stream_tell(void)
+{
+    return vfs_ftell(filept);
+}
+
+/*
+static void stream_rewind(void)
+{
+	vfs_fseek(filept, 0, SEEK_SET);
+}
+*/
+
+int
+mpg123_stream_jump_to_frame(struct frame *fr, int frame)
+{
+    if (!filept)
+        return -1;
+    mpg123_read_frame_init();
+    vfs_fseek(filept, frame * (fr->framesize + 4), SEEK_SET);
+    mpg123_read_frame(fr);
+    return 0;
+}
+
+int
+mpg123_stream_jump_to_byte(struct frame *fr, int byte)
+{
+    if (!filept)
+        return -1;
+    vfs_fseek(filept, byte, SEEK_SET);
+    mpg123_read_frame(fr);
+    return 0;
+}
+
+int
+mpg123_stream_check_for_xing_header(struct frame *fr, xing_header_t * xhead)
+{
+    unsigned char *head_data;
+    int ret;
+
+    vfs_fseek(filept, -(fr->framesize + 4), SEEK_CUR);
+    head_data = g_malloc(fr->framesize + 4);
+    vfs_fread(head_data, 1, fr->framesize + 4, filept);
+    ret = mpg123_get_xing_header(xhead, head_data);
+    g_free(head_data);
+    return ret;
+}
+
+static int
+get_fileinfo(void)
+{
+    guchar buf[3];
+
+    if (filept == NULL)
+        return -1;
+    if (vfs_fseek(filept, 0, SEEK_END) < 0)
+        return -1;
+
+    mpg123_info->filesize = vfs_ftell(filept);
+    if (vfs_fseek(filept, -128, SEEK_END) < 0)
+        return -1;
+    if (fullread(filept, buf, 3) != 3)
+        return -1;
+    if (!strncmp((char *) buf, "TAG", 3))
+        mpg123_info->filesize -= 128;
+    if (vfs_fseek(filept, 0, SEEK_SET) < 0)
+        return -1;
+
+    if (mpg123_info->filesize <= 0)
+        return -1;
+
+    return mpg123_info->filesize;
+}
+
+void
+mpg123_read_frame_init(void)
+{
+    memset(bsspace[0], 0, MAXFRAMESIZE + 512);
+    memset(bsspace[1], 0, MAXFRAMESIZE + 512);
+    mpg123_info->output_audio = FALSE;
+}
+
+/*
+ * Function read_id3v2_tag (head)
+ *
+ *    Read ID3v2 tag from stream.  Return TRUE upon success, or FALSE if
+ *    an error occurred.
+ *
+ */
+static gboolean
+read_id3v2_tag(unsigned long head)
+{
+    guchar *id3buf;
+    int hdrsize;
+    struct id3_tag *id3d;
+    struct id3tag_t tag;
+    guchar buf[7];
+
+    buf[0] = head & 0xff;
+    /*
+     * Read ID3tag header.
+     */
+    if (fullread(filept, buf + 1, 6) != 6)
+        return FALSE;
+
+    hdrsize = ID3_GET_SIZE28(buf[3], buf[4], buf[5], buf[6]);
+
+    /*
+     * A invalid header could fool us into requesting insane
+     * amounts of memory.  Make sure the header size is
+     * reasonable.
+     */
+    if ((mpg123_info->filesize && hdrsize > mpg123_info->filesize) ||
+        (!mpg123_info->filesize && hdrsize > 1000000))
+        return FALSE;
+
+    if (mpg123_cfg.disable_id3v2) {
+        guint8 *tmp = g_malloc(hdrsize);
+        gboolean ret;
+        ret = (fullread(filept, tmp, hdrsize) == hdrsize);
+        g_free(tmp);
+        return ret;
+    }
+
+    id3buf = g_malloc(hdrsize + ID3_TAGHDR_SIZE + 3);
+    memcpy(id3buf, "ID3", 3);
+    memcpy(id3buf + 3, buf, ID3_TAGHDR_SIZE);
+
+    /*
+     * Read ID3tag body.
+     */
+    if (fullread(filept, id3buf + ID3_TAGHDR_SIZE + 3, hdrsize) != hdrsize) {
+        g_free(id3buf);
+        return FALSE;
+    }
+
+    /*
+     * Get info from tag.
+     */
+    if ((id3d = id3_open_mem(id3buf, 0)) != NULL) {
+        mpg123_get_id3v2(id3d, &tag);
+        if (!mpg123_info->first_frame) {
+            char *songname = mpg123_title;
+            mpg123_title = mpg123_format_song_title(&tag, mpg123_filename);
+            mpg123_ip.set_info(mpg123_title, mpg123_length,
+                               mpg123_bitrate * 1000,
+                               mpg123_frequency, mpg123_stereo);
+            if (songname)
+                g_free(songname);
+        }
+        else {
+            mpg123_title = mpg123_format_song_title(&tag, mpg123_filename);
+        }
+        id3_close(id3d);
+    }
+    g_free(id3buf);
+
+    return TRUE;
+}
+
+int
+mpg123_head_check(unsigned long head)
+{
+    if ((head & 0xffe00000) != 0xffe00000)
+        return FALSE;
+    if (!((head >> 17) & 3))
+        return FALSE;
+    if (((head >> 12) & 0xf) == 0xf)
+        return FALSE;
+    if (!((head >> 12) & 0xf))
+        return FALSE;
+    if (((head >> 10) & 0x3) == 0x3)
+        return FALSE;
+    if (((head >> 19) & 1) == 1 &&
+        ((head >> 17) & 3) == 3 && ((head >> 16) & 1) == 1)
+        return FALSE;
+    if ((head & 0xffff0000) == 0xfffe0000)
+        return FALSE;
+
+    return TRUE;
+}
+
+/*****************************************************************
+ * read next frame
+ */
+int
+mpg123_read_frame(struct frame *fr)
+{
+    unsigned long newhead;
+
+    fsizeold = fr->framesize;   /* for Layer3 */
+
+    if (!stream_head_read(&newhead))
+        return FALSE;
+
+    if (!mpg123_head_check(newhead) || !mpg123_decode_header(fr, newhead)) {
+        int try = 0;
+
+        do {
+            try++;
+            if ((newhead & 0xffffff00) ==
+                ('I' << 24) + ('D' << 16) + ('3' << 8)) {
+                read_id3v2_tag(newhead);
+                if (!stream_head_read(&newhead))
+                    return FALSE;
+            }
+            else if (!stream_head_shift(&newhead))
+                return 0;
+
+        }
+        while ((!mpg123_head_check(newhead) ||
+                !mpg123_decode_header(fr, newhead)) && try < (256 * 1024));
+        if (try >= (256 * 1024))
+            return FALSE;
+
+        mpg123_info->filesize -= try;
+    }
+    /* flip/init buffer for Layer 3 */
+    bsbufold = bsbuf;
+    bsbuf = bsspace[bsnum] + 512;
+    bsnum = (bsnum + 1) & 1;
+
+    if (!stream_mpg123_read_frame_body(bsbuf, fr->framesize))
+        return 0;
+
+    bsi.bitindex = 0;
+    bsi.wordpointer = (unsigned char *) bsbuf;
+
+
+    return 1;
+
+}
+
+/*
+ * the code a header and write the information
+ * into the frame structure
+ */
+int
+mpg123_decode_header(struct frame *fr, unsigned long newhead)
+{
+    if (newhead & (1 << 20)) {
+        fr->lsf = (newhead & (1 << 19)) ? 0x0 : 0x1;
+        fr->mpeg25 = 0;
+    }
+    else {
+        fr->lsf = 1;
+        fr->mpeg25 = 1;
+    }
+    fr->lay = 4 - ((newhead >> 17) & 3);
+    if (fr->mpeg25) {
+        fr->sampling_frequency = 6 + ((newhead >> 10) & 0x3);
+    }
+    else
+        fr->sampling_frequency = ((newhead >> 10) & 0x3) + (fr->lsf * 3);
+    fr->error_protection = ((newhead >> 16) & 0x1) ^ 0x1;
+
+    fr->bitrate_index = ((newhead >> 12) & 0xf);
+    fr->padding = ((newhead >> 9) & 0x1);
+    fr->extension = ((newhead >> 8) & 0x1);
+    fr->mode = ((newhead >> 6) & 0x3);
+    fr->mode_ext = ((newhead >> 4) & 0x3);
+    fr->copyright = ((newhead >> 3) & 0x1);
+    fr->original = ((newhead >> 2) & 0x1);
+    fr->emphasis = newhead & 0x3;
+
+    fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2;
+
+    ssize = 0;
+
+    if (!fr->bitrate_index)
+        return (0);
+
+    switch (fr->lay) {
+    case 1:
+        fr->do_layer = mpg123_do_layer1;
+        /* inits also shared tables with layer1 */
+        mpg123_init_layer2(fr->synth_type == SYNTH_MMX);
+        fr->framesize =
+            (long) tabsel_123[fr->lsf][0][fr->bitrate_index] * 12000;
+        fr->framesize /= mpg123_freqs[fr->sampling_frequency];
+        fr->framesize = ((fr->framesize + fr->padding) << 2) - 4;
+        break;
+    case 2:
+        fr->do_layer = mpg123_do_layer2;
+        /* inits also shared tables with layer1 */
+        mpg123_init_layer2(fr->synth_type == SYNTH_MMX);
+        fr->framesize =
+            (long) tabsel_123[fr->lsf][1][fr->bitrate_index] * 144000;
+        fr->framesize /= mpg123_freqs[fr->sampling_frequency];
+        fr->framesize += fr->padding - 4;
+        break;
+    case 3:
+        fr->do_layer = mpg123_do_layer3;
+        if (fr->lsf)
+            ssize = (fr->stereo == 1) ? 9 : 17;
+        else
+            ssize = (fr->stereo == 1) ? 17 : 32;
+        if (fr->error_protection)
+            ssize += 2;
+        fr->framesize =
+            (long) tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000;
+        fr->framesize /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf);
+        fr->framesize = fr->framesize + fr->padding - 4;
+        break;
+    default:
+        return (0);
+    }
+    if (fr->framesize > MAXFRAMESIZE)
+        return 0;
+    return 1;
+}
+
+void
+mpg123_open_stream(char *bs_filenam, int fd)
+{
+    filept_opened = 1;
+    if (!strncasecmp(bs_filenam, "http://", 7)) {
+        filept = NULL;
+        mpg123_http_open(bs_filenam);
+        mpg123_info->filesize = 0;
+        mpg123_info->network_stream = TRUE;
+    }
+    else {
+        if ((filept = vfs_fopen(bs_filenam, "rb")) == NULL ||
+            stream_init() == -1)
+            mpg123_info->eof = TRUE;
+    }
+
+}
+
+void
+mpg123_set_pointer(long backstep)
+{
+    bsi.wordpointer = bsbuf + ssize - backstep;
+    if (backstep)
+        memcpy(bsi.wordpointer, bsbufold + fsizeold - backstep, backstep);
+    bsi.bitindex = 0;
+}
+
+double
+mpg123_compute_bpf(struct frame *fr)
+{
+    double bpf;
+
+    switch (fr->lay) {
+    case 1:
+        bpf = tabsel_123[fr->lsf][0][fr->bitrate_index];
+        bpf *= 12000.0 * 4.0;
+        bpf /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf);
+        break;
+    case 2:
+    case 3:
+        bpf = tabsel_123[fr->lsf][fr->lay - 1][fr->bitrate_index];
+        bpf *= 144000;
+        bpf /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf);
+        break;
+    default:
+        bpf = 1.0;
+    }
+
+    return bpf;
+}
+
+int
+mpg123_calc_numframes(struct frame *fr)
+{
+    return (int) (mpg123_info->filesize / mpg123_compute_bpf(fr));
+}
+
+double
+mpg123_relative_pos(void)
+{
+    if (!filept || !mpg123_info->filesize)
+        return 0;
+    return ((double) stream_tell()) / mpg123_info->filesize;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/configure.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/configure.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/configure.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,849 @@
+
+#include "mpg123.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include <libbeep/configdb.h>
+#include <libbeep/dirbrowser.h>
+#include <libbeep/titlestring.h>
+
+
+static GtkWidget *mpg123_configurewin = NULL;
+static GtkWidget *vbox, *notebook;
+static GtkWidget *decode_vbox, *decode_hbox1;
+static GtkWidget *decode_res_frame, *decode_res_vbox, *decode_res_16,
+    *decode_res_8;
+static GtkWidget *decode_ch_frame, *decode_ch_vbox, *decode_ch_stereo,
+    *decode_ch_mono;
+static GtkWidget *decode_freq_frame, *decode_freq_vbox, *decode_freq_1to1,
+    *decode_freq_1to2, *decode_freq_1to4;
+static GtkWidget *option_frame, *option_vbox, *detect_by_content,
+    *detect_by_extension, *detect_by_both;
+#ifdef USE_SIMD
+static GtkWidget *auto_select, *decoder_3dnow, *decoder_mmx, *decoder_fpu;
+
+static void auto_select_cb(GtkWidget * w, gpointer data);
+#endif
+
+static GtkObject *streaming_size_adj, *streaming_pre_adj;
+static GtkWidget *streaming_proxy_use, *streaming_proxy_host_entry;
+static GtkWidget *streaming_proxy_port_entry, *streaming_save_use,
+    *streaming_save_entry;
+static GtkWidget *streaming_proxy_auth_use;
+static GtkWidget *streaming_proxy_auth_pass_entry,
+    *streaming_proxy_auth_user_entry;
+static GtkWidget *streaming_proxy_auth_user_label,
+    *streaming_proxy_auth_pass_label;
+static GtkWidget *streaming_cast_title, *streaming_udp_title;
+static GtkWidget *streaming_proxy_hbox, *streaming_proxy_auth_hbox,
+    *streaming_save_dirbrowser;
+static GtkWidget *streaming_save_hbox, *title_id3_box, *title_tag_desc;
+static GtkWidget *title_override, *title_id3_entry, *title_id3v2_disable;
+
+/* Encoding patch */
+static GtkWidget *title_encoding_hbox, *title_encoding_enabled, *title_encoding, *title_encoding_label;
+/* Encoding patch */
+
+MPG123Config mpg123_cfg;
+
+static void
+mpg123_configurewin_ok(GtkWidget * widget, gpointer data)
+{
+    ConfigDb *db;
+
+    if (GTK_TOGGLE_BUTTON(decode_res_16)->active)
+        mpg123_cfg.resolution = 16;
+    else if (GTK_TOGGLE_BUTTON(decode_res_8)->active)
+        mpg123_cfg.resolution = 8;
+
+    if (GTK_TOGGLE_BUTTON(decode_ch_stereo)->active)
+        mpg123_cfg.channels = 2;
+    else if (GTK_TOGGLE_BUTTON(decode_ch_mono)->active)
+        mpg123_cfg.channels = 1;
+
+    if (GTK_TOGGLE_BUTTON(decode_freq_1to1)->active)
+        mpg123_cfg.downsample = 0;
+    else if (GTK_TOGGLE_BUTTON(decode_freq_1to2)->active)
+        mpg123_cfg.downsample = 1;
+    if (GTK_TOGGLE_BUTTON(decode_freq_1to4)->active)
+        mpg123_cfg.downsample = 2;
+
+    if (GTK_TOGGLE_BUTTON(detect_by_content)->active)
+        mpg123_cfg.detect_by = DETECT_CONTENT;
+    else if (GTK_TOGGLE_BUTTON(detect_by_extension)->active)
+        mpg123_cfg.detect_by = DETECT_EXTENSION;
+    else if (GTK_TOGGLE_BUTTON(detect_by_both)->active)
+        mpg123_cfg.detect_by = DETECT_BOTH;
+    else
+        mpg123_cfg.detect_by = DETECT_EXTENSION;
+
+#ifdef USE_SIMD
+    if (GTK_TOGGLE_BUTTON(auto_select)->active)
+        mpg123_cfg.default_synth = SYNTH_AUTO;
+    else if (GTK_TOGGLE_BUTTON(decoder_fpu)->active)
+        mpg123_cfg.default_synth = SYNTH_FPU;
+    else if (GTK_TOGGLE_BUTTON(decoder_mmx)->active)
+        mpg123_cfg.default_synth = SYNTH_MMX;
+    else
+        mpg123_cfg.default_synth = SYNTH_3DNOW;
+
+#endif
+    mpg123_cfg.http_buffer_size =
+        (gint) GTK_ADJUSTMENT(streaming_size_adj)->value;
+    mpg123_cfg.http_prebuffer =
+        (gint) GTK_ADJUSTMENT(streaming_pre_adj)->value;
+
+    mpg123_cfg.use_proxy =
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(streaming_proxy_use));
+    g_free(mpg123_cfg.proxy_host);
+    mpg123_cfg.proxy_host =
+        g_strdup(gtk_entry_get_text(GTK_ENTRY(streaming_proxy_host_entry)));
+    mpg123_cfg.proxy_port =
+        atoi(gtk_entry_get_text(GTK_ENTRY(streaming_proxy_port_entry)));
+
+    mpg123_cfg.proxy_use_auth =
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
+                                     (streaming_proxy_auth_use));
+
+    if (mpg123_cfg.proxy_user)
+        g_free(mpg123_cfg.proxy_user);
+    mpg123_cfg.proxy_user = NULL;
+    if (strlen
+        (gtk_entry_get_text(GTK_ENTRY(streaming_proxy_auth_user_entry))) > 0)
+        mpg123_cfg.proxy_user =
+            g_strdup(gtk_entry_get_text
+                     (GTK_ENTRY(streaming_proxy_auth_user_entry)));
+
+    if (mpg123_cfg.proxy_pass)
+        g_free(mpg123_cfg.proxy_pass);
+    mpg123_cfg.proxy_pass = NULL;
+    if (strlen
+        (gtk_entry_get_text(GTK_ENTRY(streaming_proxy_auth_pass_entry))) > 0)
+        mpg123_cfg.proxy_pass =
+            g_strdup(gtk_entry_get_text
+                     (GTK_ENTRY(streaming_proxy_auth_pass_entry)));
+
+
+    mpg123_cfg.save_http_stream =
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(streaming_save_use));
+    if (mpg123_cfg.save_http_path)
+        g_free(mpg123_cfg.save_http_path);
+    mpg123_cfg.save_http_path =
+        g_strdup(gtk_entry_get_text(GTK_ENTRY(streaming_save_entry)));
+
+    mpg123_cfg.use_udp_channel =
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(streaming_udp_title));
+
+    mpg123_cfg.title_override =
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(title_override));
+    mpg123_cfg.disable_id3v2 =
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(title_id3v2_disable));
+    g_free(mpg123_cfg.id3_format);
+    mpg123_cfg.id3_format =
+        g_strdup(gtk_entry_get_text(GTK_ENTRY(title_id3_entry)));
+
+    mpg123_cfg.title_encoding_enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(title_encoding_enabled));
+    mpg123_cfg.title_encoding = g_strdup(gtk_entry_get_text(GTK_ENTRY(title_encoding)));
+    if (mpg123_cfg.title_encoding_enabled)
+        mpg123_id3_encoding_list = g_strsplit_set(mpg123_cfg.title_encoding, ENCODING_SEPARATOR, 0);
+    db = bmp_cfg_db_open();
+    bmp_cfg_db_set_int(db, "MPG123", "resolution", mpg123_cfg.resolution);
+    bmp_cfg_db_set_int(db, "MPG123", "channels", mpg123_cfg.channels);
+    bmp_cfg_db_set_int(db, "MPG123", "downsample", mpg123_cfg.downsample);
+    bmp_cfg_db_set_int(db, "MPG123", "http_buffer_size",
+                       mpg123_cfg.http_buffer_size);
+    bmp_cfg_db_set_int(db, "MPG123", "http_prebuffer",
+                       mpg123_cfg.http_prebuffer);
+    bmp_cfg_db_set_bool(db, "MPG123", "use_proxy", mpg123_cfg.use_proxy);
+    bmp_cfg_db_set_string(db, "MPG123", "proxy_host", mpg123_cfg.proxy_host);
+    bmp_cfg_db_set_int(db, "MPG123", "proxy_port", mpg123_cfg.proxy_port);
+    bmp_cfg_db_set_bool(db, "MPG123", "proxy_use_auth",
+                        mpg123_cfg.proxy_use_auth);
+    if (mpg123_cfg.proxy_user)
+        bmp_cfg_db_set_string(db, "MPG123", "proxy_user",
+                              mpg123_cfg.proxy_user);
+    else
+        bmp_cfg_db_unset_key(db, "MPG123", "proxy_user");
+    if (mpg123_cfg.proxy_pass)
+        bmp_cfg_db_set_string(db, "MPG123", "proxy_pass",
+                              mpg123_cfg.proxy_pass);
+    else
+        bmp_cfg_db_unset_key(db, "MPG123", "proxy_pass");
+    bmp_cfg_db_set_bool(db, "MPG123", "save_http_stream",
+                        mpg123_cfg.save_http_stream);
+    bmp_cfg_db_set_string(db, "MPG123", "save_http_path",
+                          mpg123_cfg.save_http_path);
+    bmp_cfg_db_set_bool(db, "MPG123", "use_udp_channel",
+                        mpg123_cfg.use_udp_channel);
+    bmp_cfg_db_set_bool(db, "MPG123", "title_override",
+                        mpg123_cfg.title_override);
+    bmp_cfg_db_set_bool(db, "MPG123", "disable_id3v2",
+                        mpg123_cfg.disable_id3v2);
+    bmp_cfg_db_set_string(db, "MPG123", "id3_format", mpg123_cfg.id3_format);
+    bmp_cfg_db_set_int(db, "MPG123", "detect_by", mpg123_cfg.detect_by);
+#ifdef USE_SIMD
+    bmp_cfg_db_set_int(db, "MPG123", "default_synth",
+                       mpg123_cfg.default_synth);
+#endif
+
+/* Encoding patch */
+    bmp_cfg_db_set_bool(db, "MPG123", "title_encoding_enabled", mpg123_cfg.title_encoding_enabled);
+    bmp_cfg_db_set_string(db, "MPG123", "title_encoding", mpg123_cfg.title_encoding);
+/* Encoding patch */
+
+    bmp_cfg_db_close(db);
+    gtk_widget_destroy(mpg123_configurewin);
+}
+
+#ifdef USE_SIMD
+static void
+auto_select_cb(GtkWidget * w, gpointer data)
+{
+    gboolean autom = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w));
+
+    gtk_widget_set_sensitive(decoder_fpu, !autom);
+    gtk_widget_set_sensitive(decoder_mmx, !autom);
+    gtk_widget_set_sensitive(decoder_3dnow, !autom);
+}
+
+#endif
+
+static void
+proxy_use_cb(GtkWidget * w, gpointer data)
+{
+    gboolean use_proxy, use_proxy_auth;
+
+    use_proxy =
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(streaming_proxy_use));
+    use_proxy_auth =
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
+                                     (streaming_proxy_auth_use));
+
+    gtk_widget_set_sensitive(streaming_proxy_hbox, use_proxy);
+    gtk_widget_set_sensitive(streaming_proxy_auth_use, use_proxy);
+    gtk_widget_set_sensitive(streaming_proxy_auth_hbox, use_proxy
+                             && use_proxy_auth);
+}
+
+static void
+proxy_auth_use_cb(GtkWidget * w, gpointer data)
+{
+    gboolean use_proxy, use_proxy_auth;
+
+    use_proxy =
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(streaming_proxy_use));
+    use_proxy_auth =
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
+                                     (streaming_proxy_auth_use));
+
+    gtk_widget_set_sensitive(streaming_proxy_auth_hbox, use_proxy
+                             && use_proxy_auth);
+}
+
+static void
+streaming_save_dirbrowser_cb(gchar * dir)
+{
+    gtk_entry_set_text(GTK_ENTRY(streaming_save_entry), dir);
+}
+
+static void
+streaming_save_browse_cb(GtkWidget * w, gpointer data)
+{
+    if (!streaming_save_dirbrowser) {
+        streaming_save_dirbrowser =
+            xmms_create_dir_browser(_
+                                    ("Select the directory where you want to store the MPEG streams:"),
+                                    mpg123_cfg.save_http_path,
+                                    GTK_SELECTION_SINGLE,
+                                    streaming_save_dirbrowser_cb);
+        g_signal_connect(G_OBJECT(streaming_save_dirbrowser), "destroy",
+                         G_CALLBACK(gtk_widget_destroyed),
+                         &streaming_save_dirbrowser);
+        gtk_window_set_transient_for(GTK_WINDOW(streaming_save_dirbrowser),
+                                     GTK_WINDOW(mpg123_configurewin));
+        gtk_widget_show(streaming_save_dirbrowser);
+    }
+}
+
+static void
+streaming_save_use_cb(GtkWidget * w, gpointer data)
+{
+    gboolean save_stream;
+
+    save_stream =
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(streaming_save_use));
+
+    gtk_widget_set_sensitive(streaming_save_hbox, save_stream);
+}
+
+static void
+title_override_cb(GtkWidget * w, gpointer data)
+{
+    gboolean override;
+    override =
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(title_override));
+    gtk_widget_set_sensitive(title_id3_box, override);
+    gtk_widget_set_sensitive(title_tag_desc, override);
+}
+
+/* Encoding patch */
+static void
+title_encoding_enabled_cb(GtkWidget * w, gpointer data)
+{
+    gboolean encoding_enabled;
+    encoding_enabled =
+        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(title_encoding_enabled));
+    gtk_widget_set_sensitive(title_encoding_hbox, encoding_enabled);
+}
+/* Encoding patch */
+
+static void
+configure_destroy(GtkWidget * w, gpointer data)
+{
+    if (streaming_save_dirbrowser)
+        gtk_widget_destroy(streaming_save_dirbrowser);
+}
+
+void
+mpg123_configure(void)
+{
+    GtkWidget *streaming_vbox;
+    GtkWidget *streaming_buf_frame, *streaming_buf_hbox;
+    GtkWidget *streaming_size_box, *streaming_size_label,
+        *streaming_size_spin;
+    GtkWidget *streaming_pre_box, *streaming_pre_label, *streaming_pre_spin;
+    GtkWidget *streaming_proxy_frame, *streaming_proxy_vbox;
+    GtkWidget *streaming_proxy_port_label, *streaming_proxy_host_label;
+    GtkWidget *streaming_save_frame, *streaming_save_vbox;
+    GtkWidget *streaming_save_label, *streaming_save_browse;
+    GtkWidget *streaming_cast_frame, *streaming_cast_vbox;
+    GtkWidget *title_frame, *title_id3_vbox, *title_id3_label;
+    GtkWidget *bbox, *ok, *cancel;
+
+    char *temp;
+
+    if (mpg123_configurewin != NULL) {
+        gtk_window_present(GTK_WINDOW(mpg123_configurewin));
+        return;
+    }
+    mpg123_configurewin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_type_hint(GTK_WINDOW(mpg123_configurewin),
+                             GDK_WINDOW_TYPE_HINT_DIALOG);
+    gtk_window_set_position(GTK_WINDOW(mpg123_configurewin),
+                            GTK_WIN_POS_CENTER);
+    g_signal_connect(G_OBJECT(mpg123_configurewin), "destroy",
+                     G_CALLBACK(gtk_widget_destroyed), &mpg123_configurewin);
+    g_signal_connect(G_OBJECT(mpg123_configurewin), "destroy",
+                     G_CALLBACK(configure_destroy), &mpg123_configurewin);
+    gtk_window_set_title(GTK_WINDOW(mpg123_configurewin),
+                         _("MPEG Audio Plugin Configuration"));
+    gtk_window_set_resizable(GTK_WINDOW(mpg123_configurewin), FALSE);
+    /*  gtk_window_set_position(GTK_WINDOW(mpg123_configurewin), GTK_WIN_POS_MOUSE); */
+    gtk_container_border_width(GTK_CONTAINER(mpg123_configurewin), 10);
+
+    vbox = gtk_vbox_new(FALSE, 10);
+    gtk_container_add(GTK_CONTAINER(mpg123_configurewin), vbox);
+
+    notebook = gtk_notebook_new();
+    gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
+
+    decode_vbox = gtk_vbox_new(FALSE, 5);
+    gtk_container_set_border_width(GTK_CONTAINER(decode_vbox), 5);
+
+    decode_hbox1 = gtk_hbox_new(TRUE, 5);
+    gtk_box_pack_start(GTK_BOX(decode_vbox), decode_hbox1, FALSE, FALSE, 0);
+
+    decode_res_frame = gtk_frame_new(_("Resolution:"));
+    gtk_box_pack_start(GTK_BOX(decode_hbox1), decode_res_frame, TRUE, TRUE,
+                       0);
+
+    decode_res_vbox = gtk_vbox_new(FALSE, 5);
+    gtk_container_set_border_width(GTK_CONTAINER(decode_res_vbox), 5);
+    gtk_container_add(GTK_CONTAINER(decode_res_frame), decode_res_vbox);
+
+    decode_res_16 = gtk_radio_button_new_with_label(NULL, _("16 bit"));
+    if (mpg123_cfg.resolution == 16)
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(decode_res_16), TRUE);
+    gtk_box_pack_start(GTK_BOX(decode_res_vbox), decode_res_16, FALSE,
+                       FALSE, 0);
+
+    decode_res_8 =
+        gtk_radio_button_new_with_label(gtk_radio_button_group
+                                        (GTK_RADIO_BUTTON(decode_res_16)),
+                                        _("8 bit"));
+    if (mpg123_cfg.resolution == 8)
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(decode_res_8), TRUE);
+
+    gtk_box_pack_start(GTK_BOX(decode_res_vbox), decode_res_8, FALSE,
+                       FALSE, 0);
+
+    decode_ch_frame = gtk_frame_new(_("Channels:"));
+    gtk_box_pack_start(GTK_BOX(decode_hbox1), decode_ch_frame, TRUE, TRUE, 0);
+
+    decode_ch_vbox = gtk_vbox_new(FALSE, 5);
+    gtk_container_set_border_width(GTK_CONTAINER(decode_ch_vbox), 5);
+    gtk_container_add(GTK_CONTAINER(decode_ch_frame), decode_ch_vbox);
+
+    decode_ch_stereo =
+        gtk_radio_button_new_with_label(NULL, _("Stereo (if available)"));
+    if (mpg123_cfg.channels == 2)
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(decode_ch_stereo),
+                                     TRUE);
+
+    gtk_box_pack_start(GTK_BOX(decode_ch_vbox), decode_ch_stereo, FALSE,
+                       FALSE, 0);
+
+    decode_ch_mono =
+        gtk_radio_button_new_with_label(gtk_radio_button_group
+                                        (GTK_RADIO_BUTTON
+                                         (decode_ch_stereo)), _("Mono"));
+    if (mpg123_cfg.channels == 1)
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(decode_ch_mono), TRUE);
+
+    gtk_box_pack_start(GTK_BOX(decode_ch_vbox), decode_ch_mono, FALSE,
+                       FALSE, 0);
+
+    decode_freq_frame = gtk_frame_new(_("Down sample:"));
+    gtk_box_pack_start(GTK_BOX(decode_vbox), decode_freq_frame, FALSE,
+                       FALSE, 0);
+
+    decode_freq_vbox = gtk_vbox_new(FALSE, 5);
+    gtk_container_set_border_width(GTK_CONTAINER(decode_freq_vbox), 5);
+    gtk_container_add(GTK_CONTAINER(decode_freq_frame), decode_freq_vbox);
+
+    decode_freq_1to1 =
+        gtk_radio_button_new_with_label(NULL, _("1:1 (44 kHz)"));
+    if (mpg123_cfg.downsample == 0)
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(decode_freq_1to1),
+                                     TRUE);
+    gtk_box_pack_start(GTK_BOX(decode_freq_vbox), decode_freq_1to1, FALSE,
+                       FALSE, 0);
+
+    decode_freq_1to2 =
+        gtk_radio_button_new_with_label(gtk_radio_button_group
+                                        (GTK_RADIO_BUTTON
+                                         (decode_freq_1to1)),
+                                        _("1:2 (22 kHz)"));
+    if (mpg123_cfg.downsample == 1)
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(decode_freq_1to2),
+                                     TRUE);
+    gtk_box_pack_start(GTK_BOX(decode_freq_vbox), decode_freq_1to2, FALSE,
+                       FALSE, 0);
+
+    decode_freq_1to4 =
+        gtk_radio_button_new_with_label(gtk_radio_button_group
+                                        (GTK_RADIO_BUTTON
+                                         (decode_freq_1to1)),
+                                        _("1:4 (11 kHz)"));
+    if (mpg123_cfg.downsample == 2)
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(decode_freq_1to4),
+                                     TRUE);
+
+    gtk_box_pack_start(GTK_BOX(decode_freq_vbox), decode_freq_1to4, FALSE,
+                       FALSE, 0);
+
+
+#ifdef USE_SIMD
+    {
+        GtkWidget *decoder_frame, *decoder_vbox;
+
+        decoder_frame = gtk_frame_new(_("Decoder:"));
+        gtk_box_pack_start(GTK_BOX(decode_vbox), decoder_frame, FALSE,
+                           FALSE, 0);
+
+        decoder_vbox = gtk_vbox_new(FALSE, 5);
+        gtk_container_set_border_width(GTK_CONTAINER(decoder_vbox), 5);
+        gtk_container_add(GTK_CONTAINER(decoder_frame), decoder_vbox);
+
+        auto_select =
+            gtk_check_button_new_with_label(_("Automatic detection"));
+        gtk_box_pack_start(GTK_BOX(decoder_vbox), auto_select, FALSE,
+                           FALSE, 0);
+        g_signal_connect(G_OBJECT(auto_select), "clicked",
+                         G_CALLBACK(auto_select_cb), NULL);
+
+        decoder_3dnow =
+            gtk_radio_button_new_with_label(NULL,
+                                            _("3DNow! optimized decoder"));
+        gtk_box_pack_start(GTK_BOX(decoder_vbox), decoder_3dnow, FALSE,
+                           FALSE, 0);
+
+        decoder_mmx =
+            gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON
+                                                        (decoder_3dnow),
+                                                        _
+                                                        ("MMX optimized decoder"));
+        gtk_box_pack_start(GTK_BOX(decoder_vbox), decoder_mmx, FALSE,
+                           FALSE, 0);
+
+        decoder_fpu =
+            gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON
+                                                        (decoder_3dnow),
+                                                        _("FPU decoder"));
+        gtk_box_pack_start(GTK_BOX(decoder_vbox), decoder_fpu, FALSE,
+                           FALSE, 0);
+
+        switch (mpg123_cfg.default_synth) {
+        case SYNTH_3DNOW:
+            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(decoder_3dnow),
+                                         TRUE);
+            break;
+        case SYNTH_MMX:
+            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(decoder_mmx),
+                                         TRUE);
+            break;
+        case SYNTH_FPU:
+            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(decoder_fpu),
+                                         TRUE);
+            break;
+        default:
+            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(decoder_fpu),
+                                         TRUE);
+            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auto_select),
+                                         TRUE);
+            break;
+        }
+    }
+#endif
+    option_frame = gtk_frame_new(_("Options"));
+    gtk_box_pack_start(GTK_BOX(decode_vbox), option_frame, FALSE, FALSE, 0);
+
+    option_vbox = gtk_vbox_new(FALSE, 5);
+    gtk_container_set_border_width(GTK_CONTAINER(option_vbox), 5);
+    gtk_container_add(GTK_CONTAINER(option_frame), option_vbox);
+
+    detect_by_content = gtk_radio_button_new_with_label(NULL, _("Content"));
+
+    detect_by_extension =
+        gtk_radio_button_new_with_label(gtk_radio_button_group
+                                        (GTK_RADIO_BUTTON
+                                         (detect_by_content)),
+                                        _("Extension"));
+
+    detect_by_both =
+        gtk_radio_button_new_with_label(gtk_radio_button_group
+                                        (GTK_RADIO_BUTTON
+                                         (detect_by_content)),
+                                        _("Extension and content"));
+
+    switch (mpg123_cfg.detect_by) {
+    case DETECT_CONTENT:
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(detect_by_content),
+                                     TRUE);
+        break;
+    case DETECT_BOTH:
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(detect_by_both), TRUE);
+        break;
+    case DETECT_EXTENSION:
+    default:
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON
+                                     (detect_by_extension), TRUE);
+        break;
+    }
+
+    gtk_box_pack_start(GTK_BOX(option_vbox), detect_by_content, FALSE,
+                       FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(option_vbox), detect_by_extension, FALSE,
+                       FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(option_vbox), detect_by_both, FALSE, FALSE, 0);
+
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), decode_vbox,
+                             gtk_label_new(_("Decoder")));
+
+    streaming_vbox = gtk_vbox_new(FALSE, 0);
+
+    streaming_buf_frame = gtk_frame_new(_("Buffering:"));
+    gtk_container_set_border_width(GTK_CONTAINER(streaming_buf_frame), 5);
+    gtk_box_pack_start(GTK_BOX(streaming_vbox), streaming_buf_frame, FALSE,
+                       FALSE, 0);
+
+    streaming_buf_hbox = gtk_hbox_new(TRUE, 5);
+    gtk_container_set_border_width(GTK_CONTAINER(streaming_buf_hbox), 5);
+    gtk_container_add(GTK_CONTAINER(streaming_buf_frame), streaming_buf_hbox);
+
+    streaming_size_box = gtk_hbox_new(FALSE, 5);
+    /*gtk_table_attach_defaults(GTK_TABLE(streaming_buf_table),streaming_size_box,0,1,0,1); */
+    gtk_box_pack_start(GTK_BOX(streaming_buf_hbox), streaming_size_box,
+                       TRUE, TRUE, 0);
+    streaming_size_label = gtk_label_new(_("Buffer size (kb):"));
+    gtk_box_pack_start(GTK_BOX(streaming_size_box), streaming_size_label,
+                       FALSE, FALSE, 0);
+    streaming_size_adj =
+        gtk_adjustment_new(mpg123_cfg.http_buffer_size, 4, 4096, 4, 4, 4);
+    streaming_size_spin =
+        gtk_spin_button_new(GTK_ADJUSTMENT(streaming_size_adj), 8, 0);
+    gtk_widget_set_usize(streaming_size_spin, 60, -1);
+    gtk_box_pack_start(GTK_BOX(streaming_size_box), streaming_size_spin,
+                       FALSE, FALSE, 0);
+
+    streaming_pre_box = gtk_hbox_new(FALSE, 5);
+    /*gtk_table_attach_defaults(GTK_TABLE(streaming_buf_table),streaming_pre_box,1,2,0,1); */
+    gtk_box_pack_start(GTK_BOX(streaming_buf_hbox), streaming_pre_box,
+                       TRUE, TRUE, 0);
+    streaming_pre_label = gtk_label_new(_("Pre-buffer (percent):"));
+    gtk_box_pack_start(GTK_BOX(streaming_pre_box), streaming_pre_label,
+                       FALSE, FALSE, 0);
+    streaming_pre_adj =
+        gtk_adjustment_new(mpg123_cfg.http_prebuffer, 0, 90, 1, 1, 1);
+    streaming_pre_spin =
+        gtk_spin_button_new(GTK_ADJUSTMENT(streaming_pre_adj), 1, 0);
+    gtk_widget_set_usize(streaming_pre_spin, 60, -1);
+    gtk_box_pack_start(GTK_BOX(streaming_pre_box), streaming_pre_spin,
+                       FALSE, FALSE, 0);
+
+    /*
+     * Proxy config.
+     */
+    streaming_proxy_frame = gtk_frame_new(_("Proxy:"));
+    gtk_container_set_border_width(GTK_CONTAINER(streaming_proxy_frame), 5);
+    gtk_box_pack_start(GTK_BOX(streaming_vbox), streaming_proxy_frame,
+                       FALSE, FALSE, 0);
+
+    streaming_proxy_vbox = gtk_vbox_new(FALSE, 5);
+    gtk_container_set_border_width(GTK_CONTAINER(streaming_proxy_vbox), 5);
+    gtk_container_add(GTK_CONTAINER(streaming_proxy_frame),
+                      streaming_proxy_vbox);
+
+    streaming_proxy_use = gtk_check_button_new_with_label(_("Use proxy"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(streaming_proxy_use),
+                                 mpg123_cfg.use_proxy);
+    g_signal_connect(G_OBJECT(streaming_proxy_use), "clicked",
+                     G_CALLBACK(proxy_use_cb), NULL);
+    gtk_box_pack_start(GTK_BOX(streaming_proxy_vbox), streaming_proxy_use,
+                       FALSE, FALSE, 0);
+
+    streaming_proxy_hbox = gtk_hbox_new(FALSE, 5);
+    gtk_widget_set_sensitive(streaming_proxy_hbox, mpg123_cfg.use_proxy);
+    gtk_box_pack_start(GTK_BOX(streaming_proxy_vbox), streaming_proxy_hbox,
+                       FALSE, FALSE, 0);
+
+    streaming_proxy_host_label = gtk_label_new(_("Host:"));
+    gtk_box_pack_start(GTK_BOX(streaming_proxy_hbox),
+                       streaming_proxy_host_label, FALSE, FALSE, 0);
+
+    streaming_proxy_host_entry = gtk_entry_new();
+    gtk_entry_set_text(GTK_ENTRY(streaming_proxy_host_entry),
+                       mpg123_cfg.proxy_host);
+    gtk_box_pack_start(GTK_BOX(streaming_proxy_hbox),
+                       streaming_proxy_host_entry, TRUE, TRUE, 0);
+
+    streaming_proxy_port_label = gtk_label_new(_("Port:"));
+    gtk_box_pack_start(GTK_BOX(streaming_proxy_hbox),
+                       streaming_proxy_port_label, FALSE, FALSE, 0);
+
+    streaming_proxy_port_entry = gtk_entry_new();
+    gtk_widget_set_usize(streaming_proxy_port_entry, 50, -1);
+    temp = g_strdup_printf("%d", mpg123_cfg.proxy_port);
+    gtk_entry_set_text(GTK_ENTRY(streaming_proxy_port_entry), temp);
+    g_free(temp);
+    gtk_box_pack_start(GTK_BOX(streaming_proxy_hbox),
+                       streaming_proxy_port_entry, FALSE, FALSE, 0);
+
+    streaming_proxy_auth_use =
+        gtk_check_button_new_with_label(_("Use authentication"));
+    gtk_widget_set_sensitive(streaming_proxy_auth_use, mpg123_cfg.use_proxy);
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON
+                                 (streaming_proxy_auth_use),
+                                 mpg123_cfg.proxy_use_auth);
+    g_signal_connect(G_OBJECT(streaming_proxy_auth_use), "clicked",
+                     G_CALLBACK(proxy_auth_use_cb), NULL);
+    gtk_box_pack_start(GTK_BOX(streaming_proxy_vbox),
+                       streaming_proxy_auth_use, FALSE, FALSE, 0);
+
+    streaming_proxy_auth_hbox = gtk_hbox_new(FALSE, 5);
+    gtk_widget_set_sensitive(streaming_proxy_auth_hbox,
+                             mpg123_cfg.use_proxy
+                             && mpg123_cfg.proxy_use_auth);
+    gtk_box_pack_start(GTK_BOX(streaming_proxy_vbox),
+                       streaming_proxy_auth_hbox, FALSE, FALSE, 0);
+
+    streaming_proxy_auth_user_label = gtk_label_new(_("Username:"));
+    gtk_box_pack_start(GTK_BOX(streaming_proxy_auth_hbox),
+                       streaming_proxy_auth_user_label, FALSE, FALSE, 0);
+
+    streaming_proxy_auth_user_entry = gtk_entry_new();
+    if (mpg123_cfg.proxy_user)
+        gtk_entry_set_text(GTK_ENTRY(streaming_proxy_auth_user_entry),
+                           mpg123_cfg.proxy_user);
+    gtk_box_pack_start(GTK_BOX(streaming_proxy_auth_hbox),
+                       streaming_proxy_auth_user_entry, TRUE, TRUE, 0);
+
+    streaming_proxy_auth_pass_label = gtk_label_new(_("Password:"));
+    gtk_box_pack_start(GTK_BOX(streaming_proxy_auth_hbox),
+                       streaming_proxy_auth_pass_label, FALSE, FALSE, 0);
+
+    streaming_proxy_auth_pass_entry = gtk_entry_new();
+    if (mpg123_cfg.proxy_pass)
+        gtk_entry_set_text(GTK_ENTRY(streaming_proxy_auth_pass_entry),
+                           mpg123_cfg.proxy_pass);
+    gtk_entry_set_visibility(GTK_ENTRY(streaming_proxy_auth_pass_entry),
+                             FALSE);
+    gtk_box_pack_start(GTK_BOX(streaming_proxy_auth_hbox),
+                       streaming_proxy_auth_pass_entry, TRUE, TRUE, 0);
+
+
+    /*
+     * Save to disk config.
+     */
+    streaming_save_frame = gtk_frame_new(_("Save stream to disk:"));
+    gtk_container_set_border_width(GTK_CONTAINER(streaming_save_frame), 5);
+    gtk_box_pack_start(GTK_BOX(streaming_vbox), streaming_save_frame,
+                       FALSE, FALSE, 0);
+
+    streaming_save_vbox = gtk_vbox_new(FALSE, 5);
+    gtk_container_set_border_width(GTK_CONTAINER(streaming_save_vbox), 5);
+    gtk_container_add(GTK_CONTAINER(streaming_save_frame),
+                      streaming_save_vbox);
+
+    streaming_save_use =
+        gtk_check_button_new_with_label(_("Save stream to disk"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(streaming_save_use),
+                                 mpg123_cfg.save_http_stream);
+    g_signal_connect(G_OBJECT(streaming_save_use), "clicked",
+                     G_CALLBACK(streaming_save_use_cb), NULL);
+    gtk_box_pack_start(GTK_BOX(streaming_save_vbox), streaming_save_use,
+                       FALSE, FALSE, 0);
+
+    streaming_save_hbox = gtk_hbox_new(FALSE, 5);
+    gtk_widget_set_sensitive(streaming_save_hbox,
+                             mpg123_cfg.save_http_stream);
+    gtk_box_pack_start(GTK_BOX(streaming_save_vbox), streaming_save_hbox,
+                       FALSE, FALSE, 0);
+
+    streaming_save_label = gtk_label_new(_("Path:"));
+    gtk_box_pack_start(GTK_BOX(streaming_save_hbox), streaming_save_label,
+                       FALSE, FALSE, 0);
+
+    streaming_save_entry = gtk_entry_new();
+    gtk_entry_set_text(GTK_ENTRY(streaming_save_entry),
+                       mpg123_cfg.save_http_path);
+    gtk_box_pack_start(GTK_BOX(streaming_save_hbox), streaming_save_entry,
+                       TRUE, TRUE, 0);
+
+    streaming_save_browse = gtk_button_new_with_label(_("Browse"));
+    g_signal_connect(G_OBJECT(streaming_save_browse), "clicked",
+                     G_CALLBACK(streaming_save_browse_cb), NULL);
+    gtk_box_pack_start(GTK_BOX(streaming_save_hbox), streaming_save_browse,
+                       FALSE, FALSE, 0);
+
+    streaming_cast_frame = gtk_frame_new(_("SHOUT/Icecast:"));
+    gtk_container_set_border_width(GTK_CONTAINER(streaming_cast_frame), 5);
+    gtk_box_pack_start(GTK_BOX(streaming_vbox), streaming_cast_frame,
+                       FALSE, FALSE, 0);
+
+    streaming_cast_vbox = gtk_vbox_new(5, FALSE);
+    gtk_container_add(GTK_CONTAINER(streaming_cast_frame),
+                      streaming_cast_vbox);
+
+    gtk_box_pack_start(GTK_BOX(streaming_cast_vbox), streaming_cast_title,
+                       FALSE, FALSE, 0);
+
+    streaming_udp_title =
+        gtk_check_button_new_with_label(_
+                                        ("Enable Icecast Metadata UDP Channel"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(streaming_udp_title),
+                                 mpg123_cfg.use_udp_channel);
+    gtk_box_pack_start(GTK_BOX(streaming_cast_vbox), streaming_udp_title,
+                       FALSE, FALSE, 0);
+
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), streaming_vbox,
+                             gtk_label_new(_("Streaming")));
+
+    title_frame = gtk_frame_new(_("ID3 Tags:"));
+    gtk_container_border_width(GTK_CONTAINER(title_frame), 5);
+
+    title_id3_vbox = gtk_vbox_new(FALSE, 10);
+    gtk_container_border_width(GTK_CONTAINER(title_id3_vbox), 5);
+    gtk_container_add(GTK_CONTAINER(title_frame), title_id3_vbox);
+
+    title_id3v2_disable =
+        gtk_check_button_new_with_label(_("Disable ID3V2 tags"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(title_id3v2_disable),
+                                 mpg123_cfg.disable_id3v2);
+    gtk_box_pack_start(GTK_BOX(title_id3_vbox), title_id3v2_disable, FALSE,
+                       FALSE, 0);
+
+
+/* Encoding patch */
+    title_encoding_enabled =
+        gtk_check_button_new_with_label(_("Convert non-UTF8 ID3 tags to UTF8"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(title_encoding_enabled),
+                                 mpg123_cfg.title_encoding_enabled);
+    g_signal_connect(G_OBJECT(title_encoding_enabled), "clicked",
+                     G_CALLBACK(title_encoding_enabled_cb), NULL);
+    gtk_box_pack_start(GTK_BOX(title_id3_vbox), title_encoding_enabled, FALSE,
+                       FALSE, 0);
+
+    title_encoding_hbox = gtk_hbox_new(FALSE, 5);
+    gtk_widget_set_sensitive(title_encoding_hbox, mpg123_cfg.title_encoding_enabled);
+    gtk_box_pack_start(GTK_BOX(title_id3_vbox), title_encoding_hbox, FALSE,
+                       FALSE, 0);
+
+    title_encoding_label = gtk_label_new(_("ID3 encoding:"));
+    gtk_box_pack_start(GTK_BOX(title_encoding_hbox), title_encoding_label, FALSE,
+                       FALSE, 0);
+
+    title_encoding = gtk_entry_new();
+    gtk_entry_set_text(GTK_ENTRY(title_encoding), mpg123_cfg.title_encoding);
+    gtk_box_pack_start(GTK_BOX(title_encoding_hbox), title_encoding, TRUE, TRUE,
+                       0);
+/* Encoding patch */
+
+
+    title_override =
+        gtk_check_button_new_with_label(_("Override generic titles"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(title_override),
+                                 mpg123_cfg.title_override);
+    g_signal_connect(G_OBJECT(title_override), "clicked",
+                     G_CALLBACK(title_override_cb), NULL);
+    gtk_box_pack_start(GTK_BOX(title_id3_vbox), title_override, FALSE,
+                       FALSE, 0);
+
+    title_id3_box = gtk_hbox_new(FALSE, 5);
+    gtk_widget_set_sensitive(title_id3_box, mpg123_cfg.title_override);
+    gtk_box_pack_start(GTK_BOX(title_id3_vbox), title_id3_box, FALSE,
+                       FALSE, 0);
+
+    title_id3_label = gtk_label_new(_("ID3 format:"));
+    gtk_box_pack_start(GTK_BOX(title_id3_box), title_id3_label, FALSE,
+                       FALSE, 0);
+
+    title_id3_entry = gtk_entry_new();
+    gtk_entry_set_text(GTK_ENTRY(title_id3_entry), mpg123_cfg.id3_format);
+    gtk_box_pack_start(GTK_BOX(title_id3_box), title_id3_entry, TRUE, TRUE,
+                       0);
+
+    title_tag_desc = xmms_titlestring_descriptions("pafFetnygc", 2);
+    gtk_widget_set_sensitive(title_tag_desc, mpg123_cfg.title_override);
+    gtk_box_pack_start(GTK_BOX(title_id3_vbox), title_tag_desc, FALSE,
+                       FALSE, 0);
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), title_frame,
+                             gtk_label_new(_("Title")));
+
+    bbox = gtk_hbutton_box_new();
+    gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
+    gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
+    gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
+
+    cancel = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
+    g_signal_connect_swapped(G_OBJECT(cancel), "clicked",
+                             G_CALLBACK(gtk_widget_destroy),
+                             GTK_OBJECT(mpg123_configurewin));
+    GTK_WIDGET_SET_FLAGS(cancel, GTK_CAN_DEFAULT);
+    gtk_box_pack_start(GTK_BOX(bbox), cancel, TRUE, TRUE, 0);
+
+
+    ok = gtk_button_new_from_stock(GTK_STOCK_OK);
+    g_signal_connect(G_OBJECT(ok), "clicked",
+                     G_CALLBACK(mpg123_configurewin_ok), NULL);
+    GTK_WIDGET_SET_FLAGS(ok, GTK_CAN_DEFAULT);
+    gtk_box_pack_start(GTK_BOX(bbox), ok, TRUE, TRUE, 0);
+    gtk_widget_grab_default(ok);
+
+    gtk_widget_show_all(mpg123_configurewin);
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct36_3dnow.s
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct36_3dnow.s	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct36_3dnow.s	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,499 @@
+/
+/ dct36_3dnow.s - 3DNow! optimized dct36()
+/
+/ This code based 'dct36_3dnow.s' by Syuuhei Kashiyama
+/ <squash at mb.kcom.ne.jp>,only two types of changes have been made:
+/
+/ - remove PREFETCH instruction for speedup
+/ - change function name for support 3DNow! automatic detect
+/
+/ You can find Kashiyama's original 3dnow! support patch
+/ (for mpg123-0.59o) at
+/ http://user.ecc.u-tokyo.ac.jp/~g810370/linux-simd/ (Japanese).
+/
+/ by KIMURA Takuhiro <kim at hannah.ipc.miyakyo-u.ac.jp> - until 31.Mar.1999
+/                    <kim at comtec.co.jp>               - after  1.Apr.1999
+/
+	
+///
+/// Replacement of dct36() with AMD's 3DNow! SIMD operations support
+/// 
+/// Syuuhei Kashiyama <squash at mb.kcom.ne.jp>
+/// 
+/// The author of this program disclaim whole expressed or implied
+/// warranties with regard to this program, and in no event shall the
+/// author of this program liable to whatever resulted from the use of
+/// this program. Use it at your own risk.
+/// 
+
+	.globl dct36_3dnow
+	.type	 dct36_3dnow, at function
+dct36_3dnow:
+	pushl %ebp
+	movl %esp,%ebp
+	subl $120,%esp
+	pushl %esi
+	pushl %ebx
+	movl 8(%ebp),%eax
+	movl 12(%ebp),%esi
+	movl 16(%ebp),%ecx
+	movl 20(%ebp),%edx
+	movl 24(%ebp),%ebx
+	leal -128(%ebp),%esp
+
+	femms
+	movq (%eax),%mm0
+	movq 4(%eax),%mm1
+	pfadd %mm1,%mm0
+	movq %mm0,4(%eax)
+	psrlq $32,%mm1
+	movq 12(%eax),%mm2
+	punpckldq %mm2,%mm1
+	pfadd %mm2,%mm1
+	movq %mm1,12(%eax)
+	psrlq $32,%mm2
+	movq 20(%eax),%mm3
+	punpckldq %mm3,%mm2
+	pfadd %mm3,%mm2
+	movq %mm2,20(%eax)
+	psrlq $32,%mm3
+	movq 28(%eax),%mm4
+	punpckldq %mm4,%mm3
+	pfadd %mm4,%mm3
+	movq %mm3,28(%eax)
+	psrlq $32,%mm4
+	movq 36(%eax),%mm5
+	punpckldq %mm5,%mm4
+	pfadd %mm5,%mm4
+	movq %mm4,36(%eax)
+	psrlq $32,%mm5
+	movq 44(%eax),%mm6
+	punpckldq %mm6,%mm5
+	pfadd %mm6,%mm5
+	movq %mm5,44(%eax)
+	psrlq $32,%mm6
+	movq 52(%eax),%mm7
+	punpckldq %mm7,%mm6
+	pfadd %mm7,%mm6
+	movq %mm6,52(%eax)
+	psrlq $32,%mm7
+	movq 60(%eax),%mm0
+	punpckldq %mm0,%mm7
+	pfadd %mm0,%mm7
+	movq %mm7,60(%eax)
+	psrlq $32,%mm0
+	movd 68(%eax),%mm1
+	pfadd %mm1,%mm0
+	movd %mm0,68(%eax)
+	movd 4(%eax),%mm0
+	movd 12(%eax),%mm1
+	punpckldq %mm1,%mm0
+	punpckldq 20(%eax),%mm1
+	pfadd %mm1,%mm0
+	movd %mm0,12(%eax)
+	psrlq $32,%mm0
+	movd %mm0,20(%eax)
+	psrlq $32,%mm1
+	movd 28(%eax),%mm2
+	punpckldq %mm2,%mm1
+	punpckldq 36(%eax),%mm2
+	pfadd %mm2,%mm1
+	movd %mm1,28(%eax)
+	psrlq $32,%mm1
+	movd %mm1,36(%eax)
+	psrlq $32,%mm2
+	movd 44(%eax),%mm3
+	punpckldq %mm3,%mm2
+	punpckldq 52(%eax),%mm3
+	pfadd %mm3,%mm2
+	movd %mm2,44(%eax)
+	psrlq $32,%mm2
+	movd %mm2,52(%eax)
+	psrlq $32,%mm3
+	movd 60(%eax),%mm4
+	punpckldq %mm4,%mm3
+	punpckldq 68(%eax),%mm4
+	pfadd %mm4,%mm3
+	movd %mm3,60(%eax)
+	psrlq $32,%mm3
+	movd %mm3,68(%eax)
+
+	movq 24(%eax),%mm0
+	movq 48(%eax),%mm1
+	movd COS9+12,%mm2
+	punpckldq %mm2,%mm2
+	movd COS9+24,%mm3
+	punpckldq %mm3,%mm3
+	pfmul %mm2,%mm0
+	pfmul %mm3,%mm1
+	pushl %eax
+	movl $1,%eax
+	movd %eax,%mm7
+	pi2fd %mm7,%mm7
+	popl %eax
+	movq 8(%eax),%mm2
+	movd COS9+4,%mm3
+	punpckldq %mm3,%mm3
+	pfmul %mm3,%mm2
+	pfadd %mm0,%mm2
+	movq 40(%eax),%mm3
+	movd COS9+20,%mm4
+	punpckldq %mm4,%mm4
+	pfmul %mm4,%mm3
+	pfadd %mm3,%mm2
+	movq 56(%eax),%mm3
+	movd COS9+28,%mm4
+	punpckldq %mm4,%mm4
+	pfmul %mm4,%mm3
+	pfadd %mm3,%mm2
+	movq (%eax),%mm3
+	movq 16(%eax),%mm4
+	movd COS9+8,%mm5
+	punpckldq %mm5,%mm5
+	pfmul %mm5,%mm4
+	pfadd %mm4,%mm3
+	movq 32(%eax),%mm4
+	movd COS9+16,%mm5
+	punpckldq %mm5,%mm5
+	pfmul %mm5,%mm4
+	pfadd %mm4,%mm3
+	pfadd %mm1,%mm3
+	movq 64(%eax),%mm4
+	movd COS9+32,%mm5
+	punpckldq %mm5,%mm5
+	pfmul %mm5,%mm4
+	pfadd %mm4,%mm3
+	movq %mm2,%mm4
+	pfadd %mm3,%mm4
+	movq %mm7,%mm5
+	punpckldq tfcos36+0,%mm5
+	pfmul %mm5,%mm4
+	movq %mm4,%mm5
+	pfacc %mm5,%mm5
+	movd 108(%edx),%mm6
+	punpckldq 104(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd %mm5,36(%ecx)
+	psrlq $32,%mm5
+	movd %mm5,32(%ecx)
+	movq %mm4,%mm6
+	punpckldq %mm6,%mm5
+	pfsub %mm6,%mm5
+	punpckhdq %mm5,%mm5
+	movd 32(%edx),%mm6
+	punpckldq 36(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd 32(%esi),%mm6
+	punpckldq 36(%esi),%mm6
+	pfadd %mm6,%mm5
+	movd %mm5,1024(%ebx)
+	psrlq $32,%mm5
+	movd %mm5,1152(%ebx)
+	movq %mm3,%mm4
+	pfsub %mm2,%mm4
+	movq %mm7,%mm5
+	punpckldq tfcos36+32,%mm5
+	pfmul %mm5,%mm4
+	movq %mm4,%mm5
+	pfacc %mm5,%mm5
+	movd 140(%edx),%mm6
+	punpckldq 72(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd %mm5,68(%ecx)
+	psrlq $32,%mm5
+	movd %mm5,0(%ecx)
+	movq %mm4,%mm6
+	punpckldq %mm6,%mm5
+	pfsub %mm6,%mm5
+	punpckhdq %mm5,%mm5
+	movd 0(%edx),%mm6
+	punpckldq 68(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd 0(%esi),%mm6
+	punpckldq 68(%esi),%mm6
+	pfadd %mm6,%mm5
+	movd %mm5,0(%ebx)
+	psrlq $32,%mm5
+	movd %mm5,2176(%ebx)
+	movq 8(%eax),%mm2
+	movq 40(%eax),%mm3
+	pfsub %mm3,%mm2
+	movq 56(%eax),%mm3
+	pfsub %mm3,%mm2
+	movd COS9+12,%mm3
+	punpckldq %mm3,%mm3
+	pfmul %mm3,%mm2
+	movq 16(%eax),%mm3
+	movq 32(%eax),%mm4
+	pfsub %mm4,%mm3
+	movq 64(%eax),%mm4
+	pfsub %mm4,%mm3
+	movd COS9+24,%mm4
+	punpckldq %mm4,%mm4
+	pfmul %mm4,%mm3
+	movq 48(%eax),%mm4
+	pfsub %mm4,%mm3
+	movq (%eax),%mm4
+	pfadd %mm4,%mm3
+	movq %mm2,%mm4
+	pfadd %mm3,%mm4
+	movq %mm7,%mm5
+	punpckldq tfcos36+4,%mm5
+	pfmul %mm5,%mm4
+	movq %mm4,%mm5
+	pfacc %mm5,%mm5
+	movd 112(%edx),%mm6
+	punpckldq 100(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd %mm5,40(%ecx)
+	psrlq $32,%mm5
+	movd %mm5,28(%ecx)
+	movq %mm4,%mm6
+	punpckldq %mm6,%mm5
+	pfsub %mm6,%mm5
+	punpckhdq %mm5,%mm5
+	movd 28(%edx),%mm6
+	punpckldq 40(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd 28(%esi),%mm6
+	punpckldq 40(%esi),%mm6
+	pfadd %mm6,%mm5
+	movd %mm5,896(%ebx)
+	psrlq $32,%mm5
+	movd %mm5,1280(%ebx)
+	movq %mm3,%mm4
+	pfsub %mm2,%mm4
+	movq %mm7,%mm5
+	punpckldq tfcos36+28,%mm5
+	pfmul %mm5,%mm4
+	movq %mm4,%mm5
+	pfacc %mm5,%mm5
+	movd 136(%edx),%mm6
+	punpckldq 76(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd %mm5,64(%ecx)
+	psrlq $32,%mm5
+	movd %mm5,4(%ecx)
+	movq %mm4,%mm6
+	punpckldq %mm6,%mm5
+	pfsub %mm6,%mm5
+	punpckhdq %mm5,%mm5
+	movd 4(%edx),%mm6
+	punpckldq 64(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd 4(%esi),%mm6
+	punpckldq 64(%esi),%mm6
+	pfadd %mm6,%mm5
+	movd %mm5,128(%ebx)
+	psrlq $32,%mm5
+	movd %mm5,2048(%ebx)
+
+	movq 8(%eax),%mm2
+	movd COS9+20,%mm3
+	punpckldq %mm3,%mm3
+	pfmul %mm3,%mm2
+	pfsub %mm0,%mm2
+	movq 40(%eax),%mm3
+	movd COS9+28,%mm4
+	punpckldq %mm4,%mm4
+	pfmul %mm4,%mm3
+	pfsub %mm3,%mm2
+	movq 56(%eax),%mm3
+	movd COS9+4,%mm4
+	punpckldq %mm4,%mm4
+	pfmul %mm4,%mm3
+	pfadd %mm3,%mm2
+	movq (%eax),%mm3
+	movq 16(%eax),%mm4
+	movd COS9+32,%mm5
+	punpckldq %mm5,%mm5
+	pfmul %mm5,%mm4
+	pfsub %mm4,%mm3
+	movq 32(%eax),%mm4
+	movd COS9+8,%mm5
+	punpckldq %mm5,%mm5
+	pfmul %mm5,%mm4
+	pfsub %mm4,%mm3
+	pfadd %mm1,%mm3
+	movq 64(%eax),%mm4
+	movd COS9+16,%mm5
+	punpckldq %mm5,%mm5
+	pfmul %mm5,%mm4
+	pfadd %mm4,%mm3
+	movq %mm2,%mm4
+	pfadd %mm3,%mm4
+	movq %mm7,%mm5
+	punpckldq tfcos36+8,%mm5
+	pfmul %mm5,%mm4
+	movq %mm4,%mm5
+	pfacc %mm5,%mm5
+	movd 116(%edx),%mm6
+	punpckldq 96(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd %mm5,44(%ecx)
+	psrlq $32,%mm5
+	movd %mm5,24(%ecx)
+	movq %mm4,%mm6
+	punpckldq %mm6,%mm5
+	pfsub %mm6,%mm5
+	punpckhdq %mm5,%mm5
+	movd 24(%edx),%mm6
+	punpckldq 44(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd 24(%esi),%mm6
+	punpckldq 44(%esi),%mm6
+	pfadd %mm6,%mm5
+	movd %mm5,768(%ebx)
+	psrlq $32,%mm5
+	movd %mm5,1408(%ebx)
+	movq %mm3,%mm4
+	pfsub %mm2,%mm4
+	movq %mm7,%mm5
+	punpckldq tfcos36+24,%mm5
+	pfmul %mm5,%mm4
+	movq %mm4,%mm5
+	pfacc %mm5,%mm5
+	movd 132(%edx),%mm6
+	punpckldq 80(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd %mm5,60(%ecx)
+	psrlq $32,%mm5
+	movd %mm5,8(%ecx)
+	movq %mm4,%mm6
+	punpckldq %mm6,%mm5
+	pfsub %mm6,%mm5
+	punpckhdq %mm5,%mm5
+	movd 8(%edx),%mm6
+	punpckldq 60(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd 8(%esi),%mm6
+	punpckldq 60(%esi),%mm6
+	pfadd %mm6,%mm5
+	movd %mm5,256(%ebx)
+	psrlq $32,%mm5
+	movd %mm5,1920(%ebx)
+	movq 8(%eax),%mm2
+	movd COS9+28,%mm3
+	punpckldq %mm3,%mm3
+	pfmul %mm3,%mm2
+	pfsub %mm0,%mm2
+	movq 40(%eax),%mm3
+	movd COS9+4,%mm4
+	punpckldq %mm4,%mm4
+	pfmul %mm4,%mm3
+	pfadd %mm3,%mm2
+	movq 56(%eax),%mm3
+	movd COS9+20,%mm4
+	punpckldq %mm4,%mm4
+	pfmul %mm4,%mm3
+	pfsub %mm3,%mm2
+	movq (%eax),%mm3
+	movq 16(%eax),%mm4
+	movd COS9+16,%mm5
+	punpckldq %mm5,%mm5
+	pfmul %mm5,%mm4
+	pfsub %mm4,%mm3
+	movq 32(%eax),%mm4
+	movd COS9+32,%mm5
+	punpckldq %mm5,%mm5
+	pfmul %mm5,%mm4
+	pfadd %mm4,%mm3
+	pfadd %mm1,%mm3
+	movq 64(%eax),%mm4
+	movd COS9+8,%mm5
+	punpckldq %mm5,%mm5
+	pfmul %mm5,%mm4
+	pfsub %mm4,%mm3
+	movq %mm2,%mm4
+	pfadd %mm3,%mm4
+	movq %mm7,%mm5
+	punpckldq tfcos36+12,%mm5
+	pfmul %mm5,%mm4
+	movq %mm4,%mm5
+	pfacc %mm5,%mm5
+	movd 120(%edx),%mm6
+	punpckldq 92(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd %mm5,48(%ecx)
+	psrlq $32,%mm5
+	movd %mm5,20(%ecx)
+	movq %mm4,%mm6
+	punpckldq %mm6,%mm5
+	pfsub %mm6,%mm5
+	punpckhdq %mm5,%mm5
+	movd 20(%edx),%mm6
+	punpckldq 48(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd 20(%esi),%mm6
+	punpckldq 48(%esi),%mm6
+	pfadd %mm6,%mm5
+	movd %mm5,640(%ebx)
+	psrlq $32,%mm5
+	movd %mm5,1536(%ebx)
+	movq %mm3,%mm4
+	pfsub %mm2,%mm4
+	movq %mm7,%mm5
+	punpckldq tfcos36+20,%mm5
+	pfmul %mm5,%mm4
+	movq %mm4,%mm5
+	pfacc %mm5,%mm5
+	movd 128(%edx),%mm6
+	punpckldq 84(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd %mm5,56(%ecx)
+	psrlq $32,%mm5
+	movd %mm5,12(%ecx)
+	movq %mm4,%mm6
+	punpckldq %mm6,%mm5
+	pfsub %mm6,%mm5
+	punpckhdq %mm5,%mm5
+	movd 12(%edx),%mm6
+	punpckldq 56(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd 12(%esi),%mm6
+	punpckldq 56(%esi),%mm6
+	pfadd %mm6,%mm5
+	movd %mm5,384(%ebx)
+	psrlq $32,%mm5
+	movd %mm5,1792(%ebx)
+
+	movq (%eax),%mm4
+	movq 16(%eax),%mm3
+	pfsub %mm3,%mm4
+	movq 32(%eax),%mm3
+	pfadd %mm3,%mm4
+	movq 48(%eax),%mm3
+	pfsub %mm3,%mm4
+	movq 64(%eax),%mm3
+	pfadd %mm3,%mm4
+	movq %mm7,%mm5
+	punpckldq tfcos36+16,%mm5
+	pfmul %mm5,%mm4
+	movq %mm4,%mm5
+	pfacc %mm5,%mm5
+	movd 124(%edx),%mm6
+	punpckldq 88(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd %mm5,52(%ecx)
+	psrlq $32,%mm5
+	movd %mm5,16(%ecx)
+	movq %mm4,%mm6
+	punpckldq %mm6,%mm5
+	pfsub %mm6,%mm5
+	punpckhdq %mm5,%mm5
+	movd 16(%edx),%mm6
+	punpckldq 52(%edx),%mm6
+	pfmul %mm6,%mm5
+	movd 16(%esi),%mm6
+	punpckldq 52(%esi),%mm6
+	pfadd %mm6,%mm5
+	movd %mm5,512(%ebx)
+	psrlq $32,%mm5
+	movd %mm5,1664(%ebx)
+
+	femms
+	popl %ebx
+	popl %esi
+	movl %ebp,%esp
+	popl %ebp
+	ret

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,163 @@
+
+/*
+ * Discrete Cosine Tansform (DCT) for subband synthesis
+ *
+ * -funroll-loops (for gcc) will remove the loops for better performance
+ * using loops in the source-code enhances readabillity
+ */
+
+/*
+ * TODO: write an optimized version for the down-sampling modes
+ *       (in these modes the bands 16-31 (2:1) or 8-31 (4:1) are zero 
+ */
+
+#include "mpg123.h"
+
+void
+mpg123_dct64(real * out0, real * out1, real * samples)
+{
+    real bufs[64];
+
+    {
+        register int i, j;
+        register real *b1, *b2, *bs, *costab;
+
+        b1 = samples;
+        bs = bufs;
+        costab = mpg123_pnts[0] + 16;
+        b2 = b1 + 32;
+
+        for (i = 15; i >= 0; i--)
+            *bs++ = (*b1++ + *--b2);
+        for (i = 15; i >= 0; i--)
+            *bs++ = (*--b2 - *b1++) * *--costab;
+
+        b1 = bufs;
+        costab = mpg123_pnts[1] + 8;
+        b2 = b1 + 16;
+
+        {
+            for (i = 7; i >= 0; i--)
+                *bs++ = (*b1++ + *--b2);
+            for (i = 7; i >= 0; i--)
+                *bs++ = (*--b2 - *b1++) * *--costab;
+            b2 += 32;
+            costab += 8;
+            for (i = 7; i >= 0; i--)
+                *bs++ = (*b1++ + *--b2);
+            for (i = 7; i >= 0; i--)
+                *bs++ = (*b1++ - *--b2) * *--costab;
+            b2 += 32;
+        }
+
+        bs = bufs;
+        costab = mpg123_pnts[2];
+        b2 = b1 + 8;
+
+        for (j = 2; j; j--) {
+            for (i = 3; i >= 0; i--)
+                *bs++ = (*b1++ + *--b2);
+            for (i = 3; i >= 0; i--)
+                *bs++ = (*--b2 - *b1++) * costab[i];
+            b2 += 16;
+            for (i = 3; i >= 0; i--)
+                *bs++ = (*b1++ + *--b2);
+            for (i = 3; i >= 0; i--)
+                *bs++ = (*b1++ - *--b2) * costab[i];
+            b2 += 16;
+        }
+
+        b1 = bufs;
+        costab = mpg123_pnts[3];
+        b2 = b1 + 4;
+
+        for (j = 4; j; j--) {
+            *bs++ = (*b1++ + *--b2);
+            *bs++ = (*b1++ + *--b2);
+            *bs++ = (*--b2 - *b1++) * costab[1];
+            *bs++ = (*--b2 - *b1++) * costab[0];
+            b2 += 8;
+            *bs++ = (*b1++ + *--b2);
+            *bs++ = (*b1++ + *--b2);
+            *bs++ = (*b1++ - *--b2) * costab[1];
+            *bs++ = (*b1++ - *--b2) * costab[0];
+            b2 += 8;
+        }
+        bs = bufs;
+        costab = mpg123_pnts[4];
+
+        for (j = 8; j; j--) {
+            real v0, v1;
+
+            v0 = *b1++;
+            v1 = *b1++;
+            *bs++ = (v0 + v1);
+            *bs++ = (v0 - v1) * (*costab);
+            v0 = *b1++;
+            v1 = *b1++;
+            *bs++ = (v0 + v1);
+            *bs++ = (v1 - v0) * (*costab);
+        }
+
+    }
+
+    {
+        register real *b1;
+        register int i;
+
+        for (b1 = bufs, i = 8; i; i--, b1 += 4)
+            b1[2] += b1[3];
+
+        for (b1 = bufs, i = 4; i; i--, b1 += 8) {
+            b1[4] += b1[6];
+            b1[6] += b1[5];
+            b1[5] += b1[7];
+        }
+
+        for (b1 = bufs, i = 2; i; i--, b1 += 16) {
+            b1[8] += b1[12];
+            b1[12] += b1[10];
+            b1[10] += b1[14];
+            b1[14] += b1[9];
+            b1[9] += b1[13];
+            b1[13] += b1[11];
+            b1[11] += b1[15];
+        }
+    }
+
+    out0[0x10 * 16] = bufs[0];
+    out0[0x10 * 15] = bufs[16 + 0] + bufs[16 + 8];
+    out0[0x10 * 14] = bufs[8];
+    out0[0x10 * 13] = bufs[16 + 8] + bufs[16 + 4];
+    out0[0x10 * 12] = bufs[4];
+    out0[0x10 * 11] = bufs[16 + 4] + bufs[16 + 12];
+    out0[0x10 * 10] = bufs[12];
+    out0[0x10 * 9] = bufs[16 + 12] + bufs[16 + 2];
+    out0[0x10 * 8] = bufs[2];
+    out0[0x10 * 7] = bufs[16 + 2] + bufs[16 + 10];
+    out0[0x10 * 6] = bufs[10];
+    out0[0x10 * 5] = bufs[16 + 10] + bufs[16 + 6];
+    out0[0x10 * 4] = bufs[6];
+    out0[0x10 * 3] = bufs[16 + 6] + bufs[16 + 14];
+    out0[0x10 * 2] = bufs[14];
+    out0[0x10 * 1] = bufs[16 + 14] + bufs[16 + 1];
+    out0[0x10 * 0] = bufs[1];
+
+    out1[0x10 * 0] = bufs[1];
+    out1[0x10 * 1] = bufs[16 + 1] + bufs[16 + 9];
+    out1[0x10 * 2] = bufs[9];
+    out1[0x10 * 3] = bufs[16 + 9] + bufs[16 + 5];
+    out1[0x10 * 4] = bufs[5];
+    out1[0x10 * 5] = bufs[16 + 5] + bufs[16 + 13];
+    out1[0x10 * 6] = bufs[13];
+    out1[0x10 * 7] = bufs[16 + 13] + bufs[16 + 3];
+    out1[0x10 * 8] = bufs[3];
+    out1[0x10 * 9] = bufs[16 + 3] + bufs[16 + 11];
+    out1[0x10 * 10] = bufs[11];
+    out1[0x10 * 11] = bufs[16 + 11] + bufs[16 + 7];
+    out1[0x10 * 12] = bufs[7];
+    out1[0x10 * 13] = bufs[16 + 7] + bufs[16 + 15];
+    out1[0x10 * 14] = bufs[15];
+    out1[0x10 * 15] = bufs[16 + 15];
+
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64_3dnow.s
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64_3dnow.s	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64_3dnow.s	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,710 @@
+///
+/// Replacement of dct64() with AMD's 3DNow! SIMD operations support
+/// 
+/// Syuuhei Kashiyama <squash at mb.kcom.ne.jp>
+/// 
+/// The author of this program disclaim whole expressed or implied
+/// warranties with regard to this program, and in no event shall the
+/// author of this program liable to whatever resulted from the use of
+/// this program. Use it at your own risk.
+/// 
+/
+/ porting xmms-0.9.1 by Osamu kayasono <jacobi at jcom.home.ne.jp>
+/ - rename function name for xmms
+/
+
+	.globl mpg123_dct64_3dnow
+	.type	 mpg123_dct64_3dnow, at function
+mpg123_dct64_3dnow:
+	subl $256,%esp
+	pushl %ebp
+	pushl %edi
+	pushl %esi
+	pushl %ebx
+	leal 16(%esp),%ebx
+	movl 284(%esp),%edi
+	movl 276(%esp),%ebp
+	movl 280(%esp),%edx
+	leal 128(%ebx),%esi
+
+	/ femms
+
+	// 1
+	movl mpg123_pnts,%eax
+	movq 0(%edi),%mm0
+        movq %mm0,%mm1
+	movd 124(%edi),%mm2
+	punpckldq 120(%edi),%mm2
+	movq 0(%eax),%mm3
+	pfadd %mm2,%mm0
+	movq %mm0,0(%ebx)
+	pfsub %mm2,%mm1
+	pfmul %mm3,%mm1
+	movd %mm1,124(%ebx)
+	psrlq $32,%mm1
+	movd %mm1,120(%ebx)
+	movq 8(%edi),%mm4
+	movq %mm4,%mm5
+	movd 116(%edi),%mm6
+	punpckldq 112(%edi),%mm6
+	movq 8(%eax),%mm7
+	pfadd %mm6,%mm4
+	movq %mm4,8(%ebx)
+	pfsub %mm6,%mm5
+	pfmul %mm7,%mm5
+	movd %mm5,116(%ebx)
+	psrlq $32,%mm5
+	movd %mm5,112(%ebx)
+	movq 16(%edi),%mm0
+	movq %mm0,%mm1
+	movd 108(%edi),%mm2
+	punpckldq 104(%edi),%mm2
+	movq 16(%eax),%mm3
+	pfadd %mm2,%mm0
+	movq %mm0,16(%ebx)
+	pfsub %mm2,%mm1
+	pfmul %mm3,%mm1
+	movd %mm1,108(%ebx)
+	psrlq $32,%mm1
+	movd %mm1,104(%ebx)
+	movq 24(%edi),%mm4
+	movq %mm4,%mm5
+	movd 100(%edi),%mm6
+	punpckldq 96(%edi),%mm6
+	movq 24(%eax),%mm7
+	pfadd %mm6,%mm4
+	movq %mm4,24(%ebx)
+	pfsub %mm6,%mm5
+	pfmul %mm7,%mm5
+	movd %mm5,100(%ebx)
+	psrlq $32,%mm5
+	movd %mm5,96(%ebx)
+	movq 32(%edi),%mm0
+	movq %mm0,%mm1
+	movd 92(%edi),%mm2
+	punpckldq 88(%edi),%mm2
+	movq 32(%eax),%mm3
+	pfadd %mm2,%mm0
+	movq %mm0,32(%ebx)
+	pfsub %mm2,%mm1
+	pfmul %mm3,%mm1
+	movd %mm1,92(%ebx)
+	psrlq $32,%mm1
+	movd %mm1,88(%ebx)
+	movq 40(%edi),%mm4
+	movq %mm4,%mm5
+	movd 84(%edi),%mm6
+	punpckldq 80(%edi),%mm6
+	movq 40(%eax),%mm7
+	pfadd %mm6,%mm4
+	movq %mm4,40(%ebx)
+	pfsub %mm6,%mm5
+	pfmul %mm7,%mm5
+	movd %mm5,84(%ebx)
+	psrlq $32,%mm5
+	movd %mm5,80(%ebx)
+	movq 48(%edi),%mm0
+	movq %mm0,%mm1
+	movd 76(%edi),%mm2
+	punpckldq 72(%edi),%mm2
+	movq 48(%eax),%mm3
+	pfadd %mm2,%mm0
+	movq %mm0,48(%ebx)
+	pfsub %mm2,%mm1
+	pfmul %mm3,%mm1
+	movd %mm1,76(%ebx)
+	psrlq $32,%mm1
+	movd %mm1,72(%ebx)
+	movq 56(%edi),%mm4
+	movq %mm4,%mm5
+	movd 68(%edi),%mm6
+	punpckldq 64(%edi),%mm6
+	movq 56(%eax),%mm7
+	pfadd %mm6,%mm4
+	movq %mm4,56(%ebx)
+	pfsub %mm6,%mm5
+	pfmul %mm7,%mm5
+	movd %mm5,68(%ebx)
+	psrlq $32,%mm5
+	movd %mm5,64(%ebx)
+	
+	// 2
+	movl mpg123_pnts+4,%eax
+	/ 0, 14	
+	movq 0(%ebx),%mm0
+	movq %mm0,%mm1
+	movd 60(%ebx),%mm2
+	punpckldq 56(%ebx),%mm2
+	movq 0(%eax),%mm3
+	pfadd %mm2,%mm0
+	movq %mm0,0(%esi)
+	pfsub %mm2,%mm1
+	pfmul %mm3,%mm1
+	movd %mm1,60(%esi)
+	psrlq $32,%mm1
+	movd %mm1,56(%esi)
+	/ 16, 30
+	movq 64(%ebx),%mm0
+	movq %mm0,%mm1
+	movd 124(%ebx),%mm2
+	punpckldq 120(%ebx),%mm2
+	pfadd %mm2,%mm0
+	movq %mm0,64(%esi)
+	pfsubr %mm2,%mm1
+	pfmul %mm3,%mm1
+	movd %mm1,124(%esi)
+	psrlq $32,%mm1
+	movd %mm1,120(%esi)
+	movq 8(%ebx),%mm4
+	/ 2, 12
+	movq %mm4,%mm5
+	movd 52(%ebx),%mm6
+	punpckldq 48(%ebx),%mm6
+	movq 8(%eax),%mm7
+	pfadd %mm6,%mm4
+	movq %mm4,8(%esi)
+	pfsub %mm6,%mm5
+	pfmul %mm7,%mm5
+	movd %mm5,52(%esi)
+	psrlq $32,%mm5
+	movd %mm5,48(%esi)
+	movq 72(%ebx),%mm4
+	/ 18, 28
+	movq %mm4,%mm5
+	movd 116(%ebx),%mm6
+	punpckldq 112(%ebx),%mm6
+	pfadd %mm6,%mm4
+	movq %mm4,72(%esi)
+	pfsubr %mm6,%mm5
+	pfmul %mm7,%mm5
+	movd %mm5,116(%esi)
+	psrlq $32,%mm5
+	movd %mm5,112(%esi)
+	movq 16(%ebx),%mm0
+	/ 4, 10
+	movq %mm0,%mm1
+	movd 44(%ebx),%mm2
+	punpckldq 40(%ebx),%mm2
+	movq 16(%eax),%mm3
+	pfadd %mm2,%mm0
+	movq %mm0,16(%esi)
+	pfsub %mm2,%mm1
+	pfmul %mm3,%mm1
+	movd %mm1,44(%esi)
+	psrlq $32,%mm1
+	movd %mm1,40(%esi)
+	movq 80(%ebx),%mm0
+	/ 20, 26
+	movq %mm0,%mm1
+	movd 108(%ebx),%mm2
+	punpckldq 104(%ebx),%mm2
+	pfadd %mm2,%mm0
+	movq %mm0,80(%esi)
+	pfsubr %mm2,%mm1
+	pfmul %mm3,%mm1
+	movd %mm1,108(%esi)
+	psrlq $32,%mm1
+	movd %mm1,104(%esi)
+	movq 24(%ebx),%mm4
+	/ 6, 8
+	movq %mm4,%mm5
+	movd 36(%ebx),%mm6
+	punpckldq 32(%ebx),%mm6
+	movq 24(%eax),%mm7
+	pfadd %mm6,%mm4
+	movq %mm4,24(%esi)
+	pfsub %mm6,%mm5
+	pfmul %mm7,%mm5
+	movd %mm5,36(%esi)
+	psrlq $32,%mm5
+	movd %mm5,32(%esi)
+	movq 88(%ebx),%mm4
+	/ 22, 24
+	movq %mm4,%mm5
+	movd 100(%ebx),%mm6
+	punpckldq 96(%ebx),%mm6
+	pfadd %mm6,%mm4
+	movq %mm4,88(%esi)
+	pfsubr %mm6,%mm5
+	pfmul %mm7,%mm5
+	movd %mm5,100(%esi)
+	psrlq $32,%mm5
+	movd %mm5,96(%esi)
+
+	// 3
+	movl mpg123_pnts+8,%eax
+	movq 0(%eax),%mm0
+	movq 8(%eax),%mm1
+	movq 0(%esi),%mm2
+	/ 0, 6
+	movq %mm2,%mm3
+	movd 28(%esi),%mm4
+	punpckldq 24(%esi),%mm4
+	pfadd %mm4,%mm2
+	pfsub %mm4,%mm3
+	pfmul %mm0,%mm3
+	movq %mm2,0(%ebx)
+	movd %mm3,28(%ebx)
+	psrlq $32,%mm3
+	movd %mm3,24(%ebx)
+	movq 8(%esi),%mm5
+	/ 2, 4
+	movq %mm5,%mm6
+	movd 20(%esi),%mm7
+	punpckldq 16(%esi),%mm7
+	pfadd %mm7,%mm5
+	pfsub %mm7,%mm6
+	pfmul %mm1,%mm6
+	movq %mm5,8(%ebx)
+	movd %mm6,20(%ebx)
+	psrlq $32,%mm6
+	movd %mm6,16(%ebx)
+	movq 32(%esi),%mm2
+	/ 8, 14
+	movq %mm2,%mm3
+	movd 60(%esi),%mm4
+	punpckldq 56(%esi),%mm4
+	pfadd %mm4,%mm2
+	pfsubr %mm4,%mm3
+	pfmul %mm0,%mm3
+	movq %mm2,32(%ebx)
+	movd %mm3,60(%ebx)
+	psrlq $32,%mm3
+	movd %mm3,56(%ebx)
+	movq 40(%esi),%mm5
+	/ 10, 12
+	movq %mm5,%mm6
+	movd 52(%esi),%mm7
+	punpckldq 48(%esi),%mm7
+	pfadd %mm7,%mm5
+	pfsubr %mm7,%mm6
+	pfmul %mm1,%mm6
+	movq %mm5,40(%ebx)
+	movd %mm6,52(%ebx)
+	psrlq $32,%mm6
+	movd %mm6,48(%ebx)
+	movq 64(%esi),%mm2
+	/ 16, 22
+	movq %mm2,%mm3
+	movd 92(%esi),%mm4
+	punpckldq 88(%esi),%mm4
+	pfadd %mm4,%mm2
+	pfsub %mm4,%mm3
+	pfmul %mm0,%mm3
+	movq %mm2,64(%ebx)
+	movd %mm3,92(%ebx)
+	psrlq $32,%mm3
+	movd %mm3,88(%ebx)
+	movq 72(%esi),%mm5
+	/ 18, 20
+	movq %mm5,%mm6
+	movd 84(%esi),%mm7
+	punpckldq 80(%esi),%mm7
+	pfadd %mm7,%mm5
+	pfsub %mm7,%mm6
+	pfmul %mm1,%mm6
+	movq %mm5,72(%ebx)
+	movd %mm6,84(%ebx)
+	psrlq $32,%mm6
+	movd %mm6,80(%ebx)
+	movq 96(%esi),%mm2
+	/ 24, 30
+	movq %mm2,%mm3
+	movd 124(%esi),%mm4
+	punpckldq 120(%esi),%mm4
+	pfadd %mm4,%mm2
+	pfsubr %mm4,%mm3
+	pfmul %mm0,%mm3
+	movq %mm2,96(%ebx)
+	movd %mm3,124(%ebx)
+	psrlq $32,%mm3
+	movd %mm3,120(%ebx)
+	movq 104(%esi),%mm5
+	/ 26, 28
+	movq %mm5,%mm6
+	movd 116(%esi),%mm7
+	punpckldq 112(%esi),%mm7
+	pfadd %mm7,%mm5
+	pfsubr %mm7,%mm6
+	pfmul %mm1,%mm6
+	movq %mm5,104(%ebx)
+	movd %mm6,116(%ebx)
+	psrlq $32,%mm6
+	movd %mm6,112(%ebx)
+	
+	// 4
+	movl mpg123_pnts+12,%eax
+	movq 0(%eax),%mm0
+	movq 0(%ebx),%mm1
+	/ 0
+	movq %mm1,%mm2
+	movd 12(%ebx),%mm3
+	punpckldq 8(%ebx),%mm3
+	pfadd %mm3,%mm1
+	pfsub %mm3,%mm2
+	pfmul %mm0,%mm2
+	movq %mm1,0(%esi)
+	movd %mm2,12(%esi)
+	psrlq $32,%mm2
+	movd %mm2,8(%esi)
+	movq 16(%ebx),%mm4
+	/ 4
+	movq %mm4,%mm5
+	movd 28(%ebx),%mm6
+	punpckldq 24(%ebx),%mm6
+	pfadd %mm6,%mm4
+	pfsubr %mm6,%mm5
+	pfmul %mm0,%mm5
+	movq %mm4,16(%esi)
+	movd %mm5,28(%esi)
+	psrlq $32,%mm5
+	movd %mm5,24(%esi)
+	movq 32(%ebx),%mm1
+	/ 8
+	movq %mm1,%mm2
+	movd 44(%ebx),%mm3
+	punpckldq 40(%ebx),%mm3
+	pfadd %mm3,%mm1
+	pfsub %mm3,%mm2
+	pfmul %mm0,%mm2
+	movq %mm1,32(%esi)
+	movd %mm2,44(%esi)
+	psrlq $32,%mm2
+	movd %mm2,40(%esi)
+	movq 48(%ebx),%mm4
+	/ 12
+	movq %mm4,%mm5
+	movd 60(%ebx),%mm6
+	punpckldq 56(%ebx),%mm6
+	pfadd %mm6,%mm4
+	pfsubr %mm6,%mm5
+	pfmul %mm0,%mm5
+	movq %mm4,48(%esi)
+	movd %mm5,60(%esi)
+	psrlq $32,%mm5
+	movd %mm5,56(%esi)
+	movq 64(%ebx),%mm1
+	/ 16
+	movq %mm1,%mm2
+	movd 76(%ebx),%mm3
+	punpckldq 72(%ebx),%mm3
+	pfadd %mm3,%mm1
+	pfsub %mm3,%mm2
+	pfmul %mm0,%mm2
+	movq %mm1,64(%esi)
+	movd %mm2,76(%esi)
+	psrlq $32,%mm2
+	movd %mm2,72(%esi)
+	movq 80(%ebx),%mm4
+	/ 20
+	movq %mm4,%mm5
+	movd 92(%ebx),%mm6
+	punpckldq 88(%ebx),%mm6
+	pfadd %mm6,%mm4
+	pfsubr %mm6,%mm5
+	pfmul %mm0,%mm5
+	movq %mm4,80(%esi)
+	movd %mm5,92(%esi)
+	psrlq $32,%mm5
+	movd %mm5,88(%esi)
+	movq 96(%ebx),%mm1
+	/ 24
+	movq %mm1,%mm2
+	movd 108(%ebx),%mm3
+	punpckldq 104(%ebx),%mm3
+	pfadd %mm3,%mm1
+	pfsub %mm3,%mm2
+	pfmul %mm0,%mm2
+	movq %mm1,96(%esi)
+	movd %mm2,108(%esi)
+	psrlq $32,%mm2
+	movd %mm2,104(%esi)
+	movq 112(%ebx),%mm4
+	/ 28
+	movq %mm4,%mm5
+	movd 124(%ebx),%mm6
+	punpckldq 120(%ebx),%mm6
+	pfadd %mm6,%mm4
+	pfsubr %mm6,%mm5
+	pfmul %mm0,%mm5
+	movq %mm4,112(%esi)
+	movd %mm5,124(%esi)
+	psrlq $32,%mm5
+	movd %mm5,120(%esi)
+
+	// 5
+	movl $-1,%eax
+	movd %eax,%mm1
+	movl $1,%eax
+	movd %eax,%mm0
+	/ L | H
+	punpckldq %mm1,%mm0
+	pi2fd %mm0,%mm0
+	/ 1.0 | -1.0
+	movd %eax,%mm1
+	pi2fd %mm1,%mm1
+	movl mpg123_pnts+16,%eax
+	movd 0(%eax),%mm2
+	punpckldq %mm2,%mm1
+	/ 1.0 | cos0
+	movq 0(%esi),%mm2
+	/ 0
+	movq %mm2,%mm3
+	pfmul %mm0,%mm3
+	pfacc %mm3,%mm2
+	pfmul %mm1,%mm2
+	movq %mm2,0(%ebx)
+	movq 8(%esi),%mm4
+	movq %mm4,%mm5
+	pfmul %mm0,%mm5
+	pfacc %mm5,%mm4
+	pfmul %mm0,%mm4
+	pfmul %mm1,%mm4
+	movq %mm4,%mm5
+	psrlq $32,%mm5
+	pfacc %mm5,%mm4
+	movq %mm4,8(%ebx)
+	movq 16(%esi),%mm2
+	/ 4
+	movq %mm2,%mm3
+	pfmul %mm0,%mm3
+	pfacc %mm3,%mm2 
+	pfmul %mm1,%mm2
+	movq 24(%esi),%mm4
+	movq %mm4,%mm5
+	pfmul %mm0,%mm5
+	pfacc %mm5,%mm4
+	pfmul %mm0,%mm4
+	pfmul %mm1,%mm4
+	movq %mm4,%mm5
+	psrlq $32,%mm5
+	pfacc %mm5,%mm4
+	movq %mm2,%mm3
+	psrlq $32,%mm3
+	pfadd %mm4,%mm2
+	pfadd %mm3,%mm4
+	movq %mm2,16(%ebx)
+	movq %mm4,24(%ebx)
+	movq 32(%esi),%mm2
+	/ 8
+	movq %mm2,%mm3
+	pfmul %mm0,%mm3
+	pfacc %mm3,%mm2
+	pfmul %mm1,%mm2
+	movq %mm2,32(%ebx)
+	movq 40(%esi),%mm4
+	movq %mm4,%mm5
+	pfmul %mm0,%mm5
+	pfacc %mm5,%mm4
+	pfmul %mm0,%mm4
+	pfmul %mm1,%mm4
+	movq %mm4,%mm5
+	psrlq $32,%mm5
+	pfacc %mm5,%mm4
+	movq %mm4,40(%ebx)
+	movq 48(%esi),%mm2
+	/ 12
+	movq %mm2,%mm3
+	pfmul %mm0,%mm3
+	pfacc %mm3,%mm2 
+	pfmul %mm1,%mm2
+	movq 56(%esi),%mm4
+	movq %mm4,%mm5
+	pfmul %mm0,%mm5
+	pfacc %mm5,%mm4
+	pfmul %mm0,%mm4
+	pfmul %mm1,%mm4
+	movq %mm4,%mm5
+	psrlq $32,%mm5
+	pfacc %mm5,%mm4
+	movq %mm2,%mm3
+	psrlq $32,%mm3
+	pfadd %mm4,%mm2
+	pfadd %mm3,%mm4
+	movq %mm2,48(%ebx)
+	movq %mm4,56(%ebx)
+	movq 64(%esi),%mm2
+	/ 16
+	movq %mm2,%mm3
+	pfmul %mm0,%mm3
+	pfacc %mm3,%mm2
+	pfmul %mm1,%mm2
+	movq %mm2,64(%ebx)
+	movq 72(%esi),%mm4
+	movq %mm4,%mm5
+	pfmul %mm0,%mm5
+	pfacc %mm5,%mm4
+	pfmul %mm0,%mm4
+	pfmul %mm1,%mm4
+	movq %mm4,%mm5
+	psrlq $32,%mm5
+	pfacc %mm5,%mm4
+	movq %mm4,72(%ebx)
+	movq 80(%esi),%mm2
+	/ 20
+	movq %mm2,%mm3
+	pfmul %mm0,%mm3
+	pfacc %mm3,%mm2 
+	pfmul %mm1,%mm2
+	movq 88(%esi),%mm4
+	movq %mm4,%mm5
+	pfmul %mm0,%mm5
+	pfacc %mm5,%mm4
+	pfmul %mm0,%mm4
+	pfmul %mm1,%mm4
+	movq %mm4,%mm5
+	psrlq $32,%mm5
+	pfacc %mm5,%mm4
+	movq %mm2,%mm3
+	psrlq $32,%mm3
+	pfadd %mm4,%mm2
+	pfadd %mm3,%mm4
+	movq %mm2,80(%ebx)
+	movq %mm4,88(%ebx)
+	movq 96(%esi),%mm2
+	/ 24
+	movq %mm2,%mm3
+	pfmul %mm0,%mm3
+	pfacc %mm3,%mm2
+	pfmul %mm1,%mm2
+	movq %mm2,96(%ebx)
+	movq 104(%esi),%mm4
+	movq %mm4,%mm5
+	pfmul %mm0,%mm5
+	pfacc %mm5,%mm4
+	pfmul %mm0,%mm4
+	pfmul %mm1,%mm4
+	movq %mm4,%mm5
+	psrlq $32,%mm5
+	pfacc %mm5,%mm4
+	movq %mm4,104(%ebx)
+	movq 112(%esi),%mm2
+	/ 28
+	movq %mm2,%mm3
+	pfmul %mm0,%mm3
+	pfacc %mm3,%mm2 
+	pfmul %mm1,%mm2
+	movq 120(%esi),%mm4
+	movq %mm4,%mm5
+	pfmul %mm0,%mm5
+	pfacc %mm5,%mm4
+	pfmul %mm0,%mm4
+	pfmul %mm1,%mm4
+	movq %mm4,%mm5
+	psrlq $32,%mm5
+	pfacc %mm5,%mm4
+	movq %mm2,%mm3
+	psrlq $32,%mm3
+	pfadd %mm4,%mm2
+	pfadd %mm3,%mm4
+	movq %mm2,112(%ebx)
+	movq %mm4,120(%ebx)
+
+	// Phase6
+	movl 0(%ebx),%eax
+	movl %eax,1024(%ebp)
+	movl 4(%ebx),%eax
+	movl %eax,0(%ebp)
+	movl %eax,0(%edx)
+	movl 8(%ebx),%eax
+	movl %eax,512(%ebp)
+	movl 12(%ebx),%eax
+	movl %eax,512(%edx)
+
+	movl 16(%ebx),%eax
+	movl %eax,768(%ebp)
+	movl 20(%ebx),%eax
+	movl %eax,256(%edx)
+
+	movl 24(%ebx),%eax
+	movl %eax,256(%ebp)
+	movl 28(%ebx),%eax
+	movl %eax,768(%edx)
+
+	movq 32(%ebx),%mm0
+	movq 48(%ebx),%mm1
+	pfadd %mm1,%mm0
+	movd %mm0,896(%ebp)
+	psrlq $32,%mm0
+	movd %mm0,128(%edx)
+	movq 40(%ebx),%mm2
+	pfadd %mm2,%mm1
+	movd %mm1,640(%ebp)
+	psrlq $32,%mm1
+	movd %mm1,384(%edx)
+
+	movq 56(%ebx),%mm3
+	pfadd %mm3,%mm2
+	movd %mm2,384(%ebp)
+        psrlq $32,%mm2
+	movd %mm2,640(%edx)
+
+	movd 36(%ebx),%mm4
+	pfadd %mm4,%mm3
+	movd %mm3,128(%ebp)
+	psrlq $32,%mm3
+	movd %mm3,896(%edx)
+	movq 96(%ebx),%mm0
+	movq 64(%ebx),%mm1
+
+	movq 112(%ebx),%mm2
+        pfadd %mm2,%mm0
+	movq %mm0,%mm3
+	pfadd %mm1,%mm3
+	movd %mm3,960(%ebp)
+	psrlq $32,%mm3
+	movd %mm3,64(%edx)
+	movq 80(%ebx),%mm1
+	pfadd %mm1,%mm0
+	movd %mm0,832(%ebp)
+        psrlq $32,%mm0
+	movd %mm0,192(%edx)
+	movq 104(%ebx),%mm3
+	pfadd %mm3,%mm2
+	movq %mm2,%mm4
+	pfadd %mm1,%mm4
+	movd %mm4,704(%ebp)
+	psrlq $32,%mm4
+	movd %mm4,320(%edx)
+	movq 72(%ebx),%mm1
+	pfadd %mm1,%mm2
+	movd %mm2,576(%ebp)
+	psrlq $32,%mm2
+	movd %mm2,448(%edx)
+
+	movq 120(%ebx),%mm4
+	pfadd %mm4,%mm3
+	movq %mm3,%mm5
+	pfadd %mm1,%mm5
+	movd %mm5,448(%ebp)
+	psrlq $32,%mm5
+	movd %mm5,576(%edx)
+	movq 88(%ebx),%mm1
+	pfadd %mm1,%mm3
+	movd %mm3,320(%ebp)
+	psrlq $32,%mm3
+	movd %mm3,704(%edx)
+
+	movd 100(%ebx),%mm5
+	pfadd %mm5,%mm4
+	movq %mm4,%mm6
+	pfadd %mm1,%mm6
+	movd %mm6,192(%ebp)
+	psrlq $32,%mm6
+	movd %mm6,832(%edx)
+	movd 68(%ebx),%mm1
+	pfadd %mm1,%mm4
+	movd %mm4,64(%ebp)
+	psrlq $32,%mm4
+	movd %mm4,960(%edx)
+
+	/ femms
+
+        popl %ebx
+	popl %esi
+	popl %edi
+        popl %ebp
+	addl $256,%esp
+	
+        ret
+

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64_MMX.s
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64_MMX.s	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64_MMX.s	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,836 @@
+.data
+	.align 32
+costab:
+	.long 1056974725
+	.long 1057056395
+	.long 1057223771
+	.long 1057485416
+	.long 1057855544
+	.long 1058356026
+	.long 1059019886
+	.long 1059897405
+	.long 1061067246
+	.long 1062657950
+	.long 1064892987
+	.long 1066774581
+	.long 1069414683
+	.long 1073984175
+	.long 1079645762
+	.long 1092815430
+	.long 1057005197
+	.long 1057342072
+	.long 1058087743
+	.long 1059427869
+	.long 1061799040
+	.long 1065862217
+	.long 1071413542
+	.long 1084439708
+	.long 1057128951
+	.long 1058664893
+	.long 1063675095
+	.long 1076102863
+	.long 1057655764
+	.long 1067924853
+	.long 1060439283
+
+.text
+
+	.align 32
+.globl mpg123_dct64_mmx
+mpg123_dct64_mmx:
+
+	xorl %ecx,%ecx
+.globl dct64_MMX
+dct64_MMX:
+	pushl %ebx
+	pushl %esi
+	pushl %edi
+	subl $256,%esp
+	movl 280(%esp),%eax
+	flds     (%eax)
+	leal 128(%esp),%edx
+	fadds 124(%eax)
+	movl 272(%esp),%esi
+	fstps    (%edx)
+	movl 276(%esp),%edi
+	flds    4(%eax)
+	movl $costab,%ebx
+	fadds 120(%eax)
+	orl %ecx,%ecx
+	fstps   4(%edx)
+	flds     (%eax)
+	movl %esp,%ecx
+	fsubs 124(%eax)
+	fmuls    (%ebx)
+	fstps 124(%edx)
+	flds    4(%eax)
+	fsubs 120(%eax)
+	fmuls   4(%ebx)
+	fstps 120(%edx)
+	flds    8(%eax)
+	fadds 116(%eax)
+	fstps   8(%edx)
+	flds   12(%eax)
+	fadds 112(%eax)
+	fstps  12(%edx)
+	flds    8(%eax)
+	fsubs 116(%eax)
+	fmuls   8(%ebx)
+	fstps 116(%edx)
+	flds   12(%eax)
+	fsubs 112(%eax)
+	fmuls  12(%ebx)
+	fstps 112(%edx)
+	flds   16(%eax)
+	fadds 108(%eax)
+	fstps  16(%edx)
+	flds   20(%eax)
+	fadds 104(%eax)
+	fstps  20(%edx)
+	flds   16(%eax)
+	fsubs 108(%eax)
+	fmuls  16(%ebx)
+	fstps 108(%edx)
+	flds   20(%eax)
+	fsubs 104(%eax)
+	fmuls  20(%ebx)
+	fstps 104(%edx)
+	flds   24(%eax)
+	fadds 100(%eax)
+	fstps  24(%edx)
+	flds   28(%eax)
+	fadds  96(%eax)
+	fstps  28(%edx)
+	flds   24(%eax)
+	fsubs 100(%eax)
+	fmuls  24(%ebx)
+	fstps 100(%edx)
+	flds   28(%eax)
+	fsubs  96(%eax)
+	fmuls  28(%ebx)
+	fstps  96(%edx)
+	flds   32(%eax)
+	fadds  92(%eax)
+	fstps  32(%edx)
+	flds   36(%eax)
+	fadds  88(%eax)
+	fstps  36(%edx)
+	flds   32(%eax)
+	fsubs  92(%eax)
+	fmuls  32(%ebx)
+	fstps  92(%edx)
+	flds   36(%eax)
+	fsubs  88(%eax)
+	fmuls  36(%ebx)
+	fstps  88(%edx)
+	flds   40(%eax)
+	fadds  84(%eax)
+	fstps  40(%edx)
+	flds   44(%eax)
+	fadds  80(%eax)
+	fstps  44(%edx)
+	flds   40(%eax)
+	fsubs  84(%eax)
+	fmuls  40(%ebx)
+	fstps  84(%edx)
+	flds   44(%eax)
+	fsubs  80(%eax)
+	fmuls  44(%ebx)
+	fstps  80(%edx)
+	flds   48(%eax)
+	fadds  76(%eax)
+	fstps  48(%edx)
+	flds   52(%eax)
+	fadds  72(%eax)
+	fstps  52(%edx)
+	flds   48(%eax)
+	fsubs  76(%eax)
+	fmuls  48(%ebx)
+	fstps  76(%edx)
+	flds   52(%eax)
+	fsubs  72(%eax)
+	fmuls  52(%ebx)
+	fstps  72(%edx)
+	flds   56(%eax)
+	fadds  68(%eax)
+	fstps  56(%edx)
+	flds   60(%eax)
+	fadds  64(%eax)
+	fstps  60(%edx)
+	flds   56(%eax)
+	fsubs  68(%eax)
+	fmuls  56(%ebx)
+	fstps  68(%edx)
+	flds   60(%eax)
+	fsubs  64(%eax)
+	fmuls  60(%ebx)
+	fstps  64(%edx)
+	
+	flds     (%edx)
+	fadds  60(%edx)
+	fstps    (%ecx)
+	flds    4(%edx)
+	fadds  56(%edx)
+	fstps   4(%ecx)
+	flds     (%edx)
+	fsubs  60(%edx)
+	fmuls  64(%ebx)
+	fstps  60(%ecx)
+	flds    4(%edx)
+	fsubs  56(%edx)
+	fmuls  68(%ebx)
+	fstps  56(%ecx)
+	flds    8(%edx)
+	fadds  52(%edx)
+	fstps   8(%ecx)
+	flds   12(%edx)
+	fadds  48(%edx)
+	fstps  12(%ecx)
+	flds    8(%edx)
+	fsubs  52(%edx)
+	fmuls  72(%ebx)
+	fstps  52(%ecx)
+	flds   12(%edx)
+	fsubs  48(%edx)
+	fmuls  76(%ebx)
+	fstps  48(%ecx)
+	flds   16(%edx)
+	fadds  44(%edx)
+	fstps  16(%ecx)
+	flds   20(%edx)
+	fadds  40(%edx)
+	fstps  20(%ecx)
+	flds   16(%edx)
+	fsubs  44(%edx)
+	fmuls  80(%ebx)
+	fstps  44(%ecx)
+	flds   20(%edx)
+	fsubs  40(%edx)
+	fmuls  84(%ebx)
+	fstps  40(%ecx)
+	flds   24(%edx)
+	fadds  36(%edx)
+	fstps  24(%ecx)
+	flds   28(%edx)
+	fadds  32(%edx)
+	fstps  28(%ecx)
+	flds   24(%edx)
+	fsubs  36(%edx)
+	fmuls  88(%ebx)
+	fstps  36(%ecx)
+	flds   28(%edx)
+	fsubs  32(%edx)
+	fmuls  92(%ebx)
+	fstps  32(%ecx)
+	
+	flds   64(%edx)
+	fadds 124(%edx)
+	fstps  64(%ecx)
+	flds   68(%edx)
+	fadds 120(%edx)
+	fstps  68(%ecx)
+	flds  124(%edx)
+	fsubs  64(%edx)
+	fmuls  64(%ebx)
+	fstps 124(%ecx)
+	flds  120(%edx)
+	fsubs  68(%edx)
+	fmuls  68(%ebx)
+	fstps 120(%ecx)
+	flds   72(%edx)
+	fadds 116(%edx)
+	fstps  72(%ecx)
+	flds   76(%edx)
+	fadds 112(%edx)
+	fstps  76(%ecx)
+	flds  116(%edx)
+	fsubs  72(%edx)
+	fmuls  72(%ebx)
+	fstps 116(%ecx)
+	flds  112(%edx)
+	fsubs  76(%edx)
+	fmuls  76(%ebx)
+	fstps 112(%ecx)
+	flds   80(%edx)
+	fadds 108(%edx)
+	fstps  80(%ecx)
+	flds   84(%edx)
+	fadds 104(%edx)
+	fstps  84(%ecx)
+	flds  108(%edx)
+	fsubs  80(%edx)
+	fmuls  80(%ebx)
+	fstps 108(%ecx)
+	flds  104(%edx)
+	fsubs  84(%edx)
+	fmuls  84(%ebx)
+	fstps 104(%ecx)
+	flds   88(%edx)
+	fadds 100(%edx)
+	fstps  88(%ecx)
+	flds   92(%edx)
+	fadds  96(%edx)
+	fstps  92(%ecx)
+	flds  100(%edx)
+	fsubs  88(%edx)
+	fmuls  88(%ebx)
+	fstps 100(%ecx)
+	flds   96(%edx)
+	fsubs  92(%edx)
+	fmuls  92(%ebx)
+	fstps  96(%ecx)
+	
+	flds     (%ecx)
+	fadds  28(%ecx)
+	fstps    (%edx)
+	flds     (%ecx)
+	fsubs  28(%ecx)
+	fmuls  96(%ebx)
+	fstps  28(%edx)
+	flds    4(%ecx)
+	fadds  24(%ecx)
+	fstps   4(%edx)
+	flds    4(%ecx)
+	fsubs  24(%ecx)
+	fmuls 100(%ebx)
+	fstps  24(%edx)
+	flds    8(%ecx)
+	fadds  20(%ecx)
+	fstps   8(%edx)
+	flds    8(%ecx)
+	fsubs  20(%ecx)
+	fmuls 104(%ebx)
+	fstps  20(%edx)
+	flds   12(%ecx)
+	fadds  16(%ecx)
+	fstps  12(%edx)
+	flds   12(%ecx)
+	fsubs  16(%ecx)
+	fmuls 108(%ebx)
+	fstps  16(%edx)
+	flds   32(%ecx)
+	fadds  60(%ecx)
+	fstps  32(%edx)
+	flds   60(%ecx)
+	fsubs  32(%ecx)
+	fmuls  96(%ebx)
+	fstps  60(%edx)
+	flds   36(%ecx)
+	fadds  56(%ecx)
+	fstps  36(%edx)
+	flds   56(%ecx)
+	fsubs  36(%ecx)
+	fmuls 100(%ebx)
+	fstps  56(%edx)
+	flds   40(%ecx)
+	fadds  52(%ecx)
+	fstps  40(%edx)
+	flds   52(%ecx)
+	fsubs  40(%ecx)
+	fmuls 104(%ebx)
+	fstps  52(%edx)
+	flds   44(%ecx)
+	fadds  48(%ecx)
+	fstps  44(%edx)
+	flds   48(%ecx)
+	fsubs  44(%ecx)
+	fmuls 108(%ebx)
+	fstps  48(%edx)
+	flds   64(%ecx)
+	fadds  92(%ecx)
+	fstps  64(%edx)
+	flds   64(%ecx)
+	fsubs  92(%ecx)
+	fmuls  96(%ebx)
+	fstps  92(%edx)
+	flds   68(%ecx)
+	fadds  88(%ecx)
+	fstps  68(%edx)
+	flds   68(%ecx)
+	fsubs  88(%ecx)
+	fmuls 100(%ebx)
+	fstps  88(%edx)
+	flds   72(%ecx)
+	fadds  84(%ecx)
+	fstps  72(%edx)
+	flds   72(%ecx)
+	fsubs  84(%ecx)
+	fmuls 104(%ebx)
+	fstps  84(%edx)
+	flds   76(%ecx)
+	fadds  80(%ecx)
+	fstps  76(%edx)
+	flds   76(%ecx)
+	fsubs  80(%ecx)
+	fmuls 108(%ebx)
+	fstps  80(%edx)
+	flds   96(%ecx)
+	fadds 124(%ecx)
+	fstps  96(%edx)
+	flds  124(%ecx)
+	fsubs  96(%ecx)
+	fmuls  96(%ebx)
+	fstps 124(%edx)
+	flds  100(%ecx)
+	fadds 120(%ecx)
+	fstps 100(%edx)
+	flds  120(%ecx)
+	fsubs 100(%ecx)
+	fmuls 100(%ebx)
+	fstps 120(%edx)
+	flds  104(%ecx)
+	fadds 116(%ecx)
+	fstps 104(%edx)
+	flds  116(%ecx)
+	fsubs 104(%ecx)
+	fmuls 104(%ebx)
+	fstps 116(%edx)
+	flds  108(%ecx)
+	fadds 112(%ecx)
+	fstps 108(%edx)
+	flds  112(%ecx)
+	fsubs 108(%ecx)
+	fmuls 108(%ebx)
+	fstps 112(%edx)
+	flds     (%edx)
+	fadds  12(%edx)
+	fstps    (%ecx)
+	flds     (%edx)
+	fsubs  12(%edx)
+	fmuls 112(%ebx)
+	fstps  12(%ecx)
+	flds    4(%edx)
+	fadds   8(%edx)
+	fstps   4(%ecx)
+	flds    4(%edx)
+	fsubs   8(%edx)
+	fmuls 116(%ebx)
+	fstps   8(%ecx)
+	flds   16(%edx)
+	fadds  28(%edx)
+	fstps  16(%ecx)
+	flds   28(%edx)
+	fsubs  16(%edx)
+	fmuls 112(%ebx)
+	fstps  28(%ecx)
+	flds   20(%edx)
+	fadds  24(%edx)
+	fstps  20(%ecx)
+	flds   24(%edx)
+	fsubs  20(%edx)
+	fmuls 116(%ebx)
+	fstps  24(%ecx)
+	flds   32(%edx)
+	fadds  44(%edx)
+	fstps  32(%ecx)
+	flds   32(%edx)
+	fsubs  44(%edx)
+	fmuls 112(%ebx)
+	fstps  44(%ecx)
+	flds   36(%edx)
+	fadds  40(%edx)
+	fstps  36(%ecx)
+	flds   36(%edx)
+	fsubs  40(%edx)
+	fmuls 116(%ebx)
+	fstps  40(%ecx)
+	flds   48(%edx)
+	fadds  60(%edx)
+	fstps  48(%ecx)
+	flds   60(%edx)
+	fsubs  48(%edx)
+	fmuls 112(%ebx)
+	fstps  60(%ecx)
+	flds   52(%edx)
+	fadds  56(%edx)
+	fstps  52(%ecx)
+	flds   56(%edx)
+	fsubs  52(%edx)
+	fmuls 116(%ebx)
+	fstps  56(%ecx)
+	flds   64(%edx)
+	fadds  76(%edx)
+	fstps  64(%ecx)
+	flds   64(%edx)
+	fsubs  76(%edx)
+	fmuls 112(%ebx)
+	fstps  76(%ecx)
+	flds   68(%edx)
+	fadds  72(%edx)
+	fstps  68(%ecx)
+	flds   68(%edx)
+	fsubs  72(%edx)
+	fmuls 116(%ebx)
+	fstps  72(%ecx)
+	flds   80(%edx)
+	fadds  92(%edx)
+	fstps  80(%ecx)
+	flds   92(%edx)
+	fsubs  80(%edx)
+	fmuls 112(%ebx)
+	fstps  92(%ecx)
+	flds   84(%edx)
+	fadds  88(%edx)
+	fstps  84(%ecx)
+	flds   88(%edx)
+	fsubs  84(%edx)
+	fmuls 116(%ebx)
+	fstps  88(%ecx)
+	flds   96(%edx)
+	fadds 108(%edx)
+	fstps  96(%ecx)
+	flds   96(%edx)
+	fsubs 108(%edx)
+	fmuls 112(%ebx)
+	fstps 108(%ecx)
+	flds  100(%edx)
+	fadds 104(%edx)
+	fstps 100(%ecx)
+	flds  100(%edx)
+	fsubs 104(%edx)
+	fmuls 116(%ebx)
+	fstps 104(%ecx)
+	flds  112(%edx)
+	fadds 124(%edx)
+	fstps 112(%ecx)
+	flds  124(%edx)
+	fsubs 112(%edx)
+	fmuls 112(%ebx)
+	fstps 124(%ecx)
+	flds  116(%edx)
+	fadds 120(%edx)
+	fstps 116(%ecx)
+	flds  120(%edx)
+	fsubs 116(%edx)
+	fmuls 116(%ebx)
+	fstps 120(%ecx)
+	
+	flds   32(%ecx)
+	fadds  36(%ecx)
+	fstps  32(%edx)
+	flds   32(%ecx)
+	fsubs  36(%ecx)
+	fmuls 120(%ebx)
+	fstps  36(%edx)
+	flds   44(%ecx)
+	fsubs  40(%ecx)
+	fmuls 120(%ebx)
+	fsts   44(%edx)
+	fadds  40(%ecx)
+	fadds  44(%ecx)
+	fstps  40(%edx)
+	flds   48(%ecx)
+	fsubs  52(%ecx)
+	fmuls 120(%ebx)
+	flds   60(%ecx)
+	fsubs  56(%ecx)
+	fmuls 120(%ebx)
+	fld      %st(0)
+	fadds  56(%ecx)
+	fadds  60(%ecx)
+	fld      %st(0)
+	fadds  48(%ecx)
+	fadds  52(%ecx)
+	fstps  48(%edx)
+	fadd     %st(2)
+	fstps  56(%edx)
+	fsts   60(%edx)
+	faddp    %st(1)
+	fstps  52(%edx)
+	flds   64(%ecx)
+	fadds  68(%ecx)
+	fstps  64(%edx)
+	flds   64(%ecx)
+	fsubs  68(%ecx)
+	fmuls 120(%ebx)
+	fstps  68(%edx)
+	flds   76(%ecx)
+	fsubs  72(%ecx)
+	fmuls 120(%ebx)
+	fsts   76(%edx)
+	fadds  72(%ecx)
+	fadds  76(%ecx)
+	fstps  72(%edx)
+	flds   92(%ecx)
+	fsubs  88(%ecx)
+	fmuls 120(%ebx)
+	fsts   92(%edx)
+	fadds  92(%ecx)
+	fadds  88(%ecx)
+	fld      %st(0)
+	fadds  80(%ecx)
+	fadds  84(%ecx)
+	fstps  80(%edx)
+	flds   80(%ecx)
+	fsubs  84(%ecx)
+	fmuls 120(%ebx)
+	fadd  %st(0), %st(1)
+	fadds 92(%edx)
+	fstps 84(%edx)
+	fstps 88(%edx)
+	flds   96(%ecx)
+	fadds 100(%ecx)
+	fstps  96(%edx)
+	flds   96(%ecx)
+	fsubs 100(%ecx)
+	fmuls 120(%ebx)
+	fstps 100(%edx)
+	flds  108(%ecx)
+	fsubs 104(%ecx)
+	fmuls 120(%ebx)
+	fsts  108(%edx)
+	fadds 104(%ecx)
+	fadds 108(%ecx)
+	fstps 104(%edx)
+	flds  124(%ecx)
+	fsubs 120(%ecx)
+	fmuls 120(%ebx)
+	fsts  124(%edx)
+	fadds 120(%ecx)
+	fadds 124(%ecx)
+	fld      %st(0)
+	fadds 112(%ecx)
+	fadds 116(%ecx)
+	fstps 112(%edx)
+	flds  112(%ecx)
+	fsubs 116(%ecx)
+	fmuls 120(%ebx)
+	fadd  %st(0),%st(1)
+	fadds 124(%edx)
+	fstps 116(%edx)
+	fstps 120(%edx)
+	jnz .L01
+	
+	flds      (%ecx)
+	fadds    4(%ecx)
+	fstps 1024(%esi)
+	flds      (%ecx)
+	fsubs    4(%ecx)
+	fmuls  120(%ebx)
+	fsts      (%esi)
+	fstps     (%edi)
+	flds   12(%ecx)
+	fsubs   8(%ecx)
+	fmuls 120(%ebx)
+	fsts  512(%edi)
+	fadds  12(%ecx)
+	fadds   8(%ecx)
+	fstps 512(%esi)
+	flds   16(%ecx)
+	fsubs  20(%ecx)
+	fmuls 120(%ebx)
+	flds   28(%ecx)
+	fsubs  24(%ecx)
+	fmuls 120(%ebx)
+	fsts  768(%edi)
+	fld      %st(0)
+	fadds  24(%ecx)
+	fadds  28(%ecx)
+	fld      %st(0)
+	fadds  16(%ecx)
+	fadds  20(%ecx)
+	fstps 768(%esi)
+	fadd     %st(2)
+	fstps 256(%esi)
+	faddp    %st(1)
+	fstps 256(%edi)
+	
+	flds   32(%edx)
+	fadds  48(%edx)
+	fstps 896(%esi)
+	flds   48(%edx)
+	fadds  40(%edx)
+	fstps 640(%esi)
+	flds   40(%edx)
+	fadds  56(%edx)
+	fstps 384(%esi)
+	flds   56(%edx)
+	fadds  36(%edx)
+	fstps 128(%esi)
+	flds   36(%edx)
+	fadds  52(%edx)
+	fstps 128(%edi)
+	flds   52(%edx)
+	fadds  44(%edx)
+	fstps 384(%edi)
+	flds   60(%edx)
+	fsts  896(%edi)
+	fadds  44(%edx)
+	fstps 640(%edi)
+	flds   96(%edx)
+	fadds 112(%edx)
+	fld      %st(0)
+	fadds  64(%edx)
+	fstps 960(%esi)
+	fadds  80(%edx)
+	fstps 832(%esi)
+	flds  112(%edx)
+	fadds 104(%edx)
+	fld      %st(0)
+	fadds  80(%edx)
+	fstps 704(%esi)
+	fadds  72(%edx)
+	fstps 576(%esi)
+	flds  104(%edx)
+	fadds 120(%edx)
+	fld      %st(0)
+	fadds  72(%edx)
+	fstps 448(%esi)
+	fadds  88(%edx)
+	fstps 320(%esi)
+	flds  120(%edx)
+	fadds 100(%edx)
+	fld      %st(0)
+	fadds  88(%edx)
+	fstps 192(%esi)
+	fadds  68(%edx)
+	fstps  64(%esi)
+	flds  100(%edx)
+	fadds 116(%edx)
+	fld      %st(0)
+	fadds  68(%edx)
+	fstps  64(%edi)
+	fadds  84(%edx)
+	fstps 192(%edi)
+	flds  116(%edx)
+	fadds 108(%edx)
+	fld      %st(0)
+	fadds  84(%edx)
+	fstps 320(%edi)
+	fadds  76(%edx)
+	fstps 448(%edi)
+	flds  108(%edx)
+	fadds 124(%edx)
+	fld      %st(0)
+	fadds  76(%edx)
+	fstps 576(%edi)
+	fadds  92(%edx)
+	fstps 704(%edi)
+	flds  124(%edx)
+	fsts  960(%edi)
+	fadds  92(%edx)
+	fstps 832(%edi)
+	addl $256,%esp
+	popl %edi
+	popl %esi
+	popl %ebx
+	ret
+.L01:	
+	flds      (%ecx)
+	fadds    4(%ecx)
+	fistp  512(%esi)
+	flds      (%ecx)
+	fsubs    4(%ecx)
+	fmuls  120(%ebx)
+
+	fistp     (%esi)
+
+	flds    12(%ecx)
+	fsubs    8(%ecx)
+	fmuls  120(%ebx)
+	fist   256(%edi)
+	fadds   12(%ecx)
+	fadds    8(%ecx)
+	fistp  256(%esi)
+	flds   16(%ecx)
+	fsubs  20(%ecx)
+	fmuls 120(%ebx)
+	flds   28(%ecx)
+	fsubs  24(%ecx)
+	fmuls 120(%ebx)
+	fist  384(%edi)
+	fld      %st(0)
+	fadds  24(%ecx)
+	fadds  28(%ecx)
+	fld      %st(0)
+	fadds  16(%ecx)
+	fadds  20(%ecx)
+	fistp  384(%esi)
+	fadd     %st(2)
+	fistp  128(%esi)
+	faddp    %st(1)
+	fistp  128(%edi)
+	
+	flds    32(%edx)
+	fadds   48(%edx)
+	fistp  448(%esi)
+	flds   48(%edx)
+	fadds  40(%edx)
+	fistp 320(%esi)
+	flds   40(%edx)
+	fadds  56(%edx)
+	fistp 192(%esi)
+	flds   56(%edx)
+	fadds  36(%edx)
+	fistp  64(%esi)
+	flds   36(%edx)
+	fadds  52(%edx)
+	fistp  64(%edi)
+	flds   52(%edx)
+	fadds  44(%edx)
+	fistp 192(%edi)
+	flds   60(%edx)
+	fist   448(%edi)
+	fadds  44(%edx)
+	fistp 320(%edi)
+	flds   96(%edx)
+	fadds 112(%edx)
+	fld      %st(0)
+	fadds  64(%edx)
+	fistp 480(%esi)
+	fadds  80(%edx)
+	fistp 416(%esi)
+	flds  112(%edx)
+	fadds 104(%edx)
+	fld      %st(0)
+	fadds  80(%edx)
+	fistp 352(%esi)
+	fadds  72(%edx)
+	fistp 288(%esi)
+	flds  104(%edx)
+	fadds 120(%edx)
+	fld      %st(0)
+	fadds  72(%edx)
+	fistp 224(%esi)
+	fadds  88(%edx)
+	fistp 160(%esi)
+	flds  120(%edx)
+	fadds 100(%edx)
+	fld      %st(0)
+	fadds  88(%edx)
+	fistp  96(%esi)
+	fadds  68(%edx)
+	fistp  32(%esi)
+	flds  100(%edx)
+	fadds 116(%edx)
+	fld      %st(0)
+	fadds  68(%edx)
+	fistp  32(%edi)
+	fadds  84(%edx)
+	fistp  96(%edi)
+	flds  116(%edx)
+	fadds 108(%edx)
+	fld      %st(0)
+	fadds  84(%edx)
+	fistp 160(%edi)
+	fadds  76(%edx)
+	fistp 224(%edi)
+	flds  108(%edx)
+	fadds 124(%edx)
+	fld      %st(0)
+	fadds  76(%edx)
+	fistp 288(%edi)
+	fadds  92(%edx)
+	fistp 352(%edi)
+	flds  124(%edx)
+	fist  480(%edi)
+	fadds  92(%edx)
+	fistp 416(%edi)
+	movsw
+	addl $256,%esp
+	popl %edi
+	popl %esi
+	popl %ebx
+	ret
+	
+

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64_i386.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64_i386.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dct64_i386.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,316 @@
+
+/*
+ * Discrete Cosine Tansform (DCT) for subband synthesis
+ * optimized for machines with no auto-increment. 
+ * The performance is highly compiler dependend. Maybe
+ * the mpg123_dct64.c version for 'normal' processor may be faster
+ * even for Intel processors.
+ */
+
+#include "mpg123.h"
+
+static void
+mpg123_dct64_1(real * out0, real * out1, real * b1, real * b2, real * samples)
+{
+
+    {
+        register real *costab = mpg123_pnts[0];
+
+        b1[0x00] = samples[0x00] + samples[0x1F];
+        b1[0x1F] = (samples[0x00] - samples[0x1F]) * costab[0x0];
+
+        b1[0x01] = samples[0x01] + samples[0x1E];
+        b1[0x1E] = (samples[0x01] - samples[0x1E]) * costab[0x1];
+
+        b1[0x02] = samples[0x02] + samples[0x1D];
+        b1[0x1D] = (samples[0x02] - samples[0x1D]) * costab[0x2];
+
+        b1[0x03] = samples[0x03] + samples[0x1C];
+        b1[0x1C] = (samples[0x03] - samples[0x1C]) * costab[0x3];
+
+        b1[0x04] = samples[0x04] + samples[0x1B];
+        b1[0x1B] = (samples[0x04] - samples[0x1B]) * costab[0x4];
+
+        b1[0x05] = samples[0x05] + samples[0x1A];
+        b1[0x1A] = (samples[0x05] - samples[0x1A]) * costab[0x5];
+
+        b1[0x06] = samples[0x06] + samples[0x19];
+        b1[0x19] = (samples[0x06] - samples[0x19]) * costab[0x6];
+
+        b1[0x07] = samples[0x07] + samples[0x18];
+        b1[0x18] = (samples[0x07] - samples[0x18]) * costab[0x7];
+
+        b1[0x08] = samples[0x08] + samples[0x17];
+        b1[0x17] = (samples[0x08] - samples[0x17]) * costab[0x8];
+
+        b1[0x09] = samples[0x09] + samples[0x16];
+        b1[0x16] = (samples[0x09] - samples[0x16]) * costab[0x9];
+
+        b1[0x0A] = samples[0x0A] + samples[0x15];
+        b1[0x15] = (samples[0x0A] - samples[0x15]) * costab[0xA];
+
+        b1[0x0B] = samples[0x0B] + samples[0x14];
+        b1[0x14] = (samples[0x0B] - samples[0x14]) * costab[0xB];
+
+        b1[0x0C] = samples[0x0C] + samples[0x13];
+        b1[0x13] = (samples[0x0C] - samples[0x13]) * costab[0xC];
+
+        b1[0x0D] = samples[0x0D] + samples[0x12];
+        b1[0x12] = (samples[0x0D] - samples[0x12]) * costab[0xD];
+
+        b1[0x0E] = samples[0x0E] + samples[0x11];
+        b1[0x11] = (samples[0x0E] - samples[0x11]) * costab[0xE];
+
+        b1[0x0F] = samples[0x0F] + samples[0x10];
+        b1[0x10] = (samples[0x0F] - samples[0x10]) * costab[0xF];
+    }
+
+    {
+        register real *costab = mpg123_pnts[1];
+
+        b2[0x00] = b1[0x00] + b1[0x0F];
+        b2[0x0F] = (b1[0x00] - b1[0x0F]) * costab[0];
+        b2[0x01] = b1[0x01] + b1[0x0E];
+        b2[0x0E] = (b1[0x01] - b1[0x0E]) * costab[1];
+        b2[0x02] = b1[0x02] + b1[0x0D];
+        b2[0x0D] = (b1[0x02] - b1[0x0D]) * costab[2];
+        b2[0x03] = b1[0x03] + b1[0x0C];
+        b2[0x0C] = (b1[0x03] - b1[0x0C]) * costab[3];
+        b2[0x04] = b1[0x04] + b1[0x0B];
+        b2[0x0B] = (b1[0x04] - b1[0x0B]) * costab[4];
+        b2[0x05] = b1[0x05] + b1[0x0A];
+        b2[0x0A] = (b1[0x05] - b1[0x0A]) * costab[5];
+        b2[0x06] = b1[0x06] + b1[0x09];
+        b2[0x09] = (b1[0x06] - b1[0x09]) * costab[6];
+        b2[0x07] = b1[0x07] + b1[0x08];
+        b2[0x08] = (b1[0x07] - b1[0x08]) * costab[7];
+
+        b2[0x10] = b1[0x10] + b1[0x1F];
+        b2[0x1F] = (b1[0x1F] - b1[0x10]) * costab[0];
+        b2[0x11] = b1[0x11] + b1[0x1E];
+        b2[0x1E] = (b1[0x1E] - b1[0x11]) * costab[1];
+        b2[0x12] = b1[0x12] + b1[0x1D];
+        b2[0x1D] = (b1[0x1D] - b1[0x12]) * costab[2];
+        b2[0x13] = b1[0x13] + b1[0x1C];
+        b2[0x1C] = (b1[0x1C] - b1[0x13]) * costab[3];
+        b2[0x14] = b1[0x14] + b1[0x1B];
+        b2[0x1B] = (b1[0x1B] - b1[0x14]) * costab[4];
+        b2[0x15] = b1[0x15] + b1[0x1A];
+        b2[0x1A] = (b1[0x1A] - b1[0x15]) * costab[5];
+        b2[0x16] = b1[0x16] + b1[0x19];
+        b2[0x19] = (b1[0x19] - b1[0x16]) * costab[6];
+        b2[0x17] = b1[0x17] + b1[0x18];
+        b2[0x18] = (b1[0x18] - b1[0x17]) * costab[7];
+    }
+
+    {
+        register real *costab = mpg123_pnts[2];
+
+        b1[0x00] = b2[0x00] + b2[0x07];
+        b1[0x07] = (b2[0x00] - b2[0x07]) * costab[0];
+        b1[0x01] = b2[0x01] + b2[0x06];
+        b1[0x06] = (b2[0x01] - b2[0x06]) * costab[1];
+        b1[0x02] = b2[0x02] + b2[0x05];
+        b1[0x05] = (b2[0x02] - b2[0x05]) * costab[2];
+        b1[0x03] = b2[0x03] + b2[0x04];
+        b1[0x04] = (b2[0x03] - b2[0x04]) * costab[3];
+
+        b1[0x08] = b2[0x08] + b2[0x0F];
+        b1[0x0F] = (b2[0x0F] - b2[0x08]) * costab[0];
+        b1[0x09] = b2[0x09] + b2[0x0E];
+        b1[0x0E] = (b2[0x0E] - b2[0x09]) * costab[1];
+        b1[0x0A] = b2[0x0A] + b2[0x0D];
+        b1[0x0D] = (b2[0x0D] - b2[0x0A]) * costab[2];
+        b1[0x0B] = b2[0x0B] + b2[0x0C];
+        b1[0x0C] = (b2[0x0C] - b2[0x0B]) * costab[3];
+
+        b1[0x10] = b2[0x10] + b2[0x17];
+        b1[0x17] = (b2[0x10] - b2[0x17]) * costab[0];
+        b1[0x11] = b2[0x11] + b2[0x16];
+        b1[0x16] = (b2[0x11] - b2[0x16]) * costab[1];
+        b1[0x12] = b2[0x12] + b2[0x15];
+        b1[0x15] = (b2[0x12] - b2[0x15]) * costab[2];
+        b1[0x13] = b2[0x13] + b2[0x14];
+        b1[0x14] = (b2[0x13] - b2[0x14]) * costab[3];
+
+        b1[0x18] = b2[0x18] + b2[0x1F];
+        b1[0x1F] = (b2[0x1F] - b2[0x18]) * costab[0];
+        b1[0x19] = b2[0x19] + b2[0x1E];
+        b1[0x1E] = (b2[0x1E] - b2[0x19]) * costab[1];
+        b1[0x1A] = b2[0x1A] + b2[0x1D];
+        b1[0x1D] = (b2[0x1D] - b2[0x1A]) * costab[2];
+        b1[0x1B] = b2[0x1B] + b2[0x1C];
+        b1[0x1C] = (b2[0x1C] - b2[0x1B]) * costab[3];
+    }
+
+    {
+        register real const cos0 = mpg123_pnts[3][0];
+        register real const cos1 = mpg123_pnts[3][1];
+
+        b2[0x00] = b1[0x00] + b1[0x03];
+        b2[0x03] = (b1[0x00] - b1[0x03]) * cos0;
+        b2[0x01] = b1[0x01] + b1[0x02];
+        b2[0x02] = (b1[0x01] - b1[0x02]) * cos1;
+
+        b2[0x04] = b1[0x04] + b1[0x07];
+        b2[0x07] = (b1[0x07] - b1[0x04]) * cos0;
+        b2[0x05] = b1[0x05] + b1[0x06];
+        b2[0x06] = (b1[0x06] - b1[0x05]) * cos1;
+
+        b2[0x08] = b1[0x08] + b1[0x0B];
+        b2[0x0B] = (b1[0x08] - b1[0x0B]) * cos0;
+        b2[0x09] = b1[0x09] + b1[0x0A];
+        b2[0x0A] = (b1[0x09] - b1[0x0A]) * cos1;
+
+        b2[0x0C] = b1[0x0C] + b1[0x0F];
+        b2[0x0F] = (b1[0x0F] - b1[0x0C]) * cos0;
+        b2[0x0D] = b1[0x0D] + b1[0x0E];
+        b2[0x0E] = (b1[0x0E] - b1[0x0D]) * cos1;
+
+        b2[0x10] = b1[0x10] + b1[0x13];
+        b2[0x13] = (b1[0x10] - b1[0x13]) * cos0;
+        b2[0x11] = b1[0x11] + b1[0x12];
+        b2[0x12] = (b1[0x11] - b1[0x12]) * cos1;
+
+        b2[0x14] = b1[0x14] + b1[0x17];
+        b2[0x17] = (b1[0x17] - b1[0x14]) * cos0;
+        b2[0x15] = b1[0x15] + b1[0x16];
+        b2[0x16] = (b1[0x16] - b1[0x15]) * cos1;
+
+        b2[0x18] = b1[0x18] + b1[0x1B];
+        b2[0x1B] = (b1[0x18] - b1[0x1B]) * cos0;
+        b2[0x19] = b1[0x19] + b1[0x1A];
+        b2[0x1A] = (b1[0x19] - b1[0x1A]) * cos1;
+
+        b2[0x1C] = b1[0x1C] + b1[0x1F];
+        b2[0x1F] = (b1[0x1F] - b1[0x1C]) * cos0;
+        b2[0x1D] = b1[0x1D] + b1[0x1E];
+        b2[0x1E] = (b1[0x1E] - b1[0x1D]) * cos1;
+    }
+
+    {
+        register real const cos0 = mpg123_pnts[4][0];
+
+        b1[0x00] = b2[0x00] + b2[0x01];
+        b1[0x01] = (b2[0x00] - b2[0x01]) * cos0;
+        b1[0x02] = b2[0x02] + b2[0x03];
+        b1[0x03] = (b2[0x03] - b2[0x02]) * cos0;
+        b1[0x02] += b1[0x03];
+
+        b1[0x04] = b2[0x04] + b2[0x05];
+        b1[0x05] = (b2[0x04] - b2[0x05]) * cos0;
+        b1[0x06] = b2[0x06] + b2[0x07];
+        b1[0x07] = (b2[0x07] - b2[0x06]) * cos0;
+        b1[0x06] += b1[0x07];
+        b1[0x04] += b1[0x06];
+        b1[0x06] += b1[0x05];
+        b1[0x05] += b1[0x07];
+
+        b1[0x08] = b2[0x08] + b2[0x09];
+        b1[0x09] = (b2[0x08] - b2[0x09]) * cos0;
+        b1[0x0A] = b2[0x0A] + b2[0x0B];
+        b1[0x0B] = (b2[0x0B] - b2[0x0A]) * cos0;
+        b1[0x0A] += b1[0x0B];
+
+        b1[0x0C] = b2[0x0C] + b2[0x0D];
+        b1[0x0D] = (b2[0x0C] - b2[0x0D]) * cos0;
+        b1[0x0E] = b2[0x0E] + b2[0x0F];
+        b1[0x0F] = (b2[0x0F] - b2[0x0E]) * cos0;
+        b1[0x0E] += b1[0x0F];
+        b1[0x0C] += b1[0x0E];
+        b1[0x0E] += b1[0x0D];
+        b1[0x0D] += b1[0x0F];
+
+        b1[0x10] = b2[0x10] + b2[0x11];
+        b1[0x11] = (b2[0x10] - b2[0x11]) * cos0;
+        b1[0x12] = b2[0x12] + b2[0x13];
+        b1[0x13] = (b2[0x13] - b2[0x12]) * cos0;
+        b1[0x12] += b1[0x13];
+
+        b1[0x14] = b2[0x14] + b2[0x15];
+        b1[0x15] = (b2[0x14] - b2[0x15]) * cos0;
+        b1[0x16] = b2[0x16] + b2[0x17];
+        b1[0x17] = (b2[0x17] - b2[0x16]) * cos0;
+        b1[0x16] += b1[0x17];
+        b1[0x14] += b1[0x16];
+        b1[0x16] += b1[0x15];
+        b1[0x15] += b1[0x17];
+
+        b1[0x18] = b2[0x18] + b2[0x19];
+        b1[0x19] = (b2[0x18] - b2[0x19]) * cos0;
+        b1[0x1A] = b2[0x1A] + b2[0x1B];
+        b1[0x1B] = (b2[0x1B] - b2[0x1A]) * cos0;
+        b1[0x1A] += b1[0x1B];
+
+        b1[0x1C] = b2[0x1C] + b2[0x1D];
+        b1[0x1D] = (b2[0x1C] - b2[0x1D]) * cos0;
+        b1[0x1E] = b2[0x1E] + b2[0x1F];
+        b1[0x1F] = (b2[0x1F] - b2[0x1E]) * cos0;
+        b1[0x1E] += b1[0x1F];
+        b1[0x1C] += b1[0x1E];
+        b1[0x1E] += b1[0x1D];
+        b1[0x1D] += b1[0x1F];
+    }
+
+    out0[0x10 * 16] = b1[0x00];
+    out0[0x10 * 12] = b1[0x04];
+    out0[0x10 * 8] = b1[0x02];
+    out0[0x10 * 4] = b1[0x06];
+    out0[0x10 * 0] = b1[0x01];
+    out1[0x10 * 0] = b1[0x01];
+    out1[0x10 * 4] = b1[0x05];
+    out1[0x10 * 8] = b1[0x03];
+    out1[0x10 * 12] = b1[0x07];
+
+    b1[0x08] += b1[0x0C];
+    out0[0x10 * 14] = b1[0x08];
+    b1[0x0C] += b1[0x0a];
+    out0[0x10 * 10] = b1[0x0C];
+    b1[0x0A] += b1[0x0E];
+    out0[0x10 * 6] = b1[0x0A];
+    b1[0x0E] += b1[0x09];
+    out0[0x10 * 2] = b1[0x0E];
+    b1[0x09] += b1[0x0D];
+    out1[0x10 * 2] = b1[0x09];
+    b1[0x0D] += b1[0x0B];
+    out1[0x10 * 6] = b1[0x0D];
+    b1[0x0B] += b1[0x0F];
+    out1[0x10 * 10] = b1[0x0B];
+    out1[0x10 * 14] = b1[0x0F];
+
+    b1[0x18] += b1[0x1C];
+    out0[0x10 * 15] = b1[0x10] + b1[0x18];
+    out0[0x10 * 13] = b1[0x18] + b1[0x14];
+    b1[0x1C] += b1[0x1a];
+    out0[0x10 * 11] = b1[0x14] + b1[0x1C];
+    out0[0x10 * 9] = b1[0x1C] + b1[0x12];
+    b1[0x1A] += b1[0x1E];
+    out0[0x10 * 7] = b1[0x12] + b1[0x1A];
+    out0[0x10 * 5] = b1[0x1A] + b1[0x16];
+    b1[0x1E] += b1[0x19];
+    out0[0x10 * 3] = b1[0x16] + b1[0x1E];
+    out0[0x10 * 1] = b1[0x1E] + b1[0x11];
+    b1[0x19] += b1[0x1D];
+    out1[0x10 * 1] = b1[0x11] + b1[0x19];
+    out1[0x10 * 3] = b1[0x19] + b1[0x15];
+    b1[0x1D] += b1[0x1B];
+    out1[0x10 * 5] = b1[0x15] + b1[0x1D];
+    out1[0x10 * 7] = b1[0x1D] + b1[0x13];
+    b1[0x1B] += b1[0x1F];
+    out1[0x10 * 9] = b1[0x13] + b1[0x1B];
+    out1[0x10 * 11] = b1[0x1B] + b1[0x17];
+    out1[0x10 * 13] = b1[0x17] + b1[0x1F];
+    out1[0x10 * 15] = b1[0x1F];
+}
+
+/*
+ * the call via mpg123_dct64 is a trick to force GCC to use
+ * (new) registers for the b1,b2 pointer to the bufs[xx] field
+ */
+void
+mpg123_dct64(real * a, real * b, real * c)
+{
+    real bufs[0x40];
+
+    mpg123_dct64_1(a, b, bufs, bufs + 0x20, c);
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,236 @@
+
+/* 
+ * Mpeg Layer-1,2,3 audio decoder 
+ * ------------------------------
+ * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved.
+ * See also 'README'
+ *
+ */
+
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#include "mpg123.h"
+
+#define WRITE_SAMPLE(samples,sum,clip) \
+  if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \
+  else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \
+  else { *(samples) = sum; }
+
+int
+mpg123_synth_1to1_8bit(real * bandPtr, int channel,
+                       unsigned char *samples, int *pnt)
+{
+    short samples_tmp[64];
+    short *tmp1 = samples_tmp + channel;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret =
+        mpg123_synth_1to1(bandPtr, channel, (unsigned char *) samples_tmp,
+                          &pnt1);
+    samples += channel + *pnt;
+
+    for (i = 0; i < 32; i++) {
+        *samples = (*tmp1 >> 8) ^ 128;
+        samples += 2;
+        tmp1 += 2;
+    }
+    *pnt += 64;
+
+    return ret;
+}
+
+int
+mpg123_synth_1to1_8bit_mono(real * bandPtr, unsigned char *samples, int *pnt)
+{
+    short samples_tmp[64];
+    short *tmp1 = samples_tmp;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret = mpg123_synth_1to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
+    samples += *pnt;
+
+    for (i = 0; i < 32; i++) {
+        *samples++ = (*tmp1 >> 8) ^ 128;
+        tmp1 += 2;
+    }
+    *pnt += 32;
+
+    return ret;
+}
+
+#if 0
+int
+mpg123_synth_1to1_8bit_mono2stereo(real * bandPtr,
+                                   unsigned char *samples, int *pnt)
+{
+    short samples_tmp[64];
+    short *tmp1 = samples_tmp;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret = mpg123_synth_1to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
+    samples += *pnt;
+
+    for (i = 0; i < 32; i++) {
+        *samples++ = (*tmp1 >> 8) ^ 128;
+        *samples++ = (*tmp1 >> 8) ^ 128;
+        tmp1 += 2;
+    }
+    *pnt += 64;
+
+    return ret;
+}
+#endif
+
+int
+mpg123_synth_1to1_mono(real * bandPtr, unsigned char *samples, int *pnt)
+{
+    short samples_tmp[64];
+    short *tmp1 = samples_tmp;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret = mpg123_synth_1to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
+    samples += *pnt;
+
+    for (i = 0; i < 32; i++) {
+        *((short *) samples) = *tmp1;
+        samples += 2;
+        tmp1 += 2;
+    }
+    *pnt += 64;
+
+    return ret;
+}
+
+#if 0
+int
+mpg123_synth_1to1_mono2stereo(real * bandPtr, unsigned char *samples,
+                              int *pnt)
+{
+    int i, ret;
+
+    ret = mpg123_synth_1to1(bandPtr, 0, samples, pnt);
+    samples = samples + *pnt - 128;
+
+    for (i = 0; i < 32; i++) {
+        ((short *) samples)[1] = ((short *) samples)[0];
+        samples += 4;
+    }
+
+    return ret;
+}
+#endif
+
+int
+mpg123_synth_1to1(real * bandPtr, int channel, unsigned char *out, int *pnt)
+{
+    static real buffs[2][2][0x110];
+    static const int step = 2;
+    static int bo = 1;
+    short *samples = (short *) (out + *pnt);
+
+    real *b0, (*buf)[0x110];
+    int clip = 0;
+    int bo1;
+    int i = 0;
+
+/*  if(param.equalizer)
+   do_equalizer(bandPtr,channel); */
+
+    if (!channel) {
+        bo--;
+        bo &= 0xf;
+        buf = buffs[0];
+    }
+    else {
+        samples++;
+        buf = buffs[1];
+    }
+
+    if (bo & 0x1) {
+        b0 = buf[0];
+        bo1 = bo;
+        mpg123_dct64(buf[1] + ((bo + 1) & 0xf), buf[0] + bo, bandPtr);
+    }
+    else {
+        b0 = buf[1];
+        bo1 = bo + 1;
+        mpg123_dct64(buf[0] + bo, buf[1] + bo + 1, bandPtr);
+    }
+
+    {
+        register int j;
+        real *window = mpg123_decwin + 16 - bo1;
+
+        for (j = 16; j; j--, window += 0x10, samples += step) {
+            real sum;
+
+            sum = *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            i++;
+            WRITE_SAMPLE(samples, sum, clip);
+        }
+
+        {
+            real sum;
+
+            sum = window[0x0] * b0[0x0];
+            sum += window[0x2] * b0[0x2];
+            sum += window[0x4] * b0[0x4];
+            sum += window[0x6] * b0[0x6];
+            sum += window[0x8] * b0[0x8];
+            sum += window[0xA] * b0[0xA];
+            sum += window[0xC] * b0[0xC];
+            sum += window[0xE] * b0[0xE];
+            WRITE_SAMPLE(samples, sum, clip);
+
+            b0 -= 0x10, window -= 0x20, samples += step;
+        }
+        window += bo1 << 1;
+
+        for (j = 15; j; j--, b0 -= 0x20, window -= 0x10, samples += step) {
+            real sum;
+
+            sum = -*(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            WRITE_SAMPLE(samples, sum, clip);
+        }
+    }
+
+    *pnt += 128;
+
+    return clip;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_2to1.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_2to1.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_2to1.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,251 @@
+
+/*
+ * Mpeg Layer-1,2,3 audio decoder
+ * ------------------------------
+ * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
+ * version for slower machines .. decodes only every second sample
+ * sounds like 24000,22050 or 16000 kHz .. (depending on original sample freq.)
+ *
+ */
+
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#include "mpg123.h"
+
+#define WRITE_SAMPLE(samples,sum,clip) \
+  if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \
+  else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \
+  else { *(samples) = sum; }
+
+int
+mpg123_synth_2to1_8bit(real * bandPtr, int channel,
+                       unsigned char *samples, int *pnt)
+{
+    short samples_tmp[32];
+    short *tmp1 = samples_tmp + channel;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret =
+        mpg123_synth_2to1(bandPtr, channel, (unsigned char *) samples_tmp,
+                          &pnt1);
+    samples += channel + *pnt;
+
+    for (i = 0; i < 16; i++) {
+        *samples = (*tmp1 >> 8) ^ 128;
+        samples += 2;
+        tmp1 += 2;
+    }
+    *pnt += 32;
+
+    return ret;
+}
+
+int
+mpg123_synth_2to1_8bit_mono(real * bandPtr, unsigned char *samples, int *pnt)
+{
+    short samples_tmp[32];
+    short *tmp1 = samples_tmp;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret = mpg123_synth_2to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
+    samples += *pnt;
+
+    for (i = 0; i < 16; i++) {
+        *samples++ = (*tmp1 >> 8) ^ 128;
+        tmp1 += 2;
+    }
+    *pnt += 16;
+
+    return ret;
+}
+
+#if 0
+int
+mpg123_synth_2to1_8bit_mono2stereo(real * bandPtr,
+                                   unsigned char *samples, int *pnt)
+{
+    short samples_tmp[32];
+    short *tmp1 = samples_tmp;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret = mpg123_synth_2to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
+    samples += *pnt;
+
+    for (i = 0; i < 16; i++) {
+        *samples++ = (*tmp1 >> 8) ^ 128;
+        *samples++ = (*tmp1 >> 8) ^ 128;
+        tmp1 += 2;
+    }
+    *pnt += 32;
+
+    return ret;
+}
+#endif
+
+int
+mpg123_synth_2to1_mono(real * bandPtr, unsigned char *samples, int *pnt)
+{
+    short samples_tmp[32];
+    short *tmp1 = samples_tmp;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret = mpg123_synth_2to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
+    samples += *pnt;
+
+    for (i = 0; i < 16; i++) {
+        *((short *) samples) = *tmp1;
+        samples += 2;
+        tmp1 += 2;
+    }
+    *pnt += 32;
+
+    return ret;
+}
+
+#if 0
+int
+mpg123_synth_2to1_mono2stereo(real * bandPtr, unsigned char *samples,
+                              int *pnt)
+{
+    int i, ret;
+
+    ret = mpg123_synth_2to1(bandPtr, 0, samples, pnt);
+    samples = samples + *pnt - 64;
+
+    for (i = 0; i < 16; i++) {
+        ((short *) samples)[1] = ((short *) samples)[0];
+        samples += 4;
+    }
+
+    return ret;
+}
+#endif
+
+int
+mpg123_synth_2to1(real * bandPtr, int channel, unsigned char *out, int *pnt)
+{
+    static real buffs[2][2][0x110];
+    static const int step = 2;
+    static int bo = 1;
+    short *samples = (short *) (out + *pnt);
+
+    real *b0, (*buf)[0x110];
+    int clip = 0;
+    int bo1;
+
+/*  if(param.equalizer)
+   do_equalizer(bandPtr,channel); */
+
+    if (!channel) {
+        bo--;
+        bo &= 0xf;
+        buf = buffs[0];
+    }
+    else {
+        samples++;
+        buf = buffs[1];
+    }
+
+    if (bo & 0x1) {
+        b0 = buf[0];
+        bo1 = bo;
+        mpg123_dct64(buf[1] + ((bo + 1) & 0xf), buf[0] + bo, bandPtr);
+    }
+    else {
+        b0 = buf[1];
+        bo1 = bo + 1;
+        mpg123_dct64(buf[0] + bo, buf[1] + bo + 1, bandPtr);
+    }
+
+    {
+        register int j;
+        real *window = mpg123_decwin + 16 - bo1;
+
+        for (j = 8; j; j--, b0 += 0x10, window += 0x30) {
+            real sum;
+
+            sum = *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#if 0
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#endif
+        }
+
+        {
+            real sum;
+
+            sum = window[0x0] * b0[0x0];
+            sum += window[0x2] * b0[0x2];
+            sum += window[0x4] * b0[0x4];
+            sum += window[0x6] * b0[0x6];
+            sum += window[0x8] * b0[0x8];
+            sum += window[0xA] * b0[0xA];
+            sum += window[0xC] * b0[0xC];
+            sum += window[0xE] * b0[0xE];
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#if 0
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#endif
+            b0 -= 0x20, window -= 0x40;
+        }
+        window += bo1 << 1;
+
+        for (j = 7; j; j--, b0 -= 0x30, window -= 0x30) {
+            real sum;
+
+            sum = -*(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#if 0
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#endif
+        }
+    }
+
+    *pnt += 64;
+
+    return clip;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_3dnow.s
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_3dnow.s	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_3dnow.s	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,282 @@
+/
+/ decode_3dnow.s - 3DNow! optimized synth_1to1()
+/
+/ This code based 'decode_3dnow.s' by Syuuhei Kashiyama
+/ <squash at mb.kcom.ne.jp>,only two types of changes have been made:
+/
+/ - remove PREFETCH instruction for speedup
+/ - change function name for support 3DNow! automatic detect
+/ - femms moved to before 'call dct64_3dnow'
+/
+/ You can find Kashiyama's original 3dnow! support patch
+/ (for mpg123-0.59o) at
+/ http://user.ecc.u-tokyo.ac.jp/~g810370/linux-simd/ (Japanese).
+/
+/ by KIMURA Takuhiro <kim at hannah.ipc.miyakyo-u.ac.jp> - until 31.Mar.1999
+/                    <kim at comtec.co.jp>               - after  1.Apr.1999
+/
+/ porting xmms-0.9.1 by Osamu kayasono <jacobi at jcom.home.ne.jp>
+/ - rename function name for xmms
+/ - disable equalizer for mpg123
+
+///
+/// Replacement of synth_1to1() with AMD's 3DNow! SIMD operations support
+/// 
+/// Syuuhei Kashiyama <squash at mb.kcom.ne.jp>
+/// 
+/// The author of this program disclaim whole expressed or implied
+/// warranties with regard to this program, and in no event shall the
+/// author of this program liable to whatever resulted from the use of
+/// this program. Use it at your own risk.
+/// 
+
+	.local	buffs.40
+	.comm	buffs.40,4352,32
+.data
+	.align 4
+	.type	 bo.42, at object
+	.size	 bo.42,4
+bo.42:
+	.long 1
+.text
+.globl mpg123_synth_1to1_3dnow
+	.type	 mpg123_synth_1to1_3dnow, at function
+mpg123_synth_1to1_3dnow:
+	subl $24,%esp
+	pushl %ebp
+	pushl %edi
+	xorl %ebp,%ebp
+	pushl %esi
+	pushl %ebx
+	movl 56(%esp),%esi
+	movl 52(%esp),%edi
+	movl 0(%esi),%esi
+	movl 48(%esp),%ebx
+	addl %edi,%esi
+	movl %esi,16(%esp)
+
+	femms
+		
+///	/ disable equalizer by Osamu Kayasono
+///	cmpl $0,equalfile
+///	je .L25
+///	pushl %ebx
+///	pushl 48(%esp)
+///	call do_equalizer_3dnow
+///	addl $8,%esp
+///.L25:
+	testl %ebx,%ebx
+	jne .L26
+	decl bo.42
+	movl $buffs.40,%ecx
+	andl $15,bo.42
+	jmp .L27
+.L26:
+	addl $2,16(%esp)
+	movl $buffs.40+2176,%ecx
+.L27:
+	movl bo.42,%edx
+	testb $1,%dl
+	je .L28
+	movl %edx,36(%esp)
+	movl %ecx,%ebx
+	movl 44(%esp),%esi
+	movl %edx,%edi
+	pushl %esi
+	sall $2,%edi
+	movl %ebx,%eax
+	movl %edi,24(%esp)
+	addl %edi,%eax
+	pushl %eax
+	movl %edx,%eax
+	incl %eax
+	andl $15,%eax
+	leal 1088(,%eax,4),%eax
+	addl %ebx,%eax
+	pushl %eax
+	call mpg123_dct64_3dnow
+	addl $12,%esp
+	jmp .L29
+.L28:
+	leal 1(%edx),%esi
+	movl 44(%esp),%edi
+	movl %esi,36(%esp)
+	leal 1092(%ecx,%edx,4),%eax
+	pushl %edi
+	leal 1088(%ecx),%ebx
+	pushl %eax
+	sall $2,%esi
+	leal (%ecx,%edx,4),%eax
+	pushl %eax
+	call mpg123_dct64_3dnow
+	addl $12,%esp
+	movl %esi,20(%esp)
+.L29:
+	movl $mpg123_decwin+64,%edx
+	movl $16,%ecx
+	subl 20(%esp),%edx
+	movl 16(%esp),%edi
+
+	movq (%edx),%mm0
+	movq (%ebx),%mm1
+	.align 32
+.L33:
+	movq 8(%edx),%mm3
+        pfmul %mm1,%mm0
+	movq 8(%ebx),%mm4
+	movq 16(%edx),%mm5
+  	pfmul %mm4,%mm3
+	movq 16(%ebx),%mm6
+  	pfadd %mm3,%mm0
+	movq 24(%edx),%mm1
+	pfmul %mm6,%mm5
+	movq 24(%ebx),%mm2
+	pfadd %mm5,%mm0
+	movq 32(%edx),%mm3
+	pfmul %mm2,%mm1
+	movq 32(%ebx),%mm4
+	pfadd %mm1,%mm0
+	movq 40(%edx),%mm5
+	pfmul %mm4,%mm3
+	movq 40(%ebx),%mm6
+	pfadd %mm3,%mm0
+	movq 48(%edx),%mm1
+	pfmul %mm6,%mm5
+	movq 48(%ebx),%mm2
+	pfadd %mm0,%mm5
+	movq 56(%edx),%mm3
+	pfmul %mm1,%mm2
+	movq 56(%ebx),%mm4
+	pfadd %mm5,%mm2
+	addl $64,%ebx
+	subl $-128,%edx
+	movq (%edx),%mm0
+	pfmul %mm4,%mm3
+	movq (%ebx),%mm1
+	pfadd %mm3,%mm2
+	movq %mm2,%mm3
+	psrlq $32,%mm3
+	pfsub %mm3,%mm2
+	incl %ebp
+	pf2id %mm2,%mm2
+	packssdw %mm2,%mm2
+	movd %mm2,%eax
+	movw %ax,0(%edi)
+	addl $4,%edi
+	decl %ecx
+	jnz .L33
+	
+	movd (%ebx),%mm0
+	movd (%edx),%mm1
+	punpckldq 8(%ebx),%mm0
+	punpckldq 8(%edx),%mm1
+	movd 16(%ebx),%mm3
+	movd 16(%edx),%mm4
+	pfmul %mm1,%mm0
+	punpckldq 24(%ebx),%mm3
+	punpckldq 24(%edx),%mm4
+	movd 32(%ebx),%mm5
+	movd 32(%edx),%mm6
+	pfmul %mm4,%mm3
+	punpckldq 40(%ebx),%mm5
+	punpckldq 40(%edx),%mm6
+	pfadd %mm3,%mm0
+	movd 48(%ebx),%mm1
+	movd 48(%edx),%mm2
+	pfmul %mm6,%mm5
+	punpckldq 56(%ebx),%mm1
+	punpckldq 56(%edx),%mm2
+	pfadd %mm5,%mm0
+	pfmul %mm2,%mm1
+	pfadd %mm1,%mm0
+	pfacc %mm1,%mm0
+	pf2id %mm0,%mm0
+	packssdw %mm0,%mm0
+	movd %mm0,%eax
+	movw %ax,0(%edi)
+	incl %ebp
+	movl 36(%esp),%esi
+	addl $-64,%ebx
+	movl $15,%ebp
+	addl $4,%edi
+	leal -128(%edx,%esi,8),%edx
+
+	movl $15,%ecx
+	movd (%ebx),%mm0
+	movd -4(%edx),%mm1
+	punpckldq 4(%ebx),%mm0
+	punpckldq -8(%edx),%mm1
+	.align 32
+.L46:						
+	movd 8(%ebx),%mm3
+	movd -12(%edx),%mm4
+	pfmul %mm1,%mm0
+	punpckldq 12(%ebx),%mm3
+	punpckldq -16(%edx),%mm4
+	movd 16(%ebx),%mm5
+	movd -20(%edx),%mm6
+	pfmul %mm4,%mm3
+	punpckldq 20(%ebx),%mm5
+	punpckldq -24(%edx),%mm6
+	pfadd %mm3,%mm0
+	movd 24(%ebx),%mm1
+	movd -28(%edx),%mm2
+	pfmul %mm6,%mm5
+	punpckldq 28(%ebx),%mm1	
+	punpckldq -32(%edx),%mm2
+	pfadd %mm5,%mm0
+	movd 32(%ebx),%mm3
+	movd -36(%edx),%mm4
+	pfmul %mm2,%mm1
+	punpckldq 36(%ebx),%mm3	
+	punpckldq -40(%edx),%mm4
+	pfadd %mm1,%mm0
+	movd 40(%ebx),%mm5
+	movd -44(%edx),%mm6
+	pfmul %mm4,%mm3
+	punpckldq 44(%ebx),%mm5	
+	punpckldq -48(%edx),%mm6
+	pfadd %mm3,%mm0
+	movd 48(%ebx),%mm1
+	movd -52(%edx),%mm2
+	pfmul %mm6,%mm5
+	punpckldq 52(%ebx),%mm1
+	punpckldq -56(%edx),%mm2
+	pfadd %mm0,%mm5
+	movd 56(%ebx),%mm3
+	movd -60(%edx),%mm4
+	pfmul %mm2,%mm1
+	punpckldq 60(%ebx),%mm3	
+	punpckldq (%edx),%mm4
+	pfadd %mm1,%mm5
+	addl $-128,%edx
+	addl $-64,%ebx
+	movd (%ebx),%mm0
+	movd -4(%edx),%mm1
+	pfmul %mm4,%mm3
+	punpckldq 4(%ebx),%mm0
+	punpckldq -8(%edx),%mm1
+	pfadd %mm5,%mm3
+	pfacc %mm3,%mm3
+	incl %ebp
+	pf2id %mm3,%mm3
+  	movd %mm3,%eax
+  	negl %eax
+  	movd %eax,%mm3
+	packssdw %mm3,%mm3
+	movd %mm3,%eax
+  	movw %ax,(%edi)
+	addl $4,%edi
+	decl %ecx
+	jnz .L46
+
+	femms
+	movl 56(%esp),%esi
+	movl %ebp,%eax
+	subl $-128,0(%esi)
+	popl %ebx
+	popl %esi
+	popl %edi
+	popl %ebp
+	addl $24,%esp
+	ret

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_4to1.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_4to1.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_4to1.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,264 @@
+
+/*
+ * Mpeg Layer-1,2,3 audio decoder
+ * ------------------------------
+ * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved.
+ * See also 'README'
+ * version for slower machines .. decodes only every fourth sample
+ * dunno why it sounds THIS annoying (maybe we should adapt the window?)
+ * absolutely not optimized for this operation
+ */
+
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#include "mpg123.h"
+
+#define WRITE_SAMPLE(samples,sum,clip) \
+  if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \
+  else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \
+  else { *(samples) = sum; }
+
+int
+mpg123_synth_4to1_8bit(real * bandPtr, int channel,
+                       unsigned char *samples, int *pnt)
+{
+    short samples_tmp[16];
+    short *tmp1 = samples_tmp + channel;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret =
+        mpg123_synth_4to1(bandPtr, channel, (unsigned char *) samples_tmp,
+                          &pnt1);
+    samples += channel + *pnt;
+
+    for (i = 0; i < 8; i++) {
+        *samples = (*tmp1 >> 8) ^ 128;
+        samples += 2;
+        tmp1 += 2;
+    }
+    *pnt += 16;
+
+    return ret;
+}
+
+int
+mpg123_synth_4to1_8bit_mono(real * bandPtr, unsigned char *samples, int *pnt)
+{
+    short samples_tmp[16];
+    short *tmp1 = samples_tmp;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret = mpg123_synth_4to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
+    samples += *pnt;
+
+    for (i = 0; i < 8; i++) {
+        *samples++ = (*tmp1 >> 8) ^ 128;
+        tmp1 += 2;
+    }
+    *pnt += 8;
+
+    return ret;
+}
+
+#if 0
+int
+mpg123_synth_4to1_8bit_mono2stereo(real * bandPtr,
+                                   unsigned char *samples, int *pnt)
+{
+    short samples_tmp[16];
+    short *tmp1 = samples_tmp;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret = mpg123_synth_4to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
+    samples += *pnt;
+
+    for (i = 0; i < 8; i++) {
+        *samples++ = (*tmp1 >> 8) ^ 128;
+        *samples++ = (*tmp1 >> 8) ^ 128;
+        tmp1 += 2;
+    }
+    *pnt += 16;
+
+    return ret;
+}
+#endif
+
+int
+mpg123_synth_4to1_mono(real * bandPtr, unsigned char *samples, int *pnt)
+{
+    short samples_tmp[16];
+    short *tmp1 = samples_tmp;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret = mpg123_synth_4to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
+    samples += *pnt;
+
+    for (i = 0; i < 8; i++) {
+        *((short *) samples) = *tmp1;
+        samples += 2;
+        tmp1 += 2;
+    }
+    *pnt += 16;
+
+    return ret;
+}
+
+#if 0
+int
+mpg123_synth_4to1_mono2stereo(real * bandPtr, unsigned char *samples,
+                              int *pnt)
+{
+    int i, ret;
+
+    ret = mpg123_synth_4to1(bandPtr, 0, samples, pnt);
+    samples = samples + *pnt - 32;
+
+    for (i = 0; i < 8; i++) {
+        ((short *) samples)[1] = ((short *) samples)[0];
+        samples += 4;
+    }
+
+    return ret;
+}
+#endif
+
+int
+mpg123_synth_4to1(real * bandPtr, int channel, unsigned char *out, int *pnt)
+{
+    static real buffs[2][2][0x110];
+    static const int step = 2;
+    static int bo = 1;
+    short *samples = (short *) (out + *pnt);
+
+    real *b0, (*buf)[0x110];
+    int clip = 0;
+    int bo1;
+
+/*  if(param.equalizer)
+   do_equalizer(bandPtr,channel); */
+
+    if (!channel) {
+        bo--;
+        bo &= 0xf;
+        buf = buffs[0];
+    }
+    else {
+        samples++;
+        buf = buffs[1];
+    }
+
+    if (bo & 0x1) {
+        b0 = buf[0];
+        bo1 = bo;
+        mpg123_dct64(buf[1] + ((bo + 1) & 0xf), buf[0] + bo, bandPtr);
+    }
+    else {
+        b0 = buf[1];
+        bo1 = bo + 1;
+        mpg123_dct64(buf[0] + bo, buf[1] + bo + 1, bandPtr);
+    }
+
+    {
+        register int j;
+        real *window = mpg123_decwin + 16 - bo1;
+
+        for (j = 4; j; j--, b0 += 0x30, window += 0x70) {
+            real sum;
+
+            sum = *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+            sum += *window++ * *b0++;
+            sum -= *window++ * *b0++;
+
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#if 0
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#endif
+        }
+
+        {
+            real sum;
+
+            sum = window[0x0] * b0[0x0];
+            sum += window[0x2] * b0[0x2];
+            sum += window[0x4] * b0[0x4];
+            sum += window[0x6] * b0[0x6];
+            sum += window[0x8] * b0[0x8];
+            sum += window[0xA] * b0[0xA];
+            sum += window[0xC] * b0[0xC];
+            sum += window[0xE] * b0[0xE];
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#if 0
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#endif
+            b0 -= 0x40, window -= 0x80;
+        }
+        window += bo1 << 1;
+
+        for (j = 3; j; j--, b0 -= 0x50, window -= 0x70) {
+            real sum;
+
+            sum = -*(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+            sum -= *(--window) * *b0++;
+
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#if 0
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+            WRITE_SAMPLE(samples, sum, clip);
+            samples += step;
+#endif
+        }
+    }
+
+    *pnt += 32;
+
+    return clip;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_MMX.s
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_MMX.s	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_MMX.s	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,108 @@
+# this code comes under GPL
+
+.text
+
+.globl mpg123_synth_MMX
+
+mpg123_synth_MMX:
+        pushl %ebp
+        pushl %edi
+        pushl %esi
+        pushl %ebx
+        movl 24(%esp),%ecx              
+        movl 28(%esp),%edi              
+        movl $15,%ebx
+        movl 36(%esp),%edx              
+        leal (%edi,%ecx,2),%edi
+	decl %ecx
+        movl 32(%esp),%esi              
+        movl (%edx),%eax                
+        jecxz .L1
+        decl %eax
+        andl %ebx,%eax                  
+        leal 1088(%esi),%esi                            
+        movl %eax,(%edx)                
+.L1:
+        leal (%esi,%eax,2),%edx         
+        movl %eax,%ebp                  
+        incl %eax                       
+        pushl 20(%esp)                  
+        andl %ebx,%eax                  
+        leal 544(%esi,%eax,2),%ecx      
+        incl %ebx                       
+	testl $1, %eax
+	jnz .L2                       
+        xchgl %edx,%ecx
+	incl %ebp
+        leal 544(%esi),%esi           
+.L2: 
+        pushl %edx
+        pushl %ecx
+        call dct64_MMX
+        addl $12,%esp
+	leal 1(%ebx), %ecx
+        subl %ebp,%ebx                
+
+	leal mpg123_decwins(%ebx,%ebx,1), %edx
+.L3: 
+        movq  (%edx),%mm0
+        pmaddwd (%esi),%mm0
+        movq  8(%edx),%mm1
+        pmaddwd 8(%esi),%mm1
+        movq  16(%edx),%mm2
+        pmaddwd 16(%esi),%mm2
+        movq  24(%edx),%mm3
+        pmaddwd 24(%esi),%mm3
+        paddd %mm1,%mm0
+        paddd %mm2,%mm0
+        paddd %mm3,%mm0
+        movq  %mm0,%mm1
+        psrlq $32,%mm1
+        paddd %mm1,%mm0
+        psrad $13,%mm0
+        packssdw %mm0,%mm0
+        movd %mm0,%eax
+	movw %ax, (%edi)
+
+        leal 32(%esi),%esi
+        leal 64(%edx),%edx
+        leal 4(%edi),%edi                
+        loop .L3
+
+
+        subl $64,%esi                    
+        movl $15,%ecx
+.L4: 
+        movq  (%edx),%mm0
+        pmaddwd (%esi),%mm0
+        movq  8(%edx),%mm1
+        pmaddwd 8(%esi),%mm1
+        movq  16(%edx),%mm2
+        pmaddwd 16(%esi),%mm2
+        movq  24(%edx),%mm3
+        pmaddwd 24(%esi),%mm3
+        paddd %mm1,%mm0
+        paddd %mm2,%mm0
+        paddd %mm3,%mm0
+        movq  %mm0,%mm1
+        psrlq $32,%mm1
+        paddd %mm0,%mm1
+        psrad $13,%mm1
+        packssdw %mm1,%mm1
+        psubd %mm0,%mm0
+        psubsw %mm1,%mm0
+        movd %mm0,%eax
+	movw %ax,(%edi)
+
+        subl $32,%esi
+        addl $64,%edx
+        leal 4(%edi),%edi                
+        loop .L4
+	emms
+        popl %ebx
+        popl %esi
+        popl %edi
+        popl %ebp
+        ret
+
+

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_i386.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_i386.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_i386.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,277 @@
+
+/* 
+ * Mpeg Layer-1,2,3 audio decoder 
+ * ------------------------------
+ * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved.
+ * See also 'README'
+ *
+ * slighlty optimized for machines without autoincrement/decrement.
+ * The performance is highly compiler dependend. Maybe
+ * the decode.c version for 'normal' processor may be faster
+ * even for Intel processors.
+ */
+
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#include "mpg123.h"
+
+int mpg123_synth_1to1_pent(real *, int, unsigned char *);
+
+#if 0
+ /* old WRITE_SAMPLE */
+#define WRITE_SAMPLE(samples,sum,clip) \
+  if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \
+  else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \
+  else { *(samples) = sum; }
+#else
+ /* new WRITE_SAMPLE */
+#define WRITE_SAMPLE(samples,sum,clip) { \
+  double dtemp; int v; /* sizeof(int) == 4 */ \
+  dtemp = ((((65536.0 * 65536.0 * 16)+(65536.0 * 0.5))* 65536.0)) + (sum);  \
+  v = ((*(int *)&dtemp) - 0x80000000); \
+  if( v > 32767) { *(samples) = 0x7fff; (clip)++; } \
+  else if( v < -32768) { *(samples) = -0x8000; (clip)++; } \
+  else { *(samples) = v; }  \
+}
+#endif
+
+int
+mpg123_synth_1to1_8bit(real * bandPtr, int channel,
+                       unsigned char *samples, int *pnt)
+{
+    short samples_tmp[64];
+    short *tmp1 = samples_tmp + channel;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret =
+        mpg123_synth_1to1(bandPtr, channel, (unsigned char *) samples_tmp,
+                          &pnt1);
+    samples += channel + *pnt;
+
+    for (i = 0; i < 32; i++) {
+        *samples = (*tmp1 >> 8) ^ 128;
+        samples += 2;
+        tmp1 += 2;
+    }
+    *pnt += 64;
+
+    return ret;
+}
+
+int
+mpg123_synth_1to1_8bit_mono(real * bandPtr, unsigned char *samples, int *pnt)
+{
+    short samples_tmp[64];
+    short *tmp1 = samples_tmp;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret = mpg123_synth_1to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
+    samples += *pnt;
+
+    for (i = 0; i < 32; i++) {
+        *samples++ = (*tmp1 >> 8) ^ 128;
+        tmp1 += 2;
+    }
+    *pnt += 32;
+
+    return ret;
+}
+
+#if 0
+int
+mpg123_synth_1to1_8bit_mono2stereo(real * bandPtr,
+                                   unsigned char *samples, int *pnt)
+{
+    short samples_tmp[64];
+    short *tmp1 = samples_tmp;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret = mpg123_synth_1to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
+    samples += *pnt;
+
+    for (i = 0; i < 32; i++) {
+        *samples++ = (*tmp1 >> 8) ^ 128;
+        *samples++ = (*tmp1 >> 8) ^ 128;
+        tmp1 += 2;
+    }
+    *pnt += 64;
+
+    return ret;
+}
+#endif
+
+int
+mpg123_synth_1to1_mono(real * bandPtr, unsigned char *samples, int *pnt)
+{
+    short samples_tmp[64];
+    short *tmp1 = samples_tmp;
+    int i, ret;
+    int pnt1 = 0;
+
+    ret = mpg123_synth_1to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1);
+    samples += *pnt;
+
+    for (i = 0; i < 32; i++) {
+        *((short *) samples) = *tmp1;
+        samples += 2;
+        tmp1 += 2;
+    }
+    *pnt += 64;
+
+    return ret;
+}
+
+#if 0
+int
+mpg123_synth_1to1_mono2stereo(real * bandPtr, unsigned char *samples,
+                              int *pnt)
+{
+    int i, ret;
+
+    ret = mpg123_synth_1to1(bandPtr, 0, samples, pnt);
+    samples = samples + *pnt - 128;
+
+    for (i = 0; i < 32; i++) {
+        ((short *) samples)[1] = ((short *) samples)[0];
+        samples += 4;
+    }
+
+    return ret;
+}
+#endif
+
+int
+mpg123_synth_1to1(real * bandPtr, int channel, unsigned char *out, int *pnt)
+{
+#ifndef I386_ASSEM
+    static real buffs[2][2][0x110];
+    static const int step = 2;
+    static int bo = 1;
+    short *samples = (short *) (out + *pnt);
+
+    real *b0, (*buf)[0x110];
+    int clip = 0;
+    int bo1;
+
+    if (!channel) {
+        bo--;
+        bo &= 0xf;
+        buf = buffs[0];
+    }
+    else {
+        samples++;
+        buf = buffs[1];
+    }
+
+    if (bo & 0x1) {
+        b0 = buf[0];
+        bo1 = bo;
+        mpg123_dct64(buf[1] + ((bo + 1) & 0xf), buf[0] + bo, bandPtr);
+    }
+    else {
+        b0 = buf[1];
+        bo1 = bo + 1;
+        mpg123_dct64(buf[0] + bo, buf[1] + bo + 1, bandPtr);
+    }
+
+    {
+        register int j;
+        real *window = mpg123_decwin + 16 - bo1;
+
+        for (j = 16; j; j--, b0 += 0x10, window += 0x20, samples += step) {
+            real sum;
+
+            sum = window[0x0] * b0[0x0];
+            sum -= window[0x1] * b0[0x1];
+            sum += window[0x2] * b0[0x2];
+            sum -= window[0x3] * b0[0x3];
+            sum += window[0x4] * b0[0x4];
+            sum -= window[0x5] * b0[0x5];
+            sum += window[0x6] * b0[0x6];
+            sum -= window[0x7] * b0[0x7];
+            sum += window[0x8] * b0[0x8];
+            sum -= window[0x9] * b0[0x9];
+            sum += window[0xA] * b0[0xA];
+            sum -= window[0xB] * b0[0xB];
+            sum += window[0xC] * b0[0xC];
+            sum -= window[0xD] * b0[0xD];
+            sum += window[0xE] * b0[0xE];
+            sum -= window[0xF] * b0[0xF];
+
+            WRITE_SAMPLE(samples, sum, clip);
+        }
+
+        {
+            real sum;
+
+            sum = window[0x0] * b0[0x0];
+            sum += window[0x2] * b0[0x2];
+            sum += window[0x4] * b0[0x4];
+            sum += window[0x6] * b0[0x6];
+            sum += window[0x8] * b0[0x8];
+            sum += window[0xA] * b0[0xA];
+            sum += window[0xC] * b0[0xC];
+            sum += window[0xE] * b0[0xE];
+            WRITE_SAMPLE(samples, sum, clip);
+            b0 -= 0x10, window -= 0x20, samples += step;
+        }
+        window += bo1 << 1;
+
+        for (j = 15; j; j--, b0 -= 0x10, window -= 0x20, samples += step) {
+            real sum;
+
+            sum = -window[-0x1] * b0[0x0];
+            sum -= window[-0x2] * b0[0x1];
+            sum -= window[-0x3] * b0[0x2];
+            sum -= window[-0x4] * b0[0x3];
+            sum -= window[-0x5] * b0[0x4];
+            sum -= window[-0x6] * b0[0x5];
+            sum -= window[-0x7] * b0[0x6];
+            sum -= window[-0x8] * b0[0x7];
+            sum -= window[-0x9] * b0[0x8];
+            sum -= window[-0xA] * b0[0x9];
+            sum -= window[-0xB] * b0[0xA];
+            sum -= window[-0xC] * b0[0xB];
+            sum -= window[-0xD] * b0[0xC];
+            sum -= window[-0xE] * b0[0xD];
+            sum -= window[-0xF] * b0[0xE];
+            sum -= window[-0x0] * b0[0xF];
+
+            WRITE_SAMPLE(samples, sum, clip);
+        }
+    }
+    *pnt += 128;
+
+    return clip;
+#else
+    {
+        int ret;
+
+        ret = mpg123_synth_1to1_pent(bandPtr, channel, out + *pnt);
+        *pnt += 128;
+        return ret;
+    }
+#endif
+}
+
+#ifdef USE_SIMD
+int mpg123_synth_MMX(real *, int, short *, short *, int *);
+
+int
+mpg123_synth_1to1_mmx(real * bandPtr, int channel, unsigned char *out,
+                      int *pnt)
+{
+    static short buffs[2][2][0x110];
+    static int bo = 1;
+    short *samples = (short *) (out + *pnt);
+
+    mpg123_synth_MMX(bandPtr, channel, samples, (short *) buffs, &bo);
+    *pnt += 128;
+    return 0;
+}
+#endif

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_i586.s
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_i586.s	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/decode_i586.s	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,321 @@
+/ 
+/ mpg123_synth_1to1 works the same way as the c version of this
+/ file.  only two types of changes have been made:
+/ - reordered floating point instructions to
+/   prevent pipline stalls
+/ - made WRITE_SAMPLE use integer instead of
+/   (slower) floating point
+/ all kinds of x86 processors should benefit from these
+/ modifications.
+/
+/ useful sources of information on optimizing x86 code include:
+/
+/     Intel Architecture Optimization Manual
+/     http://www.intel.com/design/pentium/manuals/242816.htm
+/
+/     Cyrix 6x86 Instruction Set Summary
+/     ftp://ftp.cyrix.com/6x86/6x-dbch6.pdf
+/
+/     AMD-K5 Processor Software Development
+/     http://www.amd.com/products/cpg/techdocs/appnotes/20007e.pdf
+/
+/ Stefan Bieschewski <stb at acm.org>
+/
+/ $Id: decode_i586.s,v 1.1.1.1 2003/11/19 16:03:18 mderezynski Exp $
+/
+.bss
+	.comm	buffs,4352,4
+.data
+	.align 4
+bo:
+	.long 1
+.section .rodata
+	.align 8
+.LC0:
+	.long 0x0,0x40dfffc0
+	.align 8
+.LC1:
+	.long 0x0,0xc0e00000
+	.align 8
+.text
+.globl mpg123_synth_1to1_pent
+mpg123_synth_1to1_pent:
+	subl $12,%esp
+	pushl %ebp
+	pushl %edi
+	pushl %esi
+	pushl %ebx
+	movl 32(%esp),%eax
+	movl 40(%esp),%esi
+	xorl %edi,%edi
+	movl bo,%ebp
+	cmpl %edi,36(%esp)
+	jne .L48
+	decl %ebp
+	andl $15,%ebp
+	movl %ebp,bo
+	movl $buffs,%ecx
+	jmp .L49
+.L48:
+	addl $2,%esi
+	movl $buffs+2176,%ecx
+.L49:
+	testl $1,%ebp
+	je .L50
+	movl %ecx,%ebx
+	movl %ebp,16(%esp)
+	pushl %eax
+	movl 20(%esp),%edx
+	leal (%ebx,%edx,4),%eax
+	pushl %eax
+	movl 24(%esp),%eax
+	incl %eax
+	andl $15,%eax
+	leal 1088(,%eax,4),%eax
+	addl %ebx,%eax
+	jmp .L74
+.L50:
+	leal 1088(%ecx),%ebx
+	leal 1(%ebp),%edx
+	movl %edx,16(%esp)
+	pushl %eax
+	leal 1092(%ecx,%ebp,4),%eax
+	pushl %eax
+	leal (%ecx,%ebp,4),%eax
+.L74:
+	pushl %eax
+	call mpg123_dct64
+	addl $12,%esp
+	movl 16(%esp),%edx
+	leal 0(,%edx,4),%edx
+	movl $mpg123_decwin+64,%eax
+	movl %eax,%ecx
+	subl %edx,%ecx
+	movl $16,%ebp
+.L55:
+	flds (%ecx)
+	fmuls (%ebx)
+	flds 4(%ecx)
+	fmuls 4(%ebx)
+	fxch %st(1)
+	flds 8(%ecx)
+	fmuls 8(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds 12(%ecx)
+	fmuls 12(%ebx)
+	fxch %st(2)
+	faddp %st,%st(1)
+	flds 16(%ecx)
+	fmuls 16(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds 20(%ecx)
+	fmuls 20(%ebx)
+	fxch %st(2)
+	faddp %st,%st(1)
+	flds 24(%ecx)
+	fmuls 24(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds 28(%ecx)
+	fmuls 28(%ebx)
+	fxch %st(2)
+	faddp %st,%st(1)
+	flds 32(%ecx)
+	fmuls 32(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds 36(%ecx)
+	fmuls 36(%ebx)
+	fxch %st(2)
+	faddp %st,%st(1)
+	flds 40(%ecx)
+	fmuls 40(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds 44(%ecx)
+	fmuls 44(%ebx)
+	fxch %st(2)
+	faddp %st,%st(1)
+	flds 48(%ecx)
+	fmuls 48(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds 52(%ecx)
+	fmuls 52(%ebx)
+	fxch %st(2)         
+	faddp %st,%st(1)
+	flds 56(%ecx)
+	fmuls 56(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds 60(%ecx)
+	fmuls 60(%ebx)
+	fxch %st(2)
+	subl $4,%esp
+	faddp %st,%st(1)
+	fxch %st(1)
+	fsubrp %st,%st(1)
+	fistpl (%esp)
+	popl %eax
+	cmpl $32767,%eax
+	jg 1f
+	cmpl $-32768,%eax
+	jl 2f
+	movw %ax,(%esi)
+	jmp 4f
+1:	movw $32767,(%esi)
+	jmp 3f
+2:	movw $-32768,(%esi)
+3:	incl %edi
+4:
+.L54:
+	addl $64,%ebx
+	subl $-128,%ecx
+	addl $4,%esi
+	decl %ebp
+	jnz .L55
+	flds (%ecx)
+	fmuls (%ebx)
+	flds 8(%ecx)
+	fmuls 8(%ebx)
+	flds 16(%ecx)
+	fmuls 16(%ebx)
+	fxch %st(2)
+	faddp %st,%st(1)
+	flds 24(%ecx)
+	fmuls 24(%ebx)
+	fxch %st(2)
+	faddp %st,%st(1)
+	flds 32(%ecx)
+	fmuls 32(%ebx)
+	fxch %st(2)
+	faddp %st,%st(1)
+	flds 40(%ecx)
+	fmuls 40(%ebx)
+	fxch %st(2)
+	faddp %st,%st(1)
+	flds 48(%ecx)
+	fmuls 48(%ebx)
+	fxch %st(2)
+	faddp %st,%st(1)
+	flds 56(%ecx)
+	fmuls 56(%ebx)
+	fxch %st(2)
+	subl $4,%esp
+	faddp %st,%st(1)
+	fxch %st(1)
+	faddp %st,%st(1)
+	fistpl (%esp)
+	popl %eax
+	cmpl $32767,%eax
+	jg 1f
+	cmpl $-32768,%eax
+	jl 2f
+	movw %ax,(%esi)
+	jmp 4f
+1:	movw $32767,(%esi)
+	jmp 3f
+2:	movw $-32768,(%esi)
+3:	incl %edi
+4:
+.L62:
+	addl $-64,%ebx
+	addl $4,%esi
+	movl 16(%esp),%edx
+	leal -128(%ecx,%edx,8),%ecx
+	movl $15,%ebp
+.L68:
+	flds -4(%ecx)
+	fchs
+	fmuls (%ebx)
+	flds -8(%ecx)
+	fmuls 4(%ebx)
+	fxch %st(1)
+	flds -12(%ecx)
+	fmuls 8(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds -16(%ecx)
+	fmuls 12(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds -20(%ecx)
+	fmuls 16(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds -24(%ecx)
+	fmuls 20(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds -28(%ecx)
+	fmuls 24(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds -32(%ecx)
+	fmuls 28(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds -36(%ecx)
+	fmuls 32(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds -40(%ecx)
+	fmuls 36(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds -44(%ecx)
+	fmuls 40(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds -48(%ecx)
+	fmuls 44(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds -52(%ecx)
+	fmuls 48(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds -56(%ecx)
+	fmuls 52(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds -60(%ecx)
+	fmuls 56(%ebx)
+	fxch %st(2)
+	fsubrp %st,%st(1)
+	flds (%ecx)
+	fmuls 60(%ebx)
+	fxch %st(2)
+	subl $4,%esp
+	fsubrp %st,%st(1)
+	fxch %st(1)
+	fsubrp %st,%st(1)
+	fistpl (%esp)
+	popl %eax
+	cmpl $32767,%eax
+	jg 1f
+	cmpl $-32768,%eax
+	jl 2f
+	movw %ax,(%esi)
+	jmp 4f
+1:	movw $32767,(%esi)
+	jmp 3f
+2:	movw $-32768,(%esi)
+3:	incl %edi
+4:
+.L67:
+	addl $-64,%ebx
+	addl $-128,%ecx
+	addl $4,%esi
+	decl %ebp
+	jnz .L68
+	movl %edi,%eax
+	popl %ebx
+	popl %esi
+	popl %edi
+	popl %ebp
+	addl $12,%esp
+	ret
+

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dxhead.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dxhead.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dxhead.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,103 @@
+/*
+ * Handle Xing vbr header
+ */
+#include "config.h"
+#include "dxhead.h"
+#include <stdlib.h>
+#include <float.h>
+#include <math.h>
+#include <string.h>
+#include <glib.h>
+
+#define GET_INT32BE(b) \
+(i = (b[0] << 24) | (b[1] << 16) | b[2] << 8 | b[3], b += 4, i)
+
+int
+mpg123_get_xing_header(xing_header_t * xing, unsigned char *buf)
+{
+    int i, head_flags;
+    int id, mode;
+
+    memset(xing, 0, sizeof(xing_header_t));
+
+    /* get selected MPEG header data */
+    id = (buf[1] >> 3) & 1;
+    mode = (buf[3] >> 6) & 3;
+    buf += 4;
+
+    /* Skip the sub band data */
+    if (id) {
+        /* mpeg1 */
+        if (mode != 3)
+            buf += 32;
+        else
+            buf += 17;
+    }
+    else {
+        /* mpeg2 */
+        if (mode != 3)
+            buf += 17;
+        else
+            buf += 9;
+    }
+
+    if (strncmp((char *) buf, "Xing", 4))
+        return 0;
+    buf += 4;
+
+    head_flags = GET_INT32BE(buf);
+
+    if (head_flags & FRAMES_FLAG)
+        xing->frames = GET_INT32BE(buf);
+    if (xing->frames < 1)
+        return 0;
+    if (head_flags & BYTES_FLAG)
+        xing->bytes = GET_INT32BE(buf);
+
+    if (head_flags & TOC_FLAG) {
+        for (i = 0; i < 100; i++) {
+            xing->toc[i] = buf[i];
+            if (i > 0 && xing->toc[i] < xing->toc[i - 1])
+                return 0;
+        }
+        if (xing->toc[99] == 0)
+            return 0;
+        buf += 100;
+    }
+    else
+        for (i = 0; i < 100; i++)
+            xing->toc[i] = (i * 256) / 100;
+
+#ifdef XING_DEBUG
+    for (i = 0; i < 100; i++) {
+        if ((i % 10) == 0)
+            fprintf(stderr, "\n");
+        fprintf(stderr, " %3d", xing->toc[i]);
+    }
+#endif
+
+    return 1;
+}
+
+int
+mpg123_seek_point(xing_header_t * xing, float percent)
+{
+    /* interpolate in TOC to get file seek point in bytes */
+    int a, seekpoint;
+    float fa, fb, fx;
+
+    percent = CLAMP(percent, 0, 100);
+    a = MIN(percent, 99);
+
+    fa = xing->toc[a];
+
+    if (a < 99)
+        fb = xing->toc[a + 1];
+    else
+        fb = 256;
+
+    fx = fa + (fb - fa) * (percent - a);
+    seekpoint = (1.0f / 256.0f) * fx * xing->bytes;
+
+    return seekpoint;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dxhead.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dxhead.h	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/dxhead.h	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,43 @@
+/*
+ * A Xing header may be present in the ancillary
+ * data field of the first frame of an mp3 bitstream
+ * The Xing header (optionally) contains
+ *      frames      total number of audio frames in the bitstream
+ *      bytes       total number of bytes in the bitstream
+ *      toc         table of contents
+ *
+ * toc (table of contents) gives seek points
+ * for random access
+ * the ith entry determines the seek point for
+ * i-percent duration
+ * seek point in bytes = (toc[i]/256.0) * total_bitstream_bytes
+ * e.g. half duration seek point = (toc[50]/256.0) * total_bitstream_bytes
+ */
+
+#define FRAMES_FLAG     0x0001
+#define BYTES_FLAG      0x0002
+#define TOC_FLAG        0x0004
+#define VBR_SCALE_FLAG  0x0008
+
+/*
+ * structure to receive extracted header
+ */
+typedef struct {
+    int frames;                 /* total bit stream frames from Xing header data */
+    int bytes;                  /* total bit stream bytes from Xing header data */
+    unsigned char toc[100];     /* "table of contents" */
+} xing_header_t;
+
+/*
+ * Returns zero on fail, non-zero on success
+ * xing structure to receive header data (output)
+ * buf bitstream input
+ */
+int mpg123_get_xing_header(xing_header_t * xing, unsigned char *buf);
+
+
+/*
+ * Returns seekpoint in bytes (may be at eof if percent=100.0)
+ * percent: play time percentage of total playtime. May be fractional.
+ */
+int mpg123_seek_point(xing_header_t * xing, float percent);

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/equalizer.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/equalizer.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/equalizer.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,83 @@
+
+#include <math.h>
+
+#include "mpg123.h"
+
+
+static void
+init_spline(float *x, float *y, int n, float *y2)
+{
+
+    int i, k;
+    float p, qn, sig, un, *u;
+    u = (float *) g_malloc(n * sizeof(float));
+
+    y2[0] = u[0] = 0.0;
+
+    for (i = 1; i < n - 1; i++) {
+        sig = ((float) x[i] - x[i - 1]) / ((float) x[i + 1] - x[i - 1]);
+        p = sig * y2[i - 1] + 2.0;
+        y2[i] = (sig - 1.0) / p;
+        u[i] = (((float) y[i + 1] - y[i]) / (x[i + 1] - x[i])) -
+            (((float) y[i] - y[i - 1]) / (x[i] - x[i - 1]));
+        u[i] = (6.0 * u[i] / (x[i + 1] - x[i - 1]) - sig * u[i - 1]) / p;
+    }
+    qn = un = 0.0;
+
+    y2[n - 1] = (un - qn * u[n - 2]) / (qn * y2[n - 2] + 1.0);
+    for (k = n - 2; k >= 0; k--)
+        y2[k] = y2[k] * y2[k + 1] + u[k];
+    g_free(u);
+}
+
+static float
+eval_spline(float xa[], float ya[], float y2a[], int n, float x)
+{
+    int klo, khi, k;
+    float h, b, a;
+
+    klo = 0;
+    khi = n - 1;
+    while (khi - klo > 1) {
+        k = (khi + klo) >> 1;
+        if (xa[k] > x)
+            khi = k;
+        else
+            klo = k;
+    }
+    h = xa[khi] - xa[klo];
+    a = (xa[khi] - x) / h;
+    b = (x - xa[klo]) / h;
+    return (a * ya[klo] + b * ya[khi] +
+            ((a * a * a - a) * y2a[klo] + (b * b * b - b) * y2a[khi])
+            * (h * h) / 6.0);
+}
+
+void
+mpg123_set_eq(int on, float preamp, float *b)
+{
+    float x[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, yf[10], val, band[10];
+    int bands[] = { 0, 4, 8, 16, 26, 78, 157, 313, 366, 418 };
+    int i, j;
+
+    mpg123_info->eq_active = on;
+    if (mpg123_info->eq_active) {
+        for (i = 0; i < 10; i++) {
+            band[i] = b[i] + preamp;
+        }
+
+        init_spline(x, band, 10, yf);
+        for (i = 0; i < 9; i++) {
+            for (j = bands[i]; j < bands[i + 1]; j++) {
+                val =
+                    eval_spline(x, band, yf, 10,
+                                i +
+                                ((float) (j - bands[i]) *
+                                 (1.0 / (bands[i + 1] - bands[i]))));
+                mpg123_info->eq_mul[j] = pow(2, val / 10.0);
+            }
+        }
+        for (i = bands[9]; i < 576; i++)
+            mpg123_info->eq_mul[i] = mpg123_info->eq_mul[bands[9] - 1];
+    }
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/fileinfo.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/fileinfo.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/fileinfo.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,1398 @@
+/*  BMP - Cross-platform multimedia player
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "mpg123.h"
+
+#ifdef HAVE_ID3LIB
+# include <id3.h>
+#endif
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include "beep/util.h"
+#include <libbeep/util.h>
+#include <libbeep/vfs.h>
+#include <libbeep/xentry.h>
+
+#include "mp3.xpm"
+
+static GtkWidget *window = NULL;
+static GtkWidget *filename_entry, *id3_frame;
+static GtkWidget *title_entry, *artist_entry, *album_entry, *year_entry,
+    *tracknum_entry, *comment_entry;
+static GtkWidget *genre_combo;
+#ifdef HAVE_ID3LIB
+static GtkWidget * totaltracks_entry;
+#endif
+static GtkWidget *mpeg_level, *mpeg_bitrate, *mpeg_samplerate, *mpeg_flags,
+    *mpeg_error, *mpeg_copy, *mpeg_orig, *mpeg_emph, *mpeg_frames,
+    *mpeg_filesize;
+static GtkWidget *mpeg_level_val, *mpeg_bitrate_val, *mpeg_samplerate_val,
+    *mpeg_error_val, *mpeg_copy_val, *mpeg_orig_val, *mpeg_emph_val,
+    *mpeg_frames_val, *mpeg_filesize_val;
+
+GtkWidget *vbox, *hbox, *left_vbox, *table;
+GtkWidget *mpeg_frame, *mpeg_box;
+GtkWidget *label, *filename_vbox;
+GtkWidget *bbox;
+GtkWidget *remove_id3, *cancel, *save;
+GtkWidget *boxx;
+#if 0
+GtkWidget *revert;
+#endif
+
+VFSFile *fh;
+struct id3v1tag_t tag;
+const gchar *emphasis[4];
+const gchar *bool_label[2];
+
+
+static GList *genre_list = NULL;
+static gchar *current_filename = NULL;
+
+extern gchar *mpg123_filename;
+extern gint mpg123_bitrate, mpg123_frequency, mpg123_layer, mpg123_lsf,
+    mpg123_mode;
+extern gboolean mpg123_stereo, mpg123_mpeg25;
+
+glong info_rate;
+
+void fill_entries(GtkWidget * w, gpointer data);
+
+#define MAX_STR_LEN 100
+
+#ifndef HAVE_ID3LIB
+
+static void
+set_entry_tag(GtkEntry * entry, gchar * tag, gint length)
+{
+    gint stripped_len;
+    gchar *text, *text_utf8;
+
+    stripped_len = mpg123_strip_spaces(tag, length);
+    text = g_strdup_printf("%-*.*s", stripped_len, stripped_len, tag);
+
+    if ((text_utf8 = str_to_utf8(text))) {
+        gtk_entry_set_text(entry, text_utf8);
+        g_free(text_utf8);
+    }
+    else {
+        gtk_entry_set_text(entry, "");
+    }
+
+    g_free(text);
+}
+
+static void
+get_entry_tag(GtkEntry * entry, gchar * tag, gint length)
+{
+    gchar *text = str_to_utf8(gtk_entry_get_text(entry));
+    memset(tag, ' ', length);
+    memcpy(tag, text, strlen(text) > length ? length : strlen(text));
+}
+
+static gint
+find_genre_id(const gchar * text)
+{
+    gint i;
+
+    for (i = 0; i < GENRE_MAX; i++) {
+        if (!strcmp(mpg123_id3_genres[i], text))
+            return i;
+    }
+    if (text[0] == '\0')
+        return 0xff;
+    return 0;
+}
+
+static void
+press_save(GtkWidget * w, gpointer data)
+{
+    gtk_button_clicked(GTK_BUTTON(save));
+}
+
+#else
+
+GtkWidget * copy_album_tags_but, * paste_album_tags_but;
+
+struct album_tags_t {
+  char * performer;
+  char * album;
+  char * year;
+  char * total_tracks;
+};
+
+struct album_tags_t album_tags = { NULL, NULL, NULL, NULL };
+
+#define FREE_AND_ZERO(x) do { g_free(x); x = NULL; } while (0)
+
+static void free_album_tags()
+{
+  FREE_AND_ZERO(album_tags.performer);
+  FREE_AND_ZERO(album_tags.album);
+  FREE_AND_ZERO(album_tags.year);
+  FREE_AND_ZERO(album_tags.total_tracks);
+}
+
+static inline char * entry_text_dup_or_null(GtkWidget * e)
+{
+  const char * text = gtk_entry_get_text(GTK_ENTRY(e));
+  if (strlen(text) > 0)
+    return g_strdup(text);
+  else
+    return NULL;
+}
+
+static inline void 
+update_paste_sensitive()
+{
+  gtk_widget_set_sensitive(GTK_WIDGET(paste_album_tags_but), 
+			   album_tags.performer ||
+			   album_tags.album ||
+			   album_tags.year ||
+			   album_tags.total_tracks);
+
+}
+
+static void validate_zeropad_tracknums()
+{
+  const char * tn_str, * tt_str, * end;
+  char buf[5];
+  int tn, tt;
+
+  tn_str = gtk_entry_get_text(GTK_ENTRY(tracknum_entry));
+  tt_str = gtk_entry_get_text(GTK_ENTRY(totaltracks_entry));
+
+  end = tt_str;
+  tt = strtol(tt_str,(char**)&end,10);
+  if (end != tt_str) {
+    sprintf(buf,"%02d",tt);
+    gtk_entry_set_text(GTK_ENTRY(totaltracks_entry),buf);
+  } else {
+    gtk_entry_set_text(GTK_ENTRY(totaltracks_entry),"");
+    tt = 1000; /* any tracknum is valid */
+  }
+
+  end = tn_str;
+  tn = strtol(tn_str,(char**)&end,10);
+  if (end != tn_str && tn <= tt) {
+    sprintf(buf,"%02d",tn);
+    gtk_entry_set_text(GTK_ENTRY(tracknum_entry),buf);
+  } else
+    gtk_entry_set_text(GTK_ENTRY(tracknum_entry),"");
+
+}
+
+static void 
+copy_album_tags()
+{
+  validate_zeropad_tracknums();
+  free_album_tags();
+  album_tags.performer = entry_text_dup_or_null(artist_entry);
+  album_tags.album = entry_text_dup_or_null(album_entry);
+  album_tags.year = entry_text_dup_or_null(year_entry);
+  album_tags.total_tracks = entry_text_dup_or_null(totaltracks_entry);
+  update_paste_sensitive();
+}
+
+static void 
+paste_album_tags()
+{
+  if (album_tags.performer)
+    gtk_entry_set_text(GTK_ENTRY(artist_entry),album_tags.performer);
+  if (album_tags.album)
+    gtk_entry_set_text(GTK_ENTRY(album_entry),album_tags.album);
+  if (album_tags.year)
+    gtk_entry_set_text(GTK_ENTRY(year_entry),album_tags.year);
+  if (album_tags.total_tracks)
+    gtk_entry_set_text(GTK_ENTRY(totaltracks_entry),album_tags.total_tracks);
+}
+
+#endif
+
+static gint
+genre_comp_func(gconstpointer a, gconstpointer b)
+{
+    return strcasecmp(a, b);
+}
+
+static gboolean
+fileinfo_keypress_cb(GtkWidget * widget,
+                     GdkEventKey * event,
+                     gpointer data)
+{
+    if (!event)
+        return FALSE;
+
+    switch (event->keyval) {
+    case GDK_Escape:
+        gtk_widget_destroy(window);
+        break;
+    default:
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+#ifdef HAVE_ID3LIB
+/* some helper id3(v2) functions */
+
+static void str_to_id3v2_frame(const char * str, ID3Tag * tag, ID3_FrameID frame_id)
+{
+  ID3Frame * frame = ID3Tag_FindFrameWithID(tag,frame_id);
+  ID3Field * text_field;
+  gboolean new_frame = frame?FALSE:TRUE;
+
+  if (new_frame) {
+    frame = ID3Frame_NewID(frame_id);
+  }
+
+  text_field = ID3Frame_GetField(frame,ID3FN_TEXT);
+  ID3Field_SetASCII(text_field, str);
+
+  if (new_frame) 
+    ID3Tag_AddFrame(tag,frame);
+}
+
+static void genre_combo_to_tag(GtkWidget * combo, ID3Tag * tag)
+{
+  int idx = -1, i;
+  const char * genre = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry));
+  for(i=0;i<ID3_NR_OF_V1_GENRES;i++)
+    if (!strcmp(genre,ID3_v1_genre_description[i])) {
+      idx = i; break;
+    }
+  if (idx>-1) {
+    char code[7];
+    snprintf(code,7,"(%d)",idx);
+    str_to_id3v2_frame(code,tag,ID3FID_CONTENTTYPE);
+  }  
+}
+
+static void id3v2_frame_to_entry(GtkWidget * entry,ID3Tag * tag, ID3_FrameID frame_id)
+{
+  ID3Frame * frame = ID3Tag_FindFrameWithID(tag,frame_id);
+  ID3Field * text_field;
+  if (frame) {
+    char buf[4096];
+    text_field = ID3Frame_GetField(frame,ID3FN_TEXT);
+    ID3Field_GetASCII(text_field,buf,4096);
+    gtk_entry_set_text(GTK_ENTRY(entry),buf);
+  } else
+    gtk_entry_set_text(GTK_ENTRY(entry),"");    
+}
+
+static void id3v2_frame_to_text_view(GtkWidget * entry,ID3Tag * tag, ID3_FrameID frame_id)
+{
+  ID3Frame * frame = ID3Tag_FindFrameWithID(tag,frame_id);
+  ID3Field * text_field;
+  if (frame) {
+    char buf[4096];
+    text_field = ID3Frame_GetField(frame,ID3FN_TEXT);
+    ID3Field_GetASCII(text_field,buf,4096);
+    gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(entry)),buf,-1);
+  } else
+    gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(entry)),"",-1);
+}
+
+static void id3v2_tracknum_to_entries(GtkWidget * tracknum_entry,
+				      GtkWidget * totaltracks_entry,
+				      ID3Tag * tag)
+{
+  ID3Frame * frame = ID3Tag_FindFrameWithID(tag,ID3FID_TRACKNUM);
+  ID3Field * text_field;
+  if (frame) {
+    char buf[4096];
+    char * slash;
+    text_field = ID3Frame_GetField(frame,ID3FN_TEXT);
+    ID3Field_GetASCII(text_field,buf,4096);
+    slash = strchr(buf,'/');
+    if (slash) {
+      slash[0] = 0;
+      gtk_entry_set_text(GTK_ENTRY(tracknum_entry),buf);
+      gtk_entry_set_text(GTK_ENTRY(totaltracks_entry),slash+1);
+    } else {
+      gtk_entry_set_text(GTK_ENTRY(tracknum_entry),buf);
+      gtk_entry_set_text(GTK_ENTRY(totaltracks_entry),"");
+    }
+  } else {
+    gtk_entry_set_text(GTK_ENTRY(tracknum_entry),"");    
+    gtk_entry_set_text(GTK_ENTRY(totaltracks_entry),"");    
+  }
+}
+
+/* 
+   if has v2 - link with v2, if not - attempt to link with v1 
+   use this only for reading - always save v2 
+*/
+size_t ID3Tag_LinkPreferV2(ID3Tag *tag, const char *fileName)
+{
+  size_t r;
+
+  r = ID3Tag_Link(tag,fileName);
+  if (ID3Tag_HasTagType(tag,ID3TT_ID3V2)) {
+    ID3Tag_Clear(tag);
+    r = ID3Tag_LinkWithFlags(tag,fileName,ID3TT_ID3V2);
+  }
+  return r;
+}
+
+#endif /* HAVE_ID3LIB */
+
+#ifdef HAVE_ID3LIB
+
+static void
+save_cb(GtkWidget * w, gpointer data)
+{
+  ID3Tag * id3tag;
+  const char * tracks_str, * trackno_str, * endptr;
+  int trackno, tracks; 
+
+  if (str_has_prefix_nocase(current_filename, "http://"))
+    return;
+
+  validate_zeropad_tracknums();
+  
+  id3tag = ID3Tag_New();
+  ID3Tag_LinkWithFlags(id3tag, current_filename, ID3TT_ID3);
+
+  str_to_id3v2_frame(gtk_entry_get_text(GTK_ENTRY(title_entry)),id3tag,ID3FID_TITLE);
+  str_to_id3v2_frame(gtk_entry_get_text(GTK_ENTRY(artist_entry)),id3tag,ID3FID_LEADARTIST);
+  str_to_id3v2_frame(gtk_entry_get_text(GTK_ENTRY(album_entry)),id3tag,ID3FID_ALBUM);
+  {
+    GtkTextIter start, end;
+    GtkTextBuffer * buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(comment_entry));
+    gtk_text_buffer_get_start_iter(buffer,&start);
+    gtk_text_buffer_get_end_iter(buffer,&end);
+    str_to_id3v2_frame(gtk_text_buffer_get_text(buffer,&start,&end,FALSE),id3tag,ID3FID_COMMENT);
+  }
+  str_to_id3v2_frame(gtk_entry_get_text(GTK_ENTRY(year_entry)),id3tag,ID3FID_YEAR);
+
+  /* saving trackno -> may be with album tracks number */
+  trackno_str = gtk_entry_get_text(GTK_ENTRY(tracknum_entry));
+  endptr = trackno_str;
+  trackno = strtol(trackno_str,(char**)&endptr,10);
+  if (endptr != trackno_str) {
+    char buf[10];
+    tracks_str = gtk_entry_get_text(GTK_ENTRY(totaltracks_entry));
+    endptr = tracks_str;
+    tracks = strtol(tracks_str,(char**)&endptr,10);
+    if (endptr != tracks_str) 
+      snprintf(buf,10,"%02d/%02d",trackno,tracks);
+    else
+      snprintf(buf,10,"%02d",trackno);
+    str_to_id3v2_frame(buf,id3tag,ID3FID_TRACKNUM);
+  } else 
+    str_to_id3v2_frame("",id3tag,ID3FID_TRACKNUM);
+  
+
+  genre_combo_to_tag(genre_combo,id3tag);
+  gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE);
+
+  ID3Tag_Update(id3tag);
+
+  ID3Tag_Delete(id3tag);
+}
+
+#else /* ! HAVE_ID3LIB */
+
+static void
+save_cb(GtkWidget * widget,
+        gpointer data)
+{
+    VFSFile *file;
+    gchar *msg = NULL;
+
+    if (str_has_prefix_nocase(current_filename, "http://"))
+        return;
+
+    if ((file = vfs_fopen(current_filename, "r+b")) != NULL) {
+        gint tracknum;
+
+        vfs_fseek(file, -128, SEEK_END);
+        vfs_fread(&tag, 1, sizeof(struct id3v1tag_t), file);
+
+        if (g_str_has_prefix(tag.tag, "TAG"))
+            vfs_fseek(file, -128L, SEEK_END);
+        else
+            vfs_fseek(file, 0L, SEEK_END);
+
+        tag.tag[0] = 'T';
+        tag.tag[1] = 'A';
+        tag.tag[2] = 'G';
+
+        get_entry_tag(GTK_ENTRY(title_entry), tag.title, 30);
+        get_entry_tag(GTK_ENTRY(artist_entry), tag.artist, 30);
+        get_entry_tag(GTK_ENTRY(album_entry), tag.album, 30);
+        get_entry_tag(GTK_ENTRY(year_entry), tag.year, 4);
+
+        tracknum = atoi(gtk_entry_get_text(GTK_ENTRY(tracknum_entry)));
+        if (tracknum > 0) {
+            get_entry_tag(GTK_ENTRY(comment_entry), tag.u.v1_1.comment, 28);
+            tag.u.v1_1.__zero = 0;
+            tag.u.v1_1.track_number = MIN(tracknum, 255);
+        }
+        else
+            get_entry_tag(GTK_ENTRY(comment_entry), tag.u.v1_0.comment, 30);
+
+        tag.genre = find_genre_id(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO
+                                                      (genre_combo)->entry)));
+        if (vfs_fwrite(&tag, 1, sizeof(tag), file) != sizeof(tag))
+            msg = g_strdup_printf(_("%s\nUnable to write to file: %s"),
+                                  _("Couldn't write tag!"), strerror(errno));
+        vfs_fclose(file);
+    }
+    else
+        msg = g_strdup_printf(_("%s\nUnable to open file: %s"),
+                              _("Couldn't write tag!"), strerror(errno));
+    if (msg) {
+        GtkWidget *mwin = xmms_show_message(_("File Info"), msg, _("Ok"),
+                                            FALSE, NULL, NULL);
+        gtk_window_set_transient_for(GTK_WINDOW(mwin), GTK_WINDOW(window));
+        g_free(msg);
+    }
+    else {
+        gtk_widget_set_sensitive(GTK_WIDGET(data), TRUE);
+        gtk_widget_set_sensitive(GTK_WIDGET(widget), FALSE);
+    }
+}
+
+#endif /* HAVE_ID3LIB */
+
+static void
+label_set_text(GtkWidget * label, gchar * str, ...)
+{
+    va_list args;
+    gchar tempstr[MAX_STR_LEN];
+
+    va_start(args, str);
+    g_vsnprintf(tempstr, MAX_STR_LEN, str, args);
+    va_end(args);
+
+    gtk_label_set_text(GTK_LABEL(label), tempstr);
+}
+
+#ifdef HAVE_ID3LIB
+
+static void
+remove_id3_cb(GtkWidget * w, gpointer data)
+{
+  ID3Tag * id3tag;
+
+  if (str_has_prefix_nocase(current_filename, "http://"))
+    return;
+  
+  id3tag = ID3Tag_New();
+  ID3Tag_LinkWithFlags(id3tag, current_filename, ID3TT_ID3);
+
+  ID3Tag_Strip(id3tag,ID3TT_ALL);
+  ID3Tag_Update(id3tag);
+
+  ID3Tag_Delete(id3tag);
+  gtk_entry_set_text(GTK_ENTRY(title_entry), "");
+  gtk_entry_set_text(GTK_ENTRY(artist_entry), "");
+  gtk_entry_set_text(GTK_ENTRY(album_entry), "");
+  gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(comment_entry)), "",-1);
+  gtk_entry_set_text(GTK_ENTRY(year_entry), "");
+  gtk_entry_set_text(GTK_ENTRY(album_entry), "");
+  gtk_entry_set_text(GTK_ENTRY(tracknum_entry), "");
+  gtk_entry_set_text(GTK_ENTRY(totaltracks_entry), "");
+  gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(genre_combo)->entry), "");
+  gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE);
+  gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE);
+}
+
+#else
+
+static void
+remove_id3_cb(GtkWidget * w, gpointer data)
+{
+    VFSFile *file;
+    gint len;
+    struct id3v1tag_t tag;
+    gchar *msg = NULL;
+
+    if (str_has_prefix_nocase(current_filename, "http://"))
+        return;
+
+    if ((file = vfs_fopen(current_filename, "rb+")) != NULL) {
+        vfs_fseek(file, -128, SEEK_END);
+        len = vfs_ftell(file);
+
+        vfs_fread(&tag, 1, sizeof(struct id3v1tag_t), file);
+
+        if (g_str_has_prefix(tag.tag, "TAG")) {
+            if (vfs_truncate(file, len))
+                msg = g_strdup_printf(_("%s\n"
+                                        "Unable to truncate file: %s"),
+                                      _("Couldn't remove tag!"),
+                                      strerror(errno));
+        }
+        else
+            msg = strdup(_("No tag to remove!"));
+
+        vfs_fclose(file);
+    }
+    else
+        msg = g_strdup_printf(_("%s\nUnable to open file: %s"),
+                              _("Couldn't remove tag!"), strerror(errno));
+    if (msg) {
+        GtkWidget *mwin = xmms_show_message(_("File Info"), msg, _("Ok"),
+                                            FALSE, NULL, NULL);
+        gtk_window_set_transient_for(GTK_WINDOW(mwin), GTK_WINDOW(window));
+        g_free(msg);
+    }
+    else {
+        gtk_entry_set_text(GTK_ENTRY(title_entry), "");
+        gtk_entry_set_text(GTK_ENTRY(artist_entry), "");
+        gtk_entry_set_text(GTK_ENTRY(album_entry), "");
+        gtk_entry_set_text(GTK_ENTRY(comment_entry), "");
+        gtk_entry_set_text(GTK_ENTRY(year_entry), "");
+        gtk_entry_set_text(GTK_ENTRY(album_entry), "");
+        gtk_entry_set_text(GTK_ENTRY(tracknum_entry), "");
+        gtk_widget_set_sensitive(GTK_WIDGET(w), FALSE);
+        gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE);
+    }
+}
+
+#endif
+
+static void
+set_mpeg_level_label(gboolean mpeg25, gint lsf, gint layer)
+{
+    if (mpeg25)
+        label_set_text(mpeg_level_val, "MPEG-2.5 Layer %d", layer);
+    else
+        label_set_text(mpeg_level_val, "MPEG-%d Layer %d", lsf + 1, layer);
+}
+
+static const gchar *
+channel_mode_name(gint mode)
+{
+    static const gchar *channel_mode[] = { N_("Stereo"), N_("Joint stereo"),
+        N_("Dual channel"), N_("Single channel")
+    };
+    if (mode < 0 || mode > 3)
+        return "";
+
+    return gettext(channel_mode[mode]);
+}
+
+static void
+file_info_http(gchar * filename)
+{
+    gtk_widget_set_sensitive(id3_frame, FALSE);
+    if (mpg123_filename && !strcmp(filename, mpg123_filename) &&
+        mpg123_bitrate != 0) {
+        set_mpeg_level_label(mpg123_mpeg25, mpg123_lsf, mpg123_layer);
+        label_set_text(mpeg_bitrate_val, _("%d KBit/s"), mpg123_bitrate);
+        label_set_text(mpeg_samplerate_val, _("%ld Hz"), mpg123_frequency);
+        label_set_text(mpeg_flags, "%s", channel_mode_name(mpg123_mode));
+    }
+}
+
+static void
+change_buttons(GtkObject * object)
+{
+    gtk_widget_set_sensitive(GTK_WIDGET(object), TRUE);
+#if 0
+    gtk_widget_set_sensitive(GTK_WIDGET(revert),TRUE);
+#endif
+}
+
+void
+mpg123_file_info_box(gchar * filename)
+{
+    gint i;
+    gchar *title, *filename_utf8;
+
+    emphasis[0] = _("None");
+    emphasis[1] = _("50/15 ms");
+    emphasis[2] = "";
+    emphasis[3] = _("CCIT J.17");
+    bool_label[0] = _("No");
+    bool_label[1] = _("Yes");
+
+    if (!window) {
+        GtkWidget *pixmapwid;
+        GdkPixbuf *pixbuf;
+        PangoAttrList *attrs;
+        PangoAttribute *attr;
+        GtkWidget *test_table = gtk_table_new(2, 10, FALSE);
+        GtkWidget *urk, *blark;
+#ifdef HAVE_ID3LIB
+	GtkWidget * tracknum_box, * comment_frame;
+#endif
+
+        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+        gtk_window_set_type_hint(GTK_WINDOW(window),
+                                 GDK_WINDOW_TYPE_HINT_DIALOG);
+        gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
+        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
+        g_signal_connect(G_OBJECT(window), "destroy",
+                         G_CALLBACK(gtk_widget_destroyed), &window);
+        gtk_container_set_border_width(GTK_CONTAINER(window), 10);
+
+        vbox = gtk_vbox_new(FALSE, 10);
+        gtk_container_add(GTK_CONTAINER(window), vbox);
+
+
+        filename_vbox = gtk_hbox_new(FALSE, 5);
+        gtk_box_pack_start(GTK_BOX(vbox), filename_vbox, FALSE, TRUE, 0);
+
+        pixbuf = gdk_pixbuf_new_from_xpm_data((const gchar **)
+                                              gnome_mime_audio_xpm);
+        pixmapwid = gtk_image_new_from_pixbuf(pixbuf);
+        g_object_unref(pixbuf);
+        gtk_misc_set_alignment(GTK_MISC(pixmapwid), 0, 0);
+        gtk_box_pack_start(GTK_BOX(filename_vbox), pixmapwid, FALSE, FALSE,
+                           0);
+
+        label = gtk_label_new(NULL);
+
+        attrs = pango_attr_list_new();
+
+        attr = pango_attr_weight_new(PANGO_WEIGHT_BOLD);
+        attr->start_index = 0;
+        attr->end_index = -1;
+        pango_attr_list_insert(attrs, attr);
+
+        gtk_label_set_attributes(GTK_LABEL(label), attrs);
+        gtk_label_set_text(GTK_LABEL(label), _("Name:"));
+        gtk_box_pack_start(GTK_BOX(filename_vbox), label, FALSE, FALSE, 0);
+
+        filename_entry = gtk_entry_new();
+        gtk_editable_set_editable(GTK_EDITABLE(filename_entry), FALSE);
+        gtk_box_pack_start(GTK_BOX(filename_vbox), filename_entry, TRUE,
+                           TRUE, 0);
+
+        hbox = gtk_hbox_new(FALSE, 10);
+        gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
+
+        left_vbox = gtk_table_new(2, 4, FALSE);
+        gtk_box_pack_start(GTK_BOX(hbox), left_vbox, FALSE, FALSE, 0);
+
+        /* MPEG-Info window */
+
+        mpeg_frame = gtk_frame_new(_(" MPEG Info "));
+        gtk_table_attach(GTK_TABLE(left_vbox), mpeg_frame, 0, 2, 0, 1,
+                         GTK_FILL, GTK_FILL, 0, 4);
+
+        mpeg_box = gtk_vbox_new(FALSE, 5);
+        gtk_container_add(GTK_CONTAINER(mpeg_frame), mpeg_box);
+        gtk_container_set_border_width(GTK_CONTAINER(mpeg_box), 10);
+        gtk_box_set_spacing(GTK_BOX(mpeg_box), 0);
+
+        /* MPEG Layer Info */
+
+        /* FIXME: Obvious... */
+        gtk_container_set_border_width(GTK_CONTAINER(test_table), 0);
+        gtk_container_add(GTK_CONTAINER(mpeg_box), test_table);
+
+        mpeg_level = gtk_label_new(_("MPEG Level:"));
+        gtk_misc_set_alignment(GTK_MISC(mpeg_level), 1, 0.5);
+        gtk_label_set_justify(GTK_LABEL(mpeg_level), GTK_JUSTIFY_RIGHT);
+        gtk_label_set_attributes(GTK_LABEL(mpeg_level), attrs);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_level, 0, 1, 0, 1,
+                         GTK_FILL, GTK_FILL, 5, 2);
+
+        mpeg_level_val = gtk_label_new("");
+        gtk_misc_set_alignment(GTK_MISC(mpeg_level_val), 0, 0);
+        gtk_label_set_justify(GTK_LABEL(mpeg_level_val), GTK_JUSTIFY_LEFT);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_level_val, 1, 2, 0, 1,
+                         GTK_FILL, GTK_FILL, 10, 2);
+
+        mpeg_bitrate = gtk_label_new(_("Bit rate:"));
+        gtk_misc_set_alignment(GTK_MISC(mpeg_bitrate), 1, 0.5);
+        gtk_label_set_justify(GTK_LABEL(mpeg_bitrate), GTK_JUSTIFY_RIGHT);
+        gtk_label_set_attributes(GTK_LABEL(mpeg_bitrate), attrs);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_bitrate, 0, 1, 1, 2,
+                         GTK_FILL, GTK_FILL, 5, 2);
+
+        mpeg_bitrate_val = gtk_label_new("");
+        gtk_misc_set_alignment(GTK_MISC(mpeg_bitrate_val), 0, 0);
+        gtk_label_set_justify(GTK_LABEL(mpeg_bitrate_val), GTK_JUSTIFY_LEFT);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_bitrate_val, 1, 2, 1,
+                         2, GTK_FILL, GTK_FILL, 10, 2);
+
+        mpeg_samplerate = gtk_label_new(_("Sample rate:"));
+        gtk_misc_set_alignment(GTK_MISC(mpeg_samplerate), 1, 0.5);
+        gtk_label_set_justify(GTK_LABEL(mpeg_samplerate), GTK_JUSTIFY_RIGHT);
+        gtk_label_set_attributes(GTK_LABEL(mpeg_samplerate), attrs);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_samplerate, 0, 1, 2,
+                         3, GTK_FILL, GTK_FILL, 5, 2);
+
+        mpeg_samplerate_val = gtk_label_new("");
+        gtk_misc_set_alignment(GTK_MISC(mpeg_samplerate_val), 0, 0);
+        gtk_label_set_justify(GTK_LABEL(mpeg_samplerate_val),
+                              GTK_JUSTIFY_LEFT);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_samplerate_val, 1, 2,
+                         2, 3, GTK_FILL, GTK_FILL, 10, 2);
+
+        mpeg_frames = gtk_label_new(_("Frames:"));
+        gtk_misc_set_alignment(GTK_MISC(mpeg_frames), 1, 0.5);
+        gtk_label_set_justify(GTK_LABEL(mpeg_frames), GTK_JUSTIFY_RIGHT);
+        gtk_label_set_attributes(GTK_LABEL(mpeg_frames), attrs);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_frames, 0, 1, 3, 4,
+                         GTK_FILL, GTK_FILL, 5, 2);
+
+        mpeg_frames_val = gtk_label_new("");
+        gtk_misc_set_alignment(GTK_MISC(mpeg_frames_val), 0, 0);
+        gtk_label_set_justify(GTK_LABEL(mpeg_frames_val), GTK_JUSTIFY_LEFT);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_frames_val, 1, 2, 3,
+                         4, GTK_FILL, GTK_FILL, 10, 2);
+
+        mpeg_filesize = gtk_label_new(_("File size:"));
+        gtk_misc_set_alignment(GTK_MISC(mpeg_filesize), 1, 0.5);
+        gtk_label_set_justify(GTK_LABEL(mpeg_filesize), GTK_JUSTIFY_RIGHT);
+        gtk_label_set_attributes(GTK_LABEL(mpeg_filesize), attrs);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_filesize, 0, 1, 4, 5,
+                         GTK_FILL, GTK_FILL, 5, 2);
+
+        mpeg_filesize_val = gtk_label_new("");
+        gtk_misc_set_alignment(GTK_MISC(mpeg_filesize_val), 0, 0);
+        gtk_label_set_justify(GTK_LABEL(mpeg_filesize_val), GTK_JUSTIFY_LEFT);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_filesize_val, 1, 2, 4,
+                         5, GTK_FILL, GTK_FILL, 10, 2);
+
+        urk = gtk_label_new("");
+        blark = gtk_label_new("");
+        gtk_misc_set_alignment(GTK_MISC(urk), 1, 0.5);
+        gtk_misc_set_alignment(GTK_MISC(blark), 0, 0);
+
+        gtk_table_attach(GTK_TABLE(test_table), urk, 0, 1, 5, 6, GTK_FILL,
+                         GTK_FILL, 5, 5);
+        gtk_table_attach(GTK_TABLE(test_table), blark, 1, 2, 5, 6,
+                         GTK_FILL, GTK_FILL, 10, 5);
+
+        mpeg_error = gtk_label_new(_("Error Protection:"));
+        gtk_misc_set_alignment(GTK_MISC(mpeg_error), 1, 0.5);
+        gtk_label_set_justify(GTK_LABEL(mpeg_error), GTK_JUSTIFY_RIGHT);
+        gtk_label_set_attributes(GTK_LABEL(mpeg_error), attrs);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_error, 0, 1, 6, 7,
+                         GTK_FILL, GTK_FILL, 5, 0);
+
+        mpeg_error_val = gtk_label_new("");
+        gtk_misc_set_alignment(GTK_MISC(mpeg_error_val), 0, 0);
+        gtk_label_set_justify(GTK_LABEL(mpeg_error_val), GTK_JUSTIFY_LEFT);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_error_val, 1, 2, 6, 7,
+                         GTK_FILL, GTK_FILL, 10, 2);
+
+        mpeg_copy = gtk_label_new(_("Copyright:"));
+        gtk_misc_set_alignment(GTK_MISC(mpeg_copy), 1, 0.5);
+        gtk_label_set_justify(GTK_LABEL(mpeg_copy), GTK_JUSTIFY_RIGHT);
+        gtk_label_set_attributes(GTK_LABEL(mpeg_copy), attrs);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_copy, 0, 1, 7, 8,
+                         GTK_FILL, GTK_FILL, 5, 2);
+
+        mpeg_copy_val = gtk_label_new("");
+        gtk_misc_set_alignment(GTK_MISC(mpeg_copy_val), 0, 0);
+        gtk_label_set_justify(GTK_LABEL(mpeg_copy_val), GTK_JUSTIFY_LEFT);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_copy_val, 1, 2, 7, 8,
+                         GTK_FILL, GTK_FILL, 10, 2);
+
+        mpeg_orig = gtk_label_new(_("Original:"));
+        gtk_misc_set_alignment(GTK_MISC(mpeg_orig), 1, 0.5);
+        gtk_label_set_justify(GTK_LABEL(mpeg_orig), GTK_JUSTIFY_RIGHT);
+        gtk_label_set_attributes(GTK_LABEL(mpeg_orig), attrs);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_orig, 0, 1, 8, 9,
+                         GTK_FILL, GTK_FILL, 5, 2);
+
+        mpeg_orig_val = gtk_label_new("");
+        gtk_misc_set_alignment(GTK_MISC(mpeg_orig_val), 0, 0);
+        gtk_label_set_justify(GTK_LABEL(mpeg_orig_val), GTK_JUSTIFY_LEFT);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_orig_val, 1, 2, 8, 9,
+                         GTK_FILL, GTK_FILL, 10, 2);
+
+        mpeg_emph = gtk_label_new(_("Emphasis:"));
+        gtk_misc_set_alignment(GTK_MISC(mpeg_emph), 1, 0.5);
+        gtk_label_set_justify(GTK_LABEL(mpeg_emph), GTK_JUSTIFY_RIGHT);
+        gtk_label_set_attributes(GTK_LABEL(mpeg_emph), attrs);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_emph, 0, 1, 9, 10,
+                         GTK_FILL, GTK_FILL, 5, 2);
+
+        mpeg_emph_val = gtk_label_new("");
+        gtk_misc_set_alignment(GTK_MISC(mpeg_emph_val), 0, 0);
+        gtk_label_set_justify(GTK_LABEL(mpeg_emph_val), GTK_JUSTIFY_LEFT);
+        gtk_table_attach(GTK_TABLE(test_table), mpeg_emph_val, 1, 2, 9, 10,
+                         GTK_FILL, GTK_FILL, 10, 2);
+
+
+        id3_frame = gtk_frame_new(_(" ID3 Tag "));
+        gtk_table_attach(GTK_TABLE(left_vbox), id3_frame, 2, 4, 0, 1,
+                         GTK_FILL, GTK_FILL, 0, 4);
+
+        table = gtk_table_new(7, 5, FALSE);
+        gtk_container_set_border_width(GTK_CONTAINER(table), 5);
+        gtk_container_add(GTK_CONTAINER(id3_frame), table);
+
+        label = gtk_label_new(_("Title:"));
+        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
+        gtk_label_set_attributes(GTK_LABEL(label), attrs);
+        gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL,
+                         GTK_FILL, 5, 5);
+
+#ifdef HAVE_ID3LIB
+	title_entry = gtk_entry_new();
+#else
+        title_entry = gtk_entry_new_with_max_length(30);
+#endif
+        gtk_table_attach(GTK_TABLE(table), title_entry, 1, 6, 0, 1,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
+
+        label = gtk_label_new(_("Artist:"));
+        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
+        gtk_label_set_attributes(GTK_LABEL(label), attrs);
+        gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_FILL,
+                         GTK_FILL, 5, 5);
+
+#ifdef HAVE_ID3LIB
+	artist_entry = gtk_entry_new();
+#else
+        artist_entry = gtk_entry_new_with_max_length(30);
+#endif
+        gtk_table_attach(GTK_TABLE(table), artist_entry, 1, 6, 1, 2,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
+
+        label = gtk_label_new(_("Album:"));
+        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
+        gtk_label_set_attributes(GTK_LABEL(label), attrs);
+        gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3, GTK_FILL,
+                         GTK_FILL, 5, 5);
+
+#ifdef HAVE_ID3LIB
+	album_entry = gtk_entry_new();
+#else
+        album_entry = gtk_entry_new_with_max_length(30);
+#endif
+        gtk_table_attach(GTK_TABLE(table), album_entry, 1, 6, 2, 3,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
+
+        label = gtk_label_new(_("Comment:"));
+        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
+        gtk_label_set_attributes(GTK_LABEL(label), attrs);
+        gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4, GTK_FILL,
+                         GTK_FILL, 5, 5);
+
+#ifdef HAVE_ID3LIB
+	comment_frame = gtk_frame_new(NULL);
+	gtk_frame_set_shadow_type(GTK_FRAME(comment_frame),GTK_SHADOW_IN);
+	comment_entry = gtk_text_view_new();
+	gtk_text_view_set_accepts_tab(GTK_TEXT_VIEW(comment_entry),FALSE);
+	gtk_container_add(GTK_CONTAINER(comment_frame),comment_entry);
+        gtk_table_attach(GTK_TABLE(table), comment_frame, 1, 6, 3, 4,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
+#else
+        comment_entry = gtk_entry_new_with_max_length(30);
+        gtk_table_attach(GTK_TABLE(table), comment_entry, 1, 6, 3, 4,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
+#endif
+
+        label = gtk_label_new(_("Year:"));
+        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
+        gtk_label_set_attributes(GTK_LABEL(label), attrs);
+        gtk_table_attach(GTK_TABLE(table), label, 0, 1, 4, 5, GTK_FILL,
+                         GTK_FILL, 5, 5);
+
+        year_entry = gtk_entry_new_with_max_length(4);
+        gtk_entry_set_width_chars(GTK_ENTRY(year_entry),4);
+        gtk_table_attach(GTK_TABLE(table), year_entry, 1, 2, 4, 5,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
+
+        label = gtk_label_new(_("Track number:"));
+        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
+        gtk_label_set_attributes(GTK_LABEL(label), attrs);
+        gtk_table_attach(GTK_TABLE(table), label, 2, 3, 4, 5, GTK_FILL,
+                         GTK_FILL, 5, 5);
+
+#ifdef HAVE_ID3LIB
+	tracknum_box = gtk_hbox_new(FALSE,0);
+	tracknum_entry = gtk_entry_new_with_max_length(2);
+        gtk_entry_set_width_chars(GTK_ENTRY(tracknum_entry),2);
+	totaltracks_entry = gtk_entry_new_with_max_length(2);
+        gtk_entry_set_width_chars(GTK_ENTRY(totaltracks_entry),2);
+	gtk_box_pack_start(GTK_BOX(tracknum_box),
+			   tracknum_entry, TRUE, TRUE, 1);
+	gtk_box_pack_start(GTK_BOX(tracknum_box),
+			   gtk_label_new(" / "), FALSE, FALSE, 1);
+	gtk_box_pack_start(GTK_BOX(tracknum_box),
+			   totaltracks_entry, TRUE, TRUE, 1);
+        gtk_table_attach(GTK_TABLE(table), 
+			 tracknum_box,
+			 3, 4, 4, 5,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
+	
+#else
+        tracknum_entry = gtk_entry_new_with_max_length(3);
+        gtk_widget_set_usize(tracknum_entry, 40, -1);
+        gtk_table_attach(GTK_TABLE(table), tracknum_entry, 3, 4, 4, 5,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
+#endif
+
+        label = gtk_label_new(_("Genre:"));
+        gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
+        gtk_label_set_attributes(GTK_LABEL(label), attrs);
+        gtk_table_attach(GTK_TABLE(table), label, 0, 1, 5, 6, GTK_FILL,
+                         GTK_FILL, 5, 5);
+
+        pango_attr_list_unref(attrs);
+
+        genre_combo = gtk_combo_new();
+        gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(genre_combo)->entry),
+                               FALSE);
+        if (!genre_list) {
+            for (i = 0; i < GENRE_MAX; i++)
+                genre_list =
+                    g_list_prepend(genre_list,
+                                   (gchar *) mpg123_id3_genres[i]);
+            genre_list = g_list_prepend(genre_list, "");
+            genre_list = g_list_sort(genre_list, genre_comp_func);
+        }
+        gtk_combo_set_popdown_strings(GTK_COMBO(genre_combo), genre_list);
+
+        gtk_table_attach(GTK_TABLE(table), genre_combo, 1, 6, 5, 6,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK,
+                         GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5);
+
+        boxx = gtk_hbutton_box_new();
+        gtk_hbutton_box_set_layout_default(GTK_BUTTONBOX_SPREAD);
+
+        remove_id3 = gtk_button_new_from_stock(GTK_STOCK_DELETE);
+        gtk_container_add(GTK_CONTAINER(boxx), remove_id3);
+
+#if 0
+        revert = gtk_button_new_from_stock(GTK_STOCK_REVERT_TO_SAVED);
+        gtk_container_add(GTK_CONTAINER(boxx), revert);
+#endif
+
+#ifdef HAVE_ID3LIB
+	copy_album_tags_but = gtk_button_new_with_label(_("Copy album tags"));
+	paste_album_tags_but = gtk_button_new_with_label(_("Paste album tags"));
+
+        gtk_container_add(GTK_CONTAINER(boxx), copy_album_tags_but);
+        gtk_container_add(GTK_CONTAINER(boxx), paste_album_tags_but);
+
+        g_signal_connect(G_OBJECT(copy_album_tags_but), "clicked",
+                         G_CALLBACK(copy_album_tags), NULL);
+        g_signal_connect(G_OBJECT(paste_album_tags_but), "clicked",
+                         G_CALLBACK(paste_album_tags), NULL);
+
+	gtk_widget_set_sensitive(GTK_WIDGET(paste_album_tags_but), FALSE);
+#endif
+        save = gtk_button_new_from_stock(GTK_STOCK_SAVE);
+        gtk_container_add(GTK_CONTAINER(boxx), save);
+
+        g_signal_connect(G_OBJECT(remove_id3), "clicked",
+                         G_CALLBACK(remove_id3_cb), save);
+        g_signal_connect(G_OBJECT(save), "clicked", G_CALLBACK(save_cb),
+                         remove_id3);
+#if 0
+        g_signal_connect(G_OBJECT(revert), "clicked", G_CALLBACK(fill_entries),
+                         NULL);
+#endif
+
+
+        gtk_table_attach(GTK_TABLE(table), boxx, 0, 5, 6, 7, GTK_FILL, 0,
+                         0, 8);
+
+        bbox = gtk_hbutton_box_new();
+        gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
+        gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
+        gtk_table_attach(GTK_TABLE(left_vbox), bbox, 0, 4, 1, 2, GTK_FILL,
+                         0, 0, 8);
+
+        cancel = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
+        g_signal_connect_swapped(G_OBJECT(cancel), "clicked",
+                                 G_CALLBACK(gtk_widget_destroy),
+                                 G_OBJECT(window));
+        GTK_WIDGET_SET_FLAGS(cancel, GTK_CAN_DEFAULT);
+        gtk_box_pack_start(GTK_BOX(bbox), cancel, FALSE, FALSE, 0);
+        gtk_widget_grab_default(cancel);
+
+
+        gtk_table_set_col_spacing(GTK_TABLE(left_vbox), 1, 10);
+
+
+        g_signal_connect_swapped(G_OBJECT(title_entry), "changed",
+                                 G_CALLBACK(change_buttons), save);
+        g_signal_connect_swapped(G_OBJECT(artist_entry), "changed",
+                                 G_CALLBACK(change_buttons), save);
+        g_signal_connect_swapped(G_OBJECT(album_entry), "changed",
+                                 G_CALLBACK(change_buttons), save);
+        g_signal_connect_swapped(G_OBJECT(year_entry), "changed",
+                                 G_CALLBACK(change_buttons), save);
+#ifdef HAVE_ID3LIB
+        g_signal_connect_swapped(G_OBJECT(gtk_text_view_get_buffer(GTK_TEXT_VIEW(comment_entry))), "changed",
+                                 G_CALLBACK(change_buttons), save);
+        g_signal_connect_swapped(G_OBJECT(totaltracks_entry), "changed",
+                                 G_CALLBACK(change_buttons), save);
+#else
+        g_signal_connect_swapped(G_OBJECT(comment_entry), "changed",
+                                 G_CALLBACK(change_buttons), save);
+#endif
+        g_signal_connect_swapped(G_OBJECT(tracknum_entry), "changed",
+                                 G_CALLBACK(change_buttons), save);
+        g_signal_connect_swapped(G_OBJECT(GTK_COMBO(genre_combo)->entry), "changed",
+                                 G_CALLBACK(change_buttons), save);
+
+	/* Nonsence, should i remove this altogether? 
+	   causes changes to be saved as you type - 
+	   makes save /revert buttons pointless
+        g_signal_connect(G_OBJECT(title_entry), "activate",
+                         G_CALLBACK(press_save), NULL);
+        g_signal_connect(G_OBJECT(artist_entry), "activate",
+                         G_CALLBACK(press_save), NULL);
+        g_signal_connect(G_OBJECT(album_entry), "activate",
+                         G_CALLBACK(press_save), NULL);
+        g_signal_connect(G_OBJECT(year_entry), "activate",
+                         G_CALLBACK(press_save), NULL);
+        g_signal_connect(G_OBJECT(comment_entry), "activate",
+                         G_CALLBACK(press_save), NULL);
+        g_signal_connect(G_OBJECT(tracknum_entry), "activate",
+                         G_CALLBACK(press_save), NULL);
+	*/
+        g_signal_connect(G_OBJECT(window), "key_press_event",
+                         G_CALLBACK(fileinfo_keypress_cb), NULL);
+    }
+
+    g_free(current_filename);
+    current_filename = g_strdup(filename);
+
+    filename_utf8 = filename_to_utf8(filename);
+
+    title = g_strdup_printf(_("%s - BMP"), g_basename(filename_utf8));
+    gtk_window_set_title(GTK_WINDOW(window), title);
+    g_free(title);
+
+    gtk_entry_set_text(GTK_ENTRY(filename_entry), filename_utf8);
+    g_free(filename_utf8);
+
+    gtk_editable_set_position(GTK_EDITABLE(filename_entry), -1);
+
+    gtk_entry_set_text(GTK_ENTRY(artist_entry), "");
+    gtk_entry_set_text(GTK_ENTRY(album_entry), "");
+    gtk_entry_set_text(GTK_ENTRY(year_entry), "");
+    gtk_entry_set_text(GTK_ENTRY(tracknum_entry), "");
+#ifdef HAVE_ID3LIB
+    gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(comment_entry)),"",-1);
+#else
+    gtk_entry_set_text(GTK_ENTRY(comment_entry), "");
+#endif
+    gtk_list_select_item(GTK_LIST(GTK_COMBO(genre_combo)->list),
+                         g_list_index(genre_list, ""));
+
+    gtk_label_set_text(GTK_LABEL(mpeg_level), _("MPEG Level:"));
+    gtk_label_set_text(GTK_LABEL(mpeg_level_val), _("N/A"));
+
+    gtk_label_set_text(GTK_LABEL(mpeg_bitrate), _("Bit rate:"));
+    gtk_label_set_text(GTK_LABEL(mpeg_bitrate_val), _("N/A"));
+
+    gtk_label_set_text(GTK_LABEL(mpeg_samplerate), _("Sample rate:"));
+    gtk_label_set_text(GTK_LABEL(mpeg_samplerate_val), _("N/A"));
+
+    gtk_label_set_text(GTK_LABEL(mpeg_error), _("Error Protection:"));
+    gtk_label_set_text(GTK_LABEL(mpeg_error_val), _("N/A"));
+
+    gtk_label_set_text(GTK_LABEL(mpeg_copy), _("Copyright:"));
+    gtk_label_set_text(GTK_LABEL(mpeg_copy_val), _("N/A"));
+
+    gtk_label_set_text(GTK_LABEL(mpeg_orig), _("Original:"));
+    gtk_label_set_text(GTK_LABEL(mpeg_orig_val), _("N/A"));
+
+    gtk_label_set_text(GTK_LABEL(mpeg_emph), _("Emphasis:"));
+    gtk_label_set_text(GTK_LABEL(mpeg_emph_val), _("N/A"));
+
+    gtk_label_set_text(GTK_LABEL(mpeg_frames), _("Frames:"));
+    gtk_label_set_text(GTK_LABEL(mpeg_frames_val), _("N/A"));
+
+    gtk_label_set_text(GTK_LABEL(mpeg_filesize), _("File size:"));
+    gtk_label_set_text(GTK_LABEL(mpeg_filesize_val), _("N/A"));
+
+    if (str_has_prefix_nocase(filename, "http://")) {
+        file_info_http(filename);
+        return;
+    }
+
+    gtk_widget_set_sensitive(id3_frame,
+                             vfs_is_writeable(filename));
+
+    fill_entries(NULL, NULL);
+
+    gtk_widget_set_sensitive(GTK_WIDGET(save), FALSE);
+#if 0
+    gtk_widget_set_sensitive(GTK_WIDGET(revert), FALSE);
+#endif
+    gtk_widget_show_all(window);
+}
+
+#ifdef HAVE_ID3LIB
+
+void
+fill_entries(GtkWidget * w, gpointer data)
+{
+  VFSFile *fh;
+  ID3Tag * id3tag;
+
+  if (str_has_prefix_nocase(current_filename, "http://"))
+    return;
+  
+  id3tag = ID3Tag_New();
+  ID3Tag_LinkPreferV2(id3tag, current_filename);
+
+  id3v2_frame_to_entry(title_entry, id3tag, ID3FID_TITLE);
+  id3v2_frame_to_entry(artist_entry, id3tag, ID3FID_LEADARTIST);
+  id3v2_frame_to_entry(album_entry, id3tag, ID3FID_ALBUM);
+  id3v2_frame_to_text_view(comment_entry, id3tag, ID3FID_COMMENT);
+  id3v2_frame_to_entry(year_entry, id3tag, ID3FID_YEAR);
+  id3v2_tracknum_to_entries(tracknum_entry, totaltracks_entry, id3tag);
+  {
+    ID3Frame * frame = ID3Tag_FindFrameWithID(id3tag, ID3FID_CONTENTTYPE);
+	    
+    if (frame) {
+      int genre_idx = -1;
+      char genre[64];
+      const char * genre2;
+      ID3Field * text_field = ID3Frame_GetField(frame,ID3FN_TEXT);
+      ID3Field_GetASCII(text_field,genre,64);
+
+      /* attempt to find corresponding genre */
+      g_strstrip(genre);
+      sscanf(genre,"(%d)",&genre_idx);
+      if ((genre2 = ID3_V1GENRE2DESCRIPTION(genre_idx)))
+	gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(genre_combo)->entry),
+			   genre2);
+    }
+  }
+
+  gtk_widget_set_sensitive(GTK_WIDGET(remove_id3), TRUE);
+  gtk_widget_set_sensitive(GTK_WIDGET(save), FALSE);
+
+  update_paste_sensitive();
+
+  ID3Tag_Delete(id3tag);  
+
+  if ((fh = vfs_fopen(current_filename, "rb")) != NULL) {
+    guint32 head;
+    guchar tmp[4];
+    struct frame frm;
+    gboolean id3_found = FALSE;
+
+    if (vfs_fread(tmp, 1, 4, fh) != 4) {
+      vfs_fclose(fh);
+      return;
+    }
+    head =
+      ((guint32) tmp[0] << 24) | ((guint32) tmp[1] << 16) |
+      ((guint32) tmp[2] << 8) | (guint32) tmp[3];
+    while (!mpg123_head_check(head)) {
+      head <<= 8;
+      if (vfs_fread(tmp, 1, 1, fh) != 1) {
+	vfs_fclose(fh);
+	return;
+      }
+      head |= tmp[0];
+    }
+    if (mpg123_decode_header(&frm, head)) {
+      guchar *buf;
+      gdouble tpf;
+      gint pos;
+      xing_header_t xing_header;
+      guint32 num_frames;
+
+      buf = g_malloc(frm.framesize + 4);
+      vfs_fseek(fh, -4, SEEK_CUR);
+      vfs_fread(buf, 1, frm.framesize + 4, fh);
+      tpf = mpg123_compute_tpf(&frm);
+      set_mpeg_level_label(frm.mpeg25, frm.lsf, frm.lay);
+      pos = vfs_ftell(fh);
+      vfs_fseek(fh, 0, SEEK_END);
+      if (mpg123_get_xing_header(&xing_header, buf)) {
+	num_frames = xing_header.frames;
+	label_set_text(mpeg_bitrate_val,
+		       _("Variable,\navg. bitrate: %d KBit/s"),
+		       (gint) ((xing_header.bytes * 8) /
+			       (tpf * xing_header.frames * 1000)));
+      }
+      else {
+	num_frames =
+	  ((vfs_ftell(fh) - pos -
+	    (id3_found ? 128 : 0)) / mpg123_compute_bpf(&frm)) + 1;
+	label_set_text(mpeg_bitrate_val, _("%d KBit/s"),
+		       tabsel_123[frm.lsf][frm.lay -
+					   1][frm.bitrate_index]);
+      }
+      label_set_text(mpeg_samplerate_val, _("%ld Hz"),
+		     mpg123_freqs[frm.sampling_frequency]);
+      label_set_text(mpeg_error_val, _("%s"),
+		     bool_label[frm.error_protection]);
+      label_set_text(mpeg_copy_val, _("%s"), bool_label[frm.copyright]);
+      label_set_text(mpeg_orig_val, _("%s"), bool_label[frm.original]);
+      label_set_text(mpeg_emph_val, _("%s"), emphasis[frm.emphasis]);
+      label_set_text(mpeg_frames_val, _("%d"), num_frames);
+      label_set_text(mpeg_filesize_val, _("%lu Bytes"), vfs_ftell(fh));
+      g_free(buf);
+    }
+    vfs_fclose(fh);
+  }
+
+}
+
+#else /* ! HAVE_ID3LIB */
+
+void
+fill_entries(GtkWidget * w, gpointer data)
+{
+    if ((fh = vfs_fopen(current_filename, "rb")) != NULL) {
+        guint32 head;
+        guchar tmp[4];
+        struct frame frm;
+        gboolean id3_found = FALSE;
+
+        vfs_fseek(fh, -sizeof(tag), SEEK_END);
+        if (vfs_fread(&tag, 1, sizeof(tag), fh) == sizeof(tag)) {
+            if (!strncmp(tag.tag, "TAG", 3)) {
+                id3_found = TRUE;
+                set_entry_tag(GTK_ENTRY(title_entry), tag.title, 30);
+                set_entry_tag(GTK_ENTRY(artist_entry), tag.artist, 30);
+                set_entry_tag(GTK_ENTRY(album_entry), tag.album, 30);
+                set_entry_tag(GTK_ENTRY(year_entry), tag.year, 4);
+                /* Check for v1.1 tags */
+                if (tag.u.v1_1.__zero == 0) {
+                    gchar *temp =
+                        g_strdup_printf("%d", tag.u.v1_1.track_number);
+                    set_entry_tag(GTK_ENTRY(comment_entry),
+                                  tag.u.v1_1.comment, 28);
+                    gtk_entry_set_text(GTK_ENTRY(tracknum_entry), temp);
+                    g_free(temp);
+                }
+                else {
+                    set_entry_tag(GTK_ENTRY(comment_entry),
+                                  tag.u.v1_0.comment, 30);
+                    gtk_entry_set_text(GTK_ENTRY(tracknum_entry), "");
+                }
+
+                gtk_list_select_item(GTK_LIST
+                                     (GTK_COMBO(genre_combo)->list),
+                                     g_list_index(genre_list, (gchar *)
+                                                  mpg123_id3_genres[tag.
+                                                                    genre]));
+                gtk_widget_set_sensitive(GTK_WIDGET(remove_id3), TRUE);
+                gtk_widget_set_sensitive(GTK_WIDGET(save), FALSE);
+#if 0
+                gtk_widget_set_sensitive(GTK_WIDGET(revert), FALSE);
+#endif
+            }
+            else {
+                gtk_entry_set_text(GTK_ENTRY(title_entry), "");
+                gtk_entry_set_text(GTK_ENTRY(artist_entry), "");
+                gtk_entry_set_text(GTK_ENTRY(album_entry), "");
+                gtk_entry_set_text(GTK_ENTRY(comment_entry), "");
+                gtk_entry_set_text(GTK_ENTRY(year_entry), "");
+                gtk_entry_set_text(GTK_ENTRY(album_entry), "");
+                gtk_entry_set_text(GTK_ENTRY(tracknum_entry), "");
+                gtk_widget_set_sensitive(GTK_WIDGET(remove_id3), FALSE);
+                gtk_widget_set_sensitive(GTK_WIDGET(save), FALSE);
+#if 0
+                gtk_widget_set_sensitive(GTK_WIDGET(revert), FALSE);
+#endif
+            }
+        }
+        vfs_rewind(fh);
+        if (vfs_fread(tmp, 1, 4, fh) != 4) {
+            vfs_fclose(fh);
+            return;
+        }
+        head =
+            ((guint32) tmp[0] << 24) | ((guint32) tmp[1] << 16) |
+            ((guint32) tmp[2] << 8) | (guint32) tmp[3];
+        while (!mpg123_head_check(head)) {
+            head <<= 8;
+            if (vfs_fread(tmp, 1, 1, fh) != 1) {
+                vfs_fclose(fh);
+                return;
+            }
+            head |= tmp[0];
+        }
+        if (mpg123_decode_header(&frm, head)) {
+            guchar *buf;
+            gdouble tpf;
+            gint pos;
+            xing_header_t xing_header;
+            guint32 num_frames;
+
+            buf = g_malloc(frm.framesize + 4);
+            vfs_fseek(fh, -4, SEEK_CUR);
+            vfs_fread(buf, 1, frm.framesize + 4, fh);
+            tpf = mpg123_compute_tpf(&frm);
+            set_mpeg_level_label(frm.mpeg25, frm.lsf, frm.lay);
+            pos = vfs_ftell(fh);
+            vfs_fseek(fh, 0, SEEK_END);
+            if (mpg123_get_xing_header(&xing_header, buf)) {
+                num_frames = xing_header.frames;
+                label_set_text(mpeg_bitrate_val,
+                               _("Variable,\navg. bitrate: %d KBit/s"),
+                               (gint) ((xing_header.bytes * 8) /
+                                       (tpf * xing_header.frames * 1000)));
+            }
+            else {
+                num_frames =
+                    ((vfs_ftell(fh) - pos -
+                      (id3_found ? 128 : 0)) / mpg123_compute_bpf(&frm)) + 1;
+                label_set_text(mpeg_bitrate_val, _("%d KBit/s"),
+                               tabsel_123[frm.lsf][frm.lay -
+                                                   1][frm.bitrate_index]);
+            }
+            label_set_text(mpeg_samplerate_val, _("%ld Hz"),
+                           mpg123_freqs[frm.sampling_frequency]);
+            label_set_text(mpeg_error_val, _("%s"),
+                           bool_label[frm.error_protection]);
+            label_set_text(mpeg_copy_val, _("%s"), bool_label[frm.copyright]);
+            label_set_text(mpeg_orig_val, _("%s"), bool_label[frm.original]);
+            label_set_text(mpeg_emph_val, _("%s"), emphasis[frm.emphasis]);
+            label_set_text(mpeg_frames_val, _("%d"), num_frames);
+            label_set_text(mpeg_filesize_val, _("%lu Bytes"), vfs_ftell(fh));
+            g_free(buf);
+        }
+        vfs_fclose(fh);
+    }
+}
+
+#endif

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/getbits.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/getbits.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/getbits.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,132 @@
+#include "mpg123.h"
+
+#if 0
+static void
+check_buffer_range(int size)
+{
+    int pos = (bsi.wordpointer - bsbuf) + (size >> 3);
+
+    if (pos >= fsizeold) {
+        fprintf(stderr, "Pointer out of range (%d,%d)!\n", pos, fsizeold);
+    }
+}
+#endif
+
+void
+mpg123_backbits(int number_of_bits)
+{
+    bsi.bitindex -= number_of_bits;
+    bsi.wordpointer += (bsi.bitindex >> 3);
+    bsi.bitindex &= 0x7;
+}
+
+int
+mpg123_getbitoffset(void)
+{
+    return (-bsi.bitindex) & 0x7;
+}
+
+int
+mpg123_getbyte(void)
+{
+#ifdef DEBUG_GETBITS
+    if (bsi.bitindex)
+        fprintf(stderr, "getbyte called unsynched!\n");
+#endif
+    return *bsi.wordpointer++;
+}
+
+unsigned int
+mpg123_getbits(int number_of_bits)
+{
+    unsigned long rval;
+
+#ifdef DEBUG_GETBITS
+    fprintf(stderr, "g%d", number_of_bits);
+#endif
+
+    if (!number_of_bits)
+        return 0;
+
+#if 0
+    check_buffer_range(number_of_bits + bsi.bitindex);
+#endif
+
+    {
+        rval = bsi.wordpointer[0];
+        rval <<= 8;
+        rval |= bsi.wordpointer[1];
+        rval <<= 8;
+        rval |= bsi.wordpointer[2];
+
+        rval <<= bsi.bitindex;
+        rval &= 0xffffff;
+
+        bsi.bitindex += number_of_bits;
+
+        rval >>= (24 - number_of_bits);
+
+        bsi.wordpointer += (bsi.bitindex >> 3);
+        bsi.bitindex &= 7;
+    }
+
+#ifdef DEBUG_GETBITS
+    fprintf(stderr, ":%x ", rval);
+#endif
+
+    return rval;
+}
+
+unsigned int
+mpg123_getbits_fast(int number_of_bits)
+{
+    unsigned int rval;
+#ifdef DEBUG_GETBITS
+    fprintf(stderr, "g%d", number_of_bits);
+#endif
+
+#if 0
+    check_buffer_range(number_of_bits + bsi.bitindex);
+#endif
+
+    rval = (unsigned char) (bsi.wordpointer[0] << bsi.bitindex);
+    rval |= ((unsigned int) bsi.wordpointer[1] << bsi.bitindex) >> 8;
+    rval <<= number_of_bits;
+    rval >>= 8;
+
+    bsi.bitindex += number_of_bits;
+
+    bsi.wordpointer += (bsi.bitindex >> 3);
+    bsi.bitindex &= 7;
+
+#ifdef DEBUG_GETBITS
+    fprintf(stderr, ":%x ", rval);
+#endif
+    return rval;
+}
+
+unsigned int
+mpg123_get1bit(void)
+{
+    unsigned char rval;
+
+#ifdef DEBUG_GETBITS
+    fprintf(stderr, "g%d", 1);
+#endif
+
+#if 0
+    check_buffer_range(1 + bsi.bitindex);
+#endif
+
+    rval = *bsi.wordpointer << bsi.bitindex;
+
+    bsi.bitindex++;
+    bsi.wordpointer += (bsi.bitindex >> 3);
+    bsi.bitindex &= 7;
+
+#ifdef DEBUG_GETBITS
+    fprintf(stderr, ":%d ", rval >> 7);
+#endif
+
+    return rval >> 7;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/getbits.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/getbits.h	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/getbits.h	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,46 @@
+
+/*
+ * This does the same as getbits.c but with defines to
+ * force inlining
+ */
+
+#define mpg123_backbits(nob)			\
+do {						\
+	bsi.bitindex    -= nob;			\
+	bsi.wordpointer += (bsi.bitindex >> 3);	\
+	bsi.bitindex    &= 0x7;			\
+} while (0)
+
+#define mpg123_getbitoffset() ((-bsi.bitindex) & 0x7)
+#define mpg123_getbyte()      (*bsi.wordpointer++)
+
+#define mpg123_getbits(nob)			\
+	(rval = bsi.wordpointer[0],		\
+	rval <<= 8,				\
+	rval |= bsi.wordpointer[1],		\
+	rval <<= 8,				\
+	rval |= bsi.wordpointer[2],		\
+	rval <<= bsi.bitindex,			\
+	rval &= 0xffffff,			\
+	bsi.bitindex += (nob),			\
+	rval >>= (24-(nob)),			\
+	bsi.wordpointer += (bsi.bitindex>>3),	\
+	bsi.bitindex &= 7,			\
+	rval)
+
+#define mpg123_getbits_fast(nob)						\
+	(rval = (unsigned char) (bsi.wordpointer[0] << bsi.bitindex),		\
+	rval |= ((unsigned long) bsi.wordpointer[1] << bsi.bitindex) >> 8,	\
+	rval <<= (nob),								\
+	rval >>= 8,								\
+	bsi.bitindex += (nob),							\
+	bsi.wordpointer += (bsi.bitindex >> 3),					\
+	bsi.bitindex &= 7,							\
+	rval)
+
+#define mpg123_get1bit()				\
+	(rval_uc = *bsi.wordpointer << bsi.bitindex,	\
+	bsi.bitindex++,					\
+	bsi.wordpointer += (bsi.bitindex>>3),		\
+	bsi.bitindex &= 7,				\
+	rval_uc >> 7)

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/getcpuflags.s
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/getcpuflags.s	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/getcpuflags.s	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,61 @@
+# KIMURA Takuhiro <kim at comtec.co.jp>
+# Copyright 2002 Haavard Kvaalen <havardk at xmms.org>
+	
+# Get feature flags with cpuid
+# void mpg123_getcpuid(unsigned int *fflags, unsigned int *efflags)
+	
+.text
+	.align 4
+.globl mpg123_getcpuflags
+	.type	 mpg123_getcpuflags, at function
+mpg123_getcpuflags:
+	pushl %ebp
+	movl %esp,%ebp
+	pushl %edx
+	pushl %ecx
+	pushl %ebx
+	pushfl			# First test if cpuid is supported
+	pushfl			# Check if the ID flag (bit 21 of eflags) sticks
+	popl %eax		# Get eflags
+	movl %eax,%ebx
+	xorl $0x200000,%eax	# Flip bit 21
+	pushl %eax
+	popfl			# Get modified eflags to flag register
+	pushfl
+	popl %eax		# Get eflags again
+	popfl			# Restore original eflags
+	xorl %ebx,%eax
+	je nocpuid
+	xorl %eax,%eax
+	cpuid			# Check if eax = 1 is supported
+	xorl %edx,%edx
+	cmp $1,%eax
+	jl noflags
+	movl $1,%eax		# Get feature flags
+	cpuid
+noflags:
+	movl 8(%ebp),%eax
+	movl %edx,(%eax)
+	movl $0x80000000,%eax	# Check support for extended level cpuid
+	cpuid
+	xorl %edx,%edx
+	cmp $0x80000001,%eax	# Get extended feature flags
+	jl noeflags
+	movl $0x80000001,%eax
+	cpuid
+noeflags:
+	movl 12(%ebp),%eax
+	movl %edx,(%eax)
+	jmp done
+nocpuid:
+	xorl %edx,%edx
+	movl 8(%ebp),%eax
+	movl %edx,(%eax)
+	movl 12(%ebp),%eax
+	movl %edx,(%eax)
+done:
+	popl %ebx
+	popl %ecx
+	popl %edx
+	leave
+	ret

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/http.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/http.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/http.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,860 @@
+/*  BMP - Cross-platform multimedia player
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#include <libbeep/util.h>
+
+#include "mpg123.h"
+
+
+#define min(x,y) ((x)<(y)?(x):(y))
+#define min3(x,y,z) (min(x,y)<(z)?min(x,y):(z))
+#define min4(x,y,z,w) (min3(x,y,z)<(w)?min3(x,y,z):(w))
+
+static gchar *icy_name = NULL;
+static gint icy_metaint = 0;
+
+#undef DEBUG_UDP
+
+/* Static udp channel functions */
+static gint udp_establish_listener(gint * sock);
+static gint udp_check_for_data(gint sock);
+
+extern gint mpg123_bitrate, mpg123_frequency, mpg123_stereo;
+extern gboolean mpg123_stereo;
+
+static gboolean prebuffering, going, eof = FALSE;
+static gint sock, rd_index, wr_index, buffer_length, prebuffer_length;
+static guint64 buffer_read = 0;
+static gchar *buffer;
+static GThread *thread;
+static GtkWidget *error_dialog = NULL;
+
+static VFSFile *output_file = NULL;
+
+#define BASE64_LENGTH(len) (4 * (((len) + 2) / 3))
+
+/* Encode the string S of length LENGTH to base64 format and place it
+   to STORE.  STORE will be 0-terminated, and must point to a writable
+   buffer of at least 1+BASE64_LENGTH(length) bytes.  */
+static void
+base64_encode(const gchar * s, gchar * store, gint length)
+{
+    /* Conversion table.  */
+    static gchar tbl[64] = {
+        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+        'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
+        'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
+        'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
+        'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+        'w', 'x', 'y', 'z', '0', '1', '2', '3',
+        '4', '5', '6', '7', '8', '9', '+', '/'
+    };
+    gint i;
+    guchar *p = (guchar *) store;
+
+    /* Transform the 3x8 bits to 4x6 bits, as required by base64.  */
+    for (i = 0; i < length; i += 3) {
+        *p++ = tbl[s[0] >> 2];
+        *p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
+        *p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)];
+        *p++ = tbl[s[2] & 0x3f];
+        s += 3;
+    }
+    /* Pad the result if necessary...  */
+    if (i == length + 1)
+        *(p - 1) = '=';
+    else if (i == length + 2)
+        *(p - 1) = *(p - 2) = '=';
+    /* ...and zero-terminate it.  */
+    *p = '\0';
+}
+
+/* Create the authentication header contents for the `Basic' scheme.
+   This is done by encoding the string `USER:PASS' in base64 and
+   prepending `HEADER: Basic ' to it.  */
+static gchar *
+basic_authentication_encode(const gchar * user,
+                            const gchar * passwd, const gchar * header)
+{
+    gchar *t1, *t2, *res;
+    gint len1 = strlen(user) + 1 + strlen(passwd);
+    gint len2 = BASE64_LENGTH(len1);
+
+    t1 = g_strdup_printf("%s:%s", user, passwd);
+    t2 = g_malloc0(len2 + 1);
+    base64_encode(t1, t2, len1);
+    res = g_strdup_printf("%s: Basic %s\r\n", header, t2);
+    g_free(t2);
+    g_free(t1);
+
+    return res;
+}
+
+static void
+parse_url(const gchar * url, gchar ** user, gchar ** pass,
+          gchar ** host, gint * port, gchar ** filename)
+{
+    gchar *h, *p, *pt, *f, *temp, *ptr;
+
+    temp = g_strdup(url);
+    ptr = temp;
+
+    if (!strncasecmp("http://", ptr, 7))
+        ptr += 7;
+    h = strchr(ptr, '@');
+    f = strchr(ptr, '/');
+    if (h != NULL && (!f || h < f)) {
+        *h = '\0';
+        p = strchr(ptr, ':');
+        if (p != NULL && p < h) {
+            *p = '\0';
+            p++;
+            *pass = g_strdup(p);
+        }
+        else
+            *pass = NULL;
+        *user = g_strdup(ptr);
+        h++;
+        ptr = h;
+    }
+    else {
+        *user = NULL;
+        *pass = NULL;
+        h = ptr;
+    }
+    pt = strchr(ptr, ':');
+    if (pt != NULL && (f == NULL || pt < f)) {
+        *pt = '\0';
+        *port = atoi(pt + 1);
+    }
+    else {
+        if (f)
+            *f = '\0';
+        *port = 80;
+    }
+    *host = g_strdup(h);
+
+    if (f)
+        *filename = g_strdup(f + 1);
+    else
+        *filename = NULL;
+    g_free(temp);
+}
+
+void
+mpg123_http_close(void)
+{
+    going = FALSE;
+
+    g_thread_join(thread);
+    g_free(icy_name);
+    icy_name = NULL;
+}
+
+
+static gint
+http_used(void)
+{
+    if (wr_index >= rd_index)
+        return wr_index - rd_index;
+    return buffer_length - (rd_index - wr_index);
+}
+
+static gint
+http_free(void)
+{
+    if (rd_index > wr_index)
+        return (rd_index - wr_index) - 1;
+    return (buffer_length - (wr_index - rd_index)) - 1;
+}
+
+static void
+http_wait_for_data(gint bytes)
+{
+    while ((prebuffering || http_used() < bytes) && !eof && going
+           && mpg123_info->going)
+        xmms_usleep(10000);
+}
+
+static void
+show_error_message(gchar * error)
+{
+    if (!error_dialog) {
+        GDK_THREADS_ENTER();
+        error_dialog = xmms_show_message(_("Error"), error, _("Ok"), FALSE,
+                                         NULL, NULL);
+        g_signal_connect(G_OBJECT(error_dialog),
+                         "destroy",
+                         G_CALLBACK(gtk_widget_destroyed), &error_dialog);
+        GDK_THREADS_LEAVE();
+    }
+}
+
+int
+mpg123_http_read(gpointer data, gint length)
+{
+    gint len, cnt, off = 0, meta_len, meta_off = 0, i;
+    gchar *meta_data, **tags;
+
+    http_wait_for_data(length);
+
+    if (!going && !mpg123_info->going)
+        return 0;
+    len = min(http_used(), length);
+
+    while (len && http_used()) {
+        if ((icy_metaint > 0) && (buffer_read % icy_metaint) == 0 && 
+            (buffer_read > 0)) {
+            meta_len = *((guchar *) buffer + rd_index) * 16;
+            rd_index = (rd_index + 1) % buffer_length;
+            if (meta_len > 0) {
+                http_wait_for_data(meta_len);
+                meta_data = g_malloc0(meta_len);
+                if (http_used() >= meta_len) {
+                    while (meta_len) {
+                        cnt = min(meta_len, buffer_length - rd_index);
+                        memcpy(meta_data + meta_off, buffer + rd_index, cnt);
+                        rd_index = (rd_index + cnt) % buffer_length;
+                        meta_len -= cnt;
+                        meta_off += cnt;
+                    }
+                    tags = g_strsplit(meta_data, "';", 0);
+
+                    for (i = 0; tags[i]; i++) {
+                        if (!strncasecmp(tags[i], "StreamTitle=", 12)) {
+                            gchar *temp = tags[i] + 13;
+                            gchar *title =
+                                g_strdup_printf("%s (%s)", temp, icy_name);
+                            mpg123_ip.set_info(title, -1,
+                                               mpg123_bitrate * 1000,
+                                               mpg123_frequency,
+                                               mpg123_stereo);
+                            g_free(title);
+                        }
+
+                    }
+                    g_strfreev(tags);
+
+                }
+                g_free(meta_data);
+            }
+            if (!http_used())
+                http_wait_for_data(length - off);
+            cnt = min3(len, buffer_length - rd_index, http_used());
+        }
+        else if (icy_metaint > 0)
+            cnt =
+                min4(len, buffer_length - rd_index, http_used(),
+                     icy_metaint - (buffer_read % icy_metaint));
+        else
+            cnt = min3(len, buffer_length - rd_index, http_used());
+        if (output_file)
+            vfs_fwrite(buffer + rd_index, 1, cnt, output_file);
+
+        memcpy((gchar *) data + off, buffer + rd_index, cnt);
+        rd_index = (rd_index + cnt) % buffer_length;
+        buffer_read += cnt;
+        len -= cnt;
+        off += cnt;
+    }
+    return off;
+}
+
+static gboolean
+http_check_for_data(void)
+{
+
+    fd_set set;
+    struct timeval tv;
+    gint ret;
+
+    tv.tv_sec = 0;
+    tv.tv_usec = 20000;
+    FD_ZERO(&set);
+    FD_SET(sock, &set);
+    ret = select(sock + 1, &set, NULL, NULL, &tv);
+    if (ret > 0)
+        return TRUE;
+    return FALSE;
+}
+
+gint
+mpg123_http_read_line(gchar * buf, gint size)
+{
+    gint i = 0;
+
+    while (going && i < size - 1) {
+        if (http_check_for_data()) {
+            if (read(sock, buf + i, 1) <= 0)
+                return -1;
+            if (buf[i] == '\n')
+                break;
+            if (buf[i] != '\r')
+                i++;
+        }
+    }
+    if (!going)
+        return -1;
+    buf[i] = '\0';
+    return i;
+}
+
+static gpointer
+http_buffer_loop(gpointer arg)
+{
+    gchar line[1024], *user, *pass, *host, *filename,
+        *status, *url, *temp, *file;
+    gchar *chost;
+    gint cnt, written, error, err_len, port, cport;
+    gboolean redirect;
+    gint udp_sock = 0;
+    fd_set set;
+    struct hostent *hp;
+    struct sockaddr_in address;
+    struct timeval tv;
+
+    url = (gchar *) arg;
+    do {
+        redirect = FALSE;
+
+        g_strstrip(url);
+
+        parse_url(url, &user, &pass, &host, &port, &filename);
+
+        if ((!filename || !*filename) && url[strlen(url) - 1] != '/')
+            temp = g_strconcat(url, "/", NULL);
+        else
+            temp = g_strdup(url);
+        g_free(url);
+        url = temp;
+
+        chost = mpg123_cfg.use_proxy ? mpg123_cfg.proxy_host : host;
+        cport = mpg123_cfg.use_proxy ? mpg123_cfg.proxy_port : port;
+
+        sock = socket(AF_INET, SOCK_STREAM, 0);
+        fcntl(sock, F_SETFL, O_NONBLOCK);
+        address.sin_family = AF_INET;
+
+        status = g_strdup_printf(_("LOOKING UP %s"), chost);
+        mpg123_ip.set_info_text(status);
+        g_free(status);
+
+        if (!(hp = gethostbyname(chost))) {
+            status = g_strdup_printf(_("Couldn't look up host %s"), chost);
+            show_error_message(status);
+            g_free(status);
+
+            mpg123_ip.set_info_text(NULL);
+            eof = TRUE;
+        }
+
+        if (!eof) {
+            memcpy(&address.sin_addr.s_addr, *(hp->h_addr_list),
+                   sizeof(address.sin_addr.s_addr));
+            address.sin_port = g_htons(cport);
+
+            status = g_strdup_printf(_("CONNECTING TO %s:%d"), chost, cport);
+            mpg123_ip.set_info_text(status);
+            g_free(status);
+            if (connect
+                (sock, (struct sockaddr *) &address,
+                 sizeof(struct sockaddr_in)) == -1) {
+                if (errno != EINPROGRESS) {
+                    status =
+                        g_strdup_printf(_("Couldn't connect to host %s"),
+                                        chost);
+                    show_error_message(status);
+                    g_free(status);
+
+                    mpg123_ip.set_info_text(NULL);
+                    eof = TRUE;
+                }
+            }
+            while (going) {
+                tv.tv_sec = 0;
+                tv.tv_usec = 10000;
+                FD_ZERO(&set);
+                FD_SET(sock, &set);
+                if (select(sock + 1, NULL, &set, NULL, &tv) > 0) {
+                    err_len = sizeof(error);
+                    getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &err_len);
+                    if (error) {
+                        status =
+                            g_strdup_printf(_
+                                            ("Couldn't connect to host %s"),
+                                            chost);
+                        show_error_message(status);
+                        g_free(status);
+
+                        mpg123_ip.set_info_text(NULL);
+                        eof = TRUE;
+
+                    }
+                    break;
+                }
+            }
+            if (!eof) {
+                gchar *auth = NULL, *proxy_auth = NULL;
+                gchar udpspace[30];
+                gint udp_port;
+
+                if (mpg123_cfg.use_udp_channel) {
+                    udp_port = udp_establish_listener(&udp_sock);
+                    if (udp_port > 0)
+                        sprintf(udpspace, "x-audiocast-udpport: %d\r\n",
+                                udp_port);
+                    else
+                        udp_sock = 0;
+                }
+
+                if (user && pass)
+                    auth =
+                        basic_authentication_encode(user, pass,
+                                                    "Authorization");
+
+                if (mpg123_cfg.use_proxy) {
+                    file = g_strdup(url);
+                    if (mpg123_cfg.proxy_use_auth && mpg123_cfg.proxy_user
+                        && mpg123_cfg.proxy_pass) {
+                        proxy_auth =
+                            basic_authentication_encode(mpg123_cfg.
+                                                        proxy_user,
+                                                        mpg123_cfg.
+                                                        proxy_pass,
+                                                        "Proxy-Authorization");
+                    }
+                }
+                else
+                    file = g_strconcat("/", filename, NULL);
+                temp = g_strdup_printf("GET %s HTTP/1.0\r\n"
+                                       "Host: %s\r\n"
+                                       "User-Agent: %s/%s\r\n"
+                                       "%s%s%s%s\r\n",
+                                       file, host, PACKAGE, VERSION,
+                                       proxy_auth ? proxy_auth : "",
+                                       auth ? auth : "",
+                                       "Icy-MetaData:1\r\n",
+                                       mpg123_cfg.
+                                       use_udp_channel ? udpspace : "");
+
+                g_free(file);
+                if (proxy_auth)
+                    g_free(proxy_auth);
+                if (auth)
+                    g_free(auth);
+                write(sock, temp, strlen(temp));
+                g_free(temp);
+                mpg123_ip.set_info_text(_("CONNECTED: WAITING FOR REPLY"));
+                while (going && !eof) {
+                    if (http_check_for_data()) {
+                        if (mpg123_http_read_line(line, 1024)) {
+                            status = strchr(line, ' ');
+                            if (status) {
+                                if (status[1] == '2')
+                                    break;
+                                else if (status[1] == '3'
+                                         && status[2] == '0'
+                                         && status[3] == '2') {
+                                    while (going) {
+                                        if (http_check_for_data()) {
+                                            if ((cnt =
+                                                 mpg123_http_read_line
+                                                 (line, 1024)) != -1) {
+                                                if (!cnt)
+                                                    break;
+                                                if (!strncmp
+                                                    (line, "Location:", 9)) {
+                                                    g_free(url);
+                                                    url = g_strdup(line + 10);
+                                                }
+                                            }
+                                            else {
+                                                eof = TRUE;
+                                                mpg123_ip.set_info_text(NULL);
+                                                break;
+                                            }
+                                        }
+                                    }
+                                    redirect = TRUE;
+                                    break;
+                                }
+                                else {
+                                    status =
+                                        g_strdup_printf(_
+                                                        ("Couldn't connect to host %s\nServer reported: %s"),
+                                                        chost, status);
+                                    show_error_message(status);
+                                    g_free(status);
+                                    break;
+                                }
+                            }
+                        }
+                        else {
+                            eof = TRUE;
+                            mpg123_ip.set_info_text(NULL);
+                        }
+                    }
+                }
+
+                while (going && !redirect) {
+                    if (http_check_for_data()) {
+                        if ((cnt = mpg123_http_read_line(line, 1024)) != -1) {
+                            if (!cnt)
+                                break;
+                            if (!strncmp(line, "icy-name:", 9))
+                                icy_name = g_strdup(line + 9);
+                            else if (!strncmp(line, "x-audiocast-name:", 17))
+                                icy_name = g_strdup(line + 17);
+                            if (!strncmp(line, "icy-metaint:", 12))
+                                icy_metaint = atoi(line + 12);
+                            if (!strncmp(line, "x-audiocast-udpport:", 20)) {
+#ifdef DEBUG_UDP
+                                fprintf(stderr,
+                                        "Server wants udp messages on port %d\n",
+                                        atoi(line + 20));
+#endif
+/*  								udp_serverport = atoi (line + 20); */
+                            }
+
+                        }
+                        else {
+                            eof = TRUE;
+                            mpg123_ip.set_info_text(NULL);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+        if (redirect) {
+            if (output_file) {
+                vfs_fclose(output_file);
+                output_file = NULL;
+            }
+            close(sock);
+            g_free(user);
+            g_free(pass);
+            g_free(host);
+            g_free(filename);
+        }
+    } while (redirect);
+
+    if (mpg123_cfg.save_http_stream) {
+        gchar *output_name;
+        gint i = 1;
+
+        file = mpg123_http_get_title(url);
+        output_name = file;
+        if (!strncasecmp(output_name, "http://", 7))
+            output_name += 7;
+        temp = strrchr(output_name, '.');
+        if (temp && !strcasecmp(temp, ".mp3"))
+            *temp = '\0';
+
+        while ((temp = strchr(output_name, '/')))
+            *temp = '_';
+        output_name = g_strdup_printf("%s/%s.mp3",
+                                      mpg123_cfg.save_http_path, output_name);
+        while (!access(output_name, F_OK) && i < 100000) {
+            g_free(output_name);
+            output_name = g_strdup_printf("%s/%s-%d.mp3",
+                                          mpg123_cfg.save_http_path,
+                                          output_name, i++);
+        }
+
+        g_free(file);
+
+        output_file = vfs_fopen(output_name, "wb");
+        g_free(output_name);
+    }
+
+    while (going) {
+
+        if (!http_used() && !mpg123_ip.output->buffer_playing())
+            prebuffering = TRUE;
+        if (http_free() > 0 && !eof) {
+            if (http_check_for_data()) {
+                cnt = min(http_free(), buffer_length - wr_index);
+                if (cnt > 1024)
+                    cnt = 1024;
+                written = read(sock, buffer + wr_index, cnt);
+                if (written <= 0) {
+                    eof = TRUE;
+                    if (prebuffering) {
+                        prebuffering = FALSE;
+
+                        mpg123_ip.set_info_text(NULL);
+                    }
+
+                }
+                else
+                    wr_index = (wr_index + written) % buffer_length;
+            }
+
+            if (prebuffering) {
+                if (http_used() > prebuffer_length) {
+                    prebuffering = FALSE;
+                    mpg123_ip.set_info_text(NULL);
+                }
+                else {
+                    status =
+                        g_strdup_printf(_("PRE-BUFFERING: %dKB/%dKB"),
+                                        http_used() / 1024,
+                                        prebuffer_length / 1024);
+                    mpg123_ip.set_info_text(status);
+                    g_free(status);
+                }
+
+            }
+        }
+        else
+            xmms_usleep(10000);
+
+        if (mpg123_cfg.use_udp_channel && udp_sock != 0)
+            if (udp_check_for_data(udp_sock) < 0) {
+                close(udp_sock);
+                udp_sock = 0;
+            }
+    }
+    if (output_file) {
+        vfs_fclose(output_file);
+        output_file = NULL;
+    }
+    close(sock);
+    if (udp_sock != 0)
+        close(udp_sock);
+
+    g_free(user);
+    g_free(pass);
+    g_free(host);
+    g_free(filename);
+    g_free(buffer);
+    g_free(url);
+
+    return NULL;
+}
+
+int
+mpg123_http_open(gchar * _url)
+{
+    gchar *url;
+
+    url = g_strdup(_url);
+
+    rd_index = 0;
+    wr_index = 0;
+    buffer_length = mpg123_cfg.http_buffer_size * 1024;
+    prebuffer_length = (buffer_length * mpg123_cfg.http_prebuffer) / 100;
+    buffer_read = 0;
+    icy_metaint = 0;
+    prebuffering = TRUE;
+    going = TRUE;
+    eof = FALSE;
+    buffer = g_malloc(buffer_length);
+
+    thread = g_thread_create(http_buffer_loop, url, TRUE, NULL);
+
+    return 0;
+}
+
+char *
+mpg123_http_get_title(gchar * url)
+{
+    if (icy_name)
+        return g_strdup(icy_name);
+    if (g_basename(url) && strlen(g_basename(url)) > 0)
+        return g_strdup(g_basename(url));
+    return g_strdup(url);
+}
+
+/* Start UDP Channel specific stuff */
+
+/* Find a good local udp port and bind udp_sock to it, return the port */
+static gint
+udp_establish_listener(gint * sock)
+{
+    struct sockaddr_in sin;
+    socklen_t sinlen = sizeof(struct sockaddr_in);
+
+#ifdef DEBUG_UDP
+    fprintf(stderr, "Establishing udp listener\n");
+#endif
+
+    if ((*sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+        g_log(NULL, G_LOG_LEVEL_CRITICAL,
+              "udp_establish_listener(): unable to create socket");
+        return -1;
+    }
+
+    memset(&sin, 0, sinlen);
+    sin.sin_family = AF_INET;
+    sin.sin_addr.s_addr = g_htonl(INADDR_ANY);
+
+    if (bind(*sock, (struct sockaddr *) &sin, sinlen) < 0) {
+        g_log(NULL, G_LOG_LEVEL_CRITICAL,
+              "udp_establish_listener():  Failed to bind socket to localhost: %s",
+              strerror(errno));
+        close(*sock);
+        return -1;
+    }
+    if (fcntl(*sock, F_SETFL, O_NONBLOCK) < 0) {
+        g_log(NULL, G_LOG_LEVEL_CRITICAL,
+              "udp_establish_listener():  Failed to set flags: %s",
+              strerror(errno));
+        close(*sock);
+        return -1;
+    }
+
+    memset(&sin, 0, sinlen);
+    if (getsockname(*sock, (struct sockaddr *) &sin, &sinlen) < 0) {
+        g_log(NULL, G_LOG_LEVEL_CRITICAL,
+              "udp_establish_listener():  Failed to retrieve socket info: %s",
+              strerror(errno));
+        close(*sock);
+        return -1;
+    }
+#ifdef DEBUG_UDP
+    fprintf(stderr, "Listening on local %s:%d\n", inet_ntoa(sin.sin_addr),
+            g_ntohs(sin.sin_port));
+#endif
+
+    return g_ntohs(sin.sin_port);
+}
+
+static int
+udp_check_for_data(int sock)
+{
+    char buf[1025], **lines;
+    char *valptr;
+    gchar *title;
+    gint len, i;
+    struct sockaddr_in from;
+    socklen_t fromlen;
+
+    fromlen = sizeof(struct sockaddr_in);
+
+    if ((len =
+         recvfrom(sock, buf, 1024, 0, (struct sockaddr *) &from,
+                  &fromlen)) < 0) {
+        if (errno != EAGAIN) {
+            g_log(NULL, G_LOG_LEVEL_CRITICAL,
+                  "udp_read_data(): Error reading from socket: %s",
+                  strerror(errno));
+            return -1;
+        }
+        return 0;
+    }
+    buf[len] = '\0';
+#ifdef DEBUG_UDP
+    fprintf(stderr, "Received: [%s]\n", buf);
+#endif
+    lines = g_strsplit(buf, "\n", 0);
+    if (!lines)
+        return 0;
+
+    for (i = 0; lines[i]; i++) {
+        while ((lines[i][strlen(lines[i]) - 1] == '\n') ||
+               (lines[i][strlen(lines[i]) - 1] == '\r'))
+            lines[i][strlen(lines[i]) - 1] = '\0';
+
+        valptr = strchr(lines[i], ':');
+
+        if (!valptr)
+            continue;
+        else
+            valptr++;
+
+        g_strstrip(valptr);
+        if (!strlen(valptr))
+            continue;
+
+        if (strstr(lines[i], "x-audiocast-streamtitle") != NULL) {
+            title = g_strdup_printf("%s (%s)", valptr, icy_name);
+            if (going)
+                mpg123_ip.set_info(title, -1, mpg123_bitrate * 1000,
+                                   mpg123_frequency, mpg123_stereo);
+            g_free(title);
+        }
+#if 0
+        else if (strstr(lines[i], "x-audiocast-streamlength") != NULL) {
+            if (atoi(valptr) != -1)
+                mpg123_ip.set_info(NULL, atoi(valptr),
+                                   mpg123_bitrate * 1000, mpg123_frequency,
+                                   mpg123_stereo);
+        }
+#endif
+
+        else if (strstr(lines[i], "x-audiocast-streammsg") != NULL) {
+            /*  mpg123_ip.set_info(title, -1, mpg123_bitrate * 1000, mpg123_frequency, mpg123_stereo); */
+/*  			xmms_show_message(_("Message"), valptr, _("Ok"), */
+/*  					  FALSE, NULL, NULL); */
+            g_message("Stream_message: %s", valptr);
+        }
+#if 0
+        /* Use this to direct your webbrowser.. yeah right.. */
+        else if (strstr(lines[i], "x-audiocast-streamurl") != NULL) {
+            if (lasturl && g_strcmp(valptr, lasturl)) {
+                c_message(stderr, "Song URL: %s\n", valptr);
+                g_free(lasturl);
+                lasturl = g_strdup(valptr);
+            }
+        }
+#endif
+        else if (strstr(lines[i], "x-audiocast-udpseqnr:") != NULL) {
+            gchar obuf[60];
+            sprintf(obuf, "x-audiocast-ack: %ld \r\n", atol(valptr));
+            if (sendto
+                (sock, obuf, strlen(obuf), 0, (struct sockaddr *) &from,
+                 fromlen) < 0) {
+                g_log(NULL, G_LOG_LEVEL_WARNING,
+                      "udp_check_for_data(): Unable to send ack to server: %s",
+                      strerror(errno));
+            }
+#ifdef DEBUG_UDP
+            else
+                fprintf(stderr, "Sent ack: %s", obuf);
+            fprintf(stderr, "Remote: %s:%d\n", inet_ntoa(from.sin_addr),
+                    g_ntohs(from.sin_port));
+#endif
+        }
+    }
+    g_strfreev(lines);
+    return 0;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/huffman.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/huffman.h	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/huffman.h	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,313 @@
+
+/*
+ * huffman tables ... recalcualted to work with my optimzed
+ * decoder scheme (MH)
+ * 
+ * probably we could save a few bytes of memory, because the 
+ * smaller tables are often the part of a bigger table
+ */
+
+struct newhuff {
+    unsigned int linbits;
+    short *table;
+};
+
+static short tab0[] = {
+    0
+};
+
+static short tab1[] = {
+    -5, -3, -1, 17, 1, 16, 0
+};
+
+static short tab2[] = {
+    -15, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 17, -1, 1,
+    16, 0
+};
+
+static short tab3[] = {
+    -13, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 16, 17, -1,
+    1, 0
+};
+
+static short tab5[] = {
+    -29, -25, -23, -15, -7, -5, -3, -1, 51, 35, 50, 49, -3, -1, 19,
+    3, -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, 17, -1, 1, 16,
+    0
+};
+
+static short tab6[] = {
+    -25, -19, -13, -9, -5, -3, -1, 51, 3, 35, -1, 50, 48, -1, 19,
+    49, -3, -1, 34, 2, 18, -3, -1, 33, 32, 1, -1, 17, -1, 16,
+    0
+};
+
+static short tab7[] = {
+    -69, -65, -57, -39, -29, -17, -11, -7, -3, -1, 85, 69, -1, 84, 83,
+    -1, 53, 68, -3, -1, 37, 82, 21, -5, -1, 81, -1, 5, 52, -1,
+    80, -1, 67, 51, -5, -3, -1, 36, 66, 20, -1, 65, 64, -11, -7,
+    -3, -1, 4, 35, -1, 50, 3, -1, 19, 49, -3, -1, 48, 34, 18,
+    -5, -1, 33, -1, 2, 32, 17, -1, 1, 16, 0
+};
+
+static short tab8[] = {
+    -65, -63, -59, -45, -31, -19, -13, -7, -5, -3, -1, 85, 84, 69, 83,
+    -3, -1, 53, 68, 37, -3, -1, 82, 5, 21, -5, -1, 81, -1, 52,
+    67, -3, -1, 80, 51, 36, -5, -3, -1, 66, 20, 65, -3, -1, 4,
+    64, -1, 35, 50, -9, -7, -3, -1, 19, 49, -1, 3, 48, 34, -1,
+    2, 32, -1, 18, 33, 17, -3, -1, 1, 16, 0
+};
+
+static short tab9[] = {
+    -63, -53, -41, -29, -19, -11, -5, -3, -1, 85, 69, 53, -1, 83, -1,
+    84, 5, -3, -1, 68, 37, -1, 82, 21, -3, -1, 81, 52, -1, 67,
+    -1, 80, 4, -7, -3, -1, 36, 66, -1, 51, 64, -1, 20, 65, -5,
+    -3, -1, 35, 50, 19, -1, 49, -1, 3, 48, -5, -3, -1, 34, 2,
+    18, -1, 33, 32, -3, -1, 17, 1, -1, 16, 0
+};
+
+static short tab10[] = {
+    -125, -121, -111, -83, -55, -35, -21, -13, -7, -3, -1, 119, 103, -1,
+    118,
+    87, -3, -1, 117, 102, 71, -3, -1, 116, 86, -1, 101, 55, -9, -3,
+    -1, 115, 70, -3, -1, 85, 84, 99, -1, 39, 114, -11, -5, -3, -1,
+    100, 7, 112, -1, 98, -1, 69, 53, -5, -1, 6, -1, 83, 68, 23,
+    -17, -5, -1, 113, -1, 54, 38, -5, -3, -1, 37, 82, 21, -1, 81,
+    -1, 52, 67, -3, -1, 22, 97, -1, 96, -1, 5, 80, -19, -11, -7,
+    -3, -1, 36, 66, -1, 51, 4, -1, 20, 65, -3, -1, 64, 35, -1,
+    50, 3, -3, -1, 19, 49, -1, 48, 34, -7, -3, -1, 18, 33, -1,
+    2, 32, 17, -1, 1, 16, 0
+};
+
+static short tab11[] = {
+    -121, -113, -89, -59, -43, -27, -17, -7, -3, -1, 119, 103, -1, 118,
+    117,
+    -3, -1, 102, 71, -1, 116, -1, 87, 85, -5, -3, -1, 86, 101, 55,
+    -1, 115, 70, -9, -7, -3, -1, 69, 84, -1, 53, 83, 39, -1, 114,
+    -1, 100, 7, -5, -1, 113, -1, 23, 112, -3, -1, 54, 99, -1, 96,
+    -1, 68, 37, -13, -7, -5, -3, -1, 82, 5, 21, 98, -3, -1, 38,
+    6, 22, -5, -1, 97, -1, 81, 52, -5, -1, 80, -1, 67, 51, -1,
+    36, 66, -15, -11, -7, -3, -1, 20, 65, -1, 4, 64, -1, 35, 50,
+    -1, 19, 49, -5, -3, -1, 3, 48, 34, 33, -5, -1, 18, -1, 2,
+    32, 17, -3, -1, 1, 16, 0
+};
+
+static short tab12[] = {
+    -115, -99, -73, -45, -27, -17, -9, -5, -3, -1, 119, 103, 118, -1, 87,
+    117, -3, -1, 102, 71, -1, 116, 101, -3, -1, 86, 55, -3, -1, 115,
+    85, 39, -7, -3, -1, 114, 70, -1, 100, 23, -5, -1, 113, -1, 7,
+    112, -1, 54, 99, -13, -9, -3, -1, 69, 84, -1, 68, -1, 6, 5,
+    -1, 38, 98, -5, -1, 97, -1, 22, 96, -3, -1, 53, 83, -1, 37,
+    82, -17, -7, -3, -1, 21, 81, -1, 52, 67, -5, -3, -1, 80, 4,
+    36, -1, 66, 20, -3, -1, 51, 65, -1, 35, 50, -11, -7, -5, -3,
+    -1, 64, 3, 48, 19, -1, 49, 34, -1, 18, 33, -7, -5, -3, -1,
+    2, 32, 0, 17, -1, 1, 16
+};
+
+static short tab13[] = {
+    -509, -503, -475, -405, -333, -265, -205, -153, -115, -83, -53, -35,
+    -21, -13, -9,
+    -7, -5, -3, -1, 254, 252, 253, 237, 255, -1, 239, 223, -3, -1, 238,
+    207, -1, 222, 191, -9, -3, -1, 251, 206, -1, 220, -1, 175, 233, -1,
+    236, 221, -9, -5, -3, -1, 250, 205, 190, -1, 235, 159, -3, -1, 249,
+    234, -1, 189, 219, -17, -9, -3, -1, 143, 248, -1, 204, -1, 174, 158,
+    -5, -1, 142, -1, 127, 126, 247, -5, -1, 218, -1, 173, 188, -3, -1,
+    203, 246, 111, -15, -7, -3, -1, 232, 95, -1, 157, 217, -3, -1, 245,
+    231, -1, 172, 187, -9, -3, -1, 79, 244, -3, -1, 202, 230, 243, -1,
+    63, -1, 141, 216, -21, -9, -3, -1, 47, 242, -3, -1, 110, 156, 15,
+    -5, -3, -1, 201, 94, 171, -3, -1, 125, 215, 78, -11, -5, -3, -1,
+    200, 214, 62, -1, 185, -1, 155, 170, -1, 31, 241, -23, -13, -5, -1,
+    240, -1, 186, 229, -3, -1, 228, 140, -1, 109, 227, -5, -1, 226, -1,
+    46, 14, -1, 30, 225, -15, -7, -3, -1, 224, 93, -1, 213, 124, -3,
+    -1, 199, 77, -1, 139, 184, -7, -3, -1, 212, 154, -1, 169, 108, -1,
+    198, 61, -37, -21, -9, -5, -3, -1, 211, 123, 45, -1, 210, 29, -5,
+    -1, 183, -1, 92, 197, -3, -1, 153, 122, 195, -7, -5, -3, -1, 167,
+    151, 75, 209, -3, -1, 13, 208, -1, 138, 168, -11, -7, -3, -1, 76,
+    196, -1, 107, 182, -1, 60, 44, -3, -1, 194, 91, -3, -1, 181, 137,
+    28, -43, -23, -11, -5, -1, 193, -1, 152, 12, -1, 192, -1, 180, 106,
+    -5, -3, -1, 166, 121, 59, -1, 179, -1, 136, 90, -11, -5, -1, 43,
+    -1, 165, 105, -1, 164, -1, 120, 135, -5, -1, 148, -1, 119, 118, 178,
+    -11, -3, -1, 27, 177, -3, -1, 11, 176, -1, 150, 74, -7, -3, -1,
+    58, 163, -1, 89, 149, -1, 42, 162, -47, -23, -9, -3, -1, 26, 161,
+    -3, -1, 10, 104, 160, -5, -3, -1, 134, 73, 147, -3, -1, 57, 88,
+    -1, 133, 103, -9, -3, -1, 41, 146, -3, -1, 87, 117, 56, -5, -1,
+    131, -1, 102, 71, -3, -1, 116, 86, -1, 101, 115, -11, -3, -1, 25,
+    145, -3, -1, 9, 144, -1, 72, 132, -7, -5, -1, 114, -1, 70, 100,
+    40, -1, 130, 24, -41, -27, -11, -5, -3, -1, 55, 39, 23, -1, 113,
+    -1, 85, 7, -7, -3, -1, 112, 54, -1, 99, 69, -3, -1, 84, 38,
+    -1, 98, 53, -5, -1, 129, -1, 8, 128, -3, -1, 22, 97, -1, 6,
+    96, -13, -9, -5, -3, -1, 83, 68, 37, -1, 82, 5, -1, 21, 81,
+    -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20, -19, -11,
+    -5, -1, 65, -1, 4, 64, -3, -1, 35, 50, 19, -3, -1, 49, 3,
+    -1, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16,
+    0
+};
+
+static short tab15[] = {
+    -495, -445, -355, -263, -183, -115, -77, -43, -27, -13, -7, -3, -1,
+    255, 239,
+    -1, 254, 223, -1, 238, -1, 253, 207, -7, -3, -1, 252, 222, -1, 237,
+    191, -1, 251, -1, 206, 236, -7, -3, -1, 221, 175, -1, 250, 190, -3,
+    -1, 235, 205, -1, 220, 159, -15, -7, -3, -1, 249, 234, -1, 189, 219,
+    -3, -1, 143, 248, -1, 204, 158, -7, -3, -1, 233, 127, -1, 247, 173,
+    -3, -1, 218, 188, -1, 111, -1, 174, 15, -19, -11, -3, -1, 203, 246,
+    -3, -1, 142, 232, -1, 95, 157, -3, -1, 245, 126, -1, 231, 172, -9,
+    -3, -1, 202, 187, -3, -1, 217, 141, 79, -3, -1, 244, 63, -1, 243,
+    216, -33, -17, -9, -3, -1, 230, 47, -1, 242, -1, 110, 240, -3, -1,
+    31, 241, -1, 156, 201, -7, -3, -1, 94, 171, -1, 186, 229, -3, -1,
+    125, 215, -1, 78, 228, -15, -7, -3, -1, 140, 200, -1, 62, 109, -3,
+    -1, 214, 227, -1, 155, 185, -7, -3, -1, 46, 170, -1, 226, 30, -5,
+    -1, 225, -1, 14, 224, -1, 93, 213, -45, -25, -13, -7, -3, -1, 124,
+    199, -1, 77, 139, -1, 212, -1, 184, 154, -7, -3, -1, 169, 108, -1,
+    198, 61, -1, 211, 210, -9, -5, -3, -1, 45, 13, 29, -1, 123, 183,
+    -5, -1, 209, -1, 92, 208, -1, 197, 138, -17, -7, -3, -1, 168, 76,
+    -1, 196, 107, -5, -1, 182, -1, 153, 12, -1, 60, 195, -9, -3, -1,
+    122, 167, -1, 166, -1, 192, 11, -1, 194, -1, 44, 91, -55, -29, -15,
+    -7, -3, -1, 181, 28, -1, 137, 152, -3, -1, 193, 75, -1, 180, 106,
+    -5, -3, -1, 59, 121, 179, -3, -1, 151, 136, -1, 43, 90, -11, -5,
+    -1, 178, -1, 165, 27, -1, 177, -1, 176, 105, -7, -3, -1, 150, 74,
+    -1, 164, 120, -3, -1, 135, 58, 163, -17, -7, -3, -1, 89, 149, -1,
+    42, 162, -3, -1, 26, 161, -3, -1, 10, 160, 104, -7, -3, -1, 134,
+    73, -1, 148, 57, -5, -1, 147, -1, 119, 9, -1, 88, 133, -53, -29,
+    -13, -7, -3, -1, 41, 103, -1, 118, 146, -1, 145, -1, 25, 144, -7,
+    -3, -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 71, -7,
+    -3, -1, 40, 130, -1, 24, 129, -7, -3, -1, 116, 8, -1, 128, 86,
+    -3, -1, 101, 55, -1, 115, 70, -17, -7, -3, -1, 39, 114, -1, 100,
+    23, -3, -1, 85, 113, -3, -1, 7, 112, 54, -7, -3, -1, 99, 69,
+    -1, 84, 38, -3, -1, 98, 22, -3, -1, 6, 96, 53, -33, -19, -9,
+    -5, -1, 97, -1, 83, 68, -1, 37, 82, -3, -1, 21, 81, -3, -1,
+    5, 80, 52, -7, -3, -1, 67, 36, -1, 66, 51, -1, 65, -1, 20,
+    4, -9, -3, -1, 35, 50, -3, -1, 64, 3, 19, -3, -1, 49, 48,
+    34, -9, -7, -3, -1, 18, 33, -1, 2, 32, 17, -3, -1, 1, 16,
+    0
+};
+
+static short tab16[] = {
+    -509, -503, -461, -323, -103, -37, -27, -15, -7, -3, -1, 239, 254, -1,
+    223,
+    253, -3, -1, 207, 252, -1, 191, 251, -5, -1, 175, -1, 250, 159, -3,
+    -1, 249, 248, 143, -7, -3, -1, 127, 247, -1, 111, 246, 255, -9, -5,
+    -3, -1, 95, 245, 79, -1, 244, 243, -53, -1, 240, -1, 63, -29, -19,
+    -13, -7, -5, -1, 206, -1, 236, 221, 222, -1, 233, -1, 234, 217, -1,
+    238, -1, 237, 235, -3, -1, 190, 205, -3, -1, 220, 219, 174, -11, -5,
+    -1, 204, -1, 173, 218, -3, -1, 126, 172, 202, -5, -3, -1, 201, 125,
+    94, 189, 242, -93, -5, -3, -1, 47, 15, 31, -1, 241, -49, -25, -13,
+    -5, -1, 158, -1, 188, 203, -3, -1, 142, 232, -1, 157, 231, -7, -3,
+    -1, 187, 141, -1, 216, 110, -1, 230, 156, -13, -7, -3, -1, 171, 186,
+    -1, 229, 215, -1, 78, -1, 228, 140, -3, -1, 200, 62, -1, 109, -1,
+    214, 155, -19, -11, -5, -3, -1, 185, 170, 225, -1, 212, -1, 184, 169,
+    -5, -1, 123, -1, 183, 208, 227, -7, -3, -1, 14, 224, -1, 93, 213,
+    -3, -1, 124, 199, -1, 77, 139, -75, -45, -27, -13, -7, -3, -1, 154,
+    108, -1, 198, 61, -3, -1, 92, 197, 13, -7, -3, -1, 138, 168, -1,
+    153, 76, -3, -1, 182, 122, 60, -11, -5, -3, -1, 91, 137, 28, -1,
+    192, -1, 152, 121, -1, 226, -1, 46, 30, -15, -7, -3, -1, 211, 45,
+    -1, 210, 209, -5, -1, 59, -1, 151, 136, 29, -7, -3, -1, 196, 107,
+    -1, 195, 167, -1, 44, -1, 194, 181, -23, -13, -7, -3, -1, 193, 12,
+    -1, 75, 180, -3, -1, 106, 166, 179, -5, -3, -1, 90, 165, 43, -1,
+    178, 27, -13, -5, -1, 177, -1, 11, 176, -3, -1, 105, 150, -1, 74,
+    164, -5, -3, -1, 120, 135, 163, -3, -1, 58, 89, 42, -97, -57, -33,
+    -19, -11, -5, -3, -1, 149, 104, 161, -3, -1, 134, 119, 148, -5, -3,
+    -1, 73, 87, 103, 162, -5, -1, 26, -1, 10, 160, -3, -1, 57, 147,
+    -1, 88, 133, -9, -3, -1, 41, 146, -3, -1, 118, 9, 25, -5, -1,
+    145, -1, 144, 72, -3, -1, 132, 117, -1, 56, 131, -21, -11, -5, -3,
+    -1, 102, 40, 130, -3, -1, 71, 116, 24, -3, -1, 129, 128, -3, -1,
+    8, 86, 55, -9, -5, -1, 115, -1, 101, 70, -1, 39, 114, -5, -3,
+    -1, 100, 85, 7, 23, -23, -13, -5, -1, 113, -1, 112, 54, -3, -1,
+    99, 69, -1, 84, 38, -3, -1, 98, 22, -1, 97, -1, 6, 96, -9,
+    -5, -1, 83, -1, 53, 68, -1, 37, 82, -1, 81, -1, 21, 5, -33,
+    -23, -13, -7, -3, -1, 52, 67, -1, 80, 36, -3, -1, 66, 51, 20,
+    -5, -1, 65, -1, 4, 64, -1, 35, 50, -3, -1, 19, 49, -3, -1,
+    3, 48, 34, -3, -1, 18, 33, -1, 2, 32, -3, -1, 17, 1, 16,
+    0
+};
+
+static short tab24[] = {
+    -451, -117, -43, -25, -15, -7, -3, -1, 239, 254, -1, 223, 253, -3, -1,
+    207, 252, -1, 191, 251, -5, -1, 250, -1, 175, 159, -1, 249, 248, -9,
+    -5, -3, -1, 143, 127, 247, -1, 111, 246, -3, -1, 95, 245, -1, 79,
+    244, -71, -7, -3, -1, 63, 243, -1, 47, 242, -5, -1, 241, -1, 31,
+    240, -25, -9, -1, 15, -3, -1, 238, 222, -1, 237, 206, -7, -3, -1,
+    236, 221, -1, 190, 235, -3, -1, 205, 220, -1, 174, 234, -15, -7, -3,
+    -1, 189, 219, -1, 204, 158, -3, -1, 233, 173, -1, 218, 188, -7, -3,
+    -1, 203, 142, -1, 232, 157, -3, -1, 217, 126, -1, 231, 172, 255, -235,
+    -143, -77, -45, -25, -15, -7, -3, -1, 202, 187, -1, 141, 216, -5, -3,
+    -1, 14, 224, 13, 230, -5, -3, -1, 110, 156, 201, -1, 94, 186, -9,
+    -5, -1, 229, -1, 171, 125, -1, 215, 228, -3, -1, 140, 200, -3, -1,
+    78, 46, 62, -15, -7, -3, -1, 109, 214, -1, 227, 155, -3, -1, 185,
+    170, -1, 226, 30, -7, -3, -1, 225, 93, -1, 213, 124, -3, -1, 199,
+    77, -1, 139, 184, -31, -15, -7, -3, -1, 212, 154, -1, 169, 108, -3,
+    -1, 198, 61, -1, 211, 45, -7, -3, -1, 210, 29, -1, 123, 183, -3,
+    -1, 209, 92, -1, 197, 138, -17, -7, -3, -1, 168, 153, -1, 76, 196,
+    -3, -1, 107, 182, -3, -1, 208, 12, 60, -7, -3, -1, 195, 122, -1,
+    167, 44, -3, -1, 194, 91, -1, 181, 28, -57, -35, -19, -7, -3, -1,
+    137, 152, -1, 193, 75, -5, -3, -1, 192, 11, 59, -3, -1, 176, 10,
+    26, -5, -1, 180, -1, 106, 166, -3, -1, 121, 151, -3, -1, 160, 9,
+    144, -9, -3, -1, 179, 136, -3, -1, 43, 90, 178, -7, -3, -1, 165,
+    27, -1, 177, 105, -1, 150, 164, -17, -9, -5, -3, -1, 74, 120, 135,
+    -1, 58, 163, -3, -1, 89, 149, -1, 42, 162, -7, -3, -1, 161, 104,
+    -1, 134, 119, -3, -1, 73, 148, -1, 57, 147, -63, -31, -15, -7, -3,
+    -1, 88, 133, -1, 41, 103, -3, -1, 118, 146, -1, 25, 145, -7, -3,
+    -1, 72, 132, -1, 87, 117, -3, -1, 56, 131, -1, 102, 40, -17, -7,
+    -3, -1, 130, 24, -1, 71, 116, -5, -1, 129, -1, 8, 128, -1, 86,
+    101, -7, -5, -1, 23, -1, 7, 112, 115, -3, -1, 55, 39, 114, -15,
+    -7, -3, -1, 70, 100, -1, 85, 113, -3, -1, 54, 99, -1, 69, 84,
+    -7, -3, -1, 38, 98, -1, 22, 97, -5, -3, -1, 6, 96, 53, -1,
+    83, 68, -51, -37, -23, -15, -9, -3, -1, 37, 82, -1, 21, -1, 5,
+    80, -1, 81, -1, 52, 67, -3, -1, 36, 66, -1, 51, 20, -9, -5,
+    -1, 65, -1, 4, 64, -1, 35, 50, -1, 19, 49, -7, -5, -3, -1,
+    3, 48, 34, 18, -1, 33, -1, 2, 32, -3, -1, 17, 1, -1, 16,
+    0
+};
+
+static short tab_c0[] = {
+    -29, -21, -13, -7, -3, -1, 11, 15, -1, 13, 14, -3, -1, 7, 5,
+    9, -3, -1, 6, 3, -1, 10, 12, -3, -1, 2, 1, -1, 4, 8,
+    0
+};
+
+static short tab_c1[] = {
+    -15, -7, -3, -1, 15, 14, -1, 13, 12, -3, -1, 11, 10, -1, 9,
+    8, -7, -3, -1, 7, 6, -1, 5, 4, -3, -1, 3, 2, -1, 1,
+    0
+};
+
+static struct newhuff ht[] = {
+    { /* 0 */ 0, tab0},
+    { /* 2 */ 0, tab1},
+    { /* 3 */ 0, tab2},
+    { /* 3 */ 0, tab3},
+    { /* 0 */ 0, tab0},
+    { /* 4 */ 0, tab5},
+    { /* 4 */ 0, tab6},
+    { /* 6 */ 0, tab7},
+    { /* 6 */ 0, tab8},
+    { /* 6 */ 0, tab9},
+    { /* 8 */ 0, tab10},
+    { /* 8 */ 0, tab11},
+    { /* 8 */ 0, tab12},
+    { /* 16 */ 0, tab13},
+    { /* 0  */ 0, tab0},
+    { /* 16 */ 0, tab15},
+
+    { /* 16 */ 1, tab16},
+    { /* 16 */ 2, tab16},
+    { /* 16 */ 3, tab16},
+    { /* 16 */ 4, tab16},
+    { /* 16 */ 6, tab16},
+    { /* 16 */ 8, tab16},
+    { /* 16 */ 10, tab16},
+    { /* 16 */ 13, tab16},
+    { /* 16 */ 4, tab24},
+    { /* 16 */ 5, tab24},
+    { /* 16 */ 6, tab24},
+    { /* 16 */ 7, tab24},
+    { /* 16 */ 8, tab24},
+    { /* 16 */ 9, tab24},
+    { /* 16 */ 11, tab24},
+    { /* 16 */ 13, tab24}
+};
+
+static struct newhuff htc[] = {
+    { /* 1 , 1 , */ 0, tab_c0},
+    { /* 1 , 1 , */ 0, tab_c1}
+};

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,637 @@
+/*********************************************************************
+ * 
+ *    Copyright (C) 1999, 2001,  Espen Skoglund
+ *    Department of Computer Science, University of Tromsø
+ * 
+ * Filename:      id3.c
+ * Description:   Code for accessing ID3 tags.
+ * Author:        Espen Skoglund <espensk at stud.cs.uit.no>
+ * Created at:    Fri Feb  5 23:55:13 1999
+ *                
+ * $Id: id3.c,v 1.6 2004/07/20 21:47:22 descender Exp $
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * 
+ ********************************************************************/
+#include "config.h"
+
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <glib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "xmms-id3.h"
+#include "id3_header.h"
+
+
+/*
+**
+** Functions for accessing the ID3 tag using a memory pointer.
+**
+*/
+
+/*
+ * Function id3_seek_mem (id3, offset)
+ *
+ *    Seek `offset' bytes forward in the indicated ID3-tag.  Return 0
+ *    upon success, or -1 if an error occured.
+ *
+ */
+static int
+id3_seek_mem(struct id3_tag *id3, int offset)
+{
+    if (id3->id3_pos + offset > id3->id3_tagsize || id3->id3_pos + offset < 0) {
+        id3_error(id3, "seeking beyond tag boundary");
+        return -1;
+    }
+    id3->s.me.id3_ptr = (char *) id3->s.me.id3_ptr + offset;
+    id3->id3_pos += offset;
+
+    return 0;
+}
+
+
+/*
+ * Function id3_read_mem (id3, buf, size)
+ *
+ *    Read `size' bytes from indicated ID3-tag.  If `buf' is non-NULL,
+ *    read into that buffer.  Return a pointer to the data which was
+ *    read, or NULL upon error.
+ *
+ */
+static void *
+id3_read_mem(struct id3_tag *id3, void *buf, int size)
+{
+    void *ret = id3->s.me.id3_ptr;
+
+    /*
+     * Check boundary.
+     */
+    if (id3->id3_pos + size > id3->id3_tagsize) {
+        return NULL;
+    }
+
+    /*
+     * If buffer is non-NULL, we have to copy the data.
+     */
+    if (buf != NULL) {
+        if (size > ID3_FD_BUFSIZE)
+            return NULL;
+        memcpy(buf, id3->s.me.id3_ptr, size);
+    }
+
+    /*
+     * Update memory pointer.
+     */
+    id3->s.me.id3_ptr = (char *) id3->s.me.id3_ptr + size;
+    id3->id3_pos += size;
+
+    return ret;
+}
+
+
+/*
+**
+** Functions for accessing the ID3 tag using a file descriptor.
+**
+*/
+
+/*
+ * Function id3_seek_fd (id3, offset)
+ *
+ *    Seek `offset' bytes forward in the indicated ID3-tag.  Return 0
+ *    upon success, or -1 if an error occured.
+ *
+ */
+static int
+id3_seek_fd(struct id3_tag *id3, int offset)
+{
+    /*
+     * Check boundary.
+     */
+    if (id3->id3_pos + offset > id3->id3_tagsize || id3->id3_pos + offset < 0)
+        return -1;
+
+    if (lseek(id3->s.fd.id3_fd, offset, SEEK_CUR) == -1) {
+        id3_error(id3, "seeking beyond tag boundary");
+        return -1;
+    }
+    id3->id3_pos += offset;
+
+    return 0;
+}
+
+
+/*
+ * Function id3_read_fd (id3, buf, size)
+ *
+ *    Read `size' bytes from indicated ID3-tag.  If `buf' is non-NULL,
+ *    read into that buffer.  Return a pointer to the data which was
+ *    read, or NULL upon error.
+ *
+ */
+static void *
+id3_read_fd(struct id3_tag *id3, void *buf, int size)
+{
+    int done = 0;
+
+    /*
+     * Check boundary.
+     */
+    if (id3->id3_pos + size > id3->id3_tagsize) {
+        return NULL;
+    }
+
+    /*
+     * If buffer is NULL, we use the default buffer.
+     */
+    if (buf == NULL) {
+        if (size > ID3_FD_BUFSIZE)
+            return NULL;
+        buf = id3->s.fd.id3_buf;
+    }
+
+    /*
+     * Read until we have slurped as much data as we wanted.
+     */
+    while (done < size) {
+        char *buffer = (char *) buf + done;
+        int ret;
+
+        /*
+         * Try reading from file.
+         */
+        ret = read(id3->s.fd.id3_fd, buffer, size);
+        if (ret <= 0) {
+            id3_error(id3, "read(2) failed");
+            return NULL;
+        }
+
+        id3->id3_pos += ret;
+        done += ret;
+    }
+
+    return buf;
+}
+
+
+/*
+**
+** Functions for accessing the ID3 tag using a file pointer.
+**
+*/
+
+/*
+ * Function id3_seek_fp (id3, offset)
+ *
+ *    Seek `offset' bytes forward in the indicated ID3-tag.  Return 0
+ *    upon success, or -1 if an error occured.
+ *
+ */
+static int
+id3_seek_fp(struct id3_tag *id3, int offset)
+{
+    /*
+     * Check boundary.
+     */
+    if (id3->id3_pos + offset > id3->id3_tagsize || id3->id3_pos + offset < 0)
+        return -1;
+
+    if (offset > 0) {
+        /*
+         * If offset is positive, we use vfs_fread() instead of vfs_fseek().  This
+         * is more robust with respect to streams.
+         */
+        char buf[64];
+        int r, remain = offset;
+
+        while (remain > 0) {
+            int size = MIN(64, remain);
+            r = vfs_fread(buf, 1, size, id3->s.fp.id3_fp);
+            if (r == 0) {
+                id3_error(id3, "vfs_fread() failed");
+                return -1;
+            }
+            remain -= r;
+        }
+    }
+    else {
+        /*
+         * If offset is negative, we ahve to use vfs_fseek().  Let us hope
+         * that it works.
+         */
+        if (vfs_fseek(id3->s.fp.id3_fp, offset, SEEK_CUR) == -1) {
+            id3_error(id3, "seeking beyond tag boundary");
+            return -1;
+        }
+    }
+    id3->id3_pos += offset;
+
+    return 0;
+}
+
+
+/*
+ * Function id3_read_fp (id3, buf, size)
+ *
+ *    Read `size' bytes from indicated ID3-tag.  If `buf' is non-NULL,
+ *    read into that buffer.  Return a pointer to the data which was
+ *    read, or NULL upon error.
+ *
+ */
+static void *
+id3_read_fp(struct id3_tag *id3, void *buf, int size)
+{
+    int ret;
+
+    /*
+     * Check boundary.
+     */
+    if (id3->id3_pos + size > id3->id3_tagsize) {
+        size = id3->id3_tagsize - id3->id3_pos;
+    }
+
+    /*
+     * If buffer is NULL, we use the default buffer.
+     */
+    if (buf == NULL) {
+        if (size > ID3_FD_BUFSIZE)
+            return NULL;
+        buf = id3->s.fd.id3_buf;
+    }
+
+    /*
+     * Try reading from file.
+     */
+    ret = vfs_fread(buf, 1, size, id3->s.fp.id3_fp);
+    if (ret != size) {
+        id3_error(id3, "vfs_fread() failed");
+        return NULL;
+    }
+
+    id3->id3_pos += ret;
+
+    return buf;
+}
+
+
+
+
+/*
+ * Function id3_open_mem (ptr, flags)
+ *
+ *    Open an ID3 tag using a memory pointer.  Return a pointer to a
+ *    structure describing the ID3 tag, or NULL if an error occured.
+ *
+ */
+struct id3_tag *
+id3_open_mem(void *ptr, int flags)
+{
+    struct id3_tag *id3;
+
+    /*
+     * Allocate ID3 structure.
+     */
+    id3 = g_malloc0(sizeof(struct id3_tag));
+
+    /*
+     * Initialize access pointers.
+     */
+    id3->id3_seek = id3_seek_mem;
+    id3->id3_read = id3_read_mem;
+
+    id3->id3_oflags = flags;
+    id3->id3_type = ID3_TYPE_MEM;
+    id3->id3_pos = 0;
+    id3->s.me.id3_ptr = ptr;
+
+    /*
+     * Try reading ID3 tag.
+     */
+    if (id3_read_tag(id3) == -1) {
+        if (~flags & ID3_OPENF_CREATE)
+            goto Return_NULL;
+        id3_init_tag(id3);
+    }
+
+    return id3;
+
+  Return_NULL:
+    g_free(id3);
+    return NULL;
+}
+
+
+/*
+ * Function id3_open_fd (fd, flags)
+ *
+ *    Open an ID3 tag using a file descriptor.  Return a pointer to a
+ *    structure describing the ID3 tag, or NULL if an error occured.
+ *
+ */
+struct id3_tag *
+id3_open_fd(int fd, int flags)
+{
+    struct id3_tag *id3;
+
+    /*
+     * Allocate ID3 structure.
+     */
+    id3 = g_malloc0(sizeof(struct id3_tag));
+
+    /*
+     * Initialize access pointers.
+     */
+    id3->id3_seek = id3_seek_fd;
+    id3->id3_read = id3_read_fd;
+
+    id3->id3_oflags = flags;
+    id3->id3_type = ID3_TYPE_FD;
+    id3->id3_pos = 0;
+    id3->s.fd.id3_fd = fd;
+
+    /*
+     * Allocate buffer to hold read data.
+     */
+    id3->s.fd.id3_buf = g_malloc(ID3_FD_BUFSIZE);
+
+    /*
+     * Try reading ID3 tag.
+     */
+    if (id3_read_tag(id3) == -1) {
+        if (~flags & ID3_OPENF_CREATE)
+            goto Return_NULL;
+        id3_init_tag(id3);
+    }
+
+    return id3;
+
+    /*
+     * Cleanup code.
+     */
+  Return_NULL:
+    g_free(id3->s.fd.id3_buf);
+    g_free(id3);
+    return NULL;
+}
+
+
+/*
+ * Function id3_open_fp (fp, flags)
+ *
+ *    Open an ID3 tag using a file pointer.  Return a pointer to a
+ *    structure describing the ID3 tag, or NULL if an error occured.
+ *
+ */
+struct id3_tag *
+id3_open_fp(VFSFile * fp, int flags)
+{
+    struct id3_tag *id3;
+
+    /*
+     * Allocate ID3 structure.
+     */
+    id3 = g_malloc0(sizeof(struct id3_tag));
+
+    /*
+     * Initialize access pointers.
+     */
+    id3->id3_seek = id3_seek_fp;
+    id3->id3_read = id3_read_fp;
+
+    id3->id3_oflags = flags;
+    id3->id3_type = ID3_TYPE_FP;
+    id3->id3_pos = 0;
+    id3->s.fp.id3_fp = fp;
+
+    /*
+     * Allocate buffer to hold read data.
+     */
+    id3->s.fp.id3_buf = g_malloc(ID3_FD_BUFSIZE);
+
+    /*
+     * Try reading ID3 tag.
+     */
+    if (id3_read_tag(id3) == -1) {
+        if (~flags & ID3_OPENF_CREATE)
+            goto Return_NULL;
+        id3_init_tag(id3);
+    }
+
+
+    return id3;
+
+    /*
+     * Cleanup code.
+     */
+  Return_NULL:
+    g_free(id3->s.fp.id3_buf);
+    g_free(id3);
+    return NULL;
+}
+
+
+/*
+ * Function id3_close (id3)
+ *
+ *    Free all resources assoicated with the ID3 tag.
+ *
+ */
+int
+id3_close(struct id3_tag *id3)
+{
+    int ret = 0;
+
+    switch (id3->id3_type) {
+    case ID3_TYPE_MEM:
+        break;
+    case ID3_TYPE_FD:
+        g_free(id3->s.fd.id3_buf);
+        break;
+    case ID3_TYPE_FP:
+        g_free(id3->s.fp.id3_buf);
+        break;
+    case ID3_TYPE_NONE:
+        id3_error(id3, "unknown ID3 type");
+        ret = -1;
+    }
+
+    id3_destroy_frames(id3);
+
+    g_free(id3);
+
+    return ret;
+}
+
+
+/*
+ * Function id3_tell (id3)
+ *
+ *    Return the current position in ID3 tag.  This will always be
+ *    directly after the tag.
+ *
+ */
+#if 0
+int
+id3_tell(struct id3_tag *id3)
+{
+    if (id3->id3_newtag) {
+        return 0;
+    }
+    else {
+        return id3->id3_tagsize + 3 + sizeof(id3_taghdr_t);
+    }
+}
+#endif
+
+
+/*
+ * Function id3_alter_file (id3)
+ *
+ *    When altering a file, some ID3 tags should be discarded.  As the ID3
+ *    library has no means of knowing when a file has been altered
+ *    outside of the library, this function must be called manually
+ *    whenever the file is altered.
+ *
+ */
+int
+id3_alter_file(struct id3_tag *id3)
+{
+    /*
+     * List of frame classes that should be discarded whenever the
+     * file is altered.
+     */
+    static guint32 discard_list[] = {
+        ID3_ETCO, ID3_EQUA, ID3_MLLT, ID3_POSS, ID3_SYLT,
+        ID3_SYTC, ID3_RVAD, ID3_TENC, ID3_TLEN, ID3_TSIZ,
+        0
+    };
+    struct id3_frame *fr;
+    guint32 id, i = 0;
+
+    /*
+     * Go through list of frame types that should be discarded.
+     */
+    while ((id = discard_list[i++]) != 0) {
+        /*
+         * Discard all frames of that type.
+         */
+        while ((fr = id3_get_frame(id3, id, 1))) {
+            id3_delete_frame(fr);
+        }
+    }
+
+    return 0;
+}
+
+
+/*
+ * Function safe_write (fd, buf, size)
+ *
+ *    Like write(2), except that the whole buffer will be written.
+ *
+ */
+static int
+safe_write(int fd, void *buf, int size)
+{
+    int remaining = size;
+    char *ptr = buf;
+    int r;
+
+    while (remaining > 0) {
+        if ((r = write(fd, ptr, remaining)) == -1)
+            return -1;
+        remaining -= r;
+        ptr += r;
+    }
+
+    return 0;
+}
+
+
+/*
+ * Function id3_write_tag (id3, fd)
+ *
+ *    Wrtite the ID3 tag to the indicated file descriptor.  Return 0
+ *    upon success, or -1 if an error occured.
+ *
+ */
+int
+id3_write_tag(struct id3_tag *id3, int fd)
+{
+    struct id3_frame *fr;
+    GList *node;
+    int size = 0;
+    char buf[ID3_TAGHDR_SIZE];
+
+    /*
+     * Calculate size of ID3 tag.
+     */
+    for (node = id3->id3_frame; node != NULL; node = node->next) {
+        fr = node->data;
+        size += fr->fr_size + ID3_FRAMEHDR_SIZE;
+    }
+
+    /*
+     * Write tag header.
+     */
+    buf[0] = id3->id3_version;
+    buf[1] = id3->id3_revision;
+    buf[2] = id3->id3_flags;
+    ID3_SET_SIZE28(size, buf[3], buf[4], buf[5], buf[6]);
+
+    if (safe_write(fd, "ID3", 3) == -1)
+        return -1;
+    if (safe_write(fd, buf, ID3_TAGHDR_SIZE) == -1)
+        return -1;
+
+    /*
+     * TODO: Write extended header.
+     */
+#if 0
+    if (id3->id3_flags & ID3_THFLAG_EXT) {
+        id3_exthdr_t exthdr;
+    }
+#endif
+
+    for (node = id3->id3_frame; node != NULL; node = node->next) {
+        char fhdr[ID3_FRAMEHDR_SIZE];
+
+        fr = node->data;
+
+        /*
+         * TODO: Support compressed headers, encoded
+         * headers, and grouping info.
+         */
+        /*  fhdr.fh_id = fr->fr_desc ? g_htonl(fr->fr_desc->fd_id) : 0; */
+        fhdr[3] = (fr->fr_size >> 24) & 0xff;
+        fhdr[4] = (fr->fr_size >> 16) & 0xff;
+        fhdr[5] = (fr->fr_size >> 8) & 0xff;
+        fhdr[6] = fr->fr_size & 0xff;
+        fhdr[7] = (fr->fr_flags >> 8) & 0xff;
+        fhdr[8] = fr->fr_flags & 0xff;
+
+        if (safe_write(fd, fhdr, sizeof(fhdr)) == -1)
+            return -1;
+
+        if (safe_write(fd, fr->fr_data, fr->fr_size) == -1)
+            return -1;
+    }
+    return 0;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,765 @@
+/*********************************************************************
+ * 
+ *    Copyright (C) 1999-2000, 2001,  Espen Skoglund
+ *    Department of Computer Science, University of Tromsø
+ * 
+ * Filename:      id3_frame.c
+ * Description:   Code for handling ID3 frames.
+ * Author:        Espen Skoglund <espensk at stud.cs.uit.no>
+ * Created at:    Fri Feb  5 23:47:08 1999
+ * 
+ * $Id: id3_frame.c,v 1.5 2004/07/20 21:47:22 descender Exp $
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *                
+ ********************************************************************/
+#include "config.h"
+
+#ifdef HAVE_LIBZ
+#include <zlib.h>
+#endif
+#include <glib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "xmms-id3.h"
+#include "id3_header.h"
+
+static void *id3_frame_get_dataptr(struct id3_frame *frame);
+static int id3_frame_get_size(struct id3_frame *frame);
+static int id3_read_frame_v22(struct id3_tag *id3);
+
+
+/*
+ * Description of all valid ID3v2 frames.
+ */
+static struct id3_framedesc framedesc[] = {
+    {ID3_AENC, "AENC", "Audio encryption"},
+    {ID3_APIC, "APIC", "Attached picture"},
+    {ID3_ASPI, "ASPI", "Audio seek point index"},   /* v4 only */
+
+    {ID3_COMM, "COMM", "Comments"},
+    {ID3_COMR, "COMR", "Commercial frame"},
+
+    {ID3_ENCR, "ENCR", "Encryption method registration"},
+    {ID3_EQUA, "EQUA", "Equalization"}, /* v3 only */
+    {ID3_EQU2, "EQU2", "Equalization (2)"}, /* v4 only */
+    {ID3_ETCO, "ETCO", "Event timing codes"},
+
+    {ID3_GEOB, "GEOB", "General encapsulated object"},
+    {ID3_GRID, "GRID", "Group identification registration"},
+
+    {ID3_IPLS, "IPLS", "Involved people list"}, /* v3 only */
+
+    {ID3_LINK, "LINK", "Linked information"},
+
+    {ID3_MCDI, "MCDI", "Music CD identifier"},
+    {ID3_MLLT, "MLLT", "MPEG location lookup table"},
+
+    {ID3_OWNE, "OWNE", "Ownership frame"},
+
+    {ID3_PRIV, "PRIV", "Private frame"},
+    {ID3_PCNT, "PCNT", "Play counter"},
+    {ID3_POPM, "POPM", "Popularimeter"},
+    {ID3_POSS, "POSS", "Position synchronisation frame"},
+
+    {ID3_RBUF, "RBUF", "Recommended buffer size"},
+    {ID3_RVAD, "RVAD", "Relative volume adjustment"},   /* v3 only */
+    {ID3_RVA2, "RVA2", "RVA2 Relative volume adjustment (2)"},  /* v4 only */
+    {ID3_RVRB, "RVRB", "Reverb"},
+
+    {ID3_SEEK, "SEEK", "Seek frame"},   /* v4 only */
+    {ID3_SIGN, "SIGN", "Signature frame"},  /* v4 only */
+    {ID3_SYLT, "SYLT", "Synchronized lyric/text"},
+    {ID3_SYTC, "SYTC", "Synchronized tempo codes"},
+
+    {ID3_TALB, "TALB", "Album/Movie/Show title"},
+    {ID3_TBPM, "TBPM", "BPM (beats per minute)"},
+    {ID3_TCOM, "TCOM", "Composer"},
+    {ID3_TCON, "TCON", "Content type"},
+    {ID3_TCOP, "TCOP", "Copyright message"},
+    {ID3_TDAT, "TDAT", "Date"}, /* v3 only */
+    {ID3_TDEN, "TDEN", "Encoding time"},    /* v4 only */
+    {ID3_TDLY, "TDLY", "Playlist delay"},
+    {ID3_TDOR, "TDOR", "Original release time"},    /* v4 only */
+    {ID3_TDRC, "TDRC", "Recording time"},   /* v4 only */
+    {ID3_TDRL, "TDRL", "Release time"}, /* v4 only */
+    {ID3_TDTG, "TDTG", "Tagging time"}, /* v4 only */
+
+    {ID3_TENC, "TENC", "Encoded by"},
+    {ID3_TEXT, "TEXT", "Lyricist/Text writer"},
+    {ID3_TFLT, "TFLT", "File type"},
+    {ID3_TIME, "TIME", "Time"}, /* v3 only */
+    {ID3_TIPL, "TIPL", "Involved people list"}, /* v4 only */
+    {ID3_TIT1, "TIT1", "Content group description"},
+    {ID3_TIT2, "TIT2", "Title/songname/content description"},
+    {ID3_TIT3, "TIT3", "Subtitle/Description refinement"},
+    {ID3_TKEY, "TKEY", "Initial key"},
+    {ID3_TLAN, "TLAN", "Language(s)"},
+    {ID3_TLEN, "TLEN", "Length"},
+    {ID3_TMCL, "TMCL", "Musician credits list"},    /* v4 only */
+    {ID3_TMOO, "TMOO", "Mood"}, /* v4 only */
+    {ID3_TMED, "TMED", "Media type"},
+    {ID3_TOAL, "TOAL", "Original album/movie/show title"},
+    {ID3_TOFN, "TOFN", "Original filename"},
+    {ID3_TOLY, "TOLY", "Original lyricist(s)/text writer(s)"},
+    {ID3_TOPE, "TOPE", "Original artist(s)/performer(s)"},
+    {ID3_TORY, "TORY", "Original release year"},    /* v3 only */
+    {ID3_TOWN, "TOWN", "File owner/licensee"},
+    {ID3_TPE1, "TPE1", "Lead performer(s)/Soloist(s)"},
+    {ID3_TPE2, "TPE2", "Band/orchestra/accompaniment"},
+    {ID3_TPE3, "TPE3", "Conductor/performer refinement"},
+    {ID3_TPE4, "TPE4", "Interpreted, remixed, or otherwise modified by"},
+    {ID3_TPOS, "TPOS", "Part of a set"},
+    {ID3_TPRO, "TPRO", "Produced notice"},  /* v4 only */
+    {ID3_TPUB, "TPUB", "Publisher"},
+    {ID3_TRCK, "TRCK", "Track number/Position in set"},
+    {ID3_TRDA, "TRDA", "Recording dates"},  /* v3 only */
+    {ID3_TRSN, "TRSN", "Internet radio station name"},
+    {ID3_TRSO, "TRSO", "Internet radio station owner"},
+    {ID3_TSIZ, "TSIZ", "Size"}, /* v3 only */
+    {ID3_TSOA, "TSOA", "Album sort order"}, /* v4 only */
+    {ID3_TSOP, "TSOP", "Performer sort order"}, /* v4 only */
+    {ID3_TSOT, "TSOT", "Title sort order"}, /* v4 only */
+
+    {ID3_TSRC, "TSRC", "ISRC (international standard recording code)"},
+    {ID3_TSSE, "TSSE", "Software/Hardware and settings used for encoding"},
+    {ID3_TSST, "TSST", "Set subtitle"}, /* v4 only */
+    {ID3_TYER, "TYER", "Year"}, /* v3 only */
+    {ID3_TXXX, "TXXX", "User defined text information frame"},
+
+    {ID3_UFID, "UFID", "Unique file identifier"},
+    {ID3_USER, "USER", "Terms of use"},
+    {ID3_USLT, "USLT", "Unsychronized lyric/text transcription"},
+
+    {ID3_WCOM, "WCOM", "Commercial information"},
+    {ID3_WCOP, "WCOP", "Copyright/Legal information"},
+    {ID3_WOAF, "WOAF", "Official audio file webpage"},
+    {ID3_WOAR, "WOAR", "Official artist/performer webpage"},
+    {ID3_WOAS, "WOAS", "Official audio source webpage"},
+    {ID3_WORS, "WORS", "Official internet radio station homepage"},
+    {ID3_WPAY, "WPAY", "Payment"},
+    {ID3_WPUB, "WPUB", "Publishers official webpage"},
+    {ID3_WXXX, "WXXX", "User defined URL link frame"},
+};
+
+struct id3_framedesc22 {
+    guint32 fd_v22, fd_v24;
+};
+
+static struct id3_framedesc22 framedesc22[] = {
+    {ID3_BUF, ID3_RBUF},        /* Recommended buffer size */
+
+    {ID3_CNT, ID3_PCNT},        /* Play counter */
+    {ID3_COM, ID3_COMM},        /* Comments */
+    {ID3_CRA, ID3_AENC},        /* Audio encryption */
+    {ID3_CRM, 0},               /* Encrypted meta frame */
+
+    {ID3_ETC, ID3_ETCO},        /* Event timing codes */
+    /* Could be converted to EQU2 */
+    {ID3_EQU, 0},               /* Equalization */
+
+    {ID3_GEO, ID3_GEOB},        /* General encapsulated object */
+
+    /* Would need conversion to TIPL */
+    {ID3_IPL, 0},               /* Involved people list */
+
+    /* This is so fragile it's not worth trying to save */
+    {ID3_LNK, 0},               /* Linked information */
+
+    {ID3_MCI, ID3_MCDI},        /* Music CD Identifier */
+    {ID3_MLL, ID3_MLLT},        /* MPEG location lookup table */
+
+    /* Would need to convert header for APIC */
+    {ID3_PIC, 0},               /* Attached picture */
+    {ID3_POP, ID3_POPM},        /* Popularimeter */
+
+    {ID3_REV, ID3_RVRB},        /* Reverb */
+    /* Could be converted to RVA2 */
+    {ID3_RVA, 0},               /* Relative volume adjustment */
+
+    {ID3_SLT, ID3_SYLT},        /* Synchronized lyric/text */
+    {ID3_STC, ID3_SYTC},        /* Synced tempo codes */
+
+    {ID3_TAL, ID3_TALB},        /* Album/Movie/Show title */
+    {ID3_TBP, ID3_TBPM},        /* BPM (Beats Per Minute) */
+    {ID3_TCM, ID3_TCOM},        /* Composer */
+    {ID3_TCO, ID3_TCON},        /* Content type */
+    {ID3_TCR, ID3_TCOP},        /* Copyright message */
+    /* This could be incorporated into TDRC */
+    {ID3_TDA, 0},               /* Date */
+    {ID3_TDY, ID3_TDLY},        /* Playlist delay */
+    {ID3_TEN, ID3_TENC},        /* Encoded by */
+    {ID3_TFT, ID3_TFLT},        /* File type */
+    /* This could be incorporated into TDRC */
+    {ID3_TIM, 0},               /* Time */
+    {ID3_TKE, ID3_TKEY},        /* Initial key */
+    {ID3_TLA, ID3_TLAN},        /* Language(s) */
+    {ID3_TLE, ID3_TLEN},        /* Length */
+    {ID3_TMT, ID3_TMED},        /* Media type */
+    {ID3_TOA, ID3_TOPE},        /* Original artist(s)/performer(s) */
+    {ID3_TOF, ID3_TOFN},        /* Original filename */
+    {ID3_TOL, ID3_TOLY},        /* Original Lyricist(s)/text writer(s) */
+    /*
+     * The docs says that original release year should be in
+     * milliseconds!  Hopefully that is a typo.
+     */
+    {ID3_TOR, ID3_TDOR},        /* Original release year */
+    {ID3_TOT, ID3_TOAL},        /* Original album/Movie/Show title */
+    {ID3_TP1, ID3_TPE1},        /* Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group */
+    {ID3_TP2, ID3_TPE2},        /* Band/Orchestra/Accompaniment */
+    {ID3_TP3, ID3_TPE3},        /* Conductor/Performer refinement */
+    {ID3_TP4, ID3_TPE4},        /* Interpreted, remixed, or otherwise modified by */
+    {ID3_TPA, ID3_TPOS},        /* Part of a set */
+    {ID3_TPB, ID3_TPUB},        /* Publisher */
+    {ID3_TRC, ID3_TSRC},        /* ISRC (International Standard Recording Code) */
+    {ID3_TRD, 0},               /* Recording dates */
+    {ID3_TRK, ID3_TRCK},        /* Track number/Position in set */
+    {ID3_TSI, 0},               /* Size */
+    {ID3_TSS, ID3_TSSE},        /* Software/hardware and settings used for encoding */
+    {ID3_TT1, ID3_TIT1},        /* Content group description */
+    {ID3_TT2, ID3_TIT2},        /* Title/Songname/Content description */
+    {ID3_TT3, ID3_TIT3},        /* Subtitle/Description refinement */
+    {ID3_TXT, ID3_TEXT},        /* Lyricist/text writer */
+    {ID3_TXX, ID3_TXXX},        /* User defined text information frame */
+    {ID3_TYE, ID3_TDRC},        /* Year */
+
+    {ID3_UFI, ID3_UFID},        /* Unique file identifier */
+    {ID3_ULT, ID3_USLT},        /* Unsychronized lyric/text transcription */
+
+    {ID3_WAF, ID3_WOAF},        /* Official audio file webpage */
+    {ID3_WAR, ID3_WOAR},        /* Official artist/performer webpage */
+    {ID3_WAS, ID3_WOAS},        /* Official audio source webpage */
+    {ID3_WCM, ID3_WCOM},        /* Commercial information */
+    {ID3_WCP, ID3_WCOP},        /* Copyright/Legal information */
+    {ID3_WPB, ID3_WPUB},        /* Publishers official webpage */
+    {ID3_WXX, ID3_WXXX},        /* User defined URL link frame */
+};
+
+static struct id3_framedesc *
+find_frame_description(guint32 id)
+{
+    int i;
+    for (i = 0; i < sizeof(framedesc) / sizeof(struct id3_framedesc); i++)
+        if (framedesc[i].fd_id == id)
+            return &framedesc[i];
+    return NULL;
+}
+
+
+/*
+ * Function id3_read_frame (id3)
+ *
+ *    Read next frame from the indicated ID3 tag.  Return 0 upon
+ *    success, or -1 if an error occured.
+ *
+ */
+int
+id3_read_frame(struct id3_tag *id3)
+{
+    struct id3_frame *frame;
+    guint32 id;
+    char *buf;
+
+    if (id3->id3_version == 2)
+        return id3_read_frame_v22(id3);
+
+    /*
+     * Read frame header.
+     */
+    buf = id3->id3_read(id3, NULL, ID3_FRAMEHDR_SIZE);
+    if (buf == NULL)
+        return -1;
+
+    /*
+     * If we encounter an invalid frame id, we assume that there is
+     * some padding in the header.  We just skip the rest of the ID3
+     * tag.
+     */
+    if (!((buf[0] >= '0' && buf[0] <= '9')
+          || (buf[0] >= 'A' && buf[0] <= 'Z'))) {
+        id3->id3_seek(id3, id3->id3_tagsize - id3->id3_pos);
+        return 0;
+    }
+    id = ID3_FRAME_ID(buf[0], buf[1], buf[2], buf[3]);
+
+    /*
+     * Allocate frame.
+     */
+    frame = g_malloc0(sizeof(*frame));
+
+    frame->fr_owner = id3;
+    /* FIXME v2.4.0 */
+    frame->fr_raw_size = buf[4] << 24 | buf[5] << 16 | buf[6] << 8 | buf[7];
+    if (frame->fr_raw_size < 0 || frame->fr_raw_size > 1000000) {
+        g_free(frame);
+        return -1;
+    }
+    frame->fr_flags = buf[8] << 8 | buf[9];
+
+    /*
+     * Determine the type of the frame.
+     */
+
+    frame->fr_desc = find_frame_description(id);
+
+    /*
+     * Check if frame had a valid id.
+     */
+    if (frame->fr_desc == NULL) {
+        /*
+         * No. Ignore the frame.
+         */
+        if (id3->id3_seek(id3, frame->fr_raw_size) < 0) {
+            g_free(frame);
+            return -1;
+        }
+        return 0;
+    }
+
+    /*
+     * Initialize frame.
+     */
+
+    /*
+     * We allocate 2 extra bytes.  This simplifies retrieval of
+     * text strings.
+     */
+    frame->fr_raw_data = g_malloc0(frame->fr_raw_size + 2);
+    if (id3->id3_read(id3, frame->fr_raw_data, frame->fr_raw_size) == NULL) {
+        g_free(frame->fr_raw_data);
+        g_free(frame);
+        return -1;
+    }
+
+    /*
+     * Insert frame into linked list.
+     */
+    id3->id3_frame = g_list_append(id3->id3_frame, frame);
+
+    /*
+     * Check if frame is compressed using zlib.
+     */
+    if (frame->fr_flags & ID3_FHFLAG_COMPRESS)
+        return 0;
+
+    frame->fr_data = id3_frame_get_dataptr(frame);
+    frame->fr_size = id3_frame_get_size(frame);
+
+    return 0;
+}
+
+
+/*
+ * Function id3_get_frame (id3, type, num)
+ *
+ *    Search in the list of frames for the ID3-tag, and return a frame
+ *    of the indicated type.  If tag contains several frames of the
+ *    indicated type, the third argument tells which of the frames to
+ *    return.
+ *
+ */
+struct id3_frame *
+id3_get_frame(struct id3_tag *id3, guint32 type, int num)
+{
+    GList *node;
+
+    for (node = id3->id3_frame; node != NULL; node = node->next) {
+        struct id3_frame *fr = node->data;
+        if (fr->fr_desc && fr->fr_desc->fd_id == type) {
+            if (--num <= 0)
+                return fr;
+        }
+    }
+    return NULL;
+}
+
+/*
+ * Function decompress_frame(frame)
+ *
+ *    Uncompress the indicated frame.  Return 0 upon success, or -1 if
+ *    an error occured.
+ *
+ */
+static int
+decompress_frame(struct id3_frame *frame)
+{
+#ifdef HAVE_LIBZ
+    z_stream z;
+    int r;
+
+    /*
+     * Fetch the size of the decompressed data.
+     */
+    frame->fr_size_z = g_ntohl(*((guint32 *) frame->fr_raw_data));
+    if (frame->fr_size_z < 0 || frame->fr_size_z > 1000000)
+        return -1;
+
+    /*
+     * Allocate memory to hold uncompressed frame.
+     */
+    frame->fr_data_z = g_malloc(frame->fr_size_z +
+                                (id3_frame_is_text(frame) ? 2 : 0));
+
+    /*
+     * Initialize zlib.
+     */
+    z.next_in = id3_frame_get_dataptr(frame);
+    z.avail_in = id3_frame_get_size(frame);
+    z.zalloc = NULL;
+    z.zfree = NULL;
+    z.opaque = NULL;
+
+    r = inflateInit(&z);
+    switch (r) {
+    case Z_OK:
+        break;
+    case Z_MEM_ERROR:
+        id3_error(frame->fr_owner, "zlib - no memory");
+        goto Error_init;
+    case Z_VERSION_ERROR:
+        id3_error(frame->fr_owner, "zlib - invalid version");
+        goto Error_init;
+    default:
+        id3_error(frame->fr_owner, "zlib - unknown error");
+        goto Error_init;
+    }
+
+    /*
+     * Decompress frame.
+     */
+    z.next_out = frame->fr_data_z;
+    z.avail_out = frame->fr_size_z;
+    r = inflate(&z, Z_SYNC_FLUSH);
+    switch (r) {
+    case Z_STREAM_END:
+        break;
+    case Z_OK:
+        if (z.avail_in == 0)
+            /*
+             * This should not be possible with a correct stream.
+             * We will be nice however, and try to go on.
+             */
+            break;
+        id3_error(frame->fr_owner, "zlib - buffer exhausted");
+        goto Error_inflate;
+    default:
+        id3_error(frame->fr_owner, "zlib - unknown error");
+        goto Error_inflate;
+    }
+
+    r = inflateEnd(&z);
+    if (r != Z_OK)
+        id3_error(frame->fr_owner, "zlib - inflateEnd error");
+
+    /*
+     * Null-terminate text frames.
+     */
+    if (id3_frame_is_text(frame)) {
+        ((char *) frame->fr_data_z)[frame->fr_size_z] = 0;
+        ((char *) frame->fr_data_z)[frame->fr_size_z + 1] = 0;
+    }
+    frame->fr_data = frame->fr_data_z;
+    frame->fr_size = frame->fr_size_z + (id3_frame_is_text(frame) ? 2 : 0);
+
+    return 0;
+
+    /*
+     * Cleanup code.
+     */
+  Error_inflate:
+    r = inflateEnd(&z);
+  Error_init:
+    g_free(frame->fr_data_z);
+    frame->fr_data_z = NULL;
+#endif
+    return -1;
+}
+
+/*
+ * Function id3_decompress_frame(frame)
+ *
+ *    Check if frame is compressed, and uncompress if necessary.
+ *    Return 0 upon success, or -1 if an error occured.
+ *
+ */
+int
+id3_decompress_frame(struct id3_frame *frame)
+{
+    if (!(frame->fr_flags & ID3_FHFLAG_COMPRESS))
+        /* Frame not compressed */
+        return 0;
+    if (frame->fr_data_z)
+        /* Frame already decompressed */
+        return 0;
+    /* Do decompression */
+    return decompress_frame(frame);
+}
+
+
+/*
+ * Function id3_delete_frame (frame)
+ *
+ *    Remove frame from ID3 tag and release memory ocupied by it.
+ *
+ */
+int
+id3_delete_frame(struct id3_frame *frame)
+{
+    GList *list = frame->fr_owner->id3_frame;
+    int ret;
+
+    /*
+     * Search for frame in list.
+     */
+
+    if (g_list_find(list, frame) != NULL) {
+        /*
+         * Frame does not exist in frame list.
+         */
+        ret = -1;
+
+    }
+    else {
+        /*
+         * Remove frame from frame list.
+         */
+        list = g_list_remove(list, frame);
+        frame->fr_owner->id3_altered = 1;
+        ret = 0;
+    }
+
+    /*
+     * Release memory occupied by frame.
+     */
+    if (frame->fr_raw_data)
+        g_free(frame->fr_raw_data);
+    if (frame->fr_data_z)
+        g_free(frame->fr_data_z);
+    g_free(frame);
+
+    return ret;
+}
+
+
+/*
+ * Function id3_add_frame (id3, type)
+ *
+ *    Add a new frame to the ID3 tag.  Return a pointer to the new
+ *    frame, or NULL if an error occured.
+ *
+ */
+struct id3_frame *
+id3_add_frame(struct id3_tag *id3, guint32 type)
+{
+    struct id3_frame *frame;
+    int i;
+
+    /*
+     * Allocate frame.
+     */
+    frame = g_malloc0(sizeof(*frame));
+
+    /*
+     * Initialize frame
+     */
+    frame->fr_owner = id3;
+
+    /*
+     * Try finding the correct frame descriptor.
+     */
+    for (i = 0; i < sizeof(framedesc) / sizeof(struct id3_framedesc); i++) {
+        if (framedesc[i].fd_id == type) {
+            frame->fr_desc = &framedesc[i];
+            break;
+        }
+    }
+
+    /*
+     * Insert frame into linked list.
+     */
+    id3->id3_frame = g_list_append(id3->id3_frame, frame);
+    id3->id3_altered = 1;
+
+    return frame;
+}
+
+
+/*
+ * Destroy all frames  in an id3 tag, and free all data
+ */
+void
+id3_destroy_frames(struct id3_tag *id)
+{
+    GList *node;
+
+    for (node = id->id3_frame; node != NULL; node = node->next) {
+        struct id3_frame *frame = node->data;
+        /*
+         * Release memory occupied by frame.
+         */
+        if (frame->fr_raw_data)
+            g_free(frame->fr_raw_data);
+        if (frame->fr_data_z)
+            g_free(frame->fr_data_z);
+        g_free(frame);
+    }
+    g_list_free(id->id3_frame);
+    id->id3_frame = NULL;
+}
+
+static int
+id3_frame_extra_headers(struct id3_frame *frame)
+{
+    int retv = 0;
+    /*
+     * If frame is encrypted, we have four extra bytes in the
+     * header.
+     */
+    if (frame->fr_flags & ID3_FHFLAG_COMPRESS)
+        retv += 4;
+    /*
+     * If frame is encrypted, we have one extra byte in the
+     * header.
+     */
+    if (frame->fr_flags & ID3_FHFLAG_ENCRYPT)
+        retv += 1;
+
+    /*
+     * If frame has grouping identity, we have one extra byte in
+     * the header.
+     */
+    if (frame->fr_flags & ID3_FHFLAG_GROUP)
+        retv += 1;
+
+    return retv;
+}
+
+static void *
+id3_frame_get_dataptr(struct id3_frame *frame)
+{
+    char *ptr = frame->fr_raw_data;
+
+    ptr += id3_frame_extra_headers(frame);
+
+    return ptr;
+}
+
+static int
+id3_frame_get_size(struct id3_frame *frame)
+{
+    return frame->fr_raw_size - id3_frame_extra_headers(frame);
+}
+
+void
+id3_frame_clear_data(struct id3_frame *frame)
+{
+    if (frame->fr_raw_data)
+        g_free(frame->fr_raw_data);
+    if (frame->fr_data_z)
+        g_free(frame->fr_data_z);
+    frame->fr_raw_data = NULL;
+    frame->fr_raw_size = 0;
+    frame->fr_data = NULL;
+    frame->fr_size = 0;
+    frame->fr_data_z = NULL;
+    frame->fr_size_z = 0;
+}
+
+static guint32
+find_v24_id(guint32 v22)
+{
+    int i;
+    for (i = 0; i < sizeof(framedesc22) / sizeof(framedesc22[0]); i++)
+        if (framedesc22[i].fd_v22 == v22)
+            return framedesc22[i].fd_v24;
+
+    return 0;
+}
+
+static int
+id3_read_frame_v22(struct id3_tag *id3)
+{
+    struct id3_frame *frame;
+    guint32 id, idv24;
+    char *buf;
+    int size;
+
+    /*
+     * Read frame header.
+     */
+    buf = id3->id3_read(id3, NULL, ID3_FRAMEHDR_SIZE_22);
+    if (buf == NULL)
+        return -1;
+
+    /*
+     * If we encounter an invalid frame id, we assume that there
+     * is some.  We just skip the rest of the ID3 tag.
+     */
+    if (!((buf[0] >= '0' && buf[0] <= '9')
+          || (buf[0] >= 'A' && buf[0] <= 'Z'))) {
+        id3->id3_seek(id3, id3->id3_tagsize - id3->id3_pos);
+        return 0;
+    }
+
+    id = ID3_FRAME_ID_22(buf[0], buf[1], buf[2]);
+    size = buf[3] << 16 | buf[4] << 8 | buf[5];
+
+    if ((idv24 = find_v24_id(id)) == 0) {
+        if (id3->id3_seek(id3, size) < 0)
+            return -1;
+        return 0;
+    }
+
+    /*
+     * Allocate frame.
+     */
+    frame = g_malloc0(sizeof(*frame));
+
+    frame->fr_owner = id3;
+    frame->fr_raw_size = size;
+    if (frame->fr_raw_size < 0 || frame->fr_raw_size > 1000000) {
+        g_free(frame);
+        return -1;
+    }
+
+    /*
+     * Initialize frame.
+     */
+    frame->fr_desc = find_frame_description(idv24);
+
+    /*
+     * We allocate 2 extra bytes.  This simplifies retrieval of
+     * text strings.
+     */
+    frame->fr_raw_data = g_malloc0(frame->fr_raw_size + 2);
+    if (id3->id3_read(id3, frame->fr_raw_data, frame->fr_raw_size) == NULL) {
+        g_free(frame->fr_raw_data);
+        g_free(frame);
+        return -1;
+    }
+
+    /*
+     * Insert frame into linked list.
+     */
+    id3->id3_frame = g_list_append(id3->id3_frame, frame);
+
+    frame->fr_data = frame->fr_raw_data;
+    frame->fr_size = frame->fr_raw_size;
+
+    return 0;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame_content.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame_content.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame_content.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,138 @@
+/*********************************************************************
+ * 
+ *    Copyright (C) 1999, 2002,  Espen Skoglund
+ *    Department of Computer Science, University of Tromsø
+ * 
+ * Filename:      id3_frame_content.c
+ * Description:   Code for handling ID3 content frames.
+ * Author:        Espen Skoglund <espensk at stud.cs.uit.no>
+ * Created at:    Mon Feb  8 17:13:46 1999
+ *                
+ * $Id: id3_frame_content.c,v 1.7 2004/07/20 21:47:22 descender Exp $
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * 
+ ********************************************************************/
+
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#include "xmms-id3.h"
+
+#include "mpg123.h"
+
+
+/*
+ * Function id3_get_content (frame)
+ *
+ *    Expand content type string of frame and return it.  Return NULL
+ *    upon error.
+ *
+ */
+char *
+id3_get_content(struct id3_frame *frame)
+{
+    char *text, *text_beg, *ptr;
+    char buffer[256];
+    int spc = sizeof(buffer) - 1;
+
+    /* Type check */
+    if (frame->fr_desc->fd_id != ID3_TCON)
+        return NULL;
+
+    /* Check if frame is compressed */
+    if (id3_decompress_frame(frame) == -1)
+        return NULL;
+
+    if (*(guint8 *) frame->fr_data == ID3_ENCODING_ISO_8859_1)
+        text_beg = text = g_strdup((char *) frame->fr_data + 1);
+    else
+        text_beg = text = id3_utf16_to_ascii((char *) frame->fr_data + 1);
+
+    /*
+     * If content is just plain text, return it.
+     */
+    if (text[0] != '(') {
+        return text;
+    }
+
+    /*
+     * Expand ID3v1 genre numbers.
+     */
+    ptr = buffer;
+    while (text[0] == '(' && text[1] != '(' && spc > 0) {
+        const char *genre;
+        int num = 0;
+
+        if (text[1] == 'R' && text[2] == 'X') {
+            text += 4;
+            genre = _(" (Remix)");
+            if (ptr == buffer)
+                genre++;
+
+        }
+        else if (text[1] == 'C' && text[2] == 'R') {
+            text += 4;
+            genre = _(" (Cover)");
+            if (ptr == buffer)
+                genre++;
+
+        }
+        else {
+            /* Get ID3v1 genre number */
+            text++;
+            while (*text != ')') {
+                num *= 10;
+                num += *text++ - '0';
+            }
+            text++;
+
+            /* Boundary check */
+            if (num >= sizeof(mpg123_id3_genres) / sizeof(char *))
+                continue;
+
+            genre = gettext(mpg123_id3_genres[num]);
+
+            if (ptr != buffer && spc-- > 0)
+                *ptr++ = '/';
+        }
+
+        /* Expand string into buffer */
+        while (*genre != '\0' && spc > 0) {
+            *ptr++ = *genre++;
+            spc--;
+        }
+    }
+
+    /*
+     * Add plaintext refinement.
+     */
+    if (*text == '(')
+        text++;
+    if (*text != '\0' && ptr != buffer && spc-- > 0)
+        *ptr++ = ' ';
+    while (*text != '\0' && spc > 0) {
+        *ptr++ = *text++;
+        spc--;
+    }
+    *ptr = '\0';
+
+    g_free(text_beg);
+
+    /*
+     * Return the expanded content string.
+     */
+    return g_strdup(buffer);
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame_text.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame_text.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame_text.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,366 @@
+/*********************************************************************
+ * 
+ *    Copyright (C) 1999, 2001, 2002,  Espen Skoglund
+ *    Department of Computer Science, University of Tromsø
+ * 
+ * Filename:      id3_frame_text.c
+ * Description:   Code for handling ID3 text frames.
+ * Author:        Espen Skoglund <espensk at stud.cs.uit.no>
+ * Created at:    Fri Feb  5 23:50:33 1999
+ *                
+ * $Id: id3_frame_text.c,v 1.7 2004/08/21 13:04:47 descender Exp $
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *                
+ ********************************************************************/
+#include "config.h"
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "xmms-id3.h"
+#include "id3_header.h"
+
+
+char *
+id3_utf16_to_ascii(void *utf16)
+{
+    char ascii[256];
+    char *uc = (char *) utf16 + 2;
+    int i;
+
+    for (i = 0; *uc != 0 && i < sizeof(ascii); i++, uc += 2)
+        ascii[i] = *uc;
+
+    ascii[i] = 0;
+    return g_strdup(ascii);
+}
+
+
+/*
+ * Function id3_get_encoding (frame)
+ *
+ *    Return text encoding for frame, or -1 if frame does not have any
+ *    text encoding.
+ *
+ */
+gint8
+id3_get_encoding(struct id3_frame * frame)
+{
+    /* Type check */
+    if (!id3_frame_is_text(frame) &&
+        frame->fr_desc->fd_id != ID3_WXXX &&
+        frame->fr_desc->fd_id != ID3_IPLS &&
+        frame->fr_desc->fd_id != ID3_USLT &&
+        frame->fr_desc->fd_id != ID3_SYLT &&
+        frame->fr_desc->fd_id != ID3_COMM &&
+        frame->fr_desc->fd_id != ID3_APIC &&
+        frame->fr_desc->fd_id != ID3_GEOB &&
+        frame->fr_desc->fd_id != ID3_USER &&
+        frame->fr_desc->fd_id != ID3_OWNE &&
+        frame->fr_desc->fd_id != ID3_COMR)
+        return -1;
+
+    /* Check if frame is compressed */
+    if (id3_decompress_frame(frame) == -1)
+        return -1;
+
+    return *(gint8 *) frame->fr_data;
+}
+
+
+/*
+ * Function id3_set_encoding (frame, encoding)
+ *
+ *    Set text encoding for frame.  Return 0 upon success, or -1 if an
+ *    error occured. 
+ *
+ */
+int
+id3_set_encoding(struct id3_frame *frame, gint8 encoding)
+{
+    /* Type check */
+    if (frame->fr_desc->fd_idstr[0] != 'T' &&
+        frame->fr_desc->fd_id != ID3_WXXX &&
+        frame->fr_desc->fd_id != ID3_IPLS &&
+        frame->fr_desc->fd_id != ID3_USLT &&
+        frame->fr_desc->fd_id != ID3_SYLT &&
+        frame->fr_desc->fd_id != ID3_COMM &&
+        frame->fr_desc->fd_id != ID3_APIC &&
+        frame->fr_desc->fd_id != ID3_GEOB &&
+        frame->fr_desc->fd_id != ID3_USER &&
+        frame->fr_desc->fd_id != ID3_OWNE &&
+        frame->fr_desc->fd_id != ID3_COMR)
+        return -1;
+
+    /* Check if frame is compressed */
+    if (id3_decompress_frame(frame) == -1)
+        return -1;
+
+    /* Changing the encoding of frames is not supported yet */
+    if (*(gint8 *) frame->fr_data != encoding)
+        return -1;
+
+    /* Set encoding */
+    *(gint8 *) frame->fr_data = encoding;
+    return 0;
+}
+
+
+/*
+ * Function id3_get_text (frame)
+ *
+ *    Return string contents of frame.
+ *
+ */
+char *
+id3_get_text(struct id3_frame *frame)
+{
+    /* Type check */
+    if (frame->fr_desc->fd_idstr[0] != 'T' && frame->fr_desc->fd_id != ID3_COMM)
+        return NULL;
+
+    /* Check if frame is compressed */
+    if (id3_decompress_frame(frame) == -1)
+        return NULL;
+
+    if (frame->fr_desc->fd_id == ID3_TXXX || frame->fr_desc->fd_id == ID3_COMM) {
+        /*
+         * This is a user defined text frame.  Skip the description.
+         */
+        switch (*(guint8 *) frame->fr_data) {
+        case ID3_ENCODING_ISO_8859_1:
+            {
+                char *text = (char *) frame->fr_data + 1;
+
+                while (*text != 0)
+                    text++;
+
+                return g_strdup(++text);
+            }
+        case ID3_ENCODING_UTF16:
+            {
+                char *text16 = (char *) frame->fr_data + 1;
+
+                while (*text16 != 0 || *(text16 + 1) != 0)
+                    text16 += 2;
+
+                return id3_utf16_to_ascii(text16 + 2);
+            }
+        default:
+            return NULL;
+        }
+    }
+
+    if (*(guint8 *) frame->fr_data == ID3_ENCODING_ISO_8859_1)
+        return g_strdup((char *) frame->fr_data + 1);
+    else
+        return id3_utf16_to_ascii(((char *) frame->fr_data + 1));
+}
+
+
+/*
+ * Function id3_get_text_desc (frame)
+ *
+ *    Get description part of a text frame.
+ *
+ */
+char *
+id3_get_text_desc(struct id3_frame *frame)
+{
+    /* Type check */
+    if (frame->fr_desc->fd_idstr[0] != 'T')
+        return NULL;
+
+    /* If predefined text frame, return description. */
+    if (frame->fr_desc->fd_id != ID3_TXXX)
+        return frame->fr_desc->fd_description;
+
+    /* Check if frame is compressed */
+    if (id3_decompress_frame(frame) == -1)
+        return NULL;
+
+    if (*(guint8 *) frame->fr_data == ID3_ENCODING_ISO_8859_1)
+        return g_strdup((char *) frame->fr_data + 1);
+    else
+        return id3_utf16_to_ascii((char *) frame->fr_data + 1);
+}
+
+
+/*
+ * Function id3_get_text_number (frame)
+ *
+ *    Return string contents of frame translated to a positive
+ *    integer, or -1 if an error occured.
+ *
+ */
+int
+id3_get_text_number(struct id3_frame *frame)
+{
+    int number = 0;
+
+    /* Check if frame is compressed */
+    if (id3_decompress_frame(frame) == -1)
+        return -1;
+
+    /*
+     * Generate integer according to encoding.
+     */
+    switch (*(guint8 *) frame->fr_data) {
+    case ID3_ENCODING_ISO_8859_1:
+        {
+            char *text = ((char *) frame->fr_data) + 1;
+
+            while (*text >= '0' && *text <= '9') {
+                number *= 10;
+                number += *text - '0';
+                text++;
+            }
+
+            return number;
+        }
+    case ID3_ENCODING_UTF16:
+        {
+            char *text = ((char *) frame->fr_data) + 3;
+
+/*  	if (*(gint16 *) frame->fr_data == 0xfeff) */
+/*  	    text++; */
+
+            while (*text >= '0' && *text <= '9') {
+                number *= 10;
+                number += *text - '0';
+                text++;
+            }
+
+            return number;
+        }
+
+    default:
+        return -1;
+    }
+}
+
+
+/*
+ * Function id3_set_text (frame, text)
+ *
+ *    Set text for the indicated frame (only ISO-8859-1 is currently
+ *    supported).  Return 0 upon success, or -1 if an error occured.
+ *
+ */
+int
+id3_set_text(struct id3_frame *frame, char *text)
+{
+    /* Type check */
+    if (frame->fr_desc->fd_idstr[0] != 'T')
+        return -1;
+
+    /*
+     * Release memory occupied by previous data.
+     */
+    id3_frame_clear_data(frame);
+
+    /*
+     * Allocate memory for new data.
+     */
+    frame->fr_raw_size = strlen(text) + 1;
+    frame->fr_raw_data = g_malloc(frame->fr_raw_size + 1);
+
+    /*
+     * Copy contents.
+     */
+    *(gint8 *) frame->fr_raw_data = ID3_ENCODING_ISO_8859_1;
+    memcpy((char *) frame->fr_raw_data + 1, text, frame->fr_raw_size);
+
+    frame->fr_altered = 1;
+    frame->fr_owner->id3_altered = 1;
+
+    frame->fr_data = frame->fr_raw_data;
+    frame->fr_size = frame->fr_raw_size;
+
+    return 0;
+}
+
+
+/*
+ * Function id3_set_text_number (frame, number)
+ *
+ *    Set number for the indicated frame (only ISO-8859-1 is currently
+ *    supported).  Return 0 upon success, or -1 if an error occured.
+ *
+ */
+int
+id3_set_text_number(struct id3_frame *frame, int number)
+{
+    char buf[64];
+    int pos;
+    char *text;
+
+    /* Type check */
+    if (frame->fr_desc->fd_idstr[0] != 'T')
+        return -1;
+
+    /*
+     * Release memory occupied by previous data.
+     */
+    id3_frame_clear_data(frame);
+
+    /*
+     * Create a string with a reversed number.
+     */
+    pos = 0;
+    while (number > 0 && pos < 64) {
+        buf[pos++] = (number % 10) + '0';
+        number /= 10;
+    }
+    if (pos == 64)
+        return -1;
+    if (pos == 0)
+        buf[pos++] = '0';
+
+    /*
+     * Allocate memory for new data.
+     */
+    frame->fr_raw_size = pos + 1;
+    frame->fr_raw_data = g_malloc(frame->fr_raw_size + 1);
+
+    /*
+     * Insert contents.
+     */
+    *(gint8 *) frame->fr_raw_data = ID3_ENCODING_ISO_8859_1;
+    text = (char *) frame->fr_raw_data + 1;
+    while (--pos >= 0)
+        *text++ = buf[pos];
+    *text = '\0';
+
+    frame->fr_altered = 1;
+    frame->fr_owner->id3_altered = 1;
+
+    frame->fr_data = frame->fr_raw_data;
+    frame->fr_size = frame->fr_raw_size;
+
+    return 0;
+}
+
+gboolean
+id3_frame_is_text(struct id3_frame * frame)
+{
+    if (frame && frame->fr_desc &&
+        (frame->fr_desc->fd_idstr[0] == 'T' ||
+         frame->fr_desc->fd_idstr[0] == 'W'))
+        return TRUE;
+    return FALSE;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame_url.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame_url.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_frame_url.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,109 @@
+/*********************************************************************
+ * 
+ *    Copyright (C) 1999, 2001, 2002,
+ *    Department of Computer Science, University of Tromsø
+ * 
+ * Filename:      id3_frame_url.c
+ * Description:   Code for handling ID3 URL frames.
+ * Author:        Espen Skoglund <espensk at stud.cs.uit.no>
+ * Created at:    Tue Feb  9 21:10:45 1999
+ *                
+ * $Id: id3_frame_url.c,v 1.6 2004/07/20 21:47:22 descender Exp $
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *                
+ ********************************************************************/
+#include "config.h"
+
+#include "xmms-id3.h"
+#include "id3_header.h"
+
+
+
+/*
+ * Function id3_get_url (frame)
+ *
+ *    Return URL of frame.
+ *
+ */
+char *
+id3_get_url(struct id3_frame *frame)
+{
+    /* Type check */
+    if (frame->fr_desc->fd_idstr[0] != 'W')
+        return NULL;
+
+    /* Check if frame is compressed */
+    if (id3_decompress_frame(frame) == -1)
+        return NULL;
+
+    if (frame->fr_desc->fd_id == ID3_WXXX) {
+        /*
+         * This is a user defined link frame.  Skip the description.
+         */
+        switch (*(guint8 *) frame->fr_data) {
+        case ID3_ENCODING_ISO_8859_1:
+            {
+                char *text = (char *) frame->fr_data + 1;
+
+                while (*text != 0)
+                    text++;
+
+                return g_strdup(++text);
+            }
+        case ID3_ENCODING_UTF16:
+            {
+                gint16 *text16 = (gint16 *) ((glong) frame->fr_data + 1);
+
+                while (*text16 != 0)
+                    text16++;
+
+                return g_strdup((char *) (++text16));
+            }
+        default:
+            return NULL;
+        }
+    }
+
+    return g_strdup((char *) frame->fr_data);
+}
+
+
+/*
+ * Function id3_get_url_desc (frame)
+ *
+ *    Get description of a URL.
+ *
+ */
+char *
+id3_get_url_desc(struct id3_frame *frame)
+{
+    /* Type check */
+    if (frame->fr_desc->fd_idstr[0] != 'W')
+        return NULL;
+
+    /* If predefined link frame, return description. */
+    if (frame->fr_desc->fd_id != ID3_WXXX)
+        return frame->fr_desc->fd_description;
+
+    /* Check if frame is compressed */
+    if (id3_decompress_frame(frame) == -1)
+        return NULL;
+
+    if (*(guint8 *) frame->fr_data == ID3_ENCODING_ISO_8859_1)
+        return g_strdup((char *) frame->fr_data + 1);
+    else
+        return id3_utf16_to_ascii((gint16 *) ((glong) frame->fr_data + 1));
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_header.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_header.h	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_header.h	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,158 @@
+/*********************************************************************
+ * 
+ *    Copyright (C) 1998, 1999,  Espen Skoglund
+ *    Department of Computer Science, University of Tromsø
+ * 
+ * Filename:      id3_header.h
+ * Description:   Definitions for various ID3 headers.
+ * Author:        Espen Skoglund <espensk at stud.cs.uit.no>
+ * Created at:    Thu Nov  5 15:55:10 1998
+ *                
+ * $Id: id3_header.h,v 1.4 2004/04/13 23:53:01 descender Exp $
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *                
+ ********************************************************************/
+#ifndef ID3_HEADER_H
+#define ID3_HEADER_H
+
+#include <stdio.h>
+
+/*
+ * Layout for the ID3 tag header.
+ */
+#if 0
+struct id3_taghdr {
+    guint8 th_version;
+    guint8 th_revision;
+    guint8 th_flags;
+    guint32 th_size;
+};
+#endif
+
+/* Header size excluding "ID3" */
+#define ID3_TAGHDR_SIZE 7       /* Size on disk */
+
+#define ID3_THFLAG_USYNC	0x80000000
+#define ID3_THFLAG_EXT		0x40000000
+#define ID3_THFLAG_EXP		0x20000000
+
+#if 0
+#define ID3_SET_SIZE28(size)		\
+    ( ((size << 3) & 0x7f000000) |	\
+      ((size << 2) & 0x007f0000) |	\
+      ((size << 1) & 0x00007f00) |	\
+      ((size     ) & 0x0000007f) )
+
+#define ID3_GET_SIZE28(size)		\
+    ( ((size & 0x7f000000) >> 3) |	\
+      ((size & 0x007f0000) >> 2) |	\
+      ((size & 0x00007f00) >> 1) |	\
+      ((size & 0x0000007f)     ) )
+#endif
+
+#define ID3_SET_SIZE28(size, a, b, c, d)	\
+do {						\
+	a = (size >> (24 + 3)) & 0x7f;		\
+	b = (size >> (16 + 2)) & 0x7f;		\
+	c = (size >> ( 8 + 1)) & 0x7f;		\
+	d = size & 0x7f;			\
+} while (0)
+
+#define ID3_GET_SIZE28(a, b, c, d)		\
+(((a & 0x7f) << (24 - 3)) |			\
+ ((b & 0x7f) << (16 - 2)) |			\
+ ((c & 0x7f) << ( 8 - 1)) |			\
+ ((d & 0x7f)))
+
+
+
+/*
+ * Layout for the extended header.
+ */
+#if 0
+struct id3_exthdr {
+    guint32 eh_size;
+    guint16 eh_flags;
+    guint32 eh_padsize;
+};
+#endif
+
+#define ID3_EXTHDR_SIZE 10
+
+#define ID3_EHFLAG_CRC		0x80000000
+
+
+
+/*
+ * Layout for the frame header.
+ */
+#if 0
+struct id3_framehdr {
+    guint32 fh_id;
+    guint32 fh_size;
+    guint16 fh_flags;
+};
+#endif
+
+#define ID3_FRAMEHDR_SIZE 10
+
+
+#define ID3_FHFLAG_TAGALT	0x8000
+#define ID3_FHFLAG_FILEALT	0x4000
+#define ID3_FHFLAG_RO		0x2000
+#define ID3_FHFLAG_COMPRESS	0x0080
+#define ID3_FHFLAG_ENCRYPT	0x0040
+#define ID3_FHFLAG_GROUP	0x0020
+
+
+typedef enum {
+    ID3_UNI_LATIN = 0x007f,
+    ID3_UNI_LATIN_1 = 0x00ff,
+
+    ID3_UNI_SUPPORTED = 0x00ff,
+    ID3_UNI_UNSUPPORTED = 0xffff,
+} id3_unicode_blocks;
+
+#define DEBUG_ID3
+#ifdef DEBUG_ID3
+#define id3_error(id3, error)		\
+  (void) ( id3->id3_error_msg = error,	\
+           printf( "Error %s, line %d: %s\n", __FILE__, __LINE__, error ) )
+
+
+#else
+#define id3_error(id3, error)		\
+  (void) ( id3->id3_error_msg = error )
+
+#endif
+
+/*
+ * Version 2.2.0 
+ */
+
+/*
+ * Layout for the frame header.
+ */
+#if 0
+struct id3_framehdr {
+    char fh_id[3];
+    guint8 fh_size[3];
+};
+#endif
+
+#define ID3_FRAMEHDR_SIZE_22 6
+
+#endif                          /* ID3_HEADER_H */

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_tag.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_tag.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/id3_tag.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,134 @@
+/*********************************************************************
+ * 
+ *    Copyright (C) 1999-2000,  Espen Skoglund
+ *    Department of Computer Science, University of Tromsø
+ * 
+ * Filename:      id3_tag.c
+ * Description:   Code for handling ID3 tags.
+ * Author:        Espen Skoglund <espensk at stud.cs.uit.no>
+ * Created at:    Tue Feb  9 21:13:19 1999
+ *                
+ * $Id: id3_tag.c,v 1.6 2004/07/20 21:47:22 descender Exp $
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *                
+ ********************************************************************/
+#include <glib.h>
+
+#include "xmms-id3.h"
+#include "id3_header.h"
+
+
+/*
+ * Function id3_init_tag (id3)
+ *
+ *    Initialize an empty ID3 tag.
+ *
+ */
+void
+id3_init_tag(struct id3_tag *id3)
+{
+    /*
+     * Initialize header.
+     */
+    id3->id3_version = 3;
+    id3->id3_revision = 0;
+    id3->id3_flags = ID3_THFLAG_USYNC | ID3_THFLAG_EXP;
+    id3->id3_tagsize = 0;
+
+    id3->id3_altered = 1;
+    id3->id3_newtag = 1;
+    id3->id3_pos = 0;
+
+    /*
+     * Initialize frames.
+     */
+    id3->id3_frame = NULL;
+}
+
+
+/*
+ * Function id3_read_tag (id3)
+ *
+ *    Read the ID3 tag from the input stream.  The start of the tag
+ *    must be positioned in the next tag in the stream.  Return 0 upon
+ *    success, or -1 if an error occured.
+ *
+ */
+int
+id3_read_tag(struct id3_tag *id3)
+{
+    char *buf;
+
+    /*
+     * We know that the tag will be at least this big.
+     *
+     * tag header + "ID3"
+     */
+    id3->id3_tagsize = ID3_TAGHDR_SIZE + 3;
+
+    if (!(id3->id3_oflags & ID3_OPENF_NOCHK)) {
+        /*
+         * Check if we have a valid ID3 tag.
+         */
+        char *id = id3->id3_read(id3, NULL, 3);
+        if (id == NULL)
+            return -1;
+
+        if (id[0] != 'I' || id[1] != 'D' || id[2] != '3') {
+            /*
+             * ID3 tag was not detected.
+             */
+            id3->id3_seek(id3, -3);
+            return -1;
+        }
+    }
+
+    /*
+     * Read ID3 tag-header.
+     */
+    buf = id3->id3_read(id3, NULL, ID3_TAGHDR_SIZE);
+    if (buf == NULL)
+        return -1;
+
+    id3->id3_version = buf[0];
+    id3->id3_revision = buf[1];
+    id3->id3_flags = buf[2];
+    id3->id3_tagsize = ID3_GET_SIZE28(buf[3], buf[4], buf[5], buf[6]);
+    id3->id3_newtag = 0;
+    id3->id3_pos = 0;
+
+    if (id3->id3_version < 2 || id3->id3_version > 4)
+        return -1;
+
+    /*
+     * Parse extended header.
+     */
+    if (id3->id3_flags & ID3_THFLAG_EXT) {
+        buf = id3->id3_read(id3, NULL, ID3_EXTHDR_SIZE);
+        if (buf == NULL)
+            return -1;
+    }
+
+    /*
+     * Parse frames.
+     */
+    while (id3->id3_pos < id3->id3_tagsize) {
+        if (id3_read_frame(id3) == -1)
+            return -1;
+    }
+
+    return 0;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/l2tables.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/l2tables.h	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/l2tables.h	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,997 @@
+/*
+ * Layer 2 Alloc tables .. 
+ * most other tables are calculated on program start (which is (of course)
+ * not ISO-conform) .. 
+ * Layer-3 huffman table is in huffman.h
+ */
+
+struct al_table alloc_0[] = {
+    {4, 0},
+    {5, 3},
+    {3, -3},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {14, -8191},
+    {15, -16383},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {3, -3},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {14, -8191},
+    {15, -16383},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {3, -3},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {14, -8191},
+    {15, -16383},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {16, -32767},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {16, -32767},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {16, -32767},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {16, -32767}
+};
+
+struct al_table alloc_1[] = {
+    {4, 0},
+    {5, 3},
+    {3, -3},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {14, -8191},
+    {15, -16383},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {3, -3},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {14, -8191},
+    {15, -16383},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {3, -3},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {14, -8191},
+    {15, -16383},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {16, -32767},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {16, -32767},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {16, -32767},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {16, -32767},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {16, -32767},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {16, -32767},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {16, -32767},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {16, -32767}
+};
+
+struct al_table alloc_2[] = {
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {14, -8191},
+    {15, -16383},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {14, -8191},
+    {15, -16383},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63}
+};
+
+struct al_table alloc_3[] = {
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {14, -8191},
+    {15, -16383},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {14, -8191},
+    {15, -16383},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63}
+};
+
+struct al_table alloc_4[] = {
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {14, -8191},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {14, -8191},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {14, -8191},
+    {4, 0},
+    {5, 3},
+    {7, 5},
+    {3, -3},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {8, -127},
+    {9, -255},
+    {10, -511},
+    {11, -1023},
+    {12, -2047},
+    {13, -4095},
+    {14, -8191},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {3, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {4, -7},
+    {5, -15},
+    {6, -31},
+    {7, -63},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9},
+    {2, 0},
+    {5, 3},
+    {7, 5},
+    {10, 9}
+};

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/layer1.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/layer1.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/layer1.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,185 @@
+
+/*
+ * Mpeg Layer-1 audio decoder
+ * --------------------------
+ * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
+ * near unoptimzed ...
+ *
+ * may have a few bugs after last optimization ...
+ *
+ */
+
+
+#include "beep/output.h"
+#include "mpg123.h"
+#include "getbits.h"
+
+
+/* Used by the getbits macros */
+static unsigned long rval;
+
+void
+I_step_one(unsigned int balloc[],
+           unsigned int scale_index[2][SBLIMIT], struct frame *fr)
+{
+    unsigned int *ba = balloc;
+    unsigned int *sca = (unsigned int *) scale_index;
+
+    if (fr->stereo) {
+        int i;
+        int jsbound = fr->jsbound;
+
+        for (i = 0; i < jsbound; i++) {
+            *ba++ = mpg123_getbits(4);
+            *ba++ = mpg123_getbits(4);
+        }
+        for (i = jsbound; i < SBLIMIT; i++)
+            *ba++ = mpg123_getbits(4);
+
+        ba = balloc;
+
+        for (i = 0; i < jsbound; i++) {
+            if ((*ba++))
+                *sca++ = mpg123_getbits(6);
+            if ((*ba++))
+                *sca++ = mpg123_getbits(6);
+        }
+        for (i = jsbound; i < SBLIMIT; i++)
+            if ((*ba++)) {
+                *sca++ = mpg123_getbits(6);
+                *sca++ = mpg123_getbits(6);
+            }
+    }
+    else {
+        int i;
+
+        for (i = 0; i < SBLIMIT; i++)
+            *ba++ = mpg123_getbits(4);
+        ba = balloc;
+        for (i = 0; i < SBLIMIT; i++)
+            if ((*ba++))
+                *sca++ = mpg123_getbits(6);
+    }
+}
+
+void
+I_step_two(real fraction[2][SBLIMIT],
+           unsigned int balloc[2 * SBLIMIT],
+           unsigned int scale_index[2][SBLIMIT], struct frame *fr)
+{
+    int i, n;
+    int smpb[2 * SBLIMIT];      /* values: 0-65535 */
+    int *sample;
+    register unsigned int *ba;
+    register unsigned int *sca = (unsigned int *) scale_index;
+
+    if (fr->stereo) {
+        int jsbound = fr->jsbound;
+        register real *f0 = fraction[0];
+        register real *f1 = fraction[1];
+
+        ba = balloc;
+        for (sample = smpb, i = 0; i < jsbound; i++) {
+            if ((n = *ba++))
+                *sample++ = mpg123_getbits(n + 1);
+            if ((n = *ba++))
+                *sample++ = mpg123_getbits(n + 1);
+        }
+        for (i = jsbound; i < SBLIMIT; i++)
+            if ((n = *ba++))
+                *sample++ = mpg123_getbits(n + 1);
+
+        ba = balloc;
+        for (sample = smpb, i = 0; i < jsbound; i++) {
+            if ((n = *ba++))
+                *f0++ =
+                    (real) (((-1) << n) + (*sample++) +
+                            1) * mpg123_muls[n + 1][*sca++];
+            else
+                *f0++ = 0.0;
+            if ((n = *ba++))
+                *f1++ =
+                    (real) (((-1) << n) + (*sample++) +
+                            1) * mpg123_muls[n + 1][*sca++];
+            else
+                *f1++ = 0.0;
+        }
+        for (i = jsbound; i < SBLIMIT; i++) {
+            if ((n = *ba++)) {
+                real samp = (((-1) << n) + (*sample++) + 1);
+
+                *f0++ = samp * mpg123_muls[n + 1][*sca++];
+                *f1++ = samp * mpg123_muls[n + 1][*sca++];
+            }
+            else
+                *f0++ = *f1++ = 0.0;
+        }
+        for (i = fr->down_sample_sblimit; i < 32; i++)
+            fraction[0][i] = fraction[1][i] = 0.0;
+    }
+    else {
+        register real *f0 = fraction[0];
+
+        ba = balloc;
+        for (sample = smpb, i = 0; i < SBLIMIT; i++)
+            if ((n = *ba++))
+                *sample++ = mpg123_getbits(n + 1);
+        ba = balloc;
+        for (sample = smpb, i = 0; i < SBLIMIT; i++) {
+            if ((n = *ba++))
+                *f0++ =
+                    (real) (((-1) << n) + (*sample++) +
+                            1) * mpg123_muls[n + 1][*sca++];
+            else
+                *f0++ = 0.0;
+        }
+        for (i = fr->down_sample_sblimit; i < 32; i++)
+            fraction[0][i] = 0.0;
+    }
+}
+
+int
+mpg123_do_layer1(struct frame *fr)
+{
+    int i, stereo = fr->stereo;
+    unsigned int balloc[2 * SBLIMIT];
+    unsigned int scale_index[2][SBLIMIT];
+    real fraction[2][SBLIMIT];
+    int single = fr->single;
+
+    fr->jsbound =
+        (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext << 2) + 4 : 32;
+
+    if (stereo == 1 || single == 3)
+        single = 0;
+
+    I_step_one(balloc, scale_index, fr);
+
+    for (i = 0; i < SCALE_BLOCK; i++) {
+        I_step_two(fraction, balloc, scale_index, fr);
+
+        if (single >= 0) {
+            (fr->synth_mono) ((real *) fraction[single], mpg123_pcm_sample,
+                              &mpg123_pcm_point);
+        }
+        else {
+            int p1 = mpg123_pcm_point;
+
+            (fr->synth) ((real *) fraction[0], 0, mpg123_pcm_sample, &p1);
+            (fr->synth) ((real *) fraction[1], 1, mpg123_pcm_sample,
+                         &mpg123_pcm_point);
+        }
+        if (mpg123_info->output_audio && mpg123_info->jump_to_time == -1) {
+            produce_audio(mpg123_ip.output->written_time(),
+                          mpg123_cfg.resolution ==
+                          16 ? FMT_S16_NE : FMT_U8,
+                          mpg123_cfg.channels ==
+                          2 ? fr->stereo : 1, mpg123_pcm_point,
+                          mpg123_pcm_sample, &mpg123_info->going);
+        }
+
+        mpg123_pcm_point = 0;
+    }
+
+    return 1;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/layer2.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/layer2.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/layer2.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,341 @@
+
+/*
+ * Mpeg Layer-2 audio decoder
+ * --------------------------
+ * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
+ *
+ */
+
+#include <glib.h>
+#include <math.h>
+
+#include "beep/output.h"
+#include "mpg123.h"
+#include "l2tables.h"
+#include "getbits.h"
+
+
+static int grp_3tab[32 * 3] = { 0, };   /* used: 27 */
+static int grp_5tab[128 * 3] = { 0, };  /* used: 125 */
+static int grp_9tab[1024 * 3] = { 0, }; /* used: 729 */
+
+real mpg123_muls[27][64];       /* also used by layer 1 */
+
+/* Used by the getbits macros */
+static unsigned long rval;
+
+void
+mpg123_init_layer2(gboolean mmx)
+{
+    static double mulmul[27] = {
+        0.0, -2.0 / 3.0, 2.0 / 3.0, 2.0 / 7.0, 2.0 / 15.0,
+        2.0 / 31.0, 2.0 / 63.0, 2.0 / 127.0, 2.0 / 255.0,
+        2.0 / 511.0, 2.0 / 1023.0, 2.0 / 2047.0, 2.0 / 4095.0,
+        2.0 / 8191.0, 2.0 / 16383.0, 2.0 / 32767.0, 2.0 / 65535.0,
+        -4.0 / 5.0, -2.0 / 5.0, 2.0 / 5.0, 4.0 / 5.0, -8.0 / 9.0,
+        -4.0 / 9.0, -2.0 / 9.0, 2.0 / 9.0, 4.0 / 9.0, 8.0 / 9.0
+    };
+    static int base[3][9] = {
+        {1, 0, 2,},
+        {17, 18, 0, 19, 20,},
+        {21, 1, 22, 23, 0, 24, 25, 2, 26}
+    };
+    int i, j, k, l, len;
+    real *table;
+    static int tablen[3] = { 3, 5, 9 };
+    static int *itable, *tables[3] = { grp_3tab, grp_5tab, grp_9tab };
+
+    for (i = 0; i < 3; i++) {
+        itable = tables[i];
+        len = tablen[i];
+        for (j = 0; j < len; j++)
+            for (k = 0; k < len; k++)
+                for (l = 0; l < len; l++) {
+                    *itable++ = base[i][l];
+                    *itable++ = base[i][k];
+                    *itable++ = base[i][j];
+                }
+    }
+
+    for (k = 0; k < 27; k++) {
+        double m = mulmul[k];
+        table = mpg123_muls[k];
+#ifdef USE_SIMD
+        if (mmx)
+            for (j = 3, i = 0; i < 63; i++, j--)
+                *table++ = 16384 * m * pow(2.0, (double) j / 3.0);
+        else
+#endif
+            for (j = 3, i = 0; i < 63; i++, j--)
+                *table++ = m * pow(2.0, (double) j / 3.0);
+        *table++ = 0.0;
+    }
+}
+
+void
+II_step_one(unsigned int *bit_alloc, int *scale, struct frame *fr)
+{
+    int stereo = fr->stereo - 1;
+    int sblimit = fr->II_sblimit;
+    int jsbound = fr->jsbound;
+    int sblimit2 = fr->II_sblimit << stereo;
+    struct al_table *alloc1 = fr->alloc;
+    int i;
+    static unsigned int scfsi_buf[64];
+    unsigned int *scfsi, *bita;
+    int sc, step;
+
+    bita = bit_alloc;
+    if (stereo) {
+        for (i = jsbound; i > 0; i--, alloc1 += (1 << step)) {
+            *bita++ = (char) mpg123_getbits(step = alloc1->bits);
+            *bita++ = (char) mpg123_getbits(step);
+        }
+        for (i = sblimit - jsbound; i > 0; i--, alloc1 += (1 << step)) {
+            bita[0] = (char) mpg123_getbits(step = alloc1->bits);
+            bita[1] = bita[0];
+            bita += 2;
+        }
+        bita = bit_alloc;
+        scfsi = scfsi_buf;
+        for (i = sblimit2; i; i--)
+            if (*bita++)
+                *scfsi++ = (char) mpg123_getbits_fast(2);
+    }
+    else
+        /* mono */
+    {
+        for (i = sblimit; i; i--, alloc1 += (1 << step))
+            *bita++ = (char) mpg123_getbits(step = alloc1->bits);
+        bita = bit_alloc;
+        scfsi = scfsi_buf;
+        for (i = sblimit; i; i--)
+            if (*bita++)
+                *scfsi++ = (char) mpg123_getbits_fast(2);
+    }
+
+    bita = bit_alloc;
+    scfsi = scfsi_buf;
+    for (i = sblimit2; i; i--)
+        if (*bita++)
+            switch (*scfsi++) {
+            case 0:
+                *scale++ = mpg123_getbits_fast(6);
+                *scale++ = mpg123_getbits_fast(6);
+                *scale++ = mpg123_getbits_fast(6);
+                break;
+            case 1:
+                *scale++ = sc = mpg123_getbits_fast(6);
+                *scale++ = sc;
+                *scale++ = mpg123_getbits_fast(6);
+                break;
+            case 2:
+                *scale++ = sc = mpg123_getbits_fast(6);
+                *scale++ = sc;
+                *scale++ = sc;
+                break;
+            default:           /* case 3 */
+                *scale++ = mpg123_getbits_fast(6);
+                *scale++ = sc = mpg123_getbits_fast(6);
+                *scale++ = sc;
+                break;
+            }
+
+}
+
+void
+II_step_two(unsigned int *bit_alloc, real fraction[2][4][SBLIMIT],
+            int *scale, struct frame *fr, int x1)
+{
+    int i, j, k, ba;
+    int stereo = fr->stereo;
+    int sblimit = fr->II_sblimit;
+    int jsbound = fr->jsbound;
+    struct al_table *alloc2, *alloc1 = fr->alloc;
+    unsigned int *bita = bit_alloc;
+    int d1, step;
+
+    for (i = 0; i < jsbound; i++, alloc1 += (1 << step)) {
+        step = alloc1->bits;
+        for (j = 0; j < stereo; j++) {
+            if ((ba = *bita++)) {
+                k = (alloc2 = alloc1 + ba)->bits;
+                if ((d1 = alloc2->d) < 0) {
+                    real cm = mpg123_muls[k][scale[x1]];
+
+                    fraction[j][0][i] =
+                        ((real) ((int) mpg123_getbits(k) + d1)) * cm;
+                    fraction[j][1][i] =
+                        ((real) ((int) mpg123_getbits(k) + d1)) * cm;
+                    fraction[j][2][i] =
+                        ((real) ((int) mpg123_getbits(k) + d1)) * cm;
+                }
+                else {
+                    static int *table[] =
+                        { 0, 0, 0, grp_3tab, 0, grp_5tab, 0, 0, 0,
+                        grp_9tab
+                    };
+                    unsigned int idx, *tab, m = scale[x1];
+
+                    idx = (unsigned int) mpg123_getbits(k);
+                    tab = (unsigned int *) (table[d1] + idx + idx + idx);
+                    fraction[j][0][i] = mpg123_muls[*tab++][m];
+                    fraction[j][1][i] = mpg123_muls[*tab++][m];
+                    fraction[j][2][i] = mpg123_muls[*tab][m];
+                }
+                scale += 3;
+            }
+            else
+                fraction[j][0][i] = fraction[j][1][i] = fraction[j][2][i] =
+                    0.0;
+        }
+    }
+
+    for (i = jsbound; i < sblimit; i++, alloc1 += (1 << step)) {
+        step = alloc1->bits;
+        bita++;                 /* channel 1 and channel 2 bitalloc are the same */
+        if ((ba = *bita++)) {
+            k = (alloc2 = alloc1 + ba)->bits;
+            if ((d1 = alloc2->d) < 0) {
+                real cm;
+
+                cm = mpg123_muls[k][scale[x1 + 3]];
+                fraction[1][0][i] = (fraction[0][0][i] =
+                                     (real) ((int) mpg123_getbits(k) +
+                                             d1)) * cm;
+                fraction[1][1][i] = (fraction[0][1][i] =
+                                     (real) ((int) mpg123_getbits(k) +
+                                             d1)) * cm;
+                fraction[1][2][i] = (fraction[0][2][i] =
+                                     (real) ((int) mpg123_getbits(k) +
+                                             d1)) * cm;
+                cm = mpg123_muls[k][scale[x1]];
+                fraction[0][0][i] *= cm;
+                fraction[0][1][i] *= cm;
+                fraction[0][2][i] *= cm;
+            }
+            else {
+                static int *table[] =
+                    { 0, 0, 0, grp_3tab, 0, grp_5tab, 0, 0, 0, grp_9tab };
+                unsigned int idx, *tab, m1, m2;
+
+                m1 = scale[x1];
+                m2 = scale[x1 + 3];
+                idx = (unsigned int) mpg123_getbits(k);
+                tab = (unsigned int *) (table[d1] + idx + idx + idx);
+                fraction[0][0][i] = mpg123_muls[*tab][m1];
+                fraction[1][0][i] = mpg123_muls[*tab++][m2];
+                fraction[0][1][i] = mpg123_muls[*tab][m1];
+                fraction[1][1][i] = mpg123_muls[*tab++][m2];
+                fraction[0][2][i] = mpg123_muls[*tab][m1];
+                fraction[1][2][i] = mpg123_muls[*tab][m2];
+            }
+            scale += 6;
+        }
+        else {
+            fraction[0][0][i] = fraction[0][1][i] = fraction[0][2][i] =
+                fraction[1][0][i] = fraction[1][1][i] = fraction[1][2][i] =
+                0.0;
+        }
+/*
+   should we use individual scalefac for channel 2 or
+   is the current way the right one , where we just copy channel 1 to
+   channel 2 ??
+   The current 'strange' thing is, that we throw away the scalefac
+   values for the second channel ...!!
+   -> changed .. now we use the scalefac values of channel one !!
+ */
+    }
+
+    if (sblimit > (fr->down_sample_sblimit))
+        sblimit = fr->down_sample_sblimit;
+
+    for (i = sblimit; i < SBLIMIT; i++)
+        for (j = 0; j < stereo; j++)
+            fraction[j][0][i] = fraction[j][1][i] = fraction[j][2][i] = 0.0;
+
+}
+
+static void
+II_select_table(struct frame *fr)
+{
+    static int translate[3][2][16] = {
+        {{0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 0},
+         {0, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}},
+        {{0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+         {0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+        {{0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 1, 1, 1, 1, 1, 0},
+         {0, 3, 3, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}}
+    };
+
+    int table, sblim;
+    static struct al_table *tables[5] =
+        { alloc_0, alloc_1, alloc_2, alloc_3, alloc_4 };
+    static int sblims[5] = { 27, 30, 8, 12, 30 };
+
+    if (fr->lsf)
+        table = 4;
+    else
+        table =
+            translate[fr->sampling_frequency][2 -
+                                              fr->stereo][fr->bitrate_index];
+    sblim = sblims[table];
+
+    fr->alloc = tables[table];
+    fr->II_sblimit = sblim;
+}
+
+
+int
+mpg123_do_layer2(struct frame *fr)
+{
+    int i, j;
+    int stereo = fr->stereo;
+    real fraction[2][4][SBLIMIT];   /* pick_table clears unused subbands */
+    unsigned int bit_alloc[64];
+    int scale[192];
+    int single = fr->single;
+
+    II_select_table(fr);
+    fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ?
+        (fr->mode_ext << 2) + 4 : fr->II_sblimit;
+    if (fr->jsbound > fr->II_sblimit)
+        fr->jsbound = fr->II_sblimit;
+
+    if (stereo == 1 || single == 3)
+        single = 0;
+
+    II_step_one(bit_alloc, scale, fr);
+
+    for (i = 0; i < SCALE_BLOCK; i++) {
+        II_step_two(bit_alloc, fraction, scale, fr, i >> 2);
+        for (j = 0; j < 3; j++) {
+            if (single >= 0) {
+                (fr->synth_mono) (fraction[single][j], mpg123_pcm_sample,
+                                  &mpg123_pcm_point);
+            }
+            else {
+                int p1 = mpg123_pcm_point;
+
+                (fr->synth) (fraction[0][j], 0, mpg123_pcm_sample, &p1);
+                (fr->synth) (fraction[1][j], 1, mpg123_pcm_sample,
+                             &mpg123_pcm_point);
+            }
+
+            /*    if(mpg123_pcm_point >= audiobufsize)
+               audio_flush(outmode,ai); */
+        }
+    }
+    if (mpg123_info->output_audio && mpg123_info->jump_to_time == -1) {
+        produce_audio(mpg123_ip.output->written_time(),
+                      mpg123_cfg.resolution ==
+                      16 ? FMT_S16_NE : FMT_U8,
+                      mpg123_cfg.channels ==
+                      2 ? fr->stereo : 1, mpg123_pcm_point,
+                      mpg123_pcm_sample, &mpg123_info->going);
+    }
+
+    mpg123_pcm_point = 0;
+
+    return 1;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/layer3.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/layer3.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/layer3.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,1880 @@
+
+/*
+ * Mpeg Layer-3 audio decoder
+ * --------------------------
+ * copyright (c) 1995-1999 by Michael Hipp.
+ * All rights reserved. See also 'README'
+ *
+ * Optimize-TODO: put short bands into the band-field without the stride of 3 reals
+ * Length-optimze: unify long and short band code where it is possible
+ */
+
+#include <stdlib.h>
+#include <math.h>
+
+#include "beep/output.h"
+
+#include "mpg123.h"
+#include "huffman.h"
+#include "getbits.h"
+
+
+static real ispow[8207];
+static real aa_ca[8], aa_cs[8];
+static real COS1[12][6];
+static real win[4][36];
+static real win1[4][36];
+static real gainpow2[256 + 118 + 4];
+real COS9[9];
+static real COS6_1, COS6_2;
+real tfcos36[9];
+static real tfcos12[3];
+#define NEW_DCT9
+#ifdef NEW_DCT9
+static real cos9[3], cos18[3];
+#endif
+
+#ifdef USE_SIMD
+# define DCT36 (fr->dct36)
+#else
+# define DCT36 mpg123_dct36
+#endif
+
+struct bandInfoStruct {
+    int longIdx[23];
+    int longDiff[22];
+    int shortIdx[14];
+    int shortDiff[13];
+};
+
+int longLimit[9][23];
+int shortLimit[9][14];
+
+/* Used by the getbits macros */
+static unsigned long rval;
+static unsigned char rval_uc;
+
+struct bandInfoStruct bandInfo[9] = {
+/* MPEG 1.0 */
+    {{0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162,
+      196, 238, 288, 342, 418, 576},
+     {4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10, 12, 16, 20, 24, 28, 34, 42, 50, 54,
+      76, 158},
+     {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 30 * 3, 40 * 3, 52 * 3,
+      66 * 3, 84 * 3, 106 * 3, 136 * 3, 192 * 3},
+     {4, 4, 4, 4, 6, 8, 10, 12, 14, 18, 22, 30, 56}},
+
+    {{0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156,
+      190, 230, 276, 330, 384, 576},
+     {4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10, 12, 16, 18, 22, 28, 34, 40, 46, 54,
+      54, 192},
+     {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 28 * 3, 38 * 3, 50 * 3,
+      64 * 3, 80 * 3, 100 * 3, 126 * 3, 192 * 3},
+     {4, 4, 4, 4, 6, 6, 10, 12, 14, 16, 20, 26, 66}},
+
+    {{0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194,
+      240, 296, 364, 448, 550, 576},
+     {4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12, 16, 20, 24, 30, 38, 46, 56, 68,
+      84, 102, 26},
+     {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 30 * 3, 42 * 3, 58 * 3,
+      78 * 3, 104 * 3, 138 * 3, 180 * 3, 192 * 3},
+     {4, 4, 4, 4, 6, 8, 12, 16, 20, 26, 34, 42, 12}},
+
+/* MPEG 2.0 */
+    {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200,
+      238, 284, 336, 396, 464, 522, 576},
+     {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60,
+      68, 58, 54},
+     {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 24 * 3, 32 * 3, 42 * 3, 56 * 3,
+      74 * 3, 100 * 3, 132 * 3, 174 * 3, 192 * 3},
+     {4, 4, 4, 6, 6, 8, 10, 14, 18, 26, 32, 42, 18}},
+/*
+ { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
+   {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,52,64,70,76,36 } ,
+*/
+/* changed 19th value fropm 330 to 332 */
+    {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194,
+      232, 278, 332, 394, 464, 540, 576},
+     {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 18, 22, 26, 32, 38, 46, 54, 62,
+      70, 76, 36},
+     {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 26 * 3, 36 * 3, 48 * 3, 62 * 3,
+      80 * 3, 104 * 3, 136 * 3, 180 * 3, 192 * 3},
+     {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 32, 44, 12}},
+
+    {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200,
+      238, 284, 336, 396, 464, 522, 576},
+     {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60,
+      68, 58, 54},
+     {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 26 * 3, 36 * 3, 48 * 3, 62 * 3,
+      80 * 3, 104 * 3, 134 * 3, 174 * 3, 192 * 3},
+     {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18}},
+/* MPEG 2.5 */
+    {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200,
+      238, 284, 336, 396, 464, 522, 576},
+     {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60,
+      68, 58, 54},
+     {0, 12, 24, 36, 54, 78, 108, 144, 186, 240, 312, 402, 522, 576},
+     {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18}},
+    {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200,
+      238, 284, 336, 396, 464, 522, 576},
+     {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60,
+      68, 58, 54},
+     {0, 12, 24, 36, 54, 78, 108, 144, 186, 240, 312, 402, 522, 576},
+     {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18}},
+    {{0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336,
+      400, 476, 566, 568, 570, 572, 574, 576},
+     {12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 76, 90,
+      2, 2, 2, 2, 2},
+     {0, 24, 48, 72, 108, 156, 216, 288, 372, 480, 486, 492, 498, 576},
+     {8, 8, 8, 12, 16, 20, 24, 28, 36, 2, 2, 2, 26}},
+};
+
+static int mapbuf0[9][152];
+static int mapbuf1[9][156];
+static int mapbuf2[9][44];
+static int *map[9][3];
+static int *mapend[9][3];
+
+static unsigned int n_slen2[512];   /* MPEG 2.0 slen for 'normal' mode */
+static unsigned int i_slen2[256];   /* MPEG 2.0 slen for intensity stereo */
+
+static real tan1_1[16], tan2_1[16], tan1_2[16], tan2_2[16];
+static real pow1_1[2][16], pow2_1[2][16], pow1_2[2][16], pow2_2[2][16];
+
+/*
+ * init tables for layer-3
+ */
+void
+mpg123_init_layer3(int down_sample_sblimit)
+{
+    int i, j, k, l;
+
+    for (i = -256; i < 118 + 4; i++)
+        gainpow2[i + 256] = pow((double) 2.0, -0.25 * (double) (i + 210));
+    for (i = 0; i < 8207; i++)
+        ispow[i] = pow((double) i, (double) 4.0 / 3.0);
+
+    for (i = 0; i < 8; i++) {
+        static double Ci[8] =
+            { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142,
+            -0.0037
+        };
+        double sq = sqrt(1.0 + Ci[i] * Ci[i]);
+
+        aa_cs[i] = 1.0 / sq;
+        aa_ca[i] = Ci[i] / sq;
+    }
+
+    for (i = 0; i < 18; i++) {
+        win[0][i] = win[1][i] =
+            0.5 * sin(M_PI / 72.0 * (double) (2 * (i + 0) + 1)) /
+            cos(M_PI * (double) (2 * (i + 0) + 19) / 72.0);
+        win[0][i + 18] = win[3][i + 18] =
+            0.5 * sin(M_PI / 72.0 * (double) (2 * (i + 18) + 1)) /
+            cos(M_PI * (double) (2 * (i + 18) + 19) / 72.0);
+    }
+    for (i = 0; i < 6; i++) {
+        win[1][i + 18] =
+            0.5 / cos(M_PI * (double) (2 * (i + 18) + 19) / 72.0);
+        win[3][i + 12] =
+            0.5 / cos(M_PI * (double) (2 * (i + 12) + 19) / 72.0);
+        win[1][i + 24] =
+            0.5 * sin(M_PI / 24.0 * (double) (2 * i + 13)) / cos(M_PI *
+                                                                 (double)
+                                                                 (2 *
+                                                                  (i +
+                                                                   24) +
+                                                                  19) / 72.0);
+        win[1][i + 30] = win[3][i] = 0.0;
+        win[3][i + 6] =
+            0.5 * sin(M_PI / 24.0 * (double) (2 * i + 1)) / cos(M_PI *
+                                                                (double) (2
+                                                                          *
+                                                                          (i
+                                                                           +
+                                                                           6)
+                                                                          +
+                                                                          19)
+                                                                / 72.0);
+    }
+
+    for (i = 0; i < 9; i++)
+        COS9[i] = cos(M_PI / 18.0 * (double) i);
+
+    for (i = 0; i < 9; i++)
+        tfcos36[i] = 0.5 / cos(M_PI * (double) (i * 2 + 1) / 36.0);
+    for (i = 0; i < 3; i++)
+        tfcos12[i] = 0.5 / cos(M_PI * (double) (i * 2 + 1) / 12.0);
+
+    COS6_1 = cos(M_PI / 6.0 * (double) 1);
+    COS6_2 = cos(M_PI / 6.0 * (double) 2);
+
+#ifdef NEW_DCT9
+    cos9[0] = cos(1.0 * M_PI / 9.0);
+    cos9[1] = cos(5.0 * M_PI / 9.0);
+    cos9[2] = cos(7.0 * M_PI / 9.0);
+    cos18[0] = cos(1.0 * M_PI / 18.0);
+    cos18[1] = cos(11.0 * M_PI / 18.0);
+    cos18[2] = cos(13.0 * M_PI / 18.0);
+#endif
+
+    for (i = 0; i < 12; i++) {
+        win[2][i] =
+            0.5 * sin(M_PI / 24.0 * (double) (2 * i + 1)) / cos(M_PI *
+                                                                (double) (2
+                                                                          *
+                                                                          i
+                                                                          + 7)
+                                                                / 24.0);
+        for (j = 0; j < 6; j++)
+            COS1[i][j] =
+                cos(M_PI / 24.0 * (double) ((2 * i + 7) * (2 * j + 1)));
+    }
+
+    for (j = 0; j < 4; j++) {
+        static int len[4] = { 36, 36, 12, 36 };
+
+        for (i = 0; i < len[j]; i += 2)
+            win1[j][i] = +win[j][i];
+        for (i = 1; i < len[j]; i += 2)
+            win1[j][i] = -win[j][i];
+    }
+
+    for (i = 0; i < 16; i++) {
+        double t = tan((double) i * M_PI / 12.0);
+
+        tan1_1[i] = t / (1.0 + t);
+        tan2_1[i] = 1.0 / (1.0 + t);
+        tan1_2[i] = M_SQRT2 * t / (1.0 + t);
+        tan2_2[i] = M_SQRT2 / (1.0 + t);
+
+        for (j = 0; j < 2; j++) {
+            double base = pow(2.0, -0.25 * (j + 1.0));
+            double p1 = 1.0, p2 = 1.0;
+
+            if (i > 0) {
+                if (i & 1)
+                    p1 = pow(base, (i + 1.0) * 0.5);
+                else
+                    p2 = pow(base, i * 0.5);
+            }
+            pow1_1[j][i] = p1;
+            pow2_1[j][i] = p2;
+            pow1_2[j][i] = M_SQRT2 * p1;
+            pow2_2[j][i] = M_SQRT2 * p2;
+        }
+    }
+
+    for (j = 0; j < 9; j++) {
+        struct bandInfoStruct *bi = &bandInfo[j];
+        int *mp;
+        int cb, lwin;
+        int *bdf;
+
+        mp = map[j][0] = mapbuf0[j];
+        bdf = bi->longDiff;
+        for (i = 0, cb = 0; cb < 8; cb++, i += *bdf++) {
+            *mp++ = (*bdf) >> 1;
+            *mp++ = i;
+            *mp++ = 3;
+            *mp++ = cb;
+        }
+        bdf = bi->shortDiff + 3;
+        for (cb = 3; cb < 13; cb++) {
+            int l = (*bdf++) >> 1;
+
+            for (lwin = 0; lwin < 3; lwin++) {
+                *mp++ = l;
+                *mp++ = i + lwin;
+                *mp++ = lwin;
+                *mp++ = cb;
+            }
+            i += 6 * l;
+        }
+        mapend[j][0] = mp;
+
+        mp = map[j][1] = mapbuf1[j];
+        bdf = bi->shortDiff + 0;
+        for (i = 0, cb = 0; cb < 13; cb++) {
+            int l = (*bdf++) >> 1;
+
+            for (lwin = 0; lwin < 3; lwin++) {
+                *mp++ = l;
+                *mp++ = i + lwin;
+                *mp++ = lwin;
+                *mp++ = cb;
+            }
+            i += 6 * l;
+        }
+        mapend[j][1] = mp;
+
+        mp = map[j][2] = mapbuf2[j];
+        bdf = bi->longDiff;
+        for (cb = 0; cb < 22; cb++) {
+            *mp++ = (*bdf++) >> 1;
+            *mp++ = cb;
+        }
+        mapend[j][2] = mp;
+
+    }
+
+    for (j = 0; j < 9; j++) {
+        for (i = 0; i < 23; i++) {
+            longLimit[j][i] = (bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1;
+            if (longLimit[j][i] > (down_sample_sblimit))
+                longLimit[j][i] = down_sample_sblimit;
+        }
+        for (i = 0; i < 14; i++) {
+            shortLimit[j][i] = (bandInfo[j].shortIdx[i] - 1) / 18 + 1;
+            if (shortLimit[j][i] > (down_sample_sblimit))
+                shortLimit[j][i] = down_sample_sblimit;
+        }
+    }
+
+    for (i = 0; i < 5; i++) {
+        for (j = 0; j < 6; j++) {
+            for (k = 0; k < 6; k++) {
+                int n = k + j * 6 + i * 36;
+
+                i_slen2[n] = i | (j << 3) | (k << 6) | (3 << 12);
+            }
+        }
+    }
+    for (i = 0; i < 4; i++) {
+        for (j = 0; j < 4; j++) {
+            for (k = 0; k < 4; k++) {
+                int n = k + j * 4 + i * 16;
+
+                i_slen2[n + 180] = i | (j << 3) | (k << 6) | (4 << 12);
+            }
+        }
+    }
+    for (i = 0; i < 4; i++) {
+        for (j = 0; j < 3; j++) {
+            int n = j + i * 3;
+
+            i_slen2[n + 244] = i | (j << 3) | (5 << 12);
+            n_slen2[n + 500] = i | (j << 3) | (2 << 12) | (1 << 15);
+        }
+    }
+
+    for (i = 0; i < 5; i++) {
+        for (j = 0; j < 5; j++) {
+            for (k = 0; k < 4; k++) {
+                for (l = 0; l < 4; l++) {
+                    int n = l + k * 4 + j * 16 + i * 80;
+
+                    n_slen2[n] =
+                        i | (j << 3) | (k << 6) | (l << 9) | (0 << 12);
+                }
+            }
+        }
+    }
+    for (i = 0; i < 5; i++) {
+        for (j = 0; j < 5; j++) {
+            for (k = 0; k < 4; k++) {
+                int n = k + j * 4 + i * 20;
+
+                n_slen2[n + 400] = i | (j << 3) | (k << 6) | (1 << 12);
+            }
+        }
+    }
+}
+
+/*
+ * read additional side information (for MPEG 1 and MPEG 2)
+ */
+static int
+III_get_side_info(struct III_sideinfo *si, int stereo,
+                  int ms_stereo, long sfreq, int single, int lsf)
+{
+    int ch, gr;
+    int powdiff = (single == 3) ? 4 : 0;
+
+    static const int tabs[2][5] = { {2, 9, 5, 3, 4}, {1, 8, 1, 2, 9} };
+    const int *tab = tabs[lsf];
+
+    si->main_data_begin = mpg123_getbits(tab[1]);
+    if (stereo == 1)
+        si->private_bits = mpg123_getbits_fast(tab[2]);
+    else
+        si->private_bits = mpg123_getbits_fast(tab[3]);
+
+    if (!lsf) {
+        for (ch = 0; ch < stereo; ch++) {
+            si->ch[ch].gr[0].scfsi = -1;
+            si->ch[ch].gr[1].scfsi = mpg123_getbits_fast(4);
+        }
+    }
+
+    for (gr = 0; gr < tab[0]; gr++) {
+        for (ch = 0; ch < stereo; ch++) {
+            register struct gr_info_s *gr_info = &(si->ch[ch].gr[gr]);
+
+            gr_info->part2_3_length = mpg123_getbits(12);
+            gr_info->big_values = mpg123_getbits(9);
+            if (gr_info->big_values > 288) {
+                /*  fprintf(stderr, "big_values too large!\n"); */
+                /*  gr_info->big_values = 288; */
+                return 0;
+            }
+            gr_info->pow2gain =
+                gainpow2 + 256 - mpg123_getbits_fast(8) + powdiff;
+            if (ms_stereo)
+                gr_info->pow2gain += 2;
+            gr_info->scalefac_compress = mpg123_getbits(tab[4]);
+
+            if (mpg123_get1bit()) { /* window switch flag  */
+                int i;
+
+                gr_info->block_type = mpg123_getbits_fast(2);
+                gr_info->mixed_block_flag = mpg123_get1bit();
+                gr_info->table_select[0] = mpg123_getbits_fast(5);
+                gr_info->table_select[1] = mpg123_getbits_fast(5);
+                /*
+                 * table_select[2] not needed, because
+                 * there is no region2, but to satisfy
+                 * some verifications tools we set it
+                 * either.
+                 */
+                gr_info->table_select[2] = 0;
+                for (i = 0; i < 3; i++)
+                    gr_info->full_gain[i] =
+                        gr_info->pow2gain + (mpg123_getbits_fast(3) << 3);
+
+                if (gr_info->block_type == 0) {
+                    /*  fprintf(stderr,     "Blocktype == 0 and window-switching == 1 not allowed.\n"); */
+                    /*  exit(1); */
+                    return 0;
+                }
+
+                /* region_count/start parameters are implicit in this case. */
+                if (!lsf || gr_info->block_type == 2)
+                    gr_info->region1start = 36 >> 1;
+                else {
+                    /* check this again for 2.5 and sfreq=8 */
+                    if (sfreq == 8)
+                        gr_info->region1start = 108 >> 1;
+                    else
+                        gr_info->region1start = 54 >> 1;
+                }
+                gr_info->region2start = 576 >> 1;
+            }
+            else {
+                int i, r0c, r1c;
+
+                for (i = 0; i < 3; i++)
+                    gr_info->table_select[i] = mpg123_getbits_fast(5);
+                r0c = mpg123_getbits_fast(4);
+                r1c = mpg123_getbits_fast(3);
+                gr_info->region1start = bandInfo[sfreq].longIdx[r0c + 1] >> 1;
+                if (r0c + r1c + 2 > 22)
+                    gr_info->region2start = 576 >> 1;
+                else
+                    gr_info->region2start =
+                        bandInfo[sfreq].longIdx[r0c + 1 + r1c + 1] >> 1;
+                gr_info->block_type = 0;
+                gr_info->mixed_block_flag = 0;
+            }
+            if (!lsf)
+                gr_info->preflag = mpg123_get1bit();
+            gr_info->scalefac_scale = mpg123_get1bit();
+            gr_info->count1table_select = mpg123_get1bit();
+        }
+    }
+    return 1;
+}
+
+
+/*
+ * read scalefactors
+ */
+static int
+III_get_scale_factors_1(int *scf, struct gr_info_s *gr_info)
+{
+    static const unsigned char slen[2][16] = {
+        {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
+        {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}
+    };
+    int numbits;
+    int num0 = slen[0][gr_info->scalefac_compress];
+    int num1 = slen[1][gr_info->scalefac_compress];
+
+    if (gr_info->block_type == 2) {
+        int i = 18;
+
+        numbits = (num0 + num1) * 18;
+
+        if (gr_info->mixed_block_flag) {
+            for (i = 8; i; i--)
+                *scf++ = mpg123_getbits_fast(num0);
+            i = 9;
+            numbits -= num0;    /* num0 * 17 + num1 * 18 */
+        }
+
+        for (; i; i--)
+            *scf++ = mpg123_getbits_fast(num0);
+        for (i = 18; i; i--)
+            *scf++ = mpg123_getbits_fast(num1);
+        *scf++ = 0;
+        *scf++ = 0;
+        *scf++ = 0;             /* short[13][0..2] = 0 */
+    }
+    else {
+        int i;
+        int scfsi = gr_info->scfsi;
+
+        if (scfsi < 0) {        /* scfsi < 0 => granule == 0 */
+            for (i = 11; i; i--)
+                *scf++ = mpg123_getbits_fast(num0);
+            for (i = 10; i; i--)
+                *scf++ = mpg123_getbits_fast(num1);
+            numbits = (num0 + num1) * 10 + num0;
+            *scf++ = 0;
+        }
+        else {
+            numbits = 0;
+            if (!(scfsi & 0x8)) {
+                for (i = 0; i < 6; i++)
+                    *scf++ = mpg123_getbits_fast(num0);
+                numbits += num0 * 6;
+            }
+            else {
+                scf += 6;
+            }
+
+            if (!(scfsi & 0x4)) {
+                for (i = 0; i < 5; i++)
+                    *scf++ = mpg123_getbits_fast(num0);
+                numbits += num0 * 5;
+            }
+            else {
+                scf += 5;
+            }
+
+            if (!(scfsi & 0x2)) {
+                for (i = 0; i < 5; i++)
+                    *scf++ = mpg123_getbits_fast(num1);
+                numbits += num1 * 5;
+            }
+            else {
+                scf += 5;
+            }
+
+            if (!(scfsi & 0x1)) {
+                for (i = 0; i < 5; i++)
+                    *scf++ = mpg123_getbits_fast(num1);
+                numbits += num1 * 5;
+            }
+            else {
+                scf += 5;
+            }
+            *scf++ = 0;         /* no l[21] in original sources */
+        }
+    }
+    return numbits;
+}
+
+static int
+III_get_scale_factors_2(int *scf, struct gr_info_s *gr_info, int i_stereo)
+{
+    unsigned char *pnt;
+    int i, j, n = 0, numbits = 0;
+    unsigned int slen;
+
+    static unsigned char stab[3][6][4] = {
+        {{6, 5, 5, 5}, {6, 5, 7, 3}, {11, 10, 0, 0},
+         {7, 7, 7, 0}, {6, 6, 6, 3}, {8, 8, 5, 0}},
+        {{9, 9, 9, 9}, {9, 9, 12, 6}, {18, 18, 0, 0},
+         {12, 12, 12, 0}, {12, 9, 9, 6}, {15, 12, 9, 0}},
+        {{6, 9, 9, 9}, {6, 9, 12, 6}, {15, 18, 0, 0},
+         {6, 15, 12, 0}, {6, 12, 9, 6}, {6, 18, 9, 0}}
+    };
+
+    if (i_stereo)               /* i_stereo AND second channel -> mpg123_do_layer3() checks this */
+        slen = i_slen2[gr_info->scalefac_compress >> 1];
+    else
+        slen = n_slen2[gr_info->scalefac_compress];
+
+    gr_info->preflag = (slen >> 15) & 0x1;
+
+    n = 0;
+    if (gr_info->block_type == 2) {
+        n++;
+        if (gr_info->mixed_block_flag)
+            n++;
+    }
+
+    pnt = stab[n][(slen >> 12) & 0x7];
+
+    for (i = 0; i < 4; i++) {
+        int num = slen & 0x7;
+
+        slen >>= 3;
+        if (num) {
+            for (j = 0; j < (int) (pnt[i]); j++)
+                *scf++ = mpg123_getbits_fast(num);
+            numbits += pnt[i] * num;
+        }
+        else {
+            for (j = 0; j < (int) (pnt[i]); j++)
+                *scf++ = 0;
+        }
+    }
+
+    n = (n << 1) + 1;
+    for (i = 0; i < n; i++)
+        *scf++ = 0;
+
+    return numbits;
+}
+
+static int pretab1[22] =
+    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 };
+static int pretab2[22] =
+    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+/*
+ * Dequantize samples (includes huffman decoding)
+ */
+/* 24 is enough because tab13 has max. a 19 bit huffvector */
+#define BITSHIFT ((sizeof (long) - 1) * 8)
+
+#define REFRESH_MASK()							\
+while(num < BITSHIFT) {							\
+	mask |= ((unsigned long)mpg123_getbyte()) << (BITSHIFT - num);	\
+	num += 8;							\
+	part2remain -= 8;						\
+}
+
+static int
+III_dequantize_sample(real xr[SBLIMIT][SSLIMIT], int *scf,
+                      struct gr_info_s *gr_info, int sfreq, int part2bits)
+{
+    int shift = 1 + gr_info->scalefac_scale;
+    real *xrpnt = (real *) xr;
+    int l[3], l3;
+    int part2remain = gr_info->part2_3_length - part2bits;
+    int *me;
+
+    int num = mpg123_getbitoffset();
+    long mask;
+    /* we must split this, because for num==0 the shift is undefined if you do it in one step */
+    mask = ((unsigned long) mpg123_getbits(num)) << BITSHIFT;
+    mask <<= 8 - num;
+    part2remain -= num;
+
+    {
+        int bv = gr_info->big_values;
+        int region1 = gr_info->region1start;
+        int region2 = gr_info->region2start;
+
+        l3 = ((576 >> 1) - bv) >> 1;
+/*
+ * we may lose the 'odd' bit here !!
+ * check this later again
+ */
+        if (bv <= region1) {
+            l[0] = bv;
+            l[1] = 0;
+            l[2] = 0;
+        }
+        else {
+            l[0] = region1;
+            if (bv <= region2) {
+                l[1] = bv - l[0];
+                l[2] = 0;
+            }
+            else {
+                l[1] = region2 - l[0];
+                l[2] = bv - region2;
+            }
+        }
+    }
+
+    if (gr_info->block_type == 2) {
+        /*
+         * decoding with short or mixed mode BandIndex table
+         */
+        int i, max[4];
+        int step = 0, lwin = 3, cb = 0;
+        register real v = 0.0;
+        register int *m, mc;
+
+        if (gr_info->mixed_block_flag) {
+            max[3] = -1;
+            max[0] = max[1] = max[2] = 2;
+            m = map[sfreq][0];
+            me = mapend[sfreq][0];
+        }
+        else {
+            max[0] = max[1] = max[2] = max[3] = -1;
+            /* max[3] not really needed in this case */
+            m = map[sfreq][1];
+            me = mapend[sfreq][1];
+        }
+
+        mc = 0;
+        for (i = 0; i < 2; i++) {
+            int lp = l[i];
+            struct newhuff *h = ht + gr_info->table_select[i];
+
+            for (; lp; lp--, mc--) {
+                register int x, y;
+                if ((!mc)) {
+                    mc = *m++;
+                    xrpnt = ((real *) xr) + (*m++);
+                    lwin = *m++;
+                    cb = *m++;
+                    if (lwin == 3) {
+                        v = gr_info->pow2gain[(*scf++) << shift];
+                        step = 1;
+                    }
+                    else {
+                        v = gr_info->full_gain[lwin][(*scf++) << shift];
+                        step = 3;
+                    }
+                }
+                {
+                    register short *val = h->table;
+
+                    REFRESH_MASK();
+                    while ((y = *val++) < 0) {
+                        if (mask < 0)
+                            val -= y;
+                        num--;
+                        mask <<= 1;
+                    }
+                    x = y >> 4;
+                    y &= 0xf;
+                }
+                if (x == 15 && h->linbits) {
+                    max[lwin] = cb;
+                    REFRESH_MASK();
+                    x += ((unsigned long) mask) >> (BITSHIFT + 8 -
+                                                    h->linbits);
+                    num -= h->linbits + 1;
+                    mask <<= h->linbits;
+                    if (mask < 0)
+                        *xrpnt = -ispow[x] * v;
+                    else
+                        *xrpnt = ispow[x] * v;
+                    mask <<= 1;
+                }
+                else if (x) {
+                    max[lwin] = cb;
+                    if (mask < 0)
+                        *xrpnt = -ispow[x] * v;
+                    else
+                        *xrpnt = ispow[x] * v;
+                    num--;
+                    mask <<= 1;
+                }
+                else
+                    *xrpnt = 0.0;
+                xrpnt += step;
+                if (y == 15 && h->linbits) {
+                    max[lwin] = cb;
+                    REFRESH_MASK();
+                    y += ((unsigned long) mask) >> (BITSHIFT + 8 -
+                                                    h->linbits);
+                    num -= h->linbits + 1;
+                    mask <<= h->linbits;
+                    if (mask < 0)
+                        *xrpnt = -ispow[y] * v;
+                    else
+                        *xrpnt = ispow[y] * v;
+                    mask <<= 1;
+                }
+                else if (y) {
+                    max[lwin] = cb;
+                    if (mask < 0)
+                        *xrpnt = -ispow[y] * v;
+                    else
+                        *xrpnt = ispow[y] * v;
+                    num--;
+                    mask <<= 1;
+                }
+                else
+                    *xrpnt = 0.0;
+                xrpnt += step;
+            }
+        }
+
+        for (; l3 && (part2remain + num > 0); l3--) {
+            struct newhuff *h = htc + gr_info->count1table_select;
+            register short *val = h->table, a;
+
+            REFRESH_MASK();
+            while ((a = *val++) < 0) {
+                if (mask < 0)
+                    val -= a;
+                num--;
+                mask <<= 1;
+            }
+            if (part2remain + num <= 0) {
+                num -= part2remain + num;
+                break;
+            }
+
+            for (i = 0; i < 4; i++) {
+                if (!(i & 1)) {
+                    if (!mc) {
+                        mc = *m++;
+                        xrpnt = ((real *) xr) + (*m++);
+                        lwin = *m++;
+                        cb = *m++;
+                        if (lwin == 3) {
+                            v = gr_info->pow2gain[(*scf++) << shift];
+                            step = 1;
+                        }
+                        else {
+                            v = gr_info->full_gain[lwin][(*scf++) << shift];
+                            step = 3;
+                        }
+                    }
+                    mc--;
+                }
+                if ((a & (0x8 >> i))) {
+                    max[lwin] = cb;
+                    if (part2remain + num <= 0) {
+                        break;
+                    }
+                    if (mask < 0)
+                        *xrpnt = -v;
+                    else
+                        *xrpnt = v;
+                    num--;
+                    mask <<= 1;
+                }
+                else
+                    *xrpnt = 0.0;
+                xrpnt += step;
+            }
+        }
+
+        if (lwin < 3) {         /* short band? */
+            while (1) {
+                /* HACK Prevent overflowing the xr buffer */
+                if (mc * 6 > &xr[SBLIMIT][SSLIMIT] - xrpnt)
+                    return 1;
+
+                for (; mc > 0; mc--) {
+                    *xrpnt = 0.0;
+                    xrpnt += 3; /* short band -> step=3 */
+                    *xrpnt = 0.0;
+                    xrpnt += 3;
+                }
+                if (m >= me)
+                    break;
+                mc = *m++;
+                xrpnt = ((real *) xr) + *m++;
+                if (*m++ == 0)
+                    break;      /* optimize: field will be set to zero at the end of the function */
+                m++;            /* cb */
+            }
+        }
+
+        gr_info->maxband[0] = max[0] + 1;
+        gr_info->maxband[1] = max[1] + 1;
+        gr_info->maxband[2] = max[2] + 1;
+        gr_info->maxbandl = max[3] + 1;
+
+        {
+            int rmax = max[0] > max[1] ? max[0] : max[1];
+
+            rmax = (rmax > max[2] ? rmax : max[2]) + 1;
+            gr_info->maxb =
+                rmax ? shortLimit[sfreq][rmax] : longLimit[sfreq][max[3] + 1];
+        }
+
+    }
+    else {
+        /*
+         * decoding with 'long' BandIndex table (block_type != 2)
+         */
+        int *pretab = gr_info->preflag ? pretab1 : pretab2;
+        int i, max = -1;
+        int cb = 0;
+        int *m = map[sfreq][2];
+        register real v = 0.0;
+        int mc = 0;
+
+        /*
+         * long hash table values
+         */
+        for (i = 0; i < 3; i++) {
+            int lp = l[i];
+            struct newhuff *h = ht + gr_info->table_select[i];
+
+            for (; lp; lp--, mc--) {
+                int x, y;
+
+                if (!mc) {
+                    mc = *m++;
+                    cb = *m++;
+/*  					if (cb == 21) */
+/*  						v = 0.0; */
+/*  					else */
+                    v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift];
+
+                }
+                {
+                    register short *val = h->table;
+                    REFRESH_MASK();
+                    while ((y = *val++) < 0) {
+                        if (mask < 0)
+                            val -= y;
+                        num--;
+                        mask <<= 1;
+                    }
+                    x = y >> 4;
+                    y &= 0xf;
+                }
+
+                if (x == 15 && h->linbits) {
+                    max = cb;
+                    REFRESH_MASK();
+                    x += ((unsigned long) mask) >> (BITSHIFT + 8 -
+                                                    h->linbits);
+                    num -= h->linbits + 1;
+                    mask <<= h->linbits;
+                    if (mask < 0)
+                        *xrpnt++ = -ispow[x] * v;
+                    else
+                        *xrpnt++ = ispow[x] * v;
+                    mask <<= 1;
+                }
+                else if (x) {
+                    max = cb;
+                    if (mask < 0)
+                        *xrpnt++ = -ispow[x] * v;
+                    else
+                        *xrpnt++ = ispow[x] * v;
+                    num--;
+                    mask <<= 1;
+                }
+                else
+                    *xrpnt++ = 0.0;
+
+                if (y == 15 && h->linbits) {
+                    max = cb;
+                    REFRESH_MASK();
+                    y += ((unsigned long) mask) >> (BITSHIFT + 8 -
+                                                    h->linbits);
+                    num -= h->linbits + 1;
+                    mask <<= h->linbits;
+                    if (mask < 0)
+                        *xrpnt++ = -ispow[y] * v;
+                    else
+                        *xrpnt++ = ispow[y] * v;
+                    mask <<= 1;
+                }
+                else if (y) {
+                    max = cb;
+                    if (mask < 0)
+                        *xrpnt++ = -ispow[y] * v;
+                    else
+                        *xrpnt++ = ispow[y] * v;
+                    num--;
+                    mask <<= 1;
+                }
+                else
+                    *xrpnt++ = 0.0;
+            }
+        }
+
+        /*
+         * short (count1table) values
+         */
+        for (; l3 && (part2remain + num > 0); l3--) {
+            struct newhuff *h = htc + gr_info->count1table_select;
+            register short *val = h->table, a;
+
+            REFRESH_MASK();
+            while ((a = *val++) < 0) {
+                if (mask < 0)
+                    val -= a;
+                num--;
+                mask <<= 1;
+            }
+            if (part2remain + num <= 0) {
+                num -= part2remain + num;
+                break;
+            }
+
+            for (i = 0; i < 4; i++) {
+                if (!(i & 1)) {
+                    if (!mc) {
+                        mc = *m++;
+                        cb = *m++;
+/*  						if (cb == 21) */
+/*  							v = 0.0; */
+/*  						else */
+                        v = gr_info->
+                            pow2gain[((*scf++) + (*pretab++)) << shift];
+                    }
+                    mc--;
+                }
+                if ((a & (0x8 >> i))) {
+                    max = cb;
+                    if (part2remain + num <= 0) {
+                        break;
+                    }
+                    if (mask < 0)
+                        *xrpnt++ = -v;
+                    else
+                        *xrpnt++ = v;
+                    num--;
+                    mask <<= 1;
+                }
+                else
+                    *xrpnt++ = 0.0;
+            }
+        }
+
+        gr_info->maxbandl = max + 1;
+        gr_info->maxb = longLimit[sfreq][gr_info->maxbandl];
+    }
+
+    part2remain += num;
+    mpg123_backbits(num);
+    num = 0;
+
+    while (xrpnt < &xr[SBLIMIT][0])
+        *xrpnt++ = 0.0;
+
+    while (part2remain > 16) {
+        mpg123_getbits(16);     /* Dismiss stuffing Bits */
+        part2remain -= 16;
+    }
+    if (part2remain > 0)
+        mpg123_getbits(part2remain);
+    else if (part2remain < 0) {
+/*  		fprintf(stderr, "mpg123: Can't rewind stream by %d bits!\n", */
+/*  			-part2remain); */
+        return 1;               /* -> error */
+    }
+    return 0;
+}
+
+/*
+ * III_stereo: calculate real channel values for Joint-I-Stereo-mode
+ */
+static void
+III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT], int *scalefac,
+             struct gr_info_s *gr_info, int sfreq, int ms_stereo, int lsf)
+{
+    real(*xr)[SBLIMIT * SSLIMIT] = (real(*)[SBLIMIT * SSLIMIT]) xr_buf;
+    struct bandInfoStruct *bi = &bandInfo[sfreq];
+
+    const real *tab1, *tab2;
+
+#if 1
+    int tab;
+    static const real *tabs[3][2][2] = {
+        {{tan1_1, tan2_1}, {tan1_2, tan2_2}},
+        {{pow1_1[0], pow2_1[0]}, {pow1_2[0], pow2_2[0]}},
+        {{pow1_1[1], pow2_1[1]}, {pow1_2[1], pow2_2[1]}}
+    };
+
+    tab = lsf + (gr_info->scalefac_compress & lsf);
+    tab1 = tabs[tab][ms_stereo][0];
+    tab2 = tabs[tab][ms_stereo][1];
+#else
+    if (lsf) {
+        int p = gr_info->scalefac_compress & 0x1;
+
+        if (ms_stereo) {
+            tab1 = pow1_2[p];
+            tab2 = pow2_2[p];
+        }
+        else {
+            tab1 = pow1_1[p];
+            tab2 = pow2_1[p];
+        }
+    }
+    else {
+        if (ms_stereo) {
+            tab1 = tan1_2;
+            tab2 = tan2_2;
+        }
+        else {
+            tab1 = tan1_1;
+            tab2 = tan2_1;
+        }
+    }
+#endif
+
+    if (gr_info->block_type == 2) {
+        int lwin, do_l = 0;
+
+        if (gr_info->mixed_block_flag)
+            do_l = 1;
+
+        for (lwin = 0; lwin < 3; lwin++) {  /* process each window */
+            /* get first band with zero values */
+            int is_p, sb, idx, sfb = gr_info->maxband[lwin];    /* sfb is minimal 3 for mixed mode */
+
+            if (sfb > 3)
+                do_l = 0;
+
+            for (; sfb < 12; sfb++) {
+                is_p = scalefac[sfb * 3 + lwin - gr_info->mixed_block_flag];    /* scale: 0-15 */
+                if (is_p != 7) {
+                    real t1, t2;
+
+                    sb = bi->shortDiff[sfb];
+                    idx = bi->shortIdx[sfb] + lwin;
+                    t1 = tab1[is_p];
+                    t2 = tab2[is_p];
+                    for (; sb > 0; sb--, idx += 3) {
+                        real v = xr[0][idx];
+
+                        xr[0][idx] = v * t1;
+                        xr[1][idx] = v * t2;
+                    }
+                }
+            }
+
+#if 1
+/* in the original: copy 10 to 11 , here: copy 11 to 12
+   maybe still wrong??? (copy 12 to 13?) */
+            is_p = scalefac[11 * 3 + lwin - gr_info->mixed_block_flag]; /* scale: 0-15 */
+            sb = bi->shortDiff[12];
+            idx = bi->shortIdx[12] + lwin;
+#else
+            is_p = scalefac[10 * 3 + lwin - gr_info->mixed_block_flag]; /* scale: 0-15 */
+            sb = bi->shortDiff[11];
+            idx = bi->shortIdx[11] + lwin;
+#endif
+            if (is_p != 7) {
+                real t1, t2;
+                t1 = tab1[is_p];
+                t2 = tab2[is_p];
+                for (; sb > 0; sb--, idx += 3) {
+                    real v = xr[0][idx];
+                    xr[0][idx] = v * t1;
+                    xr[1][idx] = v * t2;
+                }
+            }
+        }                       /* end for(lwin; .. ; . ) */
+
+/* also check l-part, if ALL bands in the three windows are 'empty'
+ * and mode = mixed_mode
+ */
+        if (do_l) {
+            int sfb = gr_info->maxbandl;
+            int idx = bi->longIdx[sfb];
+
+            for (; sfb < 8; sfb++) {
+                int sb = bi->longDiff[sfb];
+                int is_p = scalefac[sfb];   /* scale: 0-15 */
+
+                if (is_p != 7) {
+                    real t1, t2;
+
+                    t1 = tab1[is_p];
+                    t2 = tab2[is_p];
+                    for (; sb > 0; sb--, idx++) {
+                        real v = xr[0][idx];
+
+                        xr[0][idx] = v * t1;
+                        xr[1][idx] = v * t2;
+                    }
+                }
+                else
+                    idx += sb;
+            }
+        }
+    }
+    else {                      /* ((gr_info->block_type != 2)) */
+        int sfb = gr_info->maxbandl;
+        int is_p, idx = bi->longIdx[sfb];
+
+/* hmm ... maybe the maxbandl stuff for i-stereo is buggy? */
+        if (sfb <= 21) {
+            for (; sfb < 21; sfb++) {
+                int sb = bi->longDiff[sfb];
+
+                is_p = scalefac[sfb];   /* scale: 0-15 */
+                if (is_p != 7) {
+                    real t1, t2;
+                    t1 = tab1[is_p];
+                    t2 = tab2[is_p];
+                    for (; sb > 0; sb--, idx++) {
+                        real v = xr[0][idx];
+                        xr[0][idx] = v * t1;
+                        xr[1][idx] = v * t2;
+                    }
+                }
+                else
+                    idx += sb;
+            }
+
+            is_p = scalefac[20];
+            if (is_p != 7) {    /* copy l-band 20 to l-band 21 */
+                int sb;
+                real t1 = tab1[is_p], t2 = tab2[is_p];
+
+                for (sb = bi->longDiff[21]; sb > 0; sb--, idx++) {
+                    real v = xr[0][idx];
+
+                    xr[0][idx] = v * t1;
+                    xr[1][idx] = v * t2;
+                }
+            }
+        }
+    }                           /* ... */
+}
+
+static void
+III_antialias(real xr[SBLIMIT][SSLIMIT], struct gr_info_s *gr_info)
+{
+    int sblim;
+
+    if (gr_info->block_type == 2) {
+        if (!gr_info->mixed_block_flag)
+            return;
+        sblim = 1;
+    }
+    else {
+        sblim = gr_info->maxb - 1;
+    }
+
+    /* 31 alias-reduction operations between each pair of sub-bands */
+    /* with 8 butterflies between each pair                         */
+
+    {
+        int sb;
+        real *xr1 = (real *) xr[1];
+
+        if (sblim < 1 || sblim > SBLIMIT)
+            return;
+
+        for (sb = sblim; sb; sb--, xr1 += 10) {
+            int ss;
+            real *cs = aa_cs, *ca = aa_ca;
+            real *xr2 = xr1;
+
+            for (ss = 7; ss >= 0; ss--) {   /* upper and lower butterfly inputs */
+                register real bu = *--xr2, bd = *xr1;
+
+                *xr2 = (bu * (*cs)) - (bd * (*ca));
+                *xr1++ = (bd * (*cs++)) + (bu * (*ca++));
+            }
+        }
+    }
+}
+
+/*
+ This is an optimized DCT from Jeff Tsay's maplay 1.2+ package.
+ Saved one multiplication by doing the 'twiddle factor' stuff
+ together with the window mul. (MH)
+
+ This uses Byeong Gi Lee's Fast Cosine Transform algorithm, but the
+ 9 point IDCT needs to be reduced further. Unfortunately, I don't
+ know how to do that, because 9 is not an even number. - Jeff.
+
+ ****************************************************************
+
+ 9 Point Inverse Discrete Cosine Transform
+
+ This piece of code is Copyright 1997 Mikko Tommila and is freely usable
+ by anybody. The algorithm itself is of course in the public domain.
+
+ Again derived heuristically from the 9-point WFTA.
+
+ The algorithm is optimized (?) for speed, not for small rounding errors or
+ good readability.
+
+ 36 additions, 11 multiplications
+
+ Again this is very likely sub-optimal.
+
+ The code is optimized to use a minimum number of temporary variables,
+ so it should compile quite well even on 8-register Intel x86 processors.
+ This makes the code quite obfuscated and very difficult to understand.
+
+ References:
+ [1] S. Winograd: "On Computing the Discrete Fourier Transform",
+     Mathematics of Computation, Volume 32, Number 141, January 1978,
+     Pages 175-199
+*/
+
+/*------------------------------------------------------------------*/
+/*                                                                  */
+/*    Function: Calculation of the inverse MDCT                     */
+/*                                                                  */
+/*------------------------------------------------------------------*/
+
+#define MACRO(v)						\
+do {								\
+	real tmpval;						\
+								\
+	tmpval = tmp[(v)] + tmp[17-(v)];			\
+	out2[9+(v)] = tmpval * w[27+(v)];			\
+	out2[8-(v)] = tmpval * w[26-(v)];			\
+	tmpval = tmp[(v)] - tmp[17-(v)];			\
+	ts[SBLIMIT*(8-(v))] = out1[8-(v)] + tmpval * w[8-(v)];	\
+	ts[SBLIMIT*(9+(v))] = out1[9+(v)] + tmpval * w[9+(v)];	\
+} while (0)
+
+#ifndef USE_SIMD
+static
+#endif
+    void
+mpg123_dct36(real * inbuf, real * o1, real * o2, real * wintab, real * tsbuf)
+{
+    real tmp[18];
+    register real *in = inbuf;
+
+    in[17] += in[16];
+    in[16] += in[15];
+    in[15] += in[14];
+    in[14] += in[13];
+    in[13] += in[12];
+    in[12] += in[11];
+    in[11] += in[10];
+    in[10] += in[9];
+    in[9] += in[8];
+    in[8] += in[7];
+    in[7] += in[6];
+    in[6] += in[5];
+    in[5] += in[4];
+    in[4] += in[3];
+    in[3] += in[2];
+    in[2] += in[1];
+    in[1] += in[0];
+
+    in[17] += in[15];
+    in[15] += in[13];
+    in[13] += in[11];
+    in[11] += in[9];
+    in[9] += in[7];
+    in[7] += in[5];
+    in[5] += in[3];
+    in[3] += in[1];
+
+
+    {
+        real t3;
+        {
+            real t0, t1, t2;
+
+            t0 = COS6_2 * (in[8] + in[16] - in[4]);
+            t1 = COS6_2 * in[12];
+
+            t3 = in[0];
+            t2 = t3 - t1 - t1;
+            tmp[1] = tmp[7] = t2 - t0;
+            tmp[4] = t2 + t0 + t0;
+            t3 += t1;
+
+            t2 = COS6_1 * (in[10] + in[14] - in[2]);
+            tmp[1] -= t2;
+            tmp[7] += t2;
+        }
+        {
+            real t0, t1, t2;
+
+            t0 = cos9[0] * (in[4] + in[8]);
+            t1 = cos9[1] * (in[8] - in[16]);
+            t2 = cos9[2] * (in[4] + in[16]);
+
+            tmp[2] = tmp[6] = t3 - t0 - t2;
+            tmp[0] = tmp[8] = t3 + t0 + t1;
+            tmp[3] = tmp[5] = t3 - t1 + t2;
+        }
+    }
+    {
+        real t1, t2, t3;
+
+        t1 = cos18[0] * (in[2] + in[10]);
+        t2 = cos18[1] * (in[10] - in[14]);
+        t3 = COS6_1 * in[6];
+
+        {
+            real t0 = t1 + t2 + t3;
+            tmp[0] += t0;
+            tmp[8] -= t0;
+        }
+
+        t2 -= t3;
+        t1 -= t3;
+
+        t3 = cos18[2] * (in[2] + in[14]);
+
+        t1 += t3;
+        tmp[3] += t1;
+        tmp[5] -= t1;
+
+        t2 -= t3;
+        tmp[2] += t2;
+        tmp[6] -= t2;
+    }
+
+    {
+        real t0, t1, t2, t3, t4, t5, t6, t7;
+
+        t1 = COS6_2 * in[13];
+        t2 = COS6_2 * (in[9] + in[17] - in[5]);
+
+        t3 = in[1] + t1;
+        t4 = in[1] - t1 - t1;
+        t5 = t4 - t2;
+
+        t0 = cos9[0] * (in[5] + in[9]);
+        t1 = cos9[1] * (in[9] - in[17]);
+
+        tmp[13] = (t4 + t2 + t2) * tfcos36[17 - 13];
+        t2 = cos9[2] * (in[5] + in[17]);
+
+        t6 = t3 - t0 - t2;
+        t0 += t3 + t1;
+        t3 += t2 - t1;
+
+        t2 = cos18[0] * (in[3] + in[11]);
+        t4 = cos18[1] * (in[11] - in[15]);
+        t7 = COS6_1 * in[7];
+
+        t1 = t2 + t4 + t7;
+        tmp[17] = (t0 + t1) * tfcos36[17 - 17];
+        tmp[9] = (t0 - t1) * tfcos36[17 - 9];
+        t1 = cos18[2] * (in[3] + in[15]);
+        t2 += t1 - t7;
+
+        tmp[14] = (t3 + t2) * tfcos36[17 - 14];
+        t0 = COS6_1 * (in[11] + in[15] - in[3]);
+        tmp[12] = (t3 - t2) * tfcos36[17 - 12];
+
+        t4 -= t1 + t7;
+
+        tmp[16] = (t5 - t0) * tfcos36[17 - 16];
+        tmp[10] = (t5 + t0) * tfcos36[17 - 10];
+        tmp[15] = (t6 + t4) * tfcos36[17 - 15];
+        tmp[11] = (t6 - t4) * tfcos36[17 - 11];
+    }
+
+    {
+        register real *out2 = o2;
+        register real *w = wintab;
+        register real *out1 = o1;
+        register real *ts = tsbuf;
+
+        MACRO(0);
+        MACRO(1);
+        MACRO(2);
+        MACRO(3);
+        MACRO(4);
+        MACRO(5);
+        MACRO(6);
+        MACRO(7);
+        MACRO(8);
+    }
+}
+
+/*
+ * new DCT12
+ */
+static void
+dct12(real * in, real * rawout1, real * rawout2,
+      register real * wi, register real * ts)
+{
+
+#define DCT12_PART1()				\
+do {						\
+	in5 = in[5*3];				\
+	in5 += (in4 = in[4*3]);			\
+	in4 += (in3 = in[3*3]);			\
+	in3 += (in2 = in[2*3]);			\
+	in2 += (in1 = in[1*3]);			\
+	in1 += (in0 = in[0*3]);			\
+						\
+	in5 += in3; in3 += in1;			\
+						\
+	in2 *= COS6_1;				\
+	in3 *= COS6_1;				\
+} while (0)
+
+#define DCT12_PART2()				\
+do {						\
+	in0 += in4 * COS6_2;			\
+						\
+	in4 = in0 + in2;			\
+	in0 -= in2;				\
+						\
+	in1 += in5 * COS6_2;			\
+						\
+	in5 = (in1 + in3) * tfcos12[0];		\
+	in1 = (in1 - in3) * tfcos12[2];		\
+						\
+	in3 = in4 + in5;			\
+	in4 -= in5;				\
+						\
+	in2 = in0 + in1;			\
+	in0 -= in1;				\
+} while (0)
+
+
+    {
+        real in0, in1, in2, in3, in4, in5;
+        register real *out1 = rawout1;
+
+        ts[SBLIMIT * 0] = out1[0];
+        ts[SBLIMIT * 1] = out1[1];
+        ts[SBLIMIT * 2] = out1[2];
+        ts[SBLIMIT * 3] = out1[3];
+        ts[SBLIMIT * 4] = out1[4];
+        ts[SBLIMIT * 5] = out1[5];
+
+        DCT12_PART1();
+
+        {
+            real tmp0, tmp1 = (in0 - in4);
+
+            {
+                real tmp2 = (in1 - in5) * tfcos12[1];
+
+                tmp0 = tmp1 + tmp2;
+                tmp1 -= tmp2;
+            }
+            ts[(17 - 1) * SBLIMIT] = out1[17 - 1] + tmp0 * wi[11 - 1];
+            ts[(12 + 1) * SBLIMIT] = out1[12 + 1] + tmp0 * wi[6 + 1];
+            ts[(6 + 1) * SBLIMIT] = out1[6 + 1] + tmp1 * wi[1];
+            ts[(11 - 1) * SBLIMIT] = out1[11 - 1] + tmp1 * wi[5 - 1];
+        }
+
+        DCT12_PART2();
+
+        ts[(17 - 0) * SBLIMIT] = out1[17 - 0] + in2 * wi[11 - 0];
+        ts[(12 + 0) * SBLIMIT] = out1[12 + 0] + in2 * wi[6 + 0];
+        ts[(12 + 2) * SBLIMIT] = out1[12 + 2] + in3 * wi[6 + 2];
+        ts[(17 - 2) * SBLIMIT] = out1[17 - 2] + in3 * wi[11 - 2];
+
+        ts[(6 + 0) * SBLIMIT] = out1[6 + 0] + in0 * wi[0];
+        ts[(11 - 0) * SBLIMIT] = out1[11 - 0] + in0 * wi[5 - 0];
+        ts[(6 + 2) * SBLIMIT] = out1[6 + 2] + in4 * wi[2];
+        ts[(11 - 2) * SBLIMIT] = out1[11 - 2] + in4 * wi[5 - 2];
+    }
+
+    in++;
+
+    {
+        real in0, in1, in2, in3, in4, in5;
+        register real *out2 = rawout2;
+
+        DCT12_PART1();
+
+        {
+            real tmp0, tmp1 = (in0 - in4);
+
+            {
+                real tmp2 = (in1 - in5) * tfcos12[1];
+
+                tmp0 = tmp1 + tmp2;
+                tmp1 -= tmp2;
+            }
+            out2[5 - 1] = tmp0 * wi[11 - 1];
+            out2[0 + 1] = tmp0 * wi[6 + 1];
+            ts[(12 + 1) * SBLIMIT] += tmp1 * wi[1];
+            ts[(17 - 1) * SBLIMIT] += tmp1 * wi[5 - 1];
+        }
+
+        DCT12_PART2();
+
+        out2[5 - 0] = in2 * wi[11 - 0];
+        out2[0 + 0] = in2 * wi[6 + 0];
+        out2[0 + 2] = in3 * wi[6 + 2];
+        out2[5 - 2] = in3 * wi[11 - 2];
+
+        ts[(12 + 0) * SBLIMIT] += in0 * wi[0];
+        ts[(17 - 0) * SBLIMIT] += in0 * wi[5 - 0];
+        ts[(12 + 2) * SBLIMIT] += in4 * wi[2];
+        ts[(17 - 2) * SBLIMIT] += in4 * wi[5 - 2];
+    }
+
+    in++;
+
+    {
+        real in0, in1, in2, in3, in4, in5;
+        register real *out2 = rawout2;
+
+        out2[12] = out2[13] = out2[14] = out2[15] = out2[16] = out2[17] = 0.0;
+
+        DCT12_PART1();
+
+        {
+            real tmp0, tmp1 = (in0 - in4);
+
+            {
+                real tmp2 = (in1 - in5) * tfcos12[1];
+
+                tmp0 = tmp1 + tmp2;
+                tmp1 -= tmp2;
+            }
+            out2[11 - 1] = tmp0 * wi[11 - 1];
+            out2[6 + 1] = tmp0 * wi[6 + 1];
+            out2[0 + 1] += tmp1 * wi[1];
+            out2[5 - 1] += tmp1 * wi[5 - 1];
+        }
+
+        DCT12_PART2();
+
+        out2[11 - 0] = in2 * wi[11 - 0];
+        out2[6 + 0] = in2 * wi[6 + 0];
+        out2[6 + 2] = in3 * wi[6 + 2];
+        out2[11 - 2] = in3 * wi[11 - 2];
+
+        out2[0 + 0] += in0 * wi[0];
+        out2[5 - 0] += in0 * wi[5 - 0];
+        out2[0 + 2] += in4 * wi[2];
+        out2[5 - 2] += in4 * wi[5 - 2];
+    }
+}
+
+/*
+ * III_hybrid
+ */
+static void
+III_hybrid(real fsIn[SBLIMIT][SSLIMIT],
+           real tsOut[SSLIMIT][SBLIMIT], int ch,
+           struct gr_info_s *gr_info, struct frame *fr)
+{
+    static real block[2][2][SBLIMIT * SSLIMIT] = { {{0,}} };
+    static int blc[2] = { 0, 0 };
+
+    real *tspnt = (real *) tsOut;
+    real *rawout1, *rawout2;
+    int bt, sb = 0;
+
+    {
+        int b = blc[ch];
+        rawout1 = block[b][ch];
+        b = -b + 1;
+        rawout2 = block[b][ch];
+        blc[ch] = b;
+    }
+
+    if (gr_info->mixed_block_flag) {
+        sb = 2;
+        DCT36(fsIn[0], rawout1, rawout2, win[0], tspnt);
+        DCT36(fsIn[1], rawout1 + 18, rawout2 + 18, win1[0], tspnt + 1);
+        rawout1 += 36;
+        rawout2 += 36;
+        tspnt += 2;
+    }
+
+    bt = gr_info->block_type;
+    if (bt == 2) {
+        for (; sb < gr_info->maxb;
+             sb += 2, tspnt += 2, rawout1 += 36, rawout2 += 36) {
+            dct12(fsIn[sb], rawout1, rawout2, win[2], tspnt);
+            dct12(fsIn[sb + 1], rawout1 + 18, rawout2 + 18, win1[2],
+                  tspnt + 1);
+        }
+    }
+    else {
+        for (; sb < gr_info->maxb;
+             sb += 2, tspnt += 2, rawout1 += 36, rawout2 += 36) {
+            DCT36(fsIn[sb], rawout1, rawout2, win[bt], tspnt);
+            DCT36(fsIn[sb + 1], rawout1 + 18, rawout2 + 18, win1[bt],
+                  tspnt + 1);
+        }
+    }
+
+    for (; sb < SBLIMIT; sb++, tspnt++) {
+        int i;
+        for (i = 0; i < SSLIMIT; i++) {
+            tspnt[i * SBLIMIT] = *rawout1++;
+            *rawout2++ = 0.0;
+        }
+    }
+}
+
+/*
+ * main layer3 handler
+ */
+int
+mpg123_do_layer3(struct frame *fr)
+{
+    int gr, ch, ss;
+    int scalefacs[2][39];       /* max 39 for short[13][3] mode, mixed: 38, long: 22 */
+    struct III_sideinfo sideinfo;
+    int stereo = fr->stereo;
+    int single = fr->single;
+    int ms_stereo, i_stereo;
+    int sfreq = fr->sampling_frequency;
+    int stereo1, granules;
+
+    if (stereo == 1) {          /* stream is mono */
+        stereo1 = 1;
+        single = 0;
+    }
+    else if (single >= 0)       /* stream is stereo, but force to mono */
+        stereo1 = 1;
+    else
+        stereo1 = 2;
+
+    if (fr->mode == MPG_MD_JOINT_STEREO) {
+        ms_stereo = (fr->mode_ext & 0x2) >> 1;
+        i_stereo = fr->mode_ext & 0x1;
+    }
+    else
+        ms_stereo = i_stereo = 0;
+
+    granules = fr->lsf ? 1 : 2;
+    if (!III_get_side_info
+        (&sideinfo, stereo, ms_stereo, sfreq, single, fr->lsf))
+        return 0;
+
+    mpg123_set_pointer(sideinfo.main_data_begin);
+
+    for (gr = 0; gr < granules; gr++) {
+        real hybridIn[2][SBLIMIT][SSLIMIT];
+        real hybridOut[2][SSLIMIT][SBLIMIT];
+
+        {
+            struct gr_info_s *gr_info = &(sideinfo.ch[0].gr[gr]);
+            long part2bits;
+
+            if (fr->lsf)
+                part2bits = III_get_scale_factors_2(scalefacs[0], gr_info, 0);
+            else
+                part2bits = III_get_scale_factors_1(scalefacs[0], gr_info);
+
+            if (III_dequantize_sample
+                (hybridIn[0], scalefacs[0], gr_info, sfreq, part2bits))
+                return 0;
+        }
+
+        if (stereo == 2) {
+            struct gr_info_s *gr_info = &(sideinfo.ch[1].gr[gr]);
+            long part2bits;
+
+            if (fr->lsf)
+                part2bits =
+                    III_get_scale_factors_2(scalefacs[1], gr_info, i_stereo);
+            else
+                part2bits = III_get_scale_factors_1(scalefacs[1], gr_info);
+
+            if (III_dequantize_sample
+                (hybridIn[1], scalefacs[1], gr_info, sfreq, part2bits))
+                return 0;
+
+            if (ms_stereo) {
+                int i;
+                int maxb = sideinfo.ch[0].gr[gr].maxb;
+
+                if (sideinfo.ch[1].gr[gr].maxb > maxb)
+                    maxb = sideinfo.ch[1].gr[gr].maxb;
+                for (i = 0; i < SSLIMIT * maxb; i++) {
+                    real tmp0 = ((real *) hybridIn[0])[i];
+                    real tmp1 = ((real *) hybridIn[1])[i];
+                    ((real *) hybridIn[0])[i] = tmp0 + tmp1;
+                    ((real *) hybridIn[1])[i] = tmp0 - tmp1;
+                }
+            }
+
+            if (i_stereo)
+                III_i_stereo(hybridIn, scalefacs[1], gr_info, sfreq,
+                             ms_stereo, fr->lsf);
+
+            if (ms_stereo || i_stereo || (single == 3)) {
+                if (gr_info->maxb > sideinfo.ch[0].gr[gr].maxb)
+                    sideinfo.ch[0].gr[gr].maxb = gr_info->maxb;
+                else
+                    gr_info->maxb = sideinfo.ch[0].gr[gr].maxb;
+            }
+
+            switch (single) {
+            case 3:
+                {
+                    register int i;
+                    register real *in0 = (real *) hybridIn[0],
+                        *in1 = (real *) hybridIn[1];
+                    for (i = 0; i < SSLIMIT * gr_info->maxb; i++, in0++)
+                        *in0 = (*in0 + *in1++); /* *0.5 done by pow-scale */
+                }
+                break;
+            case 1:
+                {
+                    register int i;
+                    register real *in0 = (real *) hybridIn[0],
+                        *in1 = (real *) hybridIn[1];
+                    for (i = 0; i < SSLIMIT * gr_info->maxb; i++)
+                        *in0++ = *in1++;
+                }
+                break;
+            }
+        }
+
+#ifdef XMMS_EQ
+        if (mpg123_info->eq_active) {
+            int i, sb;
+            
+            if (single < 0) {
+                for (sb = 0, i = 0; sb < SBLIMIT; sb++) {
+                    for (ss = 0; ss < SSLIMIT; ss++) {
+                        hybridIn[0][sb][ss] *= mpg123_info->eq_mul[i];
+                        hybridIn[1][sb][ss] *= mpg123_info->eq_mul[i++];
+                    }
+                }
+            }
+            else {
+                for (sb = 0, i = 0; sb < SBLIMIT; sb++) {
+                    for (ss = 0; ss < SSLIMIT; ss++)
+                        hybridIn[0][sb][ss] *= mpg123_info->eq_mul[i++];
+                }
+            }
+        }
+#endif
+        
+#ifdef USE_SIMD
+        if (fr->synth_type == SYNTH_MMX && single < 0) {
+            int i, sb;
+
+            for (sb = 0, i = 0; sb < SBLIMIT; sb++) {
+                for (ss = 0; ss < SSLIMIT; ss++) {
+                    hybridIn[0][sb][ss] *= 16384.0;
+                    hybridIn[1][sb][ss] *= 16384.0;
+                }
+            }
+        }
+#endif
+        for (ch = 0; ch < stereo1; ch++) {
+            struct gr_info_s *gr_info = &(sideinfo.ch[ch].gr[gr]);
+
+            III_antialias(hybridIn[ch], gr_info);
+            if (gr_info->maxb < 1 || gr_info->maxb > SBLIMIT)
+                return 0;
+            III_hybrid(hybridIn[ch], hybridOut[ch], ch, gr_info, fr);
+        }
+
+        for (ss = 0; ss < SSLIMIT; ss++) {
+            if (single >= 0) {
+                (fr->synth_mono) (hybridOut[0][ss], mpg123_pcm_sample,
+                                  &mpg123_pcm_point);
+            }
+            else {
+                int p1 = mpg123_pcm_point;
+
+                (fr->synth) (hybridOut[0][ss], 0, mpg123_pcm_sample, &p1);
+                (fr->synth) (hybridOut[1][ss], 1, mpg123_pcm_sample,
+                             &mpg123_pcm_point);
+            }
+        }
+
+        if (mpg123_info->output_audio && mpg123_info->jump_to_time == -1) {
+            produce_audio(mpg123_ip.output->written_time(),
+                          mpg123_cfg.resolution ==
+                          16 ? FMT_S16_NE : FMT_U8,
+                          mpg123_cfg.channels ==
+                          2 ? fr->stereo : 1, mpg123_pcm_point,
+                          mpg123_pcm_sample, &mpg123_info->going);
+        }
+
+        mpg123_pcm_point = 0;
+    }
+    return 1;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/mp3.xpm
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/mp3.xpm	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/mp3.xpm	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,963 @@
+/* XPM */
+static char * gnome_mime_audio_xpm[] = {
+"48 52 908 2",
+"  	c None",
+". 	c #000000",
+"+ 	c #010100",
+"@ 	c #020201",
+"# 	c #030201",
+"$ 	c #232323",
+"% 	c #1F1F1F",
+"& 	c #DADADA",
+"* 	c #FFFFFF",
+"= 	c #F6F6F6",
+"- 	c #CFCFCF",
+"; 	c #707070",
+"> 	c #FFFFFE",
+", 	c #FEFEFE",
+"' 	c #FBFBFB",
+") 	c #EDEDED",
+"! 	c #C0C0C0",
+"~ 	c #FFFEFE",
+"{ 	c #F8F5F2",
+"] 	c #EBE7E1",
+"^ 	c #ECEDE8",
+"/ 	c #ECEFEA",
+"( 	c #E6E9E4",
+"_ 	c #CED0CE",
+": 	c #BCBFBC",
+"< 	c #F0F0EF",
+"[ 	c #FEFEFD",
+"} 	c #F7F7F7",
+"| 	c #D7D7D7",
+"1 	c #F1F1F1",
+"2 	c #B7B7B7",
+"3 	c #EAEDEA",
+"4 	c #8EA299",
+"5 	c #697D70",
+"6 	c #546459",
+"7 	c #404D44",
+"8 	c #2C352F",
+"9 	c #4E5649",
+"0 	c #D6D8D3",
+"a 	c #D2D2D2",
+"b 	c #AEAEAE",
+"c 	c #070707",
+"d 	c #FCFCFB",
+"e 	c #6D7C75",
+"f 	c #5A5D4C",
+"g 	c #6B735F",
+"h 	c #6E7B63",
+"i 	c #5B6052",
+"j 	c #4A5042",
+"k 	c #CED0CB",
+"l 	c #FEFDFD",
+"m 	c #FDFDFD",
+"n 	c #B8B8B8",
+"o 	c #DCDCDC",
+"p 	c #A4A4A3",
+"q 	c #0E0E0E",
+"r 	c #8A928F",
+"s 	c #6A7F68",
+"t 	c #4D564E",
+"u 	c #4E5950",
+"v 	c #585E57",
+"w 	c #333530",
+"x 	c #9D9C9B",
+"y 	c #FCFDFE",
+"z 	c #FDFEFE",
+"A 	c #FDFDFE",
+"B 	c #F5F5F4",
+"C 	c #B5B5B5",
+"D 	c #F9F9F9",
+"E 	c #FCFCFC",
+"F 	c #CBCBCB",
+"G 	c #A5A5A5",
+"H 	c #CECDCB",
+"I 	c #788976",
+"J 	c #C6BDBB",
+"K 	c #E2E2E2",
+"L 	c #E2E0DF",
+"M 	c #656A65",
+"N 	c #4A4B49",
+"O 	c #EAEDF1",
+"P 	c #CED5DD",
+"Q 	c #DBE0E9",
+"R 	c #DDE1E9",
+"S 	c #D3D7DD",
+"T 	c #D9DCE1",
+"U 	c #F4F4F4",
+"V 	c #ACACAC",
+"W 	c #ECECEC",
+"X 	c #C3C3C3",
+"Y 	c #C2C2C2",
+"Z 	c #C9C9C8",
+"` 	c #A8A8A8",
+" .	c #F6F8F6",
+"..	c #A7ADA5",
+"+.	c #6D7F71",
+"@.	c #ECECE9",
+"#.	c #FDFDFC",
+"$.	c #939C9A",
+"%.	c #1B2321",
+"&.	c #FCFBFA",
+"*.	c #F2F6F9",
+"=.	c #B4BFCC",
+"-.	c #7E8A9B",
+";.	c #515B6F",
+">.	c #50596A",
+",.	c #737D8D",
+"'.	c #BEC6CE",
+").	c #C4CBD5",
+"!.	c #BFC5D1",
+"~.	c #F1F2F4",
+"{.	c #F4F4F3",
+"].	c #ABABAB",
+"^.	c #515151",
+"/.	c #474747",
+"(.	c #464645",
+"_.	c #464646",
+":.	c #5D5D5C",
+"<.	c #A9A9A9",
+"[.	c #FAFAF9",
+"}.	c #EDEFF0",
+"|.	c #F1F5F5",
+"1.	c #636E62",
+"2.	c #636E5F",
+"3.	c #D4D5D3",
+"4.	c #FBF7F4",
+"5.	c #9BA595",
+"6.	c #657366",
+"7.	c #001514",
+"8.	c #FCFAF8",
+"9.	c #FDFCFC",
+"0.	c #FBF9F7",
+"a.	c #E3E6EA",
+"b.	c #9DACBF",
+"c.	c #515A6D",
+"d.	c #111828",
+"e.	c #131B29",
+"f.	c #0F1A2B",
+"g.	c #081125",
+"h.	c #0D1328",
+"i.	c #C2C9D1",
+"j.	c #C5CBD4",
+"k.	c #A6AEBB",
+"l.	c #F6F6F7",
+"m.	c #FAFAFA",
+"n.	c #F2F2F2",
+"o.	c #F3F3F3",
+"p.	c #AAAAAA",
+"q.	c #A0A09F",
+"r.	c #8A8A8A",
+"s.	c #7A7A7A",
+"t.	c #6C6C6C",
+"u.	c #454545",
+"v.	c #ABB3AF",
+"w.	c #A8B6A3",
+"x.	c #D0DBD0",
+"y.	c #F2F3F0",
+"z.	c #DEE1E0",
+"A.	c #66736A",
+"B.	c #354336",
+"C.	c #556254",
+"D.	c #C5C7C6",
+"E.	c #F2EDEA",
+"F.	c #CADAD9",
+"G.	c #9BA893",
+"H.	c #1B3128",
+"I.	c #FCF4EF",
+"J.	c #FDFBF9",
+"K.	c #DDDFE4",
+"L.	c #97A3B4",
+"M.	c #374152",
+"N.	c #0D131C",
+"O.	c #1C2026",
+"P.	c #262C3A",
+"Q.	c #242E43",
+"R.	c #202D41",
+"S.	c #172538",
+"T.	c #121523",
+"U.	c #BABCC3",
+"V.	c #9DA6B5",
+"W.	c #BABEC4",
+"X.	c #F8F8F7",
+"Y.	c #E7E7E7",
+"Z.	c #C6C6C5",
+"`.	c #BABAB9",
+" +	c #E7E9E9",
+".+	c #63736C",
+"++	c #464945",
+"@+	c #5F7361",
+"#+	c #CED4C3",
+"$+	c #DBDEDA",
+"%+	c #979999",
+"&+	c #404342",
+"*+	c #606E6B",
+"=+	c #E5E5E3",
+"-+	c #4B5F52",
+";+	c #455845",
+">+	c #2D362F",
+",+	c #FCFAF9",
+"'+	c #E4E4E7",
+")+	c #97A8B9",
+"!+	c #343C4A",
+"~+	c #13181E",
+"{+	c #1B2027",
+"]+	c #1D232B",
+"^+	c #1F2632",
+"/+	c #212A3C",
+"(+	c #242F45",
+"_+	c #2A374D",
+":+	c #121C2F",
+"<+	c #525A67",
+"[+	c #D9DDE5",
+"}+	c #737C8C",
+"|+	c #EAEBEB",
+"1+	c #F7F7F6",
+"2+	c #F6F6F5",
+"3+	c #F5F5F5",
+"4+	c #EDEDEB",
+"5+	c #FBFBFA",
+"6+	c #6C8175",
+"7+	c #778673",
+"8+	c #121613",
+"9+	c #4C504A",
+"0+	c #8FA695",
+"a+	c #E2DCD8",
+"b+	c #E5E6E7",
+"c+	c #FBFAF9",
+"d+	c #CAC6C1",
+"e+	c #847F79",
+"f+	c #FCFAFA",
+"g+	c #ECE9E9",
+"h+	c #A6B1C4",
+"i+	c #232B37",
+"j+	c #12171E",
+"k+	c #191F27",
+"l+	c #1D222B",
+"m+	c #1E242B",
+"n+	c #1E252F",
+"o+	c #202937",
+"p+	c #232F44",
+"q+	c #283853",
+"r+	c #253046",
+"s+	c #0A1526",
+"t+	c #D5D7DB",
+"u+	c #727D90",
+"v+	c #CFD0D2",
+"w+	c #B1B1B1",
+"x+	c #99A597",
+"y+	c #7B9173",
+"z+	c #65705D",
+"A+	c #1F201B",
+"B+	c #58655E",
+"C+	c #F3F2F1",
+"D+	c #AAB3C1",
+"E+	c #525C6D",
+"F+	c #0A0F17",
+"G+	c #1C2129",
+"H+	c #1E242A",
+"I+	c #1E242C",
+"J+	c #1F232D",
+"K+	c #232E41",
+"L+	c #2B3855",
+"M+	c #2C3B57",
+"N+	c #070D1F",
+"O+	c #A3ABB6",
+"P+	c #828EA0",
+"Q+	c #B9BCC2",
+"R+	c #F3F3F2",
+"S+	c #F1EFEC",
+"T+	c #72886D",
+"U+	c #4E5849",
+"V+	c #748268",
+"W+	c #808080",
+"X+	c #D6D9DE",
+"Y+	c #5E6A7A",
+"Z+	c #121621",
+"`+	c #161D26",
+" @	c #1D242C",
+".@	c #1F242B",
+"+@	c #1E2427",
+"@@	c #212C3F",
+"#@	c #283552",
+"$@	c #2F405D",
+"%@	c #0E162B",
+"&@	c #59657B",
+"*@	c #8A98AA",
+"=@	c #AFB4BC",
+"-@	c #F2F2F1",
+";@	c #7D9074",
+">@	c #494949",
+",@	c #676D65",
+"'@	c #C8CBC7",
+")@	c #818B9B",
+"!@	c #1B232F",
+"~@	c #0F151F",
+"{@	c #1B212B",
+"]@	c #1E232D",
+"^@	c #20252C",
+"/@	c #24272C",
+"(@	c #1F2429",
+"_@	c #1C2228",
+":@	c #1F2A3C",
+"<@	c #1F2A40",
+"[@	c #25344E",
+"}@	c #314464",
+"|@	c #15223A",
+"1@	c #34445E",
+"2@	c #939FB3",
+"3@	c #ACB2BC",
+"4@	c #F1F1F0",
+"5@	c #ECEEEB",
+"6@	c #B8BCB7",
+"7@	c #647C65",
+"8@	c #797E78",
+"9@	c #C4C3C2",
+"0@	c #919191",
+"a@	c #DCE3EA",
+"b@	c #242C3D",
+"c@	c #0B101C",
+"d@	c #1A212A",
+"e@	c #1F242C",
+"f@	c #21252C",
+"g@	c #222629",
+"h@	c #1C232A",
+"i@	c #212B3D",
+"j@	c #33415B",
+"k@	c #27344B",
+"l@	c #212F47",
+"m@	c #374A68",
+"n@	c #1A2840",
+"o@	c #34445F",
+"p@	c #96A3B5",
+"q@	c #B3B7C0",
+"r@	c #F2F2F0",
+"s@	c #F0F0F0",
+"t@	c #E2E7E2",
+"u@	c #939E92",
+"v@	c #50644E",
+"w@	c #3D443E",
+"x@	c #D4D2CF",
+"y@	c #7F8898",
+"z@	c #020A14",
+"A@	c #171E28",
+"B@	c #1C222A",
+"C@	c #1E232B",
+"D@	c #1F242D",
+"E@	c #1F2228",
+"F@	c #1D2328",
+"G@	c #283449",
+"H@	c #4A5C7B",
+"I@	c #697D98",
+"J@	c #4D5D79",
+"K@	c #1F2D45",
+"L@	c #394A6B",
+"M@	c #1B2943",
+"N@	c #425371",
+"O@	c #95A3B5",
+"P@	c #B8BDC2",
+"Q@	c #EFEFEE",
+"R@	c #EFEFED",
+"S@	c #EDEEED",
+"T@	c #EFF0F0",
+"U@	c #F7FCF3",
+"V@	c #313F30",
+"W@	c #1C2120",
+"X@	c #C9CBC9",
+"Y@	c #F9F9F8",
+"Z@	c #E9EEF2",
+"`@	c #3C4352",
+" #	c #0C111D",
+".#	c #1E232E",
+"+#	c #1D212A",
+"@#	c #20242C",
+"##	c #1B1D20",
+"$#	c #263043",
+"%#	c #576886",
+"&#	c #8396B1",
+"*#	c #7A8FAD",
+"=#	c #677B99",
+"-#	c #28374F",
+";#	c #384A69",
+">#	c #182642",
+",#	c #5D708F",
+"'#	c #828FA3",
+")#	c #C5C7CB",
+"!#	c #F1F1EF",
+"~#	c #EEEEED",
+"{#	c #EEEEEC",
+"]#	c #9DA7A4",
+"^#	c #2A3B34",
+"/#	c #222725",
+"(#	c #80807E",
+"_#	c #EFEEEC",
+":#	c #F1F0EF",
+"<#	c #F4F3F2",
+"[#	c #F8F8F8",
+"}#	c #A8AFBB",
+"|#	c #0D1522",
+"1#	c #1A212E",
+"2#	c #1D232C",
+"3#	c #21252D",
+"4#	c #1E2327",
+"5#	c #171B20",
+"6#	c #637593",
+"7#	c #95A6BE",
+"8#	c #6D7F9C",
+"9#	c #617395",
+"0#	c #5A6E8B",
+"a#	c #2A354A",
+"b#	c #3D4E6D",
+"c#	c #1C2A46",
+"d#	c #748DAB",
+"e#	c #6D798A",
+"f#	c #DEDFE0",
+"g#	c #EEEEEE",
+"h#	c #EDEDEC",
+"i#	c #ECEAE7",
+"j#	c #ADB1B0",
+"k#	c #B5B9BA",
+"l#	c #F1F0F0",
+"m#	c #F9F8F8",
+"n#	c #F7F5F4",
+"o#	c #A7AAA4",
+"p#	c #B7BAB4",
+"q#	c #F7F6F6",
+"r#	c #ECEFF1",
+"s#	c #747F8E",
+"t#	c #0A121E",
+"u#	c #232C3A",
+"v#	c #1D232E",
+"w#	c #222932",
+"x#	c #1B1D21",
+"y#	c #1C273E",
+"z#	c #C1CFE1",
+"A#	c #8FA1B7",
+"B#	c #6D81A0",
+"C#	c #596D93",
+"D#	c #455674",
+"E#	c #293343",
+"F#	c #4A5C7D",
+"G#	c #304060",
+"H#	c #7690B8",
+"I#	c #5D6878",
+"J#	c #BBC0CC",
+"K#	c #ECECEB",
+"L#	c #F6F4F3",
+"M#	c #F4F1EF",
+"N#	c #F7F5F3",
+"O#	c #F9F8F7",
+"P#	c #BBBDB9",
+"Q#	c #4D5852",
+"R#	c #71746D",
+"S#	c #F0EAE7",
+"T#	c #DBDEE3",
+"U#	c #3E495B",
+"V#	c #1C2435",
+"W#	c #273041",
+"X#	c #283040",
+"Y#	c #293141",
+"Z#	c #262B38",
+"`#	c #1D212D",
+" $	c #4A5B77",
+".$	c #CFDBEB",
+"+$	c #7A8FAC",
+"@$	c #6C83A5",
+"#$	c #4D6389",
+"$$	c #35445E",
+"%$	c #404D60",
+"&$	c #506586",
+"*$	c #4F6687",
+"=$	c #6983AB",
+"-$	c #343E50",
+";$	c #4D5F7A",
+">$	c #B8C0CC",
+",$	c #F7F6F5",
+"'$	c #D2D6D3",
+")$	c #6C866F",
+"!$	c #5A715E",
+"~$	c #566758",
+"{$	c #B5C1B4",
+"]$	c #B2BAC8",
+"^$	c #273245",
+"/$	c #29354A",
+"($	c #323D53",
+"_$	c #364258",
+":$	c #333F52",
+"<$	c #343F52",
+"[$	c #28354A",
+"}$	c #6D7B92",
+"|$	c #ACBDD2",
+"1$	c #5B7297",
+"2$	c #495F87",
+"3$	c #3A4D6B",
+"4$	c #252F44",
+"5$	c #8292AC",
+"6$	c #586E94",
+"7$	c #6782A9",
+"8$	c #37404D",
+"9$	c #394860",
+"0$	c #475977",
+"a$	c #6E7E99",
+"b$	c #EBEBEA",
+"c$	c #BEC3BE",
+"d$	c #CFD1CE",
+"e$	c #F4F2F0",
+"f$	c #7D8F84",
+"g$	c #6A8667",
+"h$	c #D5D8D4",
+"i$	c #6B6B6B",
+"j$	c #9E9E9F",
+"k$	c #7A8EA8",
+"l$	c #2B374D",
+"m$	c #313E56",
+"n$	c #34425B",
+"o$	c #36425A",
+"p$	c #354257",
+"q$	c #39465D",
+"r$	c #3B4963",
+"s$	c #64738B",
+"t$	c #768CAD",
+"u$	c #354C72",
+"v$	c #2E3D5B",
+"w$	c #1D273A",
+"x$	c #3D4655",
+"y$	c #A7BACE",
+"z$	c #607799",
+"A$	c #617494",
+"B$	c #191B1B",
+"C$	c #445675",
+"D$	c #3A4A65",
+"E$	c #6C7A91",
+"F$	c #ECECEA",
+"G$	c #EAEAE9",
+"H$	c #EAEAE8",
+"I$	c #F7F6F4",
+"J$	c #B5B9B6",
+"K$	c #D7DCD9",
+"L$	c #7B8982",
+"M$	c #A9AEAD",
+"N$	c #517257",
+"O$	c #839284",
+"P$	c #DEDEDD",
+"Q$	c #D8D9D9",
+"R$	c #F3F2EE",
+"S$	c #51698C",
+"T$	c #313F55",
+"U$	c #35435B",
+"V$	c #36445A",
+"W$	c #35425C",
+"X$	c #37465D",
+"Y$	c #3D4A62",
+"Z$	c #516079",
+"`$	c #47536A",
+" %	c #354561",
+".%	c #212F46",
+"+%	c #0F1624",
+"@%	c #1A2231",
+"#%	c #99A5B7",
+"$%	c #97A8C3",
+"%%	c #6A7DA0",
+"&%	c #394559",
+"*%	c #1C1D26",
+"=%	c #35435C",
+"-%	c #344159",
+";%	c #8E96A2",
+">%	c #E9E9E8",
+",%	c #E9E9E7",
+"'%	c #F6F5F5",
+")%	c #70827F",
+"!%	c #C6D0C3",
+"~%	c #445344",
+"{%	c #637161",
+"]%	c #4B6C4C",
+"^%	c #CAC8C8",
+"/%	c #3D5271",
+"(%	c #3A4863",
+"_%	c #384862",
+":%	c #3E4C65",
+"<%	c #424D67",
+"[%	c #45536C",
+"}%	c #4D5A74",
+"|%	c #66768F",
+"1%	c #76869D",
+"2%	c #2A3243",
+"3%	c #151A27",
+"4%	c #252C3A",
+"5%	c #B2BBCE",
+"6%	c #C3D0E3",
+"7%	c #7B8CA9",
+"8%	c #51627E",
+"9%	c #171C22",
+"0%	c #141920",
+"a%	c #242C3A",
+"b%	c #3F4B60",
+"c%	c #BDC0C6",
+"d%	c #EBEBE9",
+"e%	c #D1D7D3",
+"f%	c #4F5753",
+"g%	c #27322D",
+"h%	c #57655B",
+"i%	c #7E8B86",
+"j%	c #F0EFED",
+"k%	c #3E516C",
+"l%	c #3F4E68",
+"m%	c #3C4A64",
+"n%	c #4C5A74",
+"o%	c #55637C",
+"p%	c #5A6881",
+"q%	c #707D95",
+"r%	c #8493A6",
+"s%	c #BFC8D8",
+"t%	c #D8E4F0",
+"u%	c #CCD5E4",
+"v%	c #E2E8F1",
+"w%	c #D2DAE9",
+"x%	c #8D9DB7",
+"y%	c #526380",
+"z%	c #323E53",
+"A%	c #080B11",
+"B%	c #0E1217",
+"C%	c #272E3A",
+"D%	c #747D8A",
+"E%	c #D6D7D8",
+"F%	c #E8E8E7",
+"G%	c #E8E8E6",
+"H%	c #D2D2D0",
+"I%	c #B3B7B4",
+"J%	c #BFC1BF",
+"K%	c #EBE8E7",
+"L%	c #5A718E",
+"M%	c #3F4C65",
+"N%	c #38475F",
+"O%	c #68768E",
+"P%	c #6E7C92",
+"Q%	c #78879B",
+"R%	c #959FB1",
+"S%	c #AAB4C1",
+"T%	c #C4CBD8",
+"U%	c #D7DCE6",
+"V%	c #D3D9E1",
+"W%	c #CCD3DC",
+"X%	c #8C9CB4",
+"Y%	c #52627B",
+"Z%	c #38475E",
+"`%	c #080E1A",
+" &	c #060910",
+".&	c #0E0F14",
+"+&	c #4F5869",
+"@&	c #B6B8BC",
+"#&	c #DDDDDC",
+"$&	c #E2E2E1",
+"%&	c #E5E5E4",
+"&&	c #E6E6E5",
+"*&	c #F2F1F1",
+"=&	c #F2F1F0",
+"-&	c #93A8C2",
+";&	c #2F3E56",
+">&	c #6C7A93",
+",&	c #939EAE",
+"'&	c #A9B3C0",
+")&	c #BDC3CB",
+"!&	c #C8CCD2",
+"~&	c #CDCFD5",
+"{&	c #CBD2DB",
+"]&	c #C7CFDC",
+"^&	c #A4B2C7",
+"/&	c #4C576D",
+"(&	c #262C3C",
+"_&	c #252D3B",
+":&	c #232C3D",
+"<&	c #323B4B",
+"[&	c #464B5A",
+"}&	c #959697",
+"|&	c #BDBDBC",
+"1&	c #C9C9C9",
+"2&	c #D6D6D5",
+"3&	c #E2E2E0",
+"4&	c #E7E7E6",
+"5&	c #E6E6E4",
+"6&	c #C8D6E7",
+"7&	c #515D76",
+"8&	c #33415A",
+"9&	c #66728A",
+"0&	c #C0C7D2",
+"a&	c #CACED7",
+"b&	c #CCCDD2",
+"c&	c #CBCED1",
+"d&	c #C8CED3",
+"e&	c #C2CDDB",
+"f&	c #A2B1C5",
+"g&	c #586377",
+"h&	c #181F27",
+"i&	c #363B40",
+"j&	c #575857",
+"k&	c #626261",
+"l&	c #656463",
+"m&	c #787877",
+"n&	c #929291",
+"o&	c #9F9F9D",
+"p&	c #B0B0AE",
+"q&	c #C3C3C2",
+"r&	c #D1D1D0",
+"s&	c #DCDCDB",
+"t&	c #DFE4EB",
+"u&	c #5F708B",
+"v&	c #717E92",
+"w&	c #4F5E78",
+"x&	c #8391A4",
+"y&	c #A9B4C2",
+"z&	c #B1BBC5",
+"A&	c #BAC3CE",
+"B&	c #D5DDE8",
+"C&	c #9EA7B9",
+"D&	c #444D63",
+"E&	c #1F242F",
+"F&	c #2D2F33",
+"G&	c #424242",
+"H&	c #4D4D4D",
+"I&	c #515150",
+"J&	c #575756",
+"K&	c #60605F",
+"L&	c #747473",
+"M&	c #838381",
+"N&	c #989897",
+"O&	c #B3B3B2",
+"P&	c #C6C6C4",
+"Q&	c #D3D3D2",
+"R&	c #F0EFEE",
+"S&	c #D0D1D3",
+"T&	c #959FB4",
+"U&	c #5B697E",
+"V&	c #9DA7B7",
+"W&	c #D8DEE4",
+"X&	c #D4DAE1",
+"Y&	c #DBE1E5",
+"Z&	c #DBDDE3",
+"`&	c #818894",
+" *	c #1E293A",
+".*	c #1B222B",
+"+*	c #222425",
+"@*	c #313131",
+"#*	c #343434",
+"$*	c #363635",
+"%*	c #3A3A3A",
+"&*	c #40403F",
+"**	c #484847",
+"=*	c #585858",
+"-*	c #6B6B6A",
+";*	c #838382",
+">*	c #A5A5A3",
+",*	c #BCBCBA",
+"'*	c #CFCFCE",
+")*	c #EFEFEF",
+"!*	c #E3E3E2",
+"~*	c #D9D9D8",
+"{*	c #BCBCBB",
+"]*	c #9DA0A4",
+"^*	c #616678",
+"/*	c #2F3A4F",
+"(*	c #2C3649",
+"_*	c #394250",
+":*	c #111923",
+"<*	c #010613",
+"[*	c #0A0F16",
+"}*	c #1F2225",
+"|*	c #262628",
+"1*	c #282828",
+"2*	c #292828",
+"3*	c #292929",
+"4*	c #2D2D2C",
+"5*	c #2F2F2F",
+"6*	c #343433",
+"7*	c #3D3D3C",
+"8*	c #5C5C5C",
+"9*	c #A1A1A0",
+"0*	c #B9B9B8",
+"a*	c #CECECC",
+"b*	c #E4E4E2",
+"c*	c #D7D7D5",
+"d*	c #989896",
+"e*	c #717174",
+"f*	c #464B51",
+"g*	c #2F353C",
+"h*	c #23272C",
+"i*	c #222529",
+"j*	c #25272A",
+"k*	c #2E2F31",
+"l*	c #313030",
+"m*	c #313130",
+"n*	c #333332",
+"o*	c #363636",
+"p*	c #3C3C3C",
+"q*	c #545454",
+"r*	c #686867",
+"s*	c #848483",
+"t*	c #A8A8A7",
+"u*	c #C0C0BE",
+"v*	c #D3D3D1",
+"w*	c #D9D9D7",
+"x*	c #C0C0BF",
+"y*	c #A3A3A2",
+"z*	c #888886",
+"A*	c #6E6D6C",
+"B*	c #5F6061",
+"C*	c #585859",
+"D*	c #525252",
+"E*	c #A3A3A1",
+"F*	c #A2A2A0",
+"G*	c #A2A1A0",
+"H*	c #A2A2A1",
+"I*	c #A3A2A1",
+"J*	c #A4A3A2",
+"K*	c #A4A4A2",
+"L*	c #A6A6A4",
+"M*	c #A9A8A6",
+"N*	c #ABAAA8",
+"O*	c #AFAEAB",
+"P*	c #B3B1AE",
+"Q*	c #B5B4B1",
+"R*	c #B8B6B2",
+"S*	c #BAB8B4",
+"T*	c #6E6B62",
+"U*	c #DEDEDC",
+"V*	c #D1D1CF",
+"W*	c #BFBFBE",
+"X*	c #AFAFAF",
+"Y*	c #9F9F9F",
+"Z*	c #919190",
+"`*	c #888888",
+" =	c #302E28",
+".=	c #2E2C27",
+"+=	c #2D2B26",
+"@=	c #312F29",
+"#=	c #33312B",
+"$=	c #36332D",
+"%=	c #38362F",
+"&=	c #3D3A33",
+"*=	c #413E36",
+"==	c #47433B",
+"-=	c #4D4940",
+";=	c #514D44",
+">=	c #535046",
+",=	c #565248",
+"'=	c #23211D",
+")=	c #EBEAE9",
+"!=	c #DADAD9",
+"~=	c #C9C9C7",
+"{=	c #B6B6B6",
+"]=	c #B2B0AD",
+"^=	c #423F37",
+"/=	c #E3E2E1",
+"(=	c #4E4B44",
+"_=	c #403D36",
+":=	c #413E37",
+"<=	c #908E8A",
+"[=	c #46433B",
+"}=	c #D8D7D5",
+"|=	c #75726A",
+"1=	c #ACAAA5",
+"2=	c #D7D6D3",
+"3=	c #DBDAD8",
+"4=	c #86837C",
+"5=	c #D5D5D4",
+"6=	c #B6B5B1",
+"7=	c #4E4A41",
+"8=	c #D5D4D2",
+"9=	c #514E46",
+"0=	c #5E5B52",
+"a=	c #504D43",
+"b=	c #545147",
+"c=	c #8A8780",
+"d=	c #E3E3E1",
+"e=	c #D2D1CE",
+"f=	c #7B7770",
+"g=	c #58544A",
+"h=	c #7C7971",
+"i=	c #E7E7E5",
+"j=	c #CCCBC8",
+"k=	c #C4C2BF",
+"l=	c #C4C3BF",
+"m=	c #FBFAFA",
+"n=	c #817E76",
+"o=	c #D1D0CD",
+"p=	c #67635A",
+"q=	c #F5F4F4",
+"r=	c #67645B",
+"s=	c #908E87",
+"t=	c #E5E4E3",
+"u=	c #6F6C63",
+"v=	c #8B8881",
+"w=	c #C0BEBA",
+"x=	c #8C8982",
+"y=	c #C8C7C4",
+"z=	c #656259",
+"A=	c #77736B",
+"B=	c #E4E4E3",
+"C=	c #D3D2CF",
+"D=	c #76736B",
+"E=	c #59554B",
+"F=	c #E7E6E5",
+"G=	c #AFADA8",
+"H=	c #DFDFDD",
+"I=	c #D0CFCC",
+"J=	c #736F67",
+"K=	c #A9A9A7",
+"L=	c #8D8D8D",
+"M=	c #E1E1DF",
+"N=	c #9A9A9A",
+"O=	c #8C8C8C",
+"  . . . . . . . . . . . . . + @ # + . . . . . . . . . . . . . . . . . $ %                       ",
+". & * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * = - ; .                   ",
+". * * * * * * * * * * * * * * * * * * * > * * , , , , , , , , , , , , ' = ) ! .                 ",
+". * * * * * * ~ * * { ] ^ / ( _ : < * * * , [ [ , , , , , , , , , , , } | * 1 2 .               ",
+". * * * * * * ~ * * 3 4 5 6 7 8 9 0 * , , , , , , , , , , , , , , , , } a * * ) b c             ",
+". * * * * * * * * * d e f g h i j k , , , , , l , , , , , , , , , m m = n * m * o p q           ",
+". * * * * * * * * * * r s t u v w x , , , , , l , , y z A m m m m m m B C * D E * F G .         ",
+". * * * * * * * * * * H I J K L M N , , , , l m z O P Q R S T ' E E E U V W X F n Y Z ` .       ",
+". * * * * * * * * m  ...+. at ., #.$.%., , , , &.*.=.-.;.>.,.'.).!.~.E d {.].^./.(._._.:.<..       ",
+". * * * * [. .m * }.|.1.2.3.4.5.6.7.8.m 9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.! p.q.r.s.t.u..       ",
+". * * , n.v.w.x.y.z.A.B.C.D.E.F.G.H.I.m J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.D ' } } Y.Z.Z `.s..       ",
+". * * ,  +.+++ at +#+$+%+&+*+=+E -+;+>+,+,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+} X.1+2+3+3+3+4+<..       ",
+". * * , 5+6+7+8+9+0+1 a+b+c+E d+e+` f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+= } 3+3+B B o.o.w+.       ",
+". * , , 9.x+y+z+A+B+c+E E E E E E d C+D+E+F+G+l+m+H+I+J+K+L+M+N+O+P+Q+B B B U {.o.R+R+C .       ",
+". * m m m S+T+U+V+W+X.E E d ' ' ' ' X+Y+Z+`+ @I+. at .@+@^+@@#@$@%@&@*@=@o.U {.R+R+R+- at -@C .       ",
+". * m #.E ' ;@>@,@'@5+' ' ' ' 5+5+m.)@!@~@{@]@^@/@(@_@:@<@[@}@|@1 at 2@3@{.R+R+n.n.- at 4@4 at C .       ",
+". * E ' 5 at 6@7 at 8@9 at 0@} ' 5+5+m.m.m.a at b@c at d@l+e at f@g at h@i at j@k at l@m at n@o at p@q at n.n.-@r at 4@4 at s@s at C .       ",
+". * d [.t at u@v at w@x@{.m.m.m.m.m.[.m.y at z@A at B@C at D@E at F@G at H@I at J@K at L@M at N@O at P@- at -@r at s@s@< Q at R@C .       ",
+". * ' S at T@U at V@W at X@m.m.[.[.[.D Y at Z@`@ #.#+#@#D@##$#%#&#*#=#-#;#>#,#'#)#4@!#< < Q@~#~#{#C .       ",
+". * 5+3+]#^#/#(#_#[.D :#<#D X.[#}#|#1#2#3#f at 4#5#6#7#8#9#0#a#b#c#d#e#f#< < g#g#~#{#h#h#C .       ",
+". * m.X.i#j#k#l#m#D n#o#p#q#} r#s#t#u#v#w#^@x#y#z#A#B#C#D#E#F#G#H#I#J#|+~#~#{#h#h#W K#C .       ",
+". * [.L#M#N#[#O#O#1+P#Q#R#S#1+T#U#V#W#X#Y#Z#`# $.$+$@$#$$$%$&$*$=$-$;$>${#h#4+4+K#K#K#C .       ",
+". * D ,$X.Y@[#[#} '$)$!$~${$3+]$^$/$($_$:$<$[$}$|$1$2$3$4$5$6$7$8$9$0$a$4+4+K#K#b$b$b$C .       ",
+". * [#[#[#n#c$d$e$f$g$h$i$j${.k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$D$E$K#F$b$b$b$G$H$C .       ",
+". * X.1+I$J$K$L$M$N$O$< P$Q$R$S$T$U$V$W$X$Y$Z$`$ %.%+%@%#%$%%%&%*%=%-%;%b$b$b$G$>%>%,%C .       ",
+". * = = '%)%!%~%{%]%^%o.R+R+{./%(%_%:%<%[%}%|%1%2%3%4%5%6%7%8%9%0%a%b%c%d%>%>%>%,%,%,%C .       ",
+". * 2+2+2+e%f%g%h%i%j%R+- at 1 - at k%l%m%n%o%p%q%r%s%t%u%v%w%x%y%z%A%B%C%D%E%F%F%>%,%F%F%G%C .       ",
+". * 3+U {.{.H%I%J%K%- at 4@4 at 4@4 at L%M%N%O%P%Q%R%S%T%U%V%W%X%Y%Z%`% &.&+&@&#&$&%&&&F%G%G%G%C .       ",
+". * {.{.R+n.*&=&=&4 at 4@4 at s@< Q at -&M%;&>&,&'&)&!&~&{&]&^&/&(&_&:&<&[&}&|&1&2&#&3&4&4&4&5&C .       ",
+". * n.- at -@- at -@4 at 4@s@< < < ~#b$6&7&8&9&0&a&b&c&d&e&f&g&h&i&j&k&l&m&n&o&p&q&r&s&4&5&5&%&C .       ",
+". * - at -@- at 4@< < < < < Q at R@G$%&t&u&v&w&x&y&z&A&B&C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&%&%&%&%&C .       ",
+". * 1 4@< < j%R&Q at Q@R@~#h#&&P$S&T&U&V&W&X&Y&Z&`& *.*+*@*#*$*%*&***=*-*;*>*,*'*%&=+=+=+C .       ",
+". * < < )*Q at Q@Q at R@~#~#K#G$!*~*{*]*^*/*(*_*:*<*[*}*|*1*2*3*4*5*6*7*>@8*m&9*0*a*=+=+=+b*C .       ",
+". * Q at Q@Q at Q@R@~#{#K#K#K#>%!*c*,*d*e*f*g*h*i*j*k*l*m*5*@*@*n*o*p*u.q*r*s*t*u*v*=+=+b*b*C .       ",
+". * Q at Q@~#~#{#K#K#K#K#b$>%!*w*x*y*z*A*B*C*D*E*F*F*F*G*F*H*I*J*K*L*M*N*O*P*Q*R*S*S*S*S*S*S*S*S*T*",
+". * ~#~#4+K#K#F$b$b$b$b$H$5&U*V*W*X*Y*N&Z*`*N* =.=+=+=.= =@=#=$=%=&=*===-=;=>=,=,=,=,=,=,=,=,='=",
+". * 4+K#F$)=)=)=b$d%d%G$H$G%b*!=H%~=x*{*0*{=]=^=* /=(=_=:=<=* * [=* * * m.}=|=,=1=2=D X.3=4=,='=",
+". * F$b$b$b$d%G$G$G$G$H$H$G%5&3&#&~*5=Q&Q&H%6=7=* * 8=9=0={.* * a=* * b=c=* d=,=e=f=g=h=* R+,='=",
+". * d%d%G$G$G$G$G$H$H$G%G%G%G%i=i=i=i=i=&&5&S*,=* j=* k=l=j=* * ,=* * ,=g=* m=,=,=,=,=n=* o=,='=",
+". * G$G$G$H$H$>%>%F%G%G%G%i=i=i=i=i=5&5&=+=+S*,=* p={.* q=r=* * ,=* * ,=s=* o=,=,=,=* * t=u=,='=",
+". * H$>%>%>%>%F%G%G%4&4&i=i=i=i=5&5&=+=+=+=+S*,=* ,=v=w=x=,=* * ,=* * * m#y=z=,=,=,=,=A=* )=,='=",
+". * >%>%>%G%4&4&4&4&i=i=i=&&&&5&=+=+=+=+B=B=S*,=* ,=,=,=,=,=* * ,=* * ,=,=,=,=,=C=D=E=4=* F=,='=",
+". * ,%4&4&4&4&i=i=i=&&&&&&5&=+=+=+B=B=b*b*b*S*,=* ,=,=,=,=,=* * ,=* * ,=,=,=,=,=G=H=m=q#I=J=,='=",
+". * 4&i=i=i=&&&&&&&&5&5&=+B=B=B=b*b*b*b*b*b*S*,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,=,='=",
+". * i=&&&&&&5&5&5&5&B=B=b*b*b*b*b*b*b*b*b*d=T*'='='='='='='='='='='='='='='='='='='='='='='='='=",
+". * &&5&5&5&5&%&B=b*b*b*b*b*b*b*b*b*b*d=d=d=d=K=p p p y*y*y*y*E*E*E*E*E*E*E*E*E*E*E*E*L=.       ",
+". & 5&5&5&=+b*b*b*b*b*b*b*b*b*b*!*d=d=d=d=d=d=d=d=3&3&3&3&M=M=M=M=M=M=M=M=M=M=M=M=M=M=N=.       ",
+". Y C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C N=O=.       ",
+"  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .       ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                "};

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/mpg123.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/mpg123.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/mpg123.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,1220 @@
+#include "mpg123.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <libbeep/util.h>
+#include <libbeep/configdb.h>
+#include <libbeep/vfs.h>
+#include <libbeep/titlestring.h>
+
+#include "beep/util.h"
+
+
+#define CPU_HAS_MMX() (cpu_fflags & 0x800000)
+#define CPU_HAS_3DNOW() (cpu_efflags & 0x80000000)
+
+
+static const long outscale = 32768;
+
+static struct frame fr, temp_fr;
+
+PlayerInfo *mpg123_info = NULL;
+static GThread *decode_thread;
+
+static gboolean audio_error = FALSE, output_opened = FALSE, dopause = FALSE;
+gint mpg123_bitrate, mpg123_frequency, mpg123_length, mpg123_layer,
+    mpg123_lsf;
+gchar *mpg123_title = NULL, *mpg123_filename = NULL;
+static int disp_bitrate, skip_frames = 0;
+static int cpu_fflags, cpu_efflags;
+gboolean mpg123_stereo, mpg123_mpeg25;
+int mpg123_mode;
+
+gchar **mpg123_id3_encoding_list = NULL;
+
+const char *mpg123_id3_genres[GENRE_MAX] = {
+    N_("Blues"), N_("Classic Rock"), N_("Country"), N_("Dance"),
+    N_("Disco"), N_("Funk"), N_("Grunge"), N_("Hip-Hop"),
+    N_("Jazz"), N_("Metal"), N_("New Age"), N_("Oldies"),
+    N_("Other"), N_("Pop"), N_("R&B"), N_("Rap"), N_("Reggae"),
+    N_("Rock"), N_("Techno"), N_("Industrial"), N_("Alternative"),
+    N_("Ska"), N_("Death Metal"), N_("Pranks"), N_("Soundtrack"),
+    N_("Euro-Techno"), N_("Ambient"), N_("Trip-Hop"), N_("Vocal"),
+    N_("Jazz+Funk"), N_("Fusion"), N_("Trance"), N_("Classical"),
+    N_("Instrumental"), N_("Acid"), N_("House"), N_("Game"),
+    N_("Sound Clip"), N_("Gospel"), N_("Noise"), N_("AlternRock"),
+    N_("Bass"), N_("Soul"), N_("Punk"), N_("Space"),
+    N_("Meditative"), N_("Instrumental Pop"),
+    N_("Instrumental Rock"), N_("Ethnic"), N_("Gothic"),
+    N_("Darkwave"), N_("Techno-Industrial"), N_("Electronic"),
+    N_("Pop-Folk"), N_("Eurodance"), N_("Dream"),
+    N_("Southern Rock"), N_("Comedy"), N_("Cult"),
+    N_("Gangsta Rap"), N_("Top 40"), N_("Christian Rap"),
+    N_("Pop/Funk"), N_("Jungle"), N_("Native American"),
+    N_("Cabaret"), N_("New Wave"), N_("Psychedelic"), N_("Rave"),
+    N_("Showtunes"), N_("Trailer"), N_("Lo-Fi"), N_("Tribal"),
+    N_("Acid Punk"), N_("Acid Jazz"), N_("Polka"), N_("Retro"),
+    N_("Musical"), N_("Rock & Roll"), N_("Hard Rock"), N_("Folk"),
+    N_("Folk/Rock"), N_("National Folk"), N_("Swing"),
+    N_("Fast-Fusion"), N_("Bebob"), N_("Latin"), N_("Revival"),
+    N_("Celtic"), N_("Bluegrass"), N_("Avantgarde"),
+    N_("Gothic Rock"), N_("Progressive Rock"),
+    N_("Psychedelic Rock"), N_("Symphonic Rock"), N_("Slow Rock"),
+    N_("Big Band"), N_("Chorus"), N_("Easy Listening"),
+    N_("Acoustic"), N_("Humour"), N_("Speech"), N_("Chanson"),
+    N_("Opera"), N_("Chamber Music"), N_("Sonata"), N_("Symphony"),
+    N_("Booty Bass"), N_("Primus"), N_("Porn Groove"),
+    N_("Satire"), N_("Slow Jam"), N_("Club"), N_("Tango"),
+    N_("Samba"), N_("Folklore"), N_("Ballad"), N_("Power Ballad"),
+    N_("Rhythmic Soul"), N_("Freestyle"), N_("Duet"),
+    N_("Punk Rock"), N_("Drum Solo"), N_("A Cappella"),
+    N_("Euro-House"), N_("Dance Hall"), N_("Goa"),
+    N_("Drum & Bass"), N_("Club-House"), N_("Hardcore"),
+    N_("Terror"), N_("Indie"), N_("BritPop"), N_("Negerpunk"),
+    N_("Polsk Punk"), N_("Beat"), N_("Christian Gangsta Rap"),
+    N_("Heavy Metal"), N_("Black Metal"), N_("Crossover"),
+    N_("Contemporary Christian"), N_("Christian Rock"),
+    N_("Merengue"), N_("Salsa"), N_("Thrash Metal"),
+    N_("Anime"), N_("JPop"), N_("Synthpop")
+};
+
+double
+mpg123_compute_tpf(struct frame *fr)
+{
+    const int bs[4] = { 0, 384, 1152, 1152 };
+    double tpf;
+
+    tpf = bs[fr->lay];
+    tpf /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf);
+    return tpf;
+}
+
+static void
+set_synth_functions(struct frame *fr)
+{
+    typedef int (*func) (real *, int, unsigned char *, int *);
+    typedef int (*func_mono) (real *, unsigned char *, int *);
+    typedef void (*func_dct36) (real *, real *, real *, real *, real *);
+
+    int ds = fr->down_sample;
+    int p8 = 0;
+
+    static func funcs[][3] = {
+        {mpg123_synth_1to1,
+         mpg123_synth_2to1,
+         mpg123_synth_4to1},
+        {mpg123_synth_1to1_8bit,
+         mpg123_synth_2to1_8bit,
+         mpg123_synth_4to1_8bit},
+#ifdef USE_SIMD
+        {mpg123_synth_1to1_mmx,
+         mpg123_synth_2to1,
+         mpg123_synth_4to1},
+        {mpg123_synth_1to1_3dnow,
+         mpg123_synth_2to1,
+         mpg123_synth_4to1}
+#endif
+    };
+
+    static func_mono funcs_mono[2][4] = {
+        {mpg123_synth_1to1_mono,
+         mpg123_synth_2to1_mono,
+         mpg123_synth_4to1_mono},
+        {mpg123_synth_1to1_8bit_mono,
+         mpg123_synth_2to1_8bit_mono,
+         mpg123_synth_4to1_8bit_mono}
+    };
+
+#ifdef USE_SIMD
+    static func_dct36 funcs_dct36[2] = { mpg123_dct36, dct36_3dnow };
+#endif
+
+    if (mpg123_cfg.resolution == 8)
+        p8 = 1;
+    fr->synth = funcs[p8][ds];
+    fr->synth_mono = funcs_mono[p8][ds];
+    fr->synth_type = SYNTH_FPU;
+
+#ifdef USE_SIMD
+    fr->dct36 = funcs_dct36[0];
+
+    if (CPU_HAS_3DNOW() && !p8 &&
+        (mpg123_cfg.default_synth == SYNTH_3DNOW ||
+         mpg123_cfg.default_synth == SYNTH_AUTO)) {
+        fr->synth = funcs[3][ds];   /* 3DNow! optimized synth_1to1() */
+        fr->dct36 = funcs_dct36[1]; /* 3DNow! optimized dct36() */
+        fr->synth_type = SYNTH_3DNOW;
+    }
+    else if (CPU_HAS_MMX() && !p8 &&
+             (mpg123_cfg.default_synth == SYNTH_MMX ||
+              mpg123_cfg.default_synth == SYNTH_AUTO)) {
+        fr->synth = funcs[2][ds];   /* MMX optimized synth_1to1() */
+        fr->synth_type = SYNTH_MMX;
+    }
+#endif
+    if (p8) {
+        mpg123_make_conv16to8_table();
+    }
+}
+
+static void
+init(void)
+{
+    ConfigDb *db;
+
+    mpg123_make_decode_tables(outscale);
+
+    mpg123_cfg.resolution = 16;
+    mpg123_cfg.channels = 2;
+    mpg123_cfg.downsample = 0;
+    mpg123_cfg.http_buffer_size = 128;
+    mpg123_cfg.http_prebuffer = 25;
+    mpg123_cfg.proxy_port = 8080;
+    mpg123_cfg.proxy_use_auth = FALSE;
+    mpg123_cfg.proxy_user = NULL;
+    mpg123_cfg.proxy_pass = NULL;
+    mpg123_cfg.use_udp_channel = TRUE;
+    mpg123_cfg.title_override = FALSE;
+    mpg123_cfg.disable_id3v2 = FALSE;
+    mpg123_cfg.detect_by = DETECT_EXTENSION;
+    mpg123_cfg.default_synth = SYNTH_AUTO;
+
+    mpg123_cfg.title_encoding_enabled = FALSE;
+    mpg123_cfg.title_encoding = NULL;
+
+    db = bmp_cfg_db_open();
+
+    bmp_cfg_db_get_int(db, "MPG123", "resolution", &mpg123_cfg.resolution);
+    bmp_cfg_db_get_int(db, "MPG123", "channels", &mpg123_cfg.channels);
+    bmp_cfg_db_get_int(db, "MPG123", "downsample", &mpg123_cfg.downsample);
+    bmp_cfg_db_get_int(db, "MPG123", "http_buffer_size",
+                       &mpg123_cfg.http_buffer_size);
+    bmp_cfg_db_get_int(db, "MPG123", "http_prebuffer",
+                       &mpg123_cfg.http_prebuffer);
+    bmp_cfg_db_get_bool(db, "MPG123", "save_http_stream",
+                        &mpg123_cfg.save_http_stream);
+    if (!bmp_cfg_db_get_string
+        (db, "MPG123", "save_http_path", &mpg123_cfg.save_http_path))
+        mpg123_cfg.save_http_path = g_strdup(g_get_home_dir());
+
+    bmp_cfg_db_get_bool(db, "MPG123", "use_udp_channel",
+                        &mpg123_cfg.use_udp_channel);
+
+    bmp_cfg_db_get_bool(db, "MPG123", "use_proxy", &mpg123_cfg.use_proxy);
+    if (!bmp_cfg_db_get_string
+        (db, "MPG123", "proxy_host", &mpg123_cfg.proxy_host))
+        mpg123_cfg.proxy_host = g_strdup("localhost");
+    bmp_cfg_db_get_int(db, "MPG123", "proxy_port", &mpg123_cfg.proxy_port);
+    bmp_cfg_db_get_bool(db, "MPG123", "proxy_use_auth",
+                        &mpg123_cfg.proxy_use_auth);
+    bmp_cfg_db_get_string(db, "MPG123", "proxy_user", &mpg123_cfg.proxy_user);
+    bmp_cfg_db_get_string(db, "MPG123", "proxy_pass", &mpg123_cfg.proxy_pass);
+
+    bmp_cfg_db_get_bool(db, "MPG123", "title_override",
+                        &mpg123_cfg.title_override);
+    bmp_cfg_db_get_bool(db, "MPG123", "disable_id3v2",
+                        &mpg123_cfg.disable_id3v2);
+    if (!bmp_cfg_db_get_string
+        (db, "MPG123", "id3_format", &mpg123_cfg.id3_format))
+        mpg123_cfg.id3_format = g_strdup("%p - %t");
+    bmp_cfg_db_get_int(db, "MPG123", "detect_by", &mpg123_cfg.detect_by);
+    bmp_cfg_db_get_int(db, "MPG123", "default_synth",
+                       &mpg123_cfg.default_synth);
+
+    bmp_cfg_db_get_bool(db, "MPG123", "title_encoding_enabled", &mpg123_cfg.title_encoding_enabled);
+    bmp_cfg_db_get_string(db, "MPG123", "title_encoding", &mpg123_cfg.title_encoding);
+    if (mpg123_cfg.title_encoding_enabled)
+        mpg123_id3_encoding_list = g_strsplit_set(mpg123_cfg.title_encoding, ENCODING_SEPARATOR, 0);
+
+    bmp_cfg_db_close(db);
+
+    if (mpg123_cfg.resolution != 16 && mpg123_cfg.resolution != 8)
+        mpg123_cfg.resolution = 16;
+
+    mpg123_cfg.channels = CLAMP(mpg123_cfg.channels, 0, 2);
+    mpg123_cfg.downsample = CLAMP(mpg123_cfg.downsample, 0, 2);
+    mpg123_getcpuflags(&cpu_fflags, &cpu_efflags);
+}
+
+static void
+cleanup(void)
+{
+    g_strfreev(mpg123_id3_encoding_list);
+}
+
+/* needed for is_our_file() */
+static int
+read_n_bytes(VFSFile * file, guint8 * buf, int n)
+{
+
+    if (vfs_fread(buf, 1, n, file) != n) {
+        return FALSE;
+    }
+    return TRUE;
+}
+
+static guint32
+convert_to_header(guint8 * buf)
+{
+
+    return (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + buf[3];
+}
+
+static guint32
+convert_to_long(guint8 * buf)
+{
+
+    return (buf[3] << 24) + (buf[2] << 16) + (buf[1] << 8) + buf[0];
+}
+
+static guint16
+read_wav_id(char *filename)
+{
+    VFSFile *file;
+    guint16 wavid;
+    guint8 buf[4];
+    guint32 head;
+    long seek;
+
+    if (!(file = vfs_fopen(filename, "rb"))) {  /* Could not open file */
+        return 0;
+    }
+    if (!(read_n_bytes(file, buf, 4))) {
+        vfs_fclose(file);
+        return 0;
+    }
+    head = convert_to_header(buf);
+    if (head == ('R' << 24) + ('I' << 16) + ('F' << 8) + 'F') { /* Found a riff -- maybe WAVE */
+        if (vfs_fseek(file, 4, SEEK_CUR) != 0) {    /* some error occured */
+            vfs_fclose(file);
+            return 0;
+        }
+        if (!(read_n_bytes(file, buf, 4))) {
+            vfs_fclose(file);
+            return 0;
+        }
+        head = convert_to_header(buf);
+        if (head == ('W' << 24) + ('A' << 16) + ('V' << 8) + 'E') { /* Found a WAVE */
+            seek = 0;
+            do {
+/* we'll be looking for the fmt-chunk which comes before the data-chunk */
+/* A chunk consists of an header identifier (4 bytes), the length of the chunk
+   (4 bytes), and the chunkdata itself, padded to be an even number of bytes.
+   We'll skip all chunks until we find the "data"-one which could contain
+   mpeg-data */
+                if (seek != 0) {
+                    if (vfs_fseek(file, seek, SEEK_CUR) != 0) { /* some error occured */
+                        vfs_fclose(file);
+                        return 0;
+                    }
+                }
+                if (!(read_n_bytes(file, buf, 4))) {
+                    vfs_fclose(file);
+                    return 0;
+                }
+                head = convert_to_header(buf);
+                if (!(read_n_bytes(file, buf, 4))) {
+                    vfs_fclose(file);
+                    return 0;
+                }
+                seek = convert_to_long(buf);
+                seek = seek + (seek % 2);   /* Has to be even (padding) */
+                if (seek >= 2
+                    && head == ('f' << 24) + ('m' << 16) + ('t' << 8) + ' ') {
+                    if (!(read_n_bytes(file, buf, 2))) {
+                        vfs_fclose(file);
+                        return 0;
+                    }
+                    wavid = buf[0] + 256 * buf[1];
+                    seek -= 2;
+                    /* we could go on looking for
+                       other things, but all we
+                       wanted was the wavid */
+                    vfs_fclose(file);
+                    return wavid;
+                }
+            }
+            while (head != ('d' << 24) + ('a' << 16) + ('t' << 8) + 'a');
+            /* it's RIFF WAVE */
+        }
+        /* it's RIFF */
+    }
+    /* it's not even RIFF */
+    vfs_fclose(file);
+    return 0;
+}
+
+#define DET_BUF_SIZE 1024
+
+static gboolean
+mpg123_detect_by_content(char *filename)
+{
+    VFSFile *file;
+    guchar tmp[4];
+    guint32 head;
+    struct frame fr;
+    guchar buf[DET_BUF_SIZE];
+    int in_buf, i;
+    gboolean ret = FALSE;
+
+    if ((file = vfs_fopen(filename, "rb")) == NULL)
+        return FALSE;
+    if (vfs_fread(tmp, 1, 4, file) != 4)
+        goto done;
+    head = convert_to_header(tmp);
+    while (!mpg123_head_check(head)) {
+        /*
+         * The mpeg-stream can start anywhere in the file,
+         * so we check the entire file
+         */
+        /* Optimize this */
+        in_buf = vfs_fread(buf, 1, DET_BUF_SIZE, file);
+        if (in_buf == 0)
+            goto done;
+
+        for (i = 0; i < in_buf; i++) {
+            head <<= 8;
+            head |= buf[i];
+            if (mpg123_head_check(head)) {
+                vfs_fseek(file, i + 1 - in_buf, SEEK_CUR);
+                break;
+            }
+        }
+    }
+    if (mpg123_decode_header(&fr, head)) {
+        /*
+         * We found something which looks like a MPEG-header.
+         * We check the next frame too, to be sure
+         */
+
+        if (vfs_fseek(file, fr.framesize, SEEK_CUR) != 0)
+            goto done;
+        if (vfs_fread(tmp, 1, 4, file) != 4)
+            goto done;
+        head = convert_to_header(tmp);
+        if (mpg123_head_check(head) && mpg123_decode_header(&fr, head))
+            ret = TRUE;
+    }
+
+  done:
+    vfs_fclose(file);
+    return ret;
+}
+
+static int
+is_our_file(char *filename)
+{
+    char *ext;
+    guint16 wavid;
+
+    /* FIXME: wtf? */
+    /* We assume all http:// (except those ending in .ogg) are mpeg --
+     * why do we do that? */
+    if (!strncasecmp(filename, "http://", 7)) { 
+        ext = strrchr(filename, '.');
+        if (ext) {
+            if (!strncasecmp(ext, ".ogg", 4))
+                return FALSE;
+            if (!strncasecmp(ext, ".rm", 3) ||
+                !strncasecmp(ext, ".ra", 3) ||
+                !strncasecmp(ext, ".rpm", 4) || 
+                !strncasecmp(ext, ".ram", 4))
+                return FALSE;
+        }
+        return TRUE;
+    }
+    if (mpg123_cfg.detect_by == DETECT_CONTENT)
+        return (mpg123_detect_by_content(filename));
+
+    ext = strrchr(filename, '.');
+    if (ext) {
+        if (!strncasecmp(ext, ".mp2", 4) || !strncasecmp(ext, ".mp3", 4)) {
+            return TRUE;
+        }
+        if (!strncasecmp(ext, ".wav", 4)) {
+            wavid = read_wav_id(filename);
+            if (wavid == 85 || wavid == 80) {   /* Microsoft says 80, files say 85... */
+                return TRUE;
+            }
+        }
+    }
+
+    if (mpg123_cfg.detect_by == DETECT_BOTH)
+        return (mpg123_detect_by_content(filename));
+    return FALSE;
+}
+
+static void
+play_frame(struct frame *fr)
+{
+    if (fr->error_protection) {
+        bsi.wordpointer += 2;
+        /*  mpg123_getbits(16); *//* skip crc */
+    }
+    if (!fr->do_layer(fr)) {
+        skip_frames = 2;
+        mpg123_info->output_audio = FALSE;
+    }
+    else {
+        if (!skip_frames)
+            mpg123_info->output_audio = TRUE;
+        else
+            skip_frames--;
+    }
+}
+
+static const char *
+get_id3_genre(unsigned char genre_code)
+{
+    if (genre_code < GENRE_MAX)
+        return gettext(mpg123_id3_genres[genre_code]);
+
+    return "";
+}
+
+guint
+mpg123_strip_spaces(char *src, size_t n)
+/* strips trailing spaces from string of length n
+   returns length of adjusted string */
+{
+    gchar *space = NULL,        /* last space in src */
+        *start = src;
+
+    while (n--)
+        switch (*src++) {
+        case '\0':
+            n = 0;              /* breaks out of while loop */
+
+            src--;
+            break;
+        case ' ':
+            if (space == NULL)
+                space = src - 1;
+            break;
+        default:
+            space = NULL;       /* don't terminate intermediate spaces */
+
+            break;
+        }
+    if (space != NULL) {
+        src = space;
+        *src = '\0';
+    }
+    return src - start;
+}
+
+/*
+ * Function extname (filename)
+ *
+ *    Return pointer within filename to its extenstion, or NULL if
+ *    filename has no extension.
+ *
+ */
+static gchar *
+extname(const char *filename)
+{
+    gchar *ext = strrchr(filename, '.');
+
+    if (ext != NULL)
+        ++ext;
+
+    return ext;
+}
+
+/*
+ * Function id3v1_to_id3v2 (v1, v2)
+ *
+ *    Convert ID3v1 tag `v1' to ID3v2 tag `v2'.
+ *
+ */
+void
+mpg123_id3v1_to_id3v2(struct id3v1tag_t *v1, struct id3tag_t *v2)
+{
+    memset(v2, 0, sizeof(struct id3tag_t));
+    strncpy(v2->title, v1->title, 30);
+    strncpy(v2->artist, v1->artist, 30);
+    strncpy(v2->album, v1->album, 30);
+    strncpy(v2->comment, v1->u.v1_0.comment, 30);
+    strncpy(v2->genre, get_id3_genre(v1->genre), sizeof(v2->genre));
+    g_strstrip(v2->title);
+    g_strstrip(v2->artist);
+    g_strstrip(v2->album);
+    g_strstrip(v2->comment);
+    g_strstrip(v2->genre);
+    v2->year = atoi(v1->year);
+
+    /* Check for v1.1 tags. */
+    if (v1->u.v1_1.__zero == 0)
+        v2->track_number = v1->u.v1_1.track_number;
+    else
+        v2->track_number = 0;
+}
+
+static char *
+mpg123_getstr(char *str)
+{
+    if (str && strlen(str) > 0)
+        return str;
+    return NULL;
+}
+
+static gchar *
+convert_id3_title(gchar * title)
+{
+    gchar **encoding = mpg123_id3_encoding_list;
+    gchar *new_title = NULL;
+
+    if (g_utf8_validate(title, -1, NULL))
+        return title;
+
+    while (*encoding && !new_title) {
+        new_title = g_convert(title, strlen(title), "UTF-8", *encoding++,
+                              NULL, NULL, NULL);
+    }
+
+    if (new_title) {
+        g_free(title);
+        return new_title;
+    }
+
+    /* FIXME: We're relying on BMP core to provide fallback
+     * conversion */
+    return title;
+}
+
+/*
+ * Function mpg123_format_song_title (tag, filename)
+ *
+ *    Create song title according to `tag' and/or `filename' and
+ *    return it.  The title must be subsequently freed using g_free().
+ *
+ */
+gchar *
+mpg123_format_song_title(struct id3tag_t * tag, gchar * filename)
+{
+    gchar *title = NULL;
+    TitleInput *input;
+
+    input = bmp_title_input_new();
+
+    if (tag) {
+        input->performer = mpg123_getstr(tag->artist);
+        input->album_name = mpg123_getstr(tag->album);
+        input->track_name = mpg123_getstr(tag->title);
+        input->year = tag->year;
+        input->track_number = tag->track_number;
+        input->genre = mpg123_getstr(tag->genre);
+        input->comment = mpg123_getstr(tag->comment);
+    }
+
+    input->file_name = g_path_get_basename(filename);
+    input->file_path = g_path_get_dirname(filename);
+    input->file_ext = extname(filename);
+
+    title = xmms_get_titlestring(mpg123_cfg.title_override ?
+                                 mpg123_cfg.id3_format :
+                                 xmms_get_gentitle_format(), input);
+
+    if (!title) {
+        /* Format according to filename.  */
+        title = g_path_get_basename(filename);
+        if (extname(title))
+            *(extname(title) - 1) = '\0';   /* removes period */
+    }
+
+    g_free(input->file_path);
+    g_free(input->file_name);
+    g_free(input);
+
+    if (mpg123_cfg.title_encoding_enabled)
+        title = convert_id3_title(title);
+
+    return title;
+}
+
+/*
+ * Function mpg123_get_id3v2 (id3d, tag)
+ *
+ *    Get desired contents from the indicated id3tag and store it in
+ *    `tag'. 
+ *
+ */
+void
+mpg123_get_id3v2(struct id3_tag *id3d, struct id3tag_t *tag)
+{
+    struct id3_frame *id3frm;
+    gchar *txt;
+    gint tlen, num;
+
+#define ID3_SET(_tid,_fld)                                              \
+{                                                                       \
+        id3frm = id3_get_frame( id3d, _tid, 1 );                        \
+        if (id3frm) {                                                   \
+                txt = _tid == ID3_TCON ? id3_get_content(id3frm)        \
+                    : id3_get_text(id3frm);                             \
+                if(txt)                                                 \
+                {                                                       \
+                        tlen = strlen(txt);                             \
+                        if ( tlen >= sizeof(tag->_fld) )                \
+                                tlen = sizeof(tag->_fld)-1;             \
+                        strncpy( tag->_fld, txt, tlen );                \
+                        tag->_fld[tlen] = 0;                            \
+                        g_free(txt);                                    \
+                }                                                       \
+                else                                                    \
+                        tag->_fld[0] = 0;                               \
+        } else {                                                        \
+                tag->_fld[0] = 0;                                       \
+        }                                                               \
+}
+
+#define ID3_SET_NUM(_tid,_fld)                          \
+{                                                       \
+        id3frm = id3_get_frame(id3d, _tid, 1);          \
+        if (id3frm) {                                   \
+                num = id3_get_text_number(id3frm);      \
+                tag->_fld = num >= 0 ? num : 0;         \
+        } else                                          \
+                tag->_fld = 0;                          \
+}
+
+    ID3_SET(ID3_TIT2, title);
+    ID3_SET(ID3_TPE1, artist);
+    if (strlen(tag->artist) == 0)
+        ID3_SET(ID3_TPE2, artist);
+    ID3_SET(ID3_TALB, album);
+    ID3_SET_NUM(ID3_TYER, year);
+    ID3_SET_NUM(ID3_TRCK, track_number);
+    ID3_SET(ID3_COMM, comment);
+    ID3_SET(ID3_TCON, genre);
+}
+
+
+/*
+ * Function get_song_title (fd, filename)
+ *
+ *    Get song title of file.  File position of `fd' will be
+ *    clobbered.  `fd' may be NULL, in which case `filename' is opened
+ *    separately.  The returned song title must be subsequently freed
+ *    using g_free().
+ *
+ */
+static gchar *
+get_song_title(VFSFile * fd, char *filename)
+{
+    VFSFile *file = fd;
+    char *ret = NULL;
+    struct id3v1tag_t id3v1tag;
+    struct id3tag_t id3tag;
+
+    if (file || (file = vfs_fopen(filename, "rb")) != 0) {
+        struct id3_tag *id3 = NULL;
+
+        /*
+         * Try reading ID3v2 tag.
+         */
+        if (!mpg123_cfg.disable_id3v2) {
+            vfs_fseek(file, 0, SEEK_SET);
+            id3 = id3_open_fp(file, 0);
+            if (id3) {
+                mpg123_get_id3v2(id3, &id3tag);
+                ret = mpg123_format_song_title(&id3tag, filename);
+                id3_close(id3);
+            }
+        }
+
+        /*
+         * Try reading ID3v1 tag.
+         */
+        if (!id3 && (vfs_fseek(file, -1 * sizeof(id3v1tag), SEEK_END) == 0) &&
+            (vfs_fread(&id3v1tag, 1, sizeof(id3v1tag), file) ==
+             sizeof(id3v1tag)) && (strncmp(id3v1tag.tag, "TAG", 3) == 0)) {
+            mpg123_id3v1_to_id3v2(&id3v1tag, &id3tag);
+            ret = mpg123_format_song_title(&id3tag, filename);
+        }
+
+        if (!fd)
+            /*
+             * File was opened in this function.
+             */
+            vfs_fclose(file);
+    }
+
+    if (ret == NULL)
+        /*
+         * Unable to get ID3 tag.
+         */
+        ret = mpg123_format_song_title(NULL, filename);
+
+    return ret;
+}
+
+static long
+get_song_length(VFSFile * file)
+{
+    int len;
+    char tmp[4];
+
+    vfs_fseek(file, 0, SEEK_END);
+    len = vfs_ftell(file);
+    vfs_fseek(file, -128, SEEK_END);
+    vfs_fread(tmp, 1, 3, file);
+    if (!strncmp(tmp, "TAG", 3))
+        len -= 128;
+    return len;
+}
+
+
+static guint
+get_song_time(VFSFile * file)
+{
+    guint32 head;
+    guchar tmp[4], *buf;
+    struct frame frm;
+    xing_header_t xing_header;
+    double tpf, bpf;
+    guint32 len;
+
+    if (!file)
+        return -1;
+
+    vfs_fseek(file, 0, SEEK_SET);
+    if (vfs_fread(tmp, 1, 4, file) != 4)
+        return 0;
+    head = convert_to_header(tmp);
+    while (!mpg123_head_check(head)) {
+        head <<= 8;
+        if (vfs_fread(tmp, 1, 1, file) != 1)
+            return 0;
+        head |= tmp[0];
+    }
+    if (mpg123_decode_header(&frm, head)) {
+        buf = g_malloc(frm.framesize + 4);
+        vfs_fseek(file, -4, SEEK_CUR);
+        vfs_fread(buf, 1, frm.framesize + 4, file);
+        tpf = mpg123_compute_tpf(&frm);
+        if (mpg123_get_xing_header(&xing_header, buf)) {
+            g_free(buf);
+            if (xing_header.bytes == 0)
+                xing_header.bytes = get_song_length(file);
+            return (tpf * xing_header.frames * 1000);
+        }
+        g_free(buf);
+        bpf = mpg123_compute_bpf(&frm);
+        len = get_song_length(file);
+        return ((guint) (len / bpf) * tpf * 1000);
+    }
+    return 0;
+}
+
+static void
+get_song_info(char *filename, char **title_real, int *len_real)
+{
+    VFSFile *file;
+
+    (*len_real) = -1;
+    (*title_real) = NULL;
+
+    /*
+     * TODO: Getting song info from http streams.
+     */
+    if (!strncasecmp(filename, "http://", 7))
+        return;
+
+    if ((file = vfs_fopen(filename, "rb")) != NULL) {
+        (*len_real) = get_song_time(file);
+        (*title_real) = get_song_title(file, filename);
+        vfs_fclose(file);
+    }
+}
+
+static int
+open_output(void)
+{
+    int r;
+    AFormat fmt = mpg123_cfg.resolution == 16 ? FMT_S16_NE : FMT_U8;
+    int freq = mpg123_freqs[fr.sampling_frequency] >> mpg123_cfg.downsample;
+    int channels = mpg123_cfg.channels == 2 ? fr.stereo : 1;
+    r = mpg123_ip.output->open_audio(fmt, freq, channels);
+
+    if (r && dopause) {
+        mpg123_ip.output->pause(TRUE);
+        dopause = FALSE;
+    }
+
+    return r;
+}
+
+
+static int
+mpg123_seek(struct frame *fr, xing_header_t * xh, gboolean vbr, int time)
+{
+    int jumped = -1;
+
+    if (xh) {
+        int percent = ((double) time * 100.0) /
+            (mpg123_info->num_frames * mpg123_info->tpf);
+        int byte = mpg123_seek_point(xh, percent);
+        jumped = mpg123_stream_jump_to_byte(fr, byte);
+    }
+    else if (vbr && mpg123_length > 0) {
+        int byte = ((guint64) time * 1000 * mpg123_info->filesize) /
+            mpg123_length;
+        jumped = mpg123_stream_jump_to_byte(fr, byte);
+    }
+    else {
+        int frame = time / mpg123_info->tpf;
+        jumped = mpg123_stream_jump_to_frame(fr, frame);
+    }
+
+    return jumped;
+}
+
+
+static void *
+decode_loop(void *arg)
+{
+    gboolean have_xing_header = FALSE, vbr = FALSE;
+    int disp_count = 0, temp_time;
+    char *filename = arg;
+    xing_header_t xing_header;
+
+    /* This is used by fileinfo on http streams */
+    mpg123_bitrate = 0;
+
+    mpg123_pcm_sample = g_malloc0(32768);
+    mpg123_pcm_point = 0;
+    mpg123_filename = filename;
+
+    mpg123_read_frame_init();
+
+    mpg123_open_stream(filename, -1);
+
+    if (mpg123_info->eof || !mpg123_read_frame(&fr))
+        mpg123_info->eof = TRUE;
+
+    if (!mpg123_info->eof && mpg123_info->going) {
+        if (mpg123_cfg.channels == 2)
+            fr.single = -1;
+        else
+            fr.single = 3;
+
+        fr.down_sample = mpg123_cfg.downsample;
+        fr.down_sample_sblimit = SBLIMIT >> mpg123_cfg.downsample;
+        set_synth_functions(&fr);
+        mpg123_init_layer3(fr.down_sample_sblimit);
+
+        mpg123_info->tpf = mpg123_compute_tpf(&fr);
+        if (strncasecmp(filename, "http://", 7)) {
+            if (mpg123_stream_check_for_xing_header(&fr, &xing_header)) {
+                mpg123_info->num_frames = xing_header.frames;
+                have_xing_header = TRUE;
+                mpg123_read_frame(&fr);
+            }
+        }
+
+        for (;;) {
+            memcpy(&temp_fr, &fr, sizeof(struct frame));
+            if (!mpg123_read_frame(&temp_fr)) {
+                mpg123_info->eof = TRUE;
+                break;
+            }
+            if (fr.lay != temp_fr.lay ||
+                fr.sampling_frequency != temp_fr.sampling_frequency ||
+                fr.stereo != temp_fr.stereo || fr.lsf != temp_fr.lsf)
+                memcpy(&fr, &temp_fr, sizeof(struct frame));
+            else
+                break;
+        }
+
+        if (!have_xing_header && strncasecmp(filename, "http://", 7))
+            mpg123_info->num_frames = mpg123_calc_numframes(&fr);
+
+        memcpy(&fr, &temp_fr, sizeof(struct frame));
+        mpg123_bitrate = tabsel_123[fr.lsf][fr.lay - 1][fr.bitrate_index];
+        disp_bitrate = mpg123_bitrate;
+        mpg123_frequency = mpg123_freqs[fr.sampling_frequency];
+        mpg123_stereo = fr.stereo;
+        mpg123_layer = fr.lay;
+        mpg123_lsf = fr.lsf;
+        mpg123_mpeg25 = fr.mpeg25;
+        mpg123_mode = fr.mode;
+
+        if (strncasecmp(filename, "http://", 7)) {
+            mpg123_length = mpg123_info->num_frames * mpg123_info->tpf * 1000;
+            if (!mpg123_title)
+                mpg123_title = get_song_title(NULL, filename);
+        }
+        else {
+            if (!mpg123_title)
+                mpg123_title = mpg123_http_get_title(filename);
+            mpg123_length = -1;
+        }
+
+        mpg123_ip.set_info(mpg123_title, mpg123_length,
+                           mpg123_bitrate * 1000,
+                           mpg123_freqs[fr.sampling_frequency], fr.stereo);
+
+        output_opened = TRUE;
+
+        if (!open_output()) {
+            audio_error = TRUE;
+            mpg123_info->eof = TRUE;
+        }
+        else
+            play_frame(&fr);
+    }
+
+    mpg123_info->first_frame = FALSE;
+    while (mpg123_info->going) {
+        if (mpg123_info->jump_to_time != -1) {
+            void *xp = NULL;
+            if (have_xing_header)
+                xp = &xing_header;
+            if (mpg123_seek(&fr, xp, vbr, mpg123_info->jump_to_time) > -1) {
+                mpg123_ip.output->flush(mpg123_info->jump_to_time * 1000);
+                mpg123_info->eof = FALSE;
+            }
+            mpg123_info->jump_to_time = -1;
+        }
+        if (!mpg123_info->eof) {
+            if (mpg123_read_frame(&fr) != 0) {
+                if (fr.lay != mpg123_layer || fr.lsf != mpg123_lsf) {
+                    memcpy(&temp_fr, &fr, sizeof(struct frame));
+                    if (mpg123_read_frame(&temp_fr) != 0) {
+                        if (fr.lay == temp_fr.lay && fr.lsf == temp_fr.lsf) {
+                            mpg123_layer = fr.lay;
+                            mpg123_lsf = fr.lsf;
+                            memcpy(&fr, &temp_fr, sizeof(struct frame));
+                        }
+                        else {
+                            memcpy(&fr, &temp_fr, sizeof(struct frame));
+                            skip_frames = 2;
+                            mpg123_info->output_audio = FALSE;
+                            continue;
+                        }
+
+                    }
+                }
+                if (mpg123_freqs[fr.sampling_frequency] != mpg123_frequency
+                    || mpg123_stereo != fr.stereo) {
+                    memcpy(&temp_fr, &fr, sizeof(struct frame));
+                    if (mpg123_read_frame(&temp_fr) != 0) {
+                        if (fr.sampling_frequency ==
+                            temp_fr.sampling_frequency
+                            && temp_fr.stereo == fr.stereo) {
+                            mpg123_ip.output->buffer_free();
+                            mpg123_ip.output->buffer_free();
+                            while (mpg123_ip.output->buffer_playing()
+                                   && mpg123_info->going
+                                   && mpg123_info->jump_to_time == -1)
+                                xmms_usleep(20000);
+                            if (!mpg123_info->going)
+                                break;
+                            temp_time = mpg123_ip.output->output_time();
+                            mpg123_ip.output->close_audio();
+                            mpg123_frequency =
+                                mpg123_freqs[fr.sampling_frequency];
+                            mpg123_stereo = fr.stereo;
+                            if (!mpg123_ip.output->
+                                open_audio(mpg123_cfg.resolution ==
+                                           16 ? FMT_S16_NE : FMT_U8,
+                                           mpg123_freqs[fr.sampling_frequency]
+                                           >> mpg123_cfg.downsample,
+                                           mpg123_cfg.channels ==
+                                           2 ? fr.stereo : 1)) {
+                                audio_error = TRUE;
+                                mpg123_info->eof = TRUE;
+                            }
+                            mpg123_ip.output->flush(temp_time);
+                            mpg123_ip.set_info(mpg123_title, mpg123_length,
+                                               mpg123_bitrate * 1000,
+                                               mpg123_frequency,
+                                               mpg123_stereo);
+                            memcpy(&fr, &temp_fr, sizeof(struct frame));
+                        }
+                        else {
+                            memcpy(&fr, &temp_fr, sizeof(struct frame));
+                            skip_frames = 2;
+                            mpg123_info->output_audio = FALSE;
+                            continue;
+                        }
+                    }
+                }
+
+                if (tabsel_123[fr.lsf][fr.lay - 1][fr.bitrate_index] !=
+                    mpg123_bitrate)
+                    mpg123_bitrate =
+                        tabsel_123[fr.lsf][fr.lay - 1][fr.bitrate_index];
+
+                if (!disp_count) {
+                    disp_count = 20;
+                    if (mpg123_bitrate != disp_bitrate) {
+                        /* FIXME networks streams */
+                        disp_bitrate = mpg123_bitrate;
+                        if (!have_xing_header
+                            && strncasecmp(filename, "http://", 7)) {
+                            double rel = mpg123_relative_pos();
+                            if (rel) {
+                                mpg123_length =
+                                    mpg123_ip.output->written_time() / rel;
+                                vbr = TRUE;
+                            }
+
+                            if (rel == 0 || !(mpg123_length > 0)) {
+                                mpg123_info->num_frames =
+                                    mpg123_calc_numframes(&fr);
+                                mpg123_info->tpf = mpg123_compute_tpf(&fr);
+                                mpg123_length =
+                                    mpg123_info->num_frames *
+                                    mpg123_info->tpf * 1000;
+                            }
+
+
+                        }
+                        mpg123_ip.set_info(mpg123_title, mpg123_length,
+                                           mpg123_bitrate * 1000,
+                                           mpg123_frequency, mpg123_stereo);
+                    }
+                }
+                else
+                    disp_count--;
+                play_frame(&fr);
+            }
+            else {
+                mpg123_ip.output->buffer_free();
+                mpg123_ip.output->buffer_free();
+                mpg123_info->eof = TRUE;
+                xmms_usleep(10000);
+            }
+        }
+        else {
+            xmms_usleep(10000);
+        }
+    }
+    g_free(mpg123_title);
+    mpg123_title = NULL;
+    mpg123_stream_close();
+    if (output_opened && !audio_error)
+        mpg123_ip.output->close_audio();
+    g_free(mpg123_pcm_sample);
+    mpg123_filename = NULL;
+    g_free(filename);
+
+    return NULL;
+}
+
+static void
+play_file(char *filename)
+{
+    memset(&fr, 0, sizeof(struct frame));
+    memset(&temp_fr, 0, sizeof(struct frame));
+
+    mpg123_info = g_malloc0(sizeof(PlayerInfo));
+    mpg123_info->going = 1;
+    mpg123_info->first_frame = TRUE;
+    mpg123_info->output_audio = TRUE;
+    mpg123_info->jump_to_time = -1;
+    skip_frames = 0;
+    audio_error = FALSE;
+    output_opened = FALSE;
+    dopause = FALSE;
+
+    decode_thread = g_thread_create(decode_loop, g_strdup(filename), TRUE,
+                                    NULL);
+}
+
+static void
+stop(void)
+{
+    if (mpg123_info && mpg123_info->going) {
+        mpg123_info->going = FALSE;
+        g_thread_join(decode_thread);
+        g_free(mpg123_info);
+        mpg123_info = NULL;
+    }
+}
+
+static void
+seek(int time)
+{
+    mpg123_info->jump_to_time = time;
+
+    while (mpg123_info->jump_to_time != -1)
+        xmms_usleep(10000);
+}
+
+static void
+do_pause(short p)
+{
+    if (output_opened)
+        mpg123_ip.output->pause(p);
+    else
+        dopause = p;
+}
+
+static int
+get_time(void)
+{
+    if (audio_error)
+        return -2;
+    if (!mpg123_info)
+        return -1;
+    if (!mpg123_info->going
+        || (mpg123_info->eof && !mpg123_ip.output->buffer_playing()))
+        return -1;
+    return mpg123_ip.output->output_time();
+}
+
+static void
+aboutbox(void)
+{
+    static GtkWidget *aboutbox;
+
+    if (aboutbox != NULL)
+        return;
+
+    aboutbox = xmms_show_message(_("About MPEG Audio Plugin"),
+                                 _("mpg123 decoding engine by Michael Hipp <mh at mpg123.de>\n"
+                                  "Plugin by The XMMS team"),
+                                 _("Ok"),
+                                 FALSE, NULL, NULL);
+
+    g_signal_connect(G_OBJECT(aboutbox), "destroy",
+                     G_CALLBACK(gtk_widget_destroyed), &aboutbox);
+}
+
+InputPlugin mpg123_ip = {
+    NULL,
+    NULL,
+    NULL,                       /* Description */
+    init,
+    aboutbox,
+    mpg123_configure,
+    is_our_file,
+    NULL,
+    play_file,
+    stop,
+    do_pause,
+    seek,
+    mpg123_set_eq,
+    get_time,
+    NULL, NULL,
+    cleanup,
+    NULL,
+    NULL, NULL, NULL,
+    get_song_info,
+    mpg123_file_info_box,       /* file_info_box */
+    NULL
+};
+
+InputPlugin *
+get_iplugin_info(void)
+{
+    mpg123_ip.description = g_strdup_printf(_("MPEG Audio Plugin"));
+    return &mpg123_ip;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/mpg123.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/mpg123.h	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/mpg123.h	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,303 @@
+/*
+ * mpg123 defines 
+ * used source: musicout.h from mpegaudio package
+ */
+
+#ifndef __MPG123_H__
+#define __MPG123_H__
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include <glib.h>
+
+
+enum {
+    SYNTH_AUTO,
+    SYNTH_FPU,
+    SYNTH_3DNOW,
+    SYNTH_MMX,
+};
+
+enum {
+    DETECT_EXTENSION,
+    DETECT_CONTENT,
+    DETECT_BOTH
+};
+
+#include <gtk/gtk.h>
+
+#include "beep/plugin.h"
+#include "dxhead.h"
+#include "xmms-id3.h"
+
+#define real float
+
+#define         SBLIMIT                 32
+#define         SCALE_BLOCK             12
+#define         SSLIMIT                 18
+
+#define         MPG_MD_STEREO           0
+#define         MPG_MD_JOINT_STEREO     1
+#define         MPG_MD_DUAL_CHANNEL     2
+#define         MPG_MD_MONO             3
+
+#define         ENCODING_SEPARATOR      " ,:;|/"
+
+struct id3v1tag_t {
+    char tag[3];                /* always "TAG": defines ID3v1 tag 128 bytes before EOF */
+    char title[30];
+    char artist[30];
+    char album[30];
+    char year[4];
+    union {
+        struct {
+            char comment[30];
+        } v1_0;
+        struct {
+            char comment[28];
+            char __zero;
+            unsigned char track_number;
+        } v1_1;
+    } u;
+    unsigned char genre;
+};
+
+struct id3tag_t {
+    char title[64];
+    char artist[64];
+    char album[64];
+    char comment[256];
+    char genre[256];
+    gint year;
+    gint track_number;
+};
+
+typedef struct {
+    int going, num_frames, eof, jump_to_time, eq_active;
+    int songtime;
+    double tpf;
+    float eq_mul[576];
+    gboolean output_audio, first_frame, network_stream;
+    guint32 filesize;           /* Filesize without junk */
+} PlayerInfo;
+
+void mpg123_set_eq(int on, float preamp, float *band);
+void mpg123_file_info_box(char *);
+
+extern PlayerInfo *mpg123_info;
+extern InputPlugin mpg123_ip;
+
+struct al_table {
+    short bits;
+    short d;
+};
+
+struct frame {
+    struct al_table *alloc;
+    int (*synth) (real *, int, unsigned char *, int *);
+    int (*synth_mono) (real *, unsigned char *, int *);
+#ifdef USE_SIMD
+    void (*dct36) (real *, real *, real *, real *, real *);
+#endif
+    int stereo;
+    int jsbound;
+    int single;
+    int II_sblimit;
+    int down_sample_sblimit;
+    int lsf;
+    int mpeg25;
+    int down_sample;
+    int header_change;
+    int lay;
+    int (*do_layer) (struct frame * fr);
+    int error_protection;
+    int bitrate_index;
+    int sampling_frequency;
+    int padding;
+    int extension;
+    int mode;
+    int mode_ext;
+    int copyright;
+    int original;
+    int emphasis;
+    int framesize;              /* computed framesize */
+    int synth_type;
+};
+
+void mpg123_configure(void);
+
+typedef struct {
+    gint resolution;
+    gint channels;
+    gint downsample;
+    gint http_buffer_size;
+    gint http_prebuffer;
+    gboolean use_proxy;
+    gchar *proxy_host;
+    gint proxy_port;
+    gboolean proxy_use_auth;
+    gchar *proxy_user, *proxy_pass;
+    gboolean save_http_stream;
+    gchar *save_http_path;
+    gboolean use_udp_channel;
+    gchar *id3_format;
+    gboolean title_override, disable_id3v2;
+    gboolean title_encoding_enabled;
+    gchar *title_encoding;
+    int detect_by;
+    int default_synth;
+} MPG123Config;
+
+extern MPG123Config mpg123_cfg;
+
+struct bitstream_info {
+    int bitindex;
+    unsigned char *wordpointer;
+};
+
+extern struct bitstream_info bsi;
+
+/* ------ Declarations from "http.c" ------ */
+
+extern int mpg123_http_open(char *url);
+int mpg123_http_read(gpointer data, gint length);
+void mpg123_http_close(void);
+char *mpg123_http_get_title(char *url);
+int mpg123_http_get_length(void);
+void mpg123_http_seek(long pos);
+
+/* ------ Declarations from "common.c" ------ */
+extern unsigned int mpg123_get1bit(void);
+extern unsigned int mpg123_getbits(int);
+extern unsigned int mpg123_getbits_fast(int);
+
+extern void mpg123_open_stream(char *bs_filenam, int fd);
+extern int mpg123_head_check(unsigned long);
+extern void mpg123_stream_close(void);
+
+extern void mpg123_set_pointer(long);
+
+extern unsigned char *mpg123_pcm_sample;
+extern int mpg123_pcm_point;
+
+struct gr_info_s {
+    int scfsi;
+    unsigned part2_3_length;
+    unsigned big_values;
+    unsigned scalefac_compress;
+    unsigned block_type;
+    unsigned mixed_block_flag;
+    unsigned table_select[3];
+    unsigned subblock_gain[3];
+    unsigned maxband[3];
+    unsigned maxbandl;
+    unsigned maxb;
+    unsigned region1start;
+    unsigned region2start;
+    unsigned preflag;
+    unsigned scalefac_scale;
+    unsigned count1table_select;
+    real *full_gain[3];
+    real *pow2gain;
+};
+
+struct III_sideinfo {
+    unsigned main_data_begin;
+    unsigned private_bits;
+    struct {
+        struct gr_info_s gr[2];
+    } ch[2];
+};
+
+extern void open_stream(char *, int fd);
+extern long mpg123_tell_stream(void);
+extern void mpg123_read_frame_init(void);
+extern int mpg123_read_frame(struct frame *fr);
+extern int mpg123_back_frame(struct frame *fr, int num);
+int mpg123_stream_jump_to_frame(struct frame *fr, int frame);
+int mpg123_stream_jump_to_byte(struct frame *fr, int byte);
+int mpg123_stream_check_for_xing_header(struct frame *fr,
+                                        xing_header_t * xhead);
+int mpg123_calc_numframes(struct frame *fr);
+
+extern int mpg123_do_layer3(struct frame *fr);
+extern int mpg123_do_layer2(struct frame *fr);
+extern int mpg123_do_layer1(struct frame *fr);
+
+extern int mpg123_synth_1to1(real *, int, unsigned char *, int *);
+extern int mpg123_synth_1to1_8bit(real *, int, unsigned char *, int *);
+extern int mpg123_synth_1to1_mono(real *, unsigned char *, int *);
+extern int mpg123_synth_1to1_mono2stereo(real *, unsigned char *, int *);
+extern int mpg123_synth_1to1_8bit_mono(real *, unsigned char *, int *);
+extern int mpg123_synth_1to1_8bit_mono2stereo(real *, unsigned char *,
+                                              int *);
+
+extern int mpg123_synth_2to1(real *, int, unsigned char *, int *);
+extern int mpg123_synth_2to1_8bit(real *, int, unsigned char *, int *);
+extern int mpg123_synth_2to1_mono(real *, unsigned char *, int *);
+extern int mpg123_synth_2to1_mono2stereo(real *, unsigned char *, int *);
+extern int mpg123_synth_2to1_8bit_mono(real *, unsigned char *, int *);
+extern int mpg123_synth_2to1_8bit_mono2stereo(real *, unsigned char *,
+                                              int *);
+
+extern int mpg123_synth_4to1(real *, int, unsigned char *, int *);
+extern int mpg123_synth_4to1_8bit(real *, int, unsigned char *, int *);
+extern int mpg123_synth_4to1_mono(real *, unsigned char *, int *);
+extern int mpg123_synth_4to1_mono2stereo(real *, unsigned char *, int *);
+extern int mpg123_synth_4to1_8bit_mono(real *, unsigned char *, int *);
+extern int mpg123_synth_4to1_8bit_mono2stereo(real *, unsigned char *,
+                                              int *);
+
+extern void mpg123_rewindNbits(int bits);
+extern int mpg123_hsstell(void);
+extern void mpg123_set_pointer(long);
+extern void mpg123_huffman_decoder(int, int *);
+extern void mpg123_huffman_count1(int, int *);
+extern int mpg123_get_songlen(struct frame *fr, int no);
+
+#ifdef USE_SIMD
+void mpg123_dct64_mmx(real *, real *, real *);
+int mpg123_synth_1to1_mmx(real *, int, unsigned char *, int *);
+
+void mpg123_dct36(real *, real *, real *, real *, real *);
+void dct36_3dnow(real *, real *, real *, real *, real *);
+int mpg123_synth_1to1_3dnow(real *, int, unsigned char *, int *);
+
+int mpg123_getcpuflags(guint32 * fflags, guint32 * efflags);
+#else
+#define mpg123_getcpuflags(a, b)		\
+do {						\
+	*(a) = 0;				\
+	*(b) = 0;				\
+} while (0)
+#endif
+
+void mpg123_init_layer3(int);
+void mpg123_init_layer2(gboolean);
+void mpg123_make_decode_tables(long scaleval);
+void mpg123_make_conv16to8_table(void);
+void mpg123_dct64(real *, real *, real *);
+
+int mpg123_decode_header(struct frame *fr, unsigned long newhead);
+double mpg123_compute_bpf(struct frame *fr);
+double mpg123_compute_tpf(struct frame *fr);
+guint mpg123_strip_spaces(char *src, size_t n);
+void mpg123_get_id3v2(struct id3_tag *id3d, struct id3tag_t *tag);
+gchar *mpg123_format_song_title(struct id3tag_t *tag, gchar * filename);
+double mpg123_relative_pos(void);
+
+
+extern gchar ** mpg123_id3_encoding_list;
+extern unsigned char *mpg123_conv16to8;
+extern const int mpg123_freqs[9];
+extern real mpg123_muls[27][64];
+extern real mpg123_decwin[512 + 32];
+extern real *mpg123_pnts[5];
+
+#define GENRE_MAX 0x94
+extern const char *mpg123_id3_genres[GENRE_MAX];
+extern const int tabsel_123[2][3][16];
+
+#endif

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/tabinit.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/tabinit.c	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/tabinit.c	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,153 @@
+
+#include <stdlib.h>
+#include <math.h>
+
+#include "mpg123.h"
+
+real mpg123_decwin[512 + 32];
+static real cos64[16], cos32[8], cos16[4], cos8[2], cos4[1];
+real *mpg123_pnts[] = { cos64, cos32, cos16, cos8, cos4 };
+
+static unsigned char *mpg123_conv16to8_buf = NULL;
+unsigned char *mpg123_conv16to8;
+
+static long intwinbase[] = {
+    0, -1, -1, -1, -1, -1, -1, -2, -2, -2,
+    -2, -3, -3, -4, -4, -5, -5, -6, -7, -7,
+    -8, -9, -10, -11, -13, -14, -16, -17, -19, -21,
+    -24, -26, -29, -31, -35, -38, -41, -45, -49, -53,
+    -58, -63, -68, -73, -79, -85, -91, -97, -104, -111,
+    -117, -125, -132, -139, -147, -154, -161, -169, -176, -183,
+    -190, -196, -202, -208, -213, -218, -222, -225, -227, -228,
+    -228, -227, -224, -221, -215, -208, -200, -189, -177, -163,
+    -146, -127, -106, -83, -57, -29, 2, 36, 72, 111,
+    153, 197, 244, 294, 347, 401, 459, 519, 581, 645,
+    711, 779, 848, 919, 991, 1064, 1137, 1210, 1283, 1356,
+    1428, 1498, 1567, 1634, 1698, 1759, 1817, 1870, 1919, 1962,
+    2001, 2032, 2057, 2075, 2085, 2087, 2080, 2063, 2037, 2000,
+    1952, 1893, 1822, 1739, 1644, 1535, 1414, 1280, 1131, 970,
+    794, 605, 402, 185, -45, -288, -545, -814, -1095, -1388,
+    -1692, -2006, -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788,
+    -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597, -7910, -8209,
+    -8491, -8755, -8998, -9219, -9416, -9585, -9727, -9838, -9916, -9959,
+    -9966, -9935, -9863, -9750, -9592, -9389, -9139, -8840, -8492, -8092,
+    -7640, -7134, -6574, -5959, -5288, -4561, -3776, -2935, -2037, -1082,
+    -70, 998, 2122, 3300, 4533, 5818, 7154, 8540, 9975, 11455,
+    12980, 14548, 16155, 17799, 19478, 21189, 22929, 24694, 26482, 28289,
+    30112, 31947, 33791, 35640, 37489, 39336, 41176, 43006, 44821, 46617,
+    48390, 50137, 51853, 53534, 55178, 56778, 58333, 59838, 61289, 62684,
+    64019, 65290, 66494, 67629, 68692, 69679, 70590, 71420, 72169, 72835,
+    73415, 73908, 74313, 74630, 74856, 74992, 75038
+};
+
+void mpg123_make_decode_tables_fpu(long scaleval);
+void mpg123_make_decode_tables_mmx(long scaleval);
+
+void
+mpg123_make_decode_tables_fpu(long scaleval)
+{
+    int i, j;
+    real *table, *costab;
+
+    for (i = 0; i < 5; i++) {
+        int kr = 0x10 >> i;
+        int divv = 0x40 >> i;
+        costab = mpg123_pnts[i];
+        for (j = 0; j < kr; j++)
+            costab[j] =
+                1.0 / (2.0 *
+                       cos(M_PI * ((double) j * 2.0 + 1.0) / (double) divv));
+    }
+
+    table = mpg123_decwin;
+    scaleval = -scaleval;
+    for (i = 0, j = 0; i < 256; i++, j++, table += 32) {
+        if (table < mpg123_decwin + 512 + 16)
+            table[16] = table[0] =
+                (double) intwinbase[j] / 65536.0 * (double) scaleval;
+        if (i % 32 == 31)
+            table -= 1023;
+        if (i % 64 == 63)
+            scaleval = -scaleval;
+    }
+
+    for ( /* i=256 */ ; i < 512; i++, j--, table += 32) {
+        if (table < mpg123_decwin + 512 + 16)
+            table[16] = table[0] =
+                (double) intwinbase[j] / 65536.0 * (double) scaleval;
+        if (i % 32 == 31)
+            table -= 1023;
+        if (i % 64 == 63)
+            scaleval = -scaleval;
+    }
+}
+
+#ifdef USE_SIMD
+
+gint16 mpg123_decwins[(512 + 32) * 2];
+
+void
+mpg123_make_decode_tables_mmx(long scaleval)
+{
+    int i, j, p, a;
+
+    scaleval = -scaleval;
+    a = 1;
+    for (i = 0, j = 0, p = 0; i < 512; i++, j += a, p += 32) {
+        if (p < 512 + 16) {
+            int val = ((gint64) intwinbase[j] * scaleval) >> 17;
+            val = CLAMP(val, -32767, 32767);
+            if (p < 512) {
+                int n = 1055 - p;
+                mpg123_decwins[n - 16] = val;
+                mpg123_decwins[n] = val;
+            }
+            if (!(p & 1))
+                val = -val;
+            mpg123_decwins[p + 16] = val;
+            mpg123_decwins[p] = val;
+        }
+        if (i % 32 == 31)
+            p -= 1023;
+        if (i % 64 == 63)
+            scaleval = -scaleval;
+        if (i == 256)
+            a = -1;
+    }
+}
+
+#else
+void
+mpg123_make_decode_tables_mmx(long scaleval)
+{
+}
+#endif
+
+void
+mpg123_make_decode_tables(long scaleval)
+{
+    mpg123_make_decode_tables_fpu(scaleval);
+    mpg123_make_decode_tables_mmx(scaleval);
+}
+
+
+
+
+void
+mpg123_make_conv16to8_table(void)
+{
+    int i;
+
+    /*
+     * ????: 8.0 is right but on SB cards '2.0' is a better value ???
+     */
+
+    if (!mpg123_conv16to8_buf) {
+        mpg123_conv16to8_buf = g_malloc(8192);
+        mpg123_conv16to8 = mpg123_conv16to8_buf + 4096;
+    }
+
+    for (i = -4096; i < 4096; i++) {
+        mpg123_conv16to8[i] = (i >> 5) + 128;
+    }
+}

Added: trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/xmms-id3.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/xmms-id3.h	2007-01-25 06:57:15 UTC (rev 610)
+++ trunk/src/target/OM-2007/applications/openmoko-simplemediaplayer/Input/mpg123/xmms-id3.h	2007-01-25 06:50:09 UTC (rev 611)
@@ -0,0 +1,367 @@
+/*********************************************************************
+ * 
+ *    Copyright (C) 1998, 1999, 2002,  Espen Skoglund
+ *    Department of Computer Science, University of Tromsø
+ * 
+ * Filename:      id3.h
+ * Description:   Include file for accessing the ID3 library.
+ * Author:        Espen Skoglund <espensk at stud.cs.uit.no>
+ * Created at:    Thu Nov  5 15:55:10 1998
+ *                
+ * $Id: xmms-id3.h,v 1.1 2004/07/20 21:47:22 descender Exp $
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *                
+ ********************************************************************/
+#ifndef ID3_H
+#define ID3_H
+
+#include <glib.h>
+#include <libbeep/vfs.h>
+
+/*
+ * Option flags to id3_open_*().
+ */
+#define ID3_OPENF_NONE		0x0000
+#define ID3_OPENF_NOCHK		0x0001
+#define ID3_OPENF_CREATE	0x0002
+
+
+/*
+ * The size of the read buffer used by file operations.
+ */
+#define ID3_FD_BUFSIZE	8192
+
+
+/*
+ * Structure describing the ID3 tag.
+ */
+struct id3_tag {
+    int id3_type;               /* Memory or file desriptor */
+    int id3_oflags;             /* Flags from open call */
+    int id3_flags;              /* Flags from tag header */
+    int id3_altered;            /* Set when tag has been altered */
+    int id3_newtag;             /* Set if this is a new tag */
+
+    int id3_version;            /* Major ID3 version number */
+    int id3_revision;           /* ID3 revision number */
+
+    int id3_tagsize;            /* Total size of ID3 tag */
+    int id3_pos;                /* Current position within tag */
+
+    char *id3_error_msg;        /* Last error message */
+
+    char id3_buffer[256];       /* Used for various strings */
+
+    union {
+        /*
+         * Memory specific fields.
+         */
+        struct {
+            void *id3_ptr;
+        } me;
+
+        /*
+         * File desc. specific fields.
+         */
+        struct {
+            int id3_fd;
+            void *id3_buf;
+        } fd;
+
+        /*
+         * File ptr. specific fields.
+         */
+        struct {
+            VFSFile *id3_fp;
+            void *id3_buf;
+        } fp;
+    } s;
+
+    /*
+     * Functions for doing operations within ID3 tag.
+     */
+    int (*id3_seek) (struct id3_tag *, int);
+    void *(*id3_read) (struct id3_tag *, void *, int);
+
+    /*
+     * Linked list of ID3 frames.
+     */
+    GList *id3_frame;
+};
+
+#define ID3_TYPE_NONE	0
+#define ID3_TYPE_MEM	1
+#define ID3_TYPE_FD	2
+#define ID3_TYPE_FP	3
+
+
+/*
+ * Structure describing an ID3 frame.
+ */
+struct id3_frame {
+    struct id3_tag *fr_owner;
+    struct id3_framedesc *fr_desc;
+    int fr_flags;
+    unsigned char fr_encryption;
+    unsigned char fr_grouping;
+    unsigned char fr_altered;
+
+    void *fr_data;              /* Pointer to frame data, excluding headers */
+    int fr_size;                /* Size of uncompressed frame */
+
+    void *fr_raw_data;          /* Frame data */
+    int fr_raw_size;            /* Frame size */
+
+    void *fr_data_z;            /* The decompressed compressed frame */
+    int fr_size_z;              /* Size of decompressed compressed frame */
+};
+
+
+/*
+ * Structure describing an ID3 frame type.
+ */
+struct id3_framedesc {
+    guint32 fd_id;
+    char fd_idstr[4];
+    char *fd_description;
+};
+
+
+/*
+ * Text encodings.
+ */
+#define ID3_ENCODING_ISO_8859_1	0x00
+#define ID3_ENCODING_UTF16	0x01
+#define ID3_ENCODING_UTF16BE	0x02
+#define ID3_ENCODING_UTF8	0x03
+
+
+
+/*
+ * ID3 frame id numbers.
+ */
+#define ID3_FRAME_ID(a,b,c,d)   ((a << 24) | (b << 16) | (c << 8) | d)
+
+#define ID3_AENC	ID3_FRAME_ID('A','E','N','C')
+#define ID3_APIC	ID3_FRAME_ID('A','P','I','C')
+#define ID3_ASPI	ID3_FRAME_ID('A','S','P','I')
+#define ID3_COMM	ID3_FRAME_ID('C','O','M','M')
+#define ID3_COMR	ID3_FRAME_ID('C','O','M','R')
+#define ID3_ENCR	ID3_FRAME_ID('E','N','C','R')
+#define ID3_EQUA	ID3_FRAME_ID('E','Q','U','A')
+#define ID3_EQU2	ID3_FRAME_ID('E','Q','U','2')
+#define ID3_ETCO	ID3_FRAME_ID('E','T','C','O')
+#define ID3_GEOB	ID3_FRAME_ID('G','E','O','B')
+#define ID3_GRID	ID3_FRAME_ID('G','R','I','D')
+#define ID3_IPLS	ID3_FRAME_ID('I','P','L','S')
+#define ID3_LINK	ID3_FRAME_ID('L','I','N','K')
+#define ID3_MCDI	ID3_FRAME_ID('M','C','D','I')
+#define ID3_MLLT	ID3_FRAME_ID('M','L','L','T')
+#define ID3_OWNE	ID3_FRAME_ID('O','W','N','E')
+#define ID3_PRIV	ID3_FRAME_ID('P','R','I','V')
+#define ID3_PCNT	ID3_FRAME_ID('P','C','N','T')
+#define ID3_POPM	ID3_FRAME_ID('P','O','P','M')
+#define ID3_POSS	ID3_FRAME_ID('P','O','S','S')
+#define ID3_RBUF	ID3_FRAME_ID('R','B','U','F')
+#define ID3_RVAD	ID3_FRAME_ID('R','V','A','D')
+#define ID3_RVA2	ID3_FRAME_ID('R','V','A','2')
+#define ID3_RVRB	ID3_FRAME_ID('R','V','R','B')
+#define ID3_SEEK	ID3_FRAME_ID('S','E','E','K')
+#define ID3_SIGN	ID3_FRAME_ID('S','I','G','N')
+#define ID3_SYLT	ID3_FRAME_ID('S','Y','L','T')
+#define ID3_SYTC	ID3_FRAME_ID('S','Y','T','C')
+#define ID3_TALB	ID3_FRAME_ID('T','A','L','B')
+#define ID3_TBPM	ID3_FRAME_ID('T','B','P','M')
+#define ID3_TCOM	ID3_FRAME_ID('T','C','O','M')
+#define ID3_TCON	ID3_FRAME_ID('T','C','O','N')
+#define ID3_TCOP	ID3_FRAME_ID('T','C','O','P')
+#define ID3_TDAT	ID3_FRAME_ID('T','D','A','T')
+#define ID3_TDEN	ID3_FRAME_ID('T','D','E','N')
+#define ID3_TDLY	ID3_FRAME_ID('T','D','L','Y')
+#define ID3_TDOR	ID3_FRAME_ID('T','D','O','R')
+#define ID3_TDRC	ID3_FRAME_ID('T','D','R','C')
+#define ID3_TDRL	ID3_FRAME_ID('T','D','R','L')
+#define ID3_TDTG	ID3_FRAME_ID('T','D','T','G')
+#define ID3_TENC	ID3_FRAME_ID('T','E','N','C')
+#define ID3_TEXT	ID3_FRAME_ID('T','E','X','T')
+#define ID3_TFLT	ID3_FRAME_ID('T','F','L','T')
+#define ID3_TIME	ID3_FRAME_ID('T','I','M','E')
+#define ID3_TIPL	ID3_FRAME_ID('T','I','P','L')
+#define ID3_TIT1	ID3_FRAME_ID('T','I','T','1')
+#define ID3_TIT2	ID3_FRAME_ID('T','I','T','2')
+#define ID3_TIT3	ID3_FRAME_ID('T','I','T','3')
+#define ID3_TKEY	ID3_FRAME_ID('T','K','E','Y')
+#define ID3_TLAN	ID3_FRAME_ID('T','L','A','N')
+#define ID3_TLEN	ID3_FRAME_ID('T','L','E','N')
+#define ID3_TMCL	ID3_FRAME_ID('T','M','C','L')
+#define ID3_TMED	ID3_FRAME_ID('T','M','E','D')
+#define ID3_TMOO	ID3_FRAME_ID('T','M','O','O')
+#define ID3_TOAL	ID3_FRAME_ID('T','O','A','L')
+#define ID3_TOFN	ID3_FRAME_ID('T','O','F','N')
+#define ID3_TOLY	ID3_FRAME_ID('T','O','L','Y')
+#define ID3_TOPE	ID3_FRAME_ID('T','O','P','E')
+#define ID3_TORY	ID3_FRAME_ID('T','O','R','Y')
+#define ID3_TOWN	ID3_FRAME_ID('T','O','W','N')
+#define ID3_TPE1	ID3_FRAME_ID('T','P','E','1')
+#define ID3_TPE2	ID3_FRAME_ID('T','P','E','2')
+#define ID3_TPE3	ID3_FRAME_ID('T','P','E','3')
+#define ID3_TPE4	ID3_FRAME_ID('T','P','E','4')
+#define ID3_TPOS	ID3_FRAME_ID('T','P','O','S')
+#define ID3_TPRO	ID3_FRAME_ID('T','P','R','O')
+#define ID3_TPUB	ID3_FRAME_ID('T','P','U','B')
+#define ID3_TRCK	ID3_FRAME_ID('T','R','C','K')
+#define ID3_TRDA	ID3_FRAME_ID('T','R','D','A')
+#define ID3_TRSN	ID3_FRAME_ID('T','R','S','N')
+#define ID3_TRSO	ID3_FRAME_ID('T','R','S','O')
+#define ID3_TSIZ	ID3_FRAME_ID('T','S','I','Z')
+#define ID3_TSOA	ID3_FRAME_ID('T','S','O','A')
+#define ID3_TSOP	ID3_FRAME_ID('T','S','O','P')
+#define ID3_TSOT	ID3_FRAME_ID('T','S','O','T')
+#define ID3_TSRC	ID3_FRAME_ID('T','S','R','C')
+#define ID3_TSSE	ID3_FRAME_ID('T','S','S','E')
+#define ID3_TSST	ID3_FRAME_ID('T','S','S','T')
+#define ID3_TYER	ID3_FRAME_ID('T','Y','E','R')
+#define ID3_TXXX	ID3_FRAME_ID('T','X','X','X')
+#define ID3_UFID	ID3_FRAME_ID('U','F','I','D')
+#define ID3_USER	ID3_FRAME_ID('U','S','E','R')
+#define ID3_USLT	ID3_FRAME_ID('U','S','L','T')
+#define ID3_WCOM	ID3_FRAME_ID('W','C','O','M')
+#define ID3_WCOP	ID3_FRAME_ID('W','C','O','P')
+#define ID3_WOAF	ID3_FRAME_ID('W','O','A','F')
+#define ID3_WOAR	ID3_FRAME_ID('W','O','A','R')
+#define ID3_WOAS	ID3_FRAME_ID('W','O','A','S')
+#define ID3_WORS	ID3_FRAME_ID('W','O','R','S')
+#define ID3_WPAY	ID3_FRAME_ID('W','P','A','Y')
+#define ID3_WPUB	ID3_FRAME_ID('W','P','U','B')
+#define ID3_WXXX	ID3_FRAME_ID('W','X','X','X')
+
+/*
+ * Version 2.2.0 
+ */
+
+#define ID3_FRAME_ID_22(a, b, c)   ((a << 16) | (b << 8) | c)
+
+#define ID3_BUF ID3_FRAME_ID_22('B', 'U', 'F')
+#define ID3_CNT ID3_FRAME_ID_22('C', 'N', 'T')
+#define ID3_COM ID3_FRAME_ID_22('C', 'O', 'M')
+#define ID3_CRA ID3_FRAME_ID_22('C', 'R', 'A')
+#define ID3_CRM ID3_FRAME_ID_22('C', 'R', 'M')
+#define ID3_ETC ID3_FRAME_ID_22('E', 'T', 'C')
+#define ID3_EQU ID3_FRAME_ID_22('E', 'Q', 'U')
+#define ID3_GEO ID3_FRAME_ID_22('G', 'E', 'O')
+#define ID3_IPL ID3_FRAME_ID_22('I', 'P', 'L')
+#define ID3_LNK ID3_FRAME_ID_22('L', 'N', 'K')
+#define ID3_MCI ID3_FRAME_ID_22('M', 'C', 'I')
+#define ID3_MLL ID3_FRAME_ID_22('M', 'L', 'L')
+#define ID3_PIC ID3_FRAME_ID_22('P', 'I', 'C')
+#define ID3_POP ID3_FRAME_ID_22('P', 'O', 'P')
+#define ID3_REV ID3_FRAME_ID_22('R', 'E', 'V')
+#define ID3_RVA ID3_FRAME_ID_22('R', 'V', 'A')
+#define ID3_SLT ID3_FRAME_ID_22('S', 'L', 'T')
+#define ID3_STC ID3_FRAME_ID_22('S', 'T', 'C')
+#define ID3_TAL ID3_FRAME_ID_22('T', 'A', 'L')
+#define ID3_TBP ID3_FRAME_ID_22('T', 'B', 'P')
+#define ID3_TCM ID3_FRAME_ID_22('T', 'C', 'M')
+#define ID3_TCO ID3_FRAME_ID_22('T', 'C', 'O')
+#define ID3_TCR ID3_FRAME_ID_22('T', 'C', 'R')
+#define ID3_TDA ID3_FRAME_ID_22('T', 'D', 'A')
+#define ID3_TDY ID3_FRAME_ID_22('T', 'D', 'Y')
+#define ID3_TEN ID3_FRAME_ID_22('T', 'E', 'N')
+#define ID3_TFT ID3_FRAME_ID_22('T', 'F', 'T')
+#define ID3_TIM ID3_FRAME_ID_22('T', 'I', 'M')
+#define ID3_TKE ID3_FRAME_ID_22('T', 'K', 'E')
+#define ID3_TLA ID3_FRAME_ID_22('T', 'L', 'A')
+#define ID3_TLE ID3_FRAME_ID_22('T', 'L', 'E')
+#define ID3_TMT ID3_FRAME_ID_22('T', 'M', 'T')
+#define ID3_TOA ID3_FRAME_ID_22('T', 'O', 'A')
+#define ID3_TOF ID3_FRAME_ID_22('T', 'O', 'F')
+#define ID3_TOL ID3_FRAME_ID_22('T', 'O', 'L')
+#define ID3_TOR ID3_FRAME_ID_22('T', 'O', 'R')
+#define ID3_TOT ID3_FRAME_ID_22('T', 'O', 'T')
+#define ID3_TP1 ID3_FRAME_ID_22('T', 'P', '1')
+#define ID3_TP2 ID3_FRAME_ID_22('T', 'P', '2')
+#define ID3_TP3 ID3_FRAME_ID_22('T', 'P', '3')
+#define ID3_TP4 ID3_FRAME_ID_22('T', 'P', '4')
+#define ID3_TPA ID3_FRAME_ID_22('T', 'P', 'A')
+#define ID3_TPB ID3_FRAME_ID_22('T', 'P', 'B')
+#define ID3_TRC ID3_FRAME_ID_22('T', 'R', 'C')
+#define ID3_TRD ID3_FRAME_ID_22('T', 'R', 'D')
+#define ID3_TRK ID3_FRAME_ID_22('T', 'R', 'K')
+#define ID3_TSI ID3_FRAME_ID_22('T', 'S', 'I')
+#define ID3_TSS ID3_FRAME_ID_22('T', 'S', 'S')
+#define ID3_TT1 ID3_FRAME_ID_22('T', 'T', '1')
+#define ID3_TT2 ID3_FRAME_ID_22('T', 'T', '2')
+#define ID3_TT3 ID3_FRAME_ID_22('T', 'T', '3')
+#define ID3_TXT ID3_FRAME_ID_22('T', 'X', 'T')
+#define ID3_TXX ID3_FRAME_ID_22('T', 'X', 'X')
+#define ID3_TYE ID3_FRAME_ID_22('T', 'Y', 'E')
+#define ID3_UFI ID3_FRAME_ID_22('U', 'F', 'I')
+#define ID3_ULT ID3_FRAME_ID_22('U', 'L', 'T')
+#define ID3_WAF ID3_FRAME_ID_22('W', 'A', 'F')
+#define ID3_WAR ID3_FRAME_ID_22('W', 'A', 'R')
+#define ID3_WAS ID3_FRAME_ID_22('W', 'A', 'S')
+#define ID3_WCM ID3_FRAME_ID_22('W', 'C', 'M')
+#define ID3_WCP ID3_FRAME_ID_22('W', 'C', 'P')
+#define ID3_WPB ID3_FRAME_ID_22('W', 'P', 'B')
+#define ID3_WXX ID3_FRAME_ID_22('W', 'X', 'X')
+
+
+/*
+ * Prototypes.
+ */
+
+/* From id3.c */
+struct id3_tag *id3_open_mem(void *, int);
+struct id3_tag *id3_open_fd(int, int);
+struct id3_tag *id3_open_fp(VFSFile *, int);
+int id3_set_output(struct id3_tag *, char *);
+int id3_close(struct id3_tag *);
+int id3_tell(struct id3_tag *);
+int id3_alter_file(struct id3_tag *);
+int id3_write_tag(struct id3_tag *, int);
+
+/* From id3_frame.c */
+int id3_read_frame(struct id3_tag *id3);
+struct id3_frame *id3_get_frame(struct id3_tag *, guint32, int);
+int id3_delete_frame(struct id3_frame *frame);
+struct id3_frame *id3_add_frame(struct id3_tag *, guint32);
+int id3_decompress_frame(struct id3_frame *);
+void id3_destroy_frames(struct id3_tag *id);
+void id3_frame_clear_data(struct id3_frame *frame);
+
+/* From id3_frame_text.c */
+char *id3_utf16_to_ascii(void *);
+gint8 id3_get_encoding(struct id3_frame *);
+int id3_set_encoding(struct id3_frame *, gint8);
+char *id3_get_text(struct id3_frame *);
+char *id3_get_text_desc(struct id3_frame *);
+int id3_get_text_number(struct id3_frame *);
+int id3_set_text(struct id3_frame *, char *);
+int id3_set_text_number(struct id3_frame *, int);
+gboolean id3_frame_is_text(struct id3_frame *frame);
+
+/* Fr