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_fr