summaryrefslogtreecommitdiffstats
path: root/patches/mpg123
diff options
context:
space:
mode:
Diffstat (limited to 'patches/mpg123')
-rw-r--r--patches/mpg123/mpg123-ds-rcc.patch151
-rw-r--r--patches/mpg123/mpg123-ds-rcc1121.patch247
-rw-r--r--patches/mpg123/mpg123-ds-rcc173.patch271
-rw-r--r--patches/mpg123/mpg123-ds-rcc65.patch240
4 files changed, 909 insertions, 0 deletions
diff --git a/patches/mpg123/mpg123-ds-rcc.patch b/patches/mpg123/mpg123-ds-rcc.patch
new file mode 100644
index 0000000..bbfd104
--- /dev/null
+++ b/patches/mpg123/mpg123-ds-rcc.patch
@@ -0,0 +1,151 @@
+diff -dPNur mpg123-0.59r/common.c mpg123-0.59r-new/common.c
+--- mpg123-0.59r/common.c 1999-06-15 23:24:19.000000000 +0200
++++ mpg123-0.59r-new/common.c 2005-09-16 02:48:11.000000000 +0200
+@@ -15,6 +15,7 @@
+ #endif
+ #endif
+
++#include "rccpatch.h"
+ #include "mpg123.h"
+ #include "genre.h"
+ #include "common.h"
+@@ -484,6 +485,8 @@
+ char comment[31]={0,};
+ char genre[31]={0,};
+
++ char *ctitle, *cartist, *calbum, *ccomment;
++
+ if(param.quiet)
+ return;
+
+@@ -492,16 +495,26 @@
+ strncpy(album,tag->album,30);
+ strncpy(year,tag->year,4);
+ strncpy(comment,tag->comment,30);
++
++ ctitle = rccPatchRecode(title);
++ cartist = rccPatchRecode(artist);
++ calbum = rccPatchRecode(album);
++ ccomment = rccPatchRecode(comment);
+
+- if ( tag->genre <= sizeof(genre_table)/sizeof(*genre_table) ) {
++ if ( tag->genre < sizeof(genre_table)/sizeof(*genre_table) ) {
+ strncpy(genre, genre_table[tag->genre], 30);
+ } else {
+ strncpy(genre,"Unknown",30);
+ }
+
+- fprintf(stderr,"Title : %-30s Artist: %s\n",title,artist);
+- fprintf(stderr,"Album : %-30s Year : %4s\n",album,year);
+- fprintf(stderr,"Comment: %-30s Genre : %s\n",comment,genre);
++ fprintf(stderr,"Title : %-30s Artist: %s\n",ctitle?ctitle:title,cartist?cartist:artist);
++ fprintf(stderr,"Album : %-30s Year : %4s\n",calbum?calbum:album,year);
++ fprintf(stderr,"Comment: %-30s Genre : %s\n",ccomment?ccomment:comment,genre);
++
++ if (ctitle) free(ctitle);
++ if (cartist) free(cartist);
++ if (calbum) free(calbum);
++ if (ccomment) free(ccomment);
+ }
+
+ #if 0
+diff -dPNur mpg123-0.59r/Makefile mpg123-0.59r-new/Makefile
+--- mpg123-0.59r/Makefile 1999-06-18 14:18:58.000000000 +0200
++++ mpg123-0.59r-new/Makefile 2005-09-16 02:47:47.000000000 +0200
+@@ -554,12 +554,12 @@
+ mpg123-make:
+ @ $(MAKE) CFLAGS='$(CFLAGS)' BINNAME=mpg123 mpg123
+
+-mpg123: mpg123.o common.o $(OBJECTS) decode_2to1.o decode_4to1.o \
++mpg123: mpg123.o rccpatch.o common.o $(OBJECTS) decode_2to1.o decode_4to1.o \
+ tabinit.o audio.o layer1.o layer2.o layer3.o buffer.o \
+ getlopt.o httpget.o xfermem.o equalizer.o \
+ decode_ntom.o Makefile wav.o readers.o getbits.o \
+ control_generic.o
+- $(CC) $(CFLAGS) $(LDFLAGS) mpg123.o tabinit.o common.o layer1.o \
++ $(CC) $(CFLAGS) $(LDFLAGS) -lrcc mpg123.o tabinit.o rccpatch.o common.o layer1.o \
+ layer2.o layer3.o audio.o buffer.o decode_2to1.o equalizer.o \
+ decode_4to1.o getlopt.o httpget.o xfermem.o decode_ntom.o \
+ wav.o readers.o getbits.o control_generic.o \
+diff -dPNur mpg123-0.59r/mpg123.c mpg123-0.59r-new/mpg123.c
+--- mpg123-0.59r/mpg123.c 1999-06-18 14:18:11.000000000 +0200
++++ mpg123-0.59r-new/mpg123.c 2005-09-16 02:47:47.000000000 +0200
+@@ -32,6 +32,8 @@
+ #include "buffer.h"
+ #include "term.h"
+
++#include "rccpatch.h"
++
+ #include "version.h"
+
+ static void usage(char *dummy);
+@@ -903,6 +905,8 @@
+ exit(0);
+ }
+ #endif
++
++ rccPatchInit();
+
+ while ((fname = get_next_file(argc, argv))) {
+ char *dirname, *filename;
+@@ -1068,6 +1072,8 @@
+ intflag = FALSE;
+ }
+ }
++ rccPatchFree();
++
+ #ifndef NOXFERMEM
+ if (param.usebuffer) {
+ buffer_end();
+diff -dPNur mpg123-0.59r/rccpatch.c mpg123-0.59r-new/rccpatch.c
+--- mpg123-0.59r/rccpatch.c 1970-01-01 01:00:00.000000000 +0100
++++ mpg123-0.59r-new/rccpatch.c 2005-09-16 02:47:47.000000000 +0200
+@@ -0,0 +1,40 @@
++#include <librcc.h>
++
++#define ID3_CLASS 0
++#define OUT_CLASS 1
++static rcc_class classes[] = {
++ { "id3", RCC_CLASS_STANDARD, NULL, NULL, "ID3 Encoding", 0 },
++ { "out", RCC_CLASS_STANDARD, NULL, NULL, "Output Encoding", 0 },
++ { NULL }
++};
++
++static int rcc_initialized = 0;
++
++void rccPatchFree() {
++ if (rcc_initialized) {
++ rccFree();
++ rcc_initialized = 0;
++ }
++}
++
++void rccPatchInit() {
++ if (rcc_initialized) return;
++ rccInit();
++ rccInitDefaultContext(NULL, 0, 0, classes, 0);
++ rccLoad(NULL, "xmms");
++ rccInitDb4(NULL, NULL, 0);
++ rcc_initialized = 1;
++}
++
++static void rccPatchTryInit() {
++ if (!rcc_initialized) {
++ rccPatchInit();
++ if (rcc_initialized) atexit(rccPatchFree);
++ }
++}
++
++char *rccPatchRecode(const char *str) {
++ char *res;
++ rccPatchTryInit();
++ return rccRecode(NULL, ID3_CLASS, OUT_CLASS, str);
++}
+diff -dPNur mpg123-0.59r/rccpatch.h mpg123-0.59r-new/rccpatch.h
+--- mpg123-0.59r/rccpatch.h 1970-01-01 01:00:00.000000000 +0100
++++ mpg123-0.59r-new/rccpatch.h 2005-09-16 02:47:47.000000000 +0200
+@@ -0,0 +1,4 @@
++void rccPatchFree();
++void rccPatchInit();
++char *rccPatchRecode(const char *str);
++
diff --git a/patches/mpg123/mpg123-ds-rcc1121.patch b/patches/mpg123/mpg123-ds-rcc1121.patch
new file mode 100644
index 0000000..1335795
--- /dev/null
+++ b/patches/mpg123/mpg123-ds-rcc1121.patch
@@ -0,0 +1,247 @@
+diff -dPNur mpg123-1.12.1/configure.ac mpg123-1.12.1-new/configure.ac
+--- mpg123-1.12.1/configure.ac 2010-03-31 10:27:37.000000000 +0200
++++ mpg123-1.12.1-new/configure.ac 2010-07-07 23:44:57.000000000 +0200
+@@ -998,6 +998,21 @@
+ AC_CHECK_LIB([m], [sqrt])
+ AC_CHECK_LIB([mx], [powf])
+
++# LibRCC
++AC_CHECK_LIB(rcc, rccInit,[
++ AC_CHECK_HEADERS(librcc.h,[
++ LIBRCC_LIBS="-lrcc"
++ LIBRCC_INCLUDES="-DHAVE_LIBRCC"
++ ],[
++ LIBRCC_LIBS=""
++ LIBRCC_INCLUDES=""
++])],[
++ LIBRCC_LIBS=""
++ LIBRCC_INCLUDES=""
++])
++AC_SUBST(LIBRCC_LIBS)
++AC_SUBST(LIBRCC_INCLUDES)
++
+ # attempt to make the signal stuff work... also with GENERIC - later
+ #if test x"$ac_cv_header_sys_signal_h" = xyes; then
+ # AC_CHECK_FUNCS( sigemptyset sigaddset sigprocmask sigaction )
+diff -dPNur mpg123-1.12.1/src/libmpg123/id3.c mpg123-1.12.1-new/src/libmpg123/id3.c
+--- mpg123-1.12.1/src/libmpg123/id3.c 2010-03-31 10:27:35.000000000 +0200
++++ mpg123-1.12.1-new/src/libmpg123/id3.c 2010-07-07 23:51:50.000000000 +0200
+@@ -9,6 +9,8 @@
+ #include "mpg123lib_intern.h"
+ #include "id3.h"
+ #include "debug.h"
++#include "rccpatch.h"
++
+
+ #ifndef NO_ID3V2 /* Only the main parsing routine will always be there. */
+
+@@ -829,6 +831,15 @@
+ size_t length = l;
+ size_t i;
+ unsigned char *p;
++ char *ctitle;
++
++ ctitle = mpg123_rcc_recode(s, l, &i);
++ if (ctitle) {
++ convert_utf8(sb, ctitle, i, 0);
++ free(ctitle);
++ return;
++ }
++
+ /* determine real length, a latin1 character can at most take 2 in UTF8 */
+ for(i=0; i<l; ++i)
+ if(s[i] >= 0x80) ++length;
+diff -dPNur mpg123-1.12.1/src/libmpg123/Makefile.am mpg123-1.12.1-new/src/libmpg123/Makefile.am
+--- mpg123-1.12.1/src/libmpg123/Makefile.am 2010-03-31 10:27:35.000000000 +0200
++++ mpg123-1.12.1-new/src/libmpg123/Makefile.am 2010-07-07 23:44:57.000000000 +0200
+@@ -29,6 +29,8 @@
+ libmpg123_la_DEPENDENCIES = @DECODER_LOBJ@ @LFS_LOBJ@
+
+ libmpg123_la_SOURCES = \
++ rccpatch.c \
++ rccpatch.h \
+ compat.c \
+ compat.h \
+ parse.c \
+diff -dPNur mpg123-1.12.1/src/libmpg123/rccpatch.c mpg123-1.12.1-new/src/libmpg123/rccpatch.c
+--- mpg123-1.12.1/src/libmpg123/rccpatch.c 1970-01-01 01:00:00.000000000 +0100
++++ mpg123-1.12.1-new/src/libmpg123/rccpatch.c 2010-07-07 23:55:59.000000000 +0200
+@@ -0,0 +1,76 @@
++#include <string.h>
++#include <librcc.h>
++#include "mpg123.h"
++
++#define ID3_CLASS 0
++#define UTF_CLASS 1
++#define OUT_CLASS 2
++static rcc_class classes[] = {
++ { "id3", RCC_CLASS_STANDARD, NULL, NULL, "ID3 Encoding", 0 },
++ { "utf", RCC_CLASS_KNOWN, "UTF-8", NULL, "Unicode Encoding", 0 },
++ { "out", RCC_CLASS_STANDARD, NULL, NULL, "Output Encoding", 0 },
++ { NULL }
++};
++
++static int rcc_initialized = 0;
++
++void mpg123_rcc_free() {
++ if (rcc_initialized) {
++ rccFree();
++ rcc_initialized = 0;
++ }
++}
++
++void mpg123_rcc_init() {
++ if (rcc_initialized) return;
++ rccInit();
++ rccInitDefaultContext(NULL, 0, 0, classes, 0);
++ rccLoad(NULL, "xmms");
++ rccInitDb4(NULL, NULL, 0);
++ rcc_initialized = 1;
++}
++
++static void mpg123_rcc_try_init() {
++ if (!rcc_initialized) {
++ mpg123_rcc_init();
++ if (rcc_initialized) atexit(mpg123_rcc_free);
++ }
++}
++
++
++char *mpg123_rcc_recode(const char *str, size_t len, size_t *rlen) {
++ char *res;
++ mpg123_rcc_try_init();
++ return rccSizedRecode(NULL, ID3_CLASS, UTF_CLASS, str, len, rlen);
++}
++
++static void mpg123_rcc_recode_string(mpg123_string *str, rcc_class_id from, rcc_class_id to) {
++ size_t size;
++ char *res;
++
++ if ((!str)||(str->fill<2)) return;
++
++ mpg123_rcc_try_init();
++
++ res = rccSizedRecode(NULL, from, to, str->p, str->fill - 1, &size);
++ if (res) {
++ if (size+1>str->size) {
++ if (!mpg123_resize_string(str, size + 1)) {
++ // allocation failed
++ free(res);
++ return;
++ }
++ }
++ strncpy(str->p, res, size + 1);
++ str->fill = size + 1;
++ free(res);
++ }
++}
++
++void mpg123_rcc_recode_utf_string(mpg123_string *str) {
++ mpg123_rcc_recode_string(str, UTF_CLASS, OUT_CLASS);
++}
++
++void mpg123_rcc_recode_latin_string(mpg123_string *str) {
++ mpg123_rcc_recode_string(str, ID3_CLASS, OUT_CLASS);
++}
+diff -dPNur mpg123-1.12.1/src/libmpg123/rccpatch.h mpg123-1.12.1-new/src/libmpg123/rccpatch.h
+--- mpg123-1.12.1/src/libmpg123/rccpatch.h 1970-01-01 01:00:00.000000000 +0100
++++ mpg123-1.12.1-new/src/libmpg123/rccpatch.h 2010-07-07 23:44:57.000000000 +0200
+@@ -0,0 +1,5 @@
++void mpg123_rcc_free();
++void mpg123_rcc_init();
++char *mpg123_rcc_recode(const char *str, size_t len, size_t *rlen);
++void mpg123_rcc_recode_utf_string(mpg123_string *str);
++void mpg123_rcc_recode_latin_string(mpg123_string *str);
+diff -dPNur mpg123-1.12.1/src/Makefile.am mpg123-1.12.1-new/src/Makefile.am
+--- mpg123-1.12.1/src/Makefile.am 2010-03-31 10:27:36.000000000 +0200
++++ mpg123-1.12.1-new/src/Makefile.am 2010-07-07 23:46:10.000000000 +0200
+@@ -5,10 +5,10 @@
+ ## initially written by Nicholas J. Humfrey
+
+ AM_CPPFLAGS = -DPKGLIBDIR="\"$(pkglibdir)\""
+-mpg123_LDADD = $(LIBLTDL) libmpg123/libmpg123.la @MODULE_OBJ@ @OUTPUT_OBJ@ @OUTPUT_LIBS@
++mpg123_LDADD = $(LIBLTDL) libmpg123/libmpg123.la @MODULE_OBJ@ @OUTPUT_OBJ@ @OUTPUT_LIBS@ @LIBRCC_LIBS@
+ mpg123_LDFLAGS = @EXEC_LT_LDFLAGS@ @OUTPUT_LDFLAGS@
+ # Just mpg123_INCLUDES has no effect on build! Trying that before reverting to AM_CPPFLAGS.
+-INCLUDES = $(LTDLINCL) -I$(top_builddir)/src/libmpg123 -I$(top_srcdir)/src/libmpg123
++INCLUDES = $(LTDLINCL) -I$(top_builddir)/src/libmpg123 -I$(top_srcdir)/src/libmpg123 @LIBRCC_INCLUDES@
+ # libltdl is not mentioned here... it's not that trivial
+ mpg123_DEPENDENCIES = @OUTPUT_OBJ@ @MODULE_OBJ@ libmpg123/libmpg123.la
+
+diff -dPNur mpg123-1.12.1/src/metaprint.c mpg123-1.12.1-new/src/metaprint.c
+--- mpg123-1.12.1/src/metaprint.c 2010-03-31 10:27:36.000000000 +0200
++++ mpg123-1.12.1-new/src/metaprint.c 2010-07-07 23:54:21.000000000 +0200
+@@ -17,7 +17,11 @@
+ if(source == NULL) return;
+
+ if(utf8env) mpg123_copy_string(source, dest);
+- else utf8_ascii(dest, source);
++ else {
++ mpg123_copy_string(source, dest);
++ mpg123_rcc_recode_utf_string(dest);
++// utf8_ascii(dest, source);
++ }
+ }
+
+ /* print tags... limiting the UTF-8 to ASCII */
+@@ -53,6 +57,7 @@
+ strncpy(tag[TITLE].p,v1->title,30);
+ tag[TITLE].p[30] = 0;
+ tag[TITLE].fill = strlen(tag[TITLE].p) + 1;
++ mpg123_rcc_recode_latin_string(&tag[TITLE]);
+ }
+ }
+ if(!tag[ARTIST].fill)
+@@ -62,6 +67,7 @@
+ strncpy(tag[ARTIST].p,v1->artist,30);
+ tag[ARTIST].p[30] = 0;
+ tag[ARTIST].fill = strlen(tag[ARTIST].p) + 1;
++ mpg123_rcc_recode_latin_string(&tag[ARTIST]);
+ }
+ }
+ if(!tag[ALBUM].fill)
+@@ -71,6 +77,7 @@
+ strncpy(tag[ALBUM].p,v1->album,30);
+ tag[ALBUM].p[30] = 0;
+ tag[ALBUM].fill = strlen(tag[ALBUM].p) + 1;
++ mpg123_rcc_recode_latin_string(&tag[ALBUM]);
+ }
+ }
+ if(!tag[COMMENT].fill)
+@@ -80,6 +87,7 @@
+ strncpy(tag[COMMENT].p,v1->comment,30);
+ tag[COMMENT].p[30] = 0;
+ tag[COMMENT].fill = strlen(tag[COMMENT].p) + 1;
++ mpg123_rcc_recode_latin_string(&tag[COMMENT]);
+ }
+ }
+ if(!tag[YEAR].fill)
+diff -dPNur mpg123-1.12.1/src/mpg123.c mpg123-1.12.1-new/src/mpg123.c
+--- mpg123-1.12.1/src/mpg123.c 2010-03-31 10:27:36.000000000 +0200
++++ mpg123-1.12.1-new/src/mpg123.c 2010-07-07 23:52:58.000000000 +0200
+@@ -10,6 +10,7 @@
+ #include "mpg123app.h"
+ #include "mpg123.h"
+ #include "local.h"
++#include "rccpatch.h"
+
+ #ifdef HAVE_SYS_WAIT_H
+ #include <sys/wait.h>
+@@ -973,6 +974,8 @@
+ if(param.term_ctrl)
+ term_init();
+ #endif
++
++ mpg123_rcc_init();
+ while ((fname = get_next_file()))
+ {
+ char *dirname, *filename;
+@@ -1132,6 +1135,8 @@
+ #endif
+ }
+ } /* end of loop over input files */
++ mpg123_rcc_free();
++
+ /* Ensure we played everything. */
+ if(param.smooth && param.usebuffer)
+ {
diff --git a/patches/mpg123/mpg123-ds-rcc173.patch b/patches/mpg123/mpg123-ds-rcc173.patch
new file mode 100644
index 0000000..ae814ff
--- /dev/null
+++ b/patches/mpg123/mpg123-ds-rcc173.patch
@@ -0,0 +1,271 @@
+diff -dPNur mpg123-1.7.3/configure.ac mpg123-1.7.3-rusxmms/configure.ac
+--- mpg123-1.7.3/configure.ac 2009-04-27 09:02:40.000000000 +0200
++++ mpg123-1.7.3-rusxmms/configure.ac 2009-06-13 23:22:17.000000000 +0200
+@@ -759,6 +759,21 @@
+ AC_CHECK_LIB([m], [sqrt])
+ AC_CHECK_LIB([mx], [powf])
+
++# LibRCC
++AC_CHECK_LIB(rcc, rccInit,[
++ AC_CHECK_HEADERS(librcc.h,[
++ LIBRCC_LIBS="-lrcc"
++ LIBRCC_INCLUDES="-DHAVE_LIBRCC"
++ ],[
++ LIBRCC_LIBS=""
++ LIBRCC_INCLUDES=""
++])],[
++ LIBRCC_LIBS=""
++ LIBRCC_INCLUDES=""
++])
++AC_SUBST(LIBRCC_LIBS)
++AC_SUBST(LIBRCC_INCLUDES)
++
+ # attempt to make the signal stuff work... also with GENERIC - later
+ #if test x"$ac_cv_header_sys_signal_h" = xyes; then
+ # AC_CHECK_FUNCS( sigemptyset sigaddset sigprocmask sigaction )
+diff -dPNur mpg123-1.7.3/src/libmpg123/id3.c mpg123-1.7.3-rusxmms/src/libmpg123/id3.c
+--- mpg123-1.7.3/src/libmpg123/id3.c 2009-04-27 09:02:12.000000000 +0200
++++ mpg123-1.7.3-rusxmms/src/libmpg123/id3.c 2009-06-14 00:34:23.000000000 +0200
+@@ -9,6 +9,8 @@
+ #include "mpg123lib_intern.h"
+ #include "id3.h"
+ #include "debug.h"
++#include "rccpatch.h"
++
+
+ #ifndef NO_ID3V2 /* Only the main parsing routine will always be there. */
+
+@@ -774,6 +776,15 @@
+ size_t length = l;
+ size_t i;
+ unsigned char *p;
++ char *ctitle;
++
++ ctitle = mpg123_rcc_recode(s, l, &i);
++ if (ctitle) {
++ convert_utf8(sb, ctitle, i);
++ free(ctitle);
++ return;
++ }
++
+ /* determine real length, a latin1 character can at most take 2 in UTF8 */
+ for(i=0; i<l; ++i)
+ if(s[i] >= 0x80) ++length;
+diff -dPNur mpg123-1.7.3/src/libmpg123/libmpg123.sym mpg123-1.7.3-rusxmms/src/libmpg123/libmpg123.sym
+--- mpg123-1.7.3/src/libmpg123/libmpg123.sym 2009-04-27 09:07:20.000000000 +0200
++++ mpg123-1.7.3-rusxmms/src/libmpg123/libmpg123.sym 2009-06-14 01:53:25.000000000 +0200
+@@ -74,3 +74,8 @@
+ mpg123_position
+ mpg123_length
+ mpg123_set_filesize
++mpg123_rcc_free
++mpg123_rcc_init
++mpg123_rcc_recode
++mpg123_rcc_recode_utf_string
++mpg123_rcc_recode_latin_string
+diff -dPNur mpg123-1.7.3/src/libmpg123/libmpg123.sym.in mpg123-1.7.3-rusxmms/src/libmpg123/libmpg123.sym.in
+--- mpg123-1.7.3/src/libmpg123/libmpg123.sym.in 2009-04-27 09:02:12.000000000 +0200
++++ mpg123-1.7.3-rusxmms/src/libmpg123/libmpg123.sym.in 2009-06-14 01:51:45.000000000 +0200
+@@ -74,3 +74,8 @@
+ mpg123_position@LARGEFILE_SUFFIX@
+ mpg123_length@LARGEFILE_SUFFIX@
+ mpg123_set_filesize@LARGEFILE_SUFFIX@
++mpg123_rcc_free
++mpg123_rcc_init
++mpg123_rcc_recode
++mpg123_rcc_recode_utf_string
++mpg123_rcc_recode_latin_string
+diff -dPNur mpg123-1.7.3/src/libmpg123/Makefile.am mpg123-1.7.3-rusxmms/src/libmpg123/Makefile.am
+--- mpg123-1.7.3/src/libmpg123/Makefile.am 2009-04-27 09:02:12.000000000 +0200
++++ mpg123-1.7.3-rusxmms/src/libmpg123/Makefile.am 2009-06-14 00:10:34.000000000 +0200
+@@ -31,6 +31,8 @@
+ libmpg123_la_DEPENDENCIES = @DECODER_LOBJ@ libmpg123.sym
+
+ libmpg123_la_SOURCES = \
++ rccpatch.c \
++ rccpatch.h \
+ compat.c \
+ compat.h \
+ parse.c \
+diff -dPNur mpg123-1.7.3/src/libmpg123/rccpatch.c mpg123-1.7.3-rusxmms/src/libmpg123/rccpatch.c
+--- mpg123-1.7.3/src/libmpg123/rccpatch.c 1970-01-01 01:00:00.000000000 +0100
++++ mpg123-1.7.3-rusxmms/src/libmpg123/rccpatch.c 2009-06-14 01:54:37.000000000 +0200
+@@ -0,0 +1,76 @@
++#include <string.h>
++#include <librcc.h>
++#include "mpg123.h"
++
++#define ID3_CLASS 0
++#define UTF_CLASS 1
++#define OUT_CLASS 2
++static rcc_class classes[] = {
++ { "id3", RCC_CLASS_STANDARD, NULL, NULL, "ID3 Encoding", 0 },
++ { "utf", RCC_CLASS_KNOWN, "UTF-8", NULL, "Unicode Encoding", 0 },
++ { "out", RCC_CLASS_STANDARD, NULL, NULL, "Output Encoding", 0 },
++ { NULL }
++};
++
++static int rcc_initialized = 0;
++
++void mpg123_rcc_free() {
++ if (rcc_initialized) {
++ rccFree();
++ rcc_initialized = 0;
++ }
++}
++
++void mpg123_rcc_init() {
++ if (rcc_initialized) return;
++ rccInit();
++ rccInitDefaultContext(NULL, 0, 0, classes, 0);
++ rccLoad(NULL, "xmms");
++ rccInitDb4(NULL, NULL, 0);
++ rcc_initialized = 1;
++}
++
++static void mpg123_rcc_try_init() {
++ if (!rcc_initialized) {
++ mpg123_rcc_init();
++ if (rcc_initialized) atexit(mpg123_rcc_free);
++ }
++}
++
++
++char *mpg123_rcc_recode(const char *str, size_t len, size_t *rlen) {
++ char *res;
++ mpg123_rcc_try_init();
++ return rccSizedRecode(NULL, ID3_CLASS, UTF_CLASS, str, len, rlen);
++}
++
++static void mpg123_rcc_recode_string(mpg123_string *str, rcc_class_id from, rcc_class_id to) {
++ size_t size;
++ char *res;
++
++ if ((!str)||(str->fill<2)) return;
++
++ mpg123_rcc_try_init();
++
++ res = rccSizedRecode(NULL, from, to, str->p, str->fill - 1, &size);
++ if (res) {
++ if (size+1>str->size) {
++ if (!mpg123_resize_string(str, size + 1)) {
++ // allocation failed
++ free(res);
++ return;
++ }
++ }
++ strncpy(str->p, res, size + 1);
++ str->fill = size + 1;
++ free(res);
++ }
++}
++
++void mpg123_rcc_recode_utf_string(mpg123_string *str) {
++ mpg123_rcc_recode_string(str, UTF_CLASS, OUT_CLASS);
++}
++
++void mpg123_rcc_recode_latin_string(mpg123_string *str) {
++ mpg123_rcc_recode_string(str, ID3_CLASS, OUT_CLASS);
++}
+diff -dPNur mpg123-1.7.3/src/libmpg123/rccpatch.h mpg123-1.7.3-rusxmms/src/libmpg123/rccpatch.h
+--- mpg123-1.7.3/src/libmpg123/rccpatch.h 1970-01-01 01:00:00.000000000 +0100
++++ mpg123-1.7.3-rusxmms/src/libmpg123/rccpatch.h 2009-06-14 01:51:21.000000000 +0200
+@@ -0,0 +1,5 @@
++void mpg123_rcc_free();
++void mpg123_rcc_init();
++char *mpg123_rcc_recode(const char *str, size_t len, size_t *rlen);
++void mpg123_rcc_recode_utf_string(mpg123_string *str);
++void mpg123_rcc_recode_latin_string(mpg123_string *str);
+diff -dPNur mpg123-1.7.3/src/Makefile.am mpg123-1.7.3-rusxmms/src/Makefile.am
+--- mpg123-1.7.3/src/Makefile.am 2009-04-27 09:02:12.000000000 +0200
++++ mpg123-1.7.3-rusxmms/src/Makefile.am 2009-06-14 00:10:22.000000000 +0200
+@@ -5,10 +5,10 @@
+ ## initially written by Nicholas J. Humfrey
+
+ AM_CPPFLAGS = -DPKGLIBDIR="\"$(pkglibdir)\""
+-mpg123_LDADD = $(LIBLTDL) libmpg123/libmpg123.la @MODULE_OBJ@ @OUTPUT_OBJ@ @OUTPUT_LIBS@
++mpg123_LDADD = $(LIBLTDL) libmpg123/libmpg123.la @MODULE_OBJ@ @OUTPUT_OBJ@ @OUTPUT_LIBS@ @LIBRCC_LIBS@
+ mpg123_LDFLAGS = @LT_LDFLAGS@ @OUTPUT_LDFLAGS@
+ # Just mpg123_INCLUDES has no effect on build! Trying that before reverting to AM_CPPFLAGS.
+-INCLUDES = $(LTDLINCL) -I$(top_builddir)/src/libmpg123 -I$(top_srcdir)/src/libmpg123
++INCLUDES = $(LTDLINCL) -I$(top_builddir)/src/libmpg123 -I$(top_srcdir)/src/libmpg123 @LIBRCC_INCLUDES@
+ # libltdl is not mentioned here... it's not that trivial
+ mpg123_DEPENDENCIES = @OUTPUT_OBJ@ @MODULE_OBJ@ libmpg123/libmpg123.la
+
+diff -dPNur mpg123-1.7.3/src/metaprint.c mpg123-1.7.3-rusxmms/src/metaprint.c
+--- mpg123-1.7.3/src/metaprint.c 2009-04-27 09:02:12.000000000 +0200
++++ mpg123-1.7.3-rusxmms/src/metaprint.c 2009-06-14 01:59:09.000000000 +0200
+@@ -17,7 +17,11 @@
+ if(source == NULL) return;
+
+ if(utf8env) mpg123_copy_string(source, dest);
+- else utf8_ascii(dest, source);
++ else {
++ mpg123_copy_string(source, dest);
++ mpg123_rcc_recode_utf_string(dest);
++// utf8_ascii(dest, source);
++ }
+ }
+
+ /* print tags... limiting the UTF-8 to ASCII */
+@@ -53,6 +57,7 @@
+ strncpy(tag[TITLE].p,v1->title,30);
+ tag[TITLE].p[30] = 0;
+ tag[TITLE].fill = strlen(tag[TITLE].p) + 1;
++ mpg123_rcc_recode_latin_string(&tag[TITLE]);
+ }
+ }
+ if(!tag[ARTIST].fill)
+@@ -62,6 +67,7 @@
+ strncpy(tag[ARTIST].p,v1->artist,30);
+ tag[ARTIST].p[30] = 0;
+ tag[ARTIST].fill = strlen(tag[ARTIST].p) + 1;
++ mpg123_rcc_recode_latin_string(&tag[ARTIST]);
+ }
+ }
+ if(!tag[ALBUM].fill)
+@@ -71,6 +77,7 @@
+ strncpy(tag[ALBUM].p,v1->album,30);
+ tag[ALBUM].p[30] = 0;
+ tag[ALBUM].fill = strlen(tag[ALBUM].p) + 1;
++ mpg123_rcc_recode_latin_string(&tag[ALBUM]);
+ }
+ }
+ if(!tag[COMMENT].fill)
+@@ -80,6 +87,7 @@
+ strncpy(tag[COMMENT].p,v1->comment,30);
+ tag[COMMENT].p[30] = 0;
+ tag[COMMENT].fill = strlen(tag[COMMENT].p) + 1;
++ mpg123_rcc_recode_latin_string(&tag[COMMENT]);
+ }
+ }
+ if(!tag[YEAR].fill)
+diff -dPNur mpg123-1.7.3/src/mpg123.c mpg123-1.7.3-rusxmms/src/mpg123.c
+--- mpg123-1.7.3/src/mpg123.c 2009-04-27 09:02:12.000000000 +0200
++++ mpg123-1.7.3-rusxmms/src/mpg123.c 2009-06-14 00:35:14.000000000 +0200
+@@ -10,6 +10,7 @@
+ #include "mpg123app.h"
+ #include "mpg123.h"
+ #include "local.h"
++#include "rccpatch.h"
+
+ #ifdef HAVE_SYS_WAIT_H
+ #include <sys/wait.h>
+@@ -893,6 +894,8 @@
+ if(param.term_ctrl)
+ term_init();
+ #endif
++
++ mpg123_rcc_init();
+ while ((fname = get_next_file()))
+ {
+ char *dirname, *filename;
+@@ -1038,6 +1041,8 @@
+ #endif
+ }
+ } /* end of loop over input files */
++ mpg123_rcc_free();
++
+ /* Ensure we played everything. */
+ if(param.smooth && param.usebuffer)
+ {
diff --git a/patches/mpg123/mpg123-ds-rcc65.patch b/patches/mpg123/mpg123-ds-rcc65.patch
new file mode 100644
index 0000000..41a4d33
--- /dev/null
+++ b/patches/mpg123/mpg123-ds-rcc65.patch
@@ -0,0 +1,240 @@
+diff -dPNur mpg123-0.65/configure.ac mpg123-0.65-new/configure.ac
+--- mpg123-0.65/configure.ac 2007-02-07 10:24:33.000000000 +0100
++++ mpg123-0.65-new/configure.ac 2007-04-15 13:36:52.000000000 +0200
+@@ -137,6 +137,21 @@
+ AC_CHECK_LIB([m], [sqrt])
+ AC_CHECK_LIB([mx], [powf])
+
++# LibRCC
++AC_CHECK_LIB(rcc, rccInit,[
++ AC_CHECK_HEADERS(librcc.h,[
++ LIBRCC_LIBS="-lrcc"
++ LIBRCC_INCLUDES="-DHAVE_LIBRCC"
++ ],[
++ LIBRCC_LIBS=""
++ LIBRCC_INCLUDES=""
++])],[
++ LIBRCC_LIBS=""
++ LIBRCC_INCLUDES=""
++])
++AC_SUBST(LIBRCC_LIBS)
++AC_SUBST(LIBRCC_INCLUDES)
++
+ # Check for JACK
+ PKG_CHECK_MODULES(JACK, jack, HAVE_JACK=yes, HAVE_JACK=no)
+
+diff -dPNur mpg123-0.65/src/id3.c mpg123-0.65-new/src/id3.c
+--- mpg123-0.65/src/id3.c 2007-02-07 10:24:33.000000000 +0100
++++ mpg123-0.65-new/src/id3.c 2007-04-15 13:26:06.000000000 +0200
+@@ -6,6 +6,7 @@
+ #include "stringbuf.h"
+ #include "genre.h"
+ #include "id3.h"
++#include "rccpatch.h"
+
+ struct taginfo
+ {
+@@ -499,6 +500,8 @@
+ void print_id3_tag(unsigned char *id3v1buf)
+ {
+ char genre_from_v1 = 0;
++ char *ctitle, *cartist, *calbum, *ccomment;
++
+ if(!(id3.version || id3v1buf)) return;
+ if(id3v1buf != NULL)
+ {
+@@ -688,17 +691,26 @@
+ free_stringbuf(&tmp);
+ }
+
++ if (id3.title.fill) ctitle = rccPatchRecode(id3.title.p);
++ else ctitle = NULL;
++ if (id3.artist.fill) cartist = rccPatchRecode(id3.artist.p);
++ else cartist = NULL;
++ if (id3.album.fill) calbum = rccPatchRecode(id3.album.p);
++ else calbum = NULL;
++ if (id3.comment.fill) ccomment = rccPatchRecode(id3.comment.p);
++ else ccomment = NULL;
++
+ if(param.long_id3)
+ {
+ fprintf(stderr,"\n");
+ /* print id3v2 */
+ /* dammed, I use pointers as bool again! It's so convenient... */
+- fprintf(stderr,"\tTitle: %s\n", id3.title.fill ? id3.title.p : "");
+- fprintf(stderr,"\tArtist: %s\n", id3.artist.fill ? id3.artist.p : "");
+- fprintf(stderr,"\tAlbum: %s\n", id3.album.fill ? id3.album.p : "");
++ fprintf(stderr,"\tTitle: %s\n", ctitle?ctitle:(id3.title.fill ? id3.title.p : ""));
++ fprintf(stderr,"\tArtist: %s\n", cartist?cartist:(id3.artist.fill ? id3.artist.p : ""));
++ fprintf(stderr,"\tAlbum: %s\n", calbum?calbum:(id3.album.fill ? id3.album.p : ""));
+ fprintf(stderr,"\tYear: %s\n", id3.year.fill ? id3.year.p : "");
+ fprintf(stderr,"\tGenre: %s\n", id3.genre.fill ? id3.genre.p : "");
+- fprintf(stderr,"\tComment: %s\n", id3.comment.fill ? id3.comment.p : "");
++ fprintf(stderr,"\tComment: %s\n", ccomment?ccomment:(id3.comment.fill ? id3.comment.p : ""));
+ fprintf(stderr,"\n");
+ }
+ else
+@@ -708,23 +720,23 @@
+ /* one _could_ circumvent the strlen calls... */
+ if(id3.title.fill && id3.artist.fill && strlen(id3.title.p) <= 30 && strlen(id3.title.p) <= 30)
+ {
+- fprintf(stderr,"Title: %-30s Artist: %s\n",id3.title.p,id3.artist.p);
++ fprintf(stderr,"Title: %-30s Artist: %s\n",ctitle?ctitle:id3.title.p,cartist?cartist:id3.artist.p);
+ }
+ else
+ {
+- if(id3.title.fill) fprintf(stderr,"Title: %s\n", id3.title.p);
+- if(id3.artist.fill) fprintf(stderr,"Artist: %s\n", id3.artist.p);
++ if(id3.title.fill) fprintf(stderr,"Title: %s\n", ctitle?ctitle:id3.title.p);
++ if(id3.artist.fill) fprintf(stderr,"Artist: %s\n", cartist?cartist:id3.artist.p);
+ }
+ if (id3.comment.fill && id3.album.fill && strlen(id3.comment.p) <= 30 && strlen(id3.album.p) <= 30)
+ {
+- fprintf(stderr,"Comment: %-30s Album: %s\n",id3.comment.p,id3.album.p);
++ fprintf(stderr,"Comment: %-30s Album: %s\n",ccomment?ccomment:id3.comment.p,calbum?calbum:id3.album.p);
+ }
+ else
+ {
+ if (id3.comment.fill)
+- fprintf(stderr,"Comment: %s\n", id3.comment.p);
++ fprintf(stderr,"Comment: %s\n", ccomment?ccomment:id3.comment.p);
+ if (id3.album.fill)
+- fprintf(stderr,"Album: %s\n", id3.album.p);
++ fprintf(stderr,"Album: %s\n", calbum?calbum:id3.album.p);
+ }
+ if (id3.year.fill && id3.genre.fill && strlen(id3.year.p) <= 30 && strlen(id3.genre.p) <= 30)
+ {
+@@ -738,6 +750,11 @@
+ fprintf(stderr,"Genre: %s\n", id3.genre.p);
+ }
+ }
++
++ if (ctitle) free(ctitle);
++ if (cartist) free(cartist);
++ if (calbum) free(calbum);
++ if (ccomment) free(ccomment);
+ }
+
+ /*
+diff -dPNur mpg123-0.65/src/Makefile.am mpg123-0.65-new/src/Makefile.am
+--- mpg123-0.65/src/Makefile.am 2007-02-07 10:24:33.000000000 +0100
++++ mpg123-0.65-new/src/Makefile.am 2007-04-15 13:38:44.000000000 +0200
+@@ -4,8 +4,8 @@
+ ## see COPYING and AUTHORS files in distribution or http://mpg123.de
+ ## initially written by Nicholas J. Humfrey
+
+-AM_CFLAGS = @AUDIO_CFLAGS@
+-AM_LDFLAGS = @AUDIO_LIBS@
++AM_CFLAGS = @AUDIO_CFLAGS@ @LIBRCC_INCLUDES@
++AM_LDFLAGS = @AUDIO_LIBS@ @LIBRCC_LIBS@
+ mpg123_LDADD = @AUDIO_OBJ@ @CPU_TYPE_LIB@
+ mpg123_DEPENDENCIES = @AUDIO_OBJ@ @CPU_TYPE_LIB@
+
+@@ -14,6 +14,8 @@
+
+ bin_PROGRAMS = mpg123
+ mpg123_SOURCES = \
++ rccpatch.c \
++ rccpatch.h \
+ audio.c \
+ audio.h \
+ buffer.c \
+diff -dPNur mpg123-0.65/src/mpg123.c mpg123-0.65-new/src/mpg123.c
+--- mpg123-0.65/src/mpg123.c 2007-02-07 10:24:33.000000000 +0100
++++ mpg123-0.65-new/src/mpg123.c 2007-04-15 13:30:42.000000000 +0200
+@@ -35,6 +35,7 @@
+ #include "layer3.h"
+ #endif
+ #include "playlist.h"
++#include "rccpatch.h"
+ #include "id3.h"
+ #include "icy.h"
+
+@@ -814,15 +815,18 @@
+
+ if(param.remote) {
+ int ret;
++ rccPatchInit();
+ init_id3();
+ init_icy();
+ ret = control_generic(&fr);
+ clear_icy();
+ exit_id3();
++ rccPatchFree();
+ safe_exit(ret);
+ }
+ #endif
+
++ rccPatchInit();
+ init_icy();
+ init_id3(); /* prepare id3 memory */
+ while ((fname = get_next_file())) {
+@@ -851,7 +855,7 @@
+ }
+ }
+ #endif
+-
++
+ }
+
+ #if !defined(WIN32) && !defined(GENERIC)
+@@ -1031,6 +1035,7 @@
+ } /* end of loop over input files */
+ clear_icy();
+ exit_id3(); /* free id3 memory */
++ rccPatchFree();
+ #ifndef NOXFERMEM
+ if (param.usebuffer) {
+ buffer_end();
+diff -dPNur mpg123-0.65/src/rccpatch.c mpg123-0.65-new/src/rccpatch.c
+--- mpg123-0.65/src/rccpatch.c 1970-01-01 01:00:00.000000000 +0100
++++ mpg123-0.65-new/src/rccpatch.c 2007-04-15 13:13:09.000000000 +0200
+@@ -0,0 +1,40 @@
++#include <librcc.h>
++
++#define ID3_CLASS 0
++#define OUT_CLASS 1
++static rcc_class classes[] = {
++ { "id3", RCC_CLASS_STANDARD, NULL, NULL, "ID3 Encoding", 0 },
++ { "out", RCC_CLASS_STANDARD, NULL, NULL, "Output Encoding", 0 },
++ { NULL }
++};
++
++static int rcc_initialized = 0;
++
++void rccPatchFree() {
++ if (rcc_initialized) {
++ rccFree();
++ rcc_initialized = 0;
++ }
++}
++
++void rccPatchInit() {
++ if (rcc_initialized) return;
++ rccInit();
++ rccInitDefaultContext(NULL, 0, 0, classes, 0);
++ rccLoad(NULL, "xmms");
++ rccInitDb4(NULL, NULL, 0);
++ rcc_initialized = 1;
++}
++
++static void rccPatchTryInit() {
++ if (!rcc_initialized) {
++ rccPatchInit();
++ if (rcc_initialized) atexit(rccPatchFree);
++ }
++}
++
++char *rccPatchRecode(const char *str) {
++ char *res;
++ rccPatchTryInit();
++ return rccRecode(NULL, ID3_CLASS, OUT_CLASS, str);
++}
+diff -dPNur mpg123-0.65/src/rccpatch.h mpg123-0.65-new/src/rccpatch.h
+--- mpg123-0.65/src/rccpatch.h 1970-01-01 01:00:00.000000000 +0100
++++ mpg123-0.65-new/src/rccpatch.h 2007-04-15 13:13:09.000000000 +0200
+@@ -0,0 +1,4 @@
++void rccPatchFree();
++void rccPatchInit();
++char *rccPatchRecode(const char *str);
++