annotate Plugins/Input/mpg123/mpg123.c @ 354:e2775c9b8b13 trunk

[svn] very rudementary http stream detection support for mpg123-clone. - i had to do a lot of stupid hackish workarounds for shoutcast (BTW, I hate you AOL and I hope you die someday.)
author nenolod
date Thu, 29 Dec 2005 02:29:29 -0800
parents 18f881216679
children 3fb3657d2e14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1 #include "mpg123.h"
354
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
2 #include "common.h"
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
3
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
4 #include <glib.h>
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
5 #include <glib/gi18n.h>
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
6 #include <gtk/gtk.h>
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
7 #include <stdlib.h>
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
8 #include <string.h>
354
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
9 #include <unistd.h>
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
10
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
11 #include <fcntl.h>
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
12 #include <unistd.h>
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
13 #include <errno.h>
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
14 #include <sys/types.h>
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
15 #include <sys/socket.h>
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
16 #include <sys/time.h>
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
17 #include <netinet/in.h>
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
18 #include <arpa/inet.h>
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
19 #include <netdb.h>
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
20
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
21 #include <libaudacious/util.h>
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
22 #include <libaudacious/configdb.h>
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
23 #include <libaudacious/vfs.h>
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
24 #include <libaudacious/titlestring.h>
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
25
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
26 #include "audacious/util.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
27
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
28 static const long outscale = 32768;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
29
354
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
30 #define BUFSIZE_X 2048
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
31
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
32 static struct frame fr, temp_fr;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
33
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
34 PlayerInfo *mpg123_info = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
35 static GThread *decode_thread;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
36
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
37 static gboolean audio_error = FALSE, output_opened = FALSE, dopause = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
38 gint mpg123_bitrate, mpg123_frequency, mpg123_length, mpg123_layer,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
39 mpg123_lsf;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
40 gchar *mpg123_title = NULL, *mpg123_filename = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
41 static int disp_bitrate, skip_frames = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
42 static int cpu_fflags, cpu_efflags;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
43 gboolean mpg123_stereo, mpg123_mpeg25;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
44 int mpg123_mode;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
45
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
46 gchar **mpg123_id3_encoding_list = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
47
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
48 const char *mpg123_id3_genres[GENRE_MAX] = {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
49 N_("Blues"), N_("Classic Rock"), N_("Country"), N_("Dance"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
50 N_("Disco"), N_("Funk"), N_("Grunge"), N_("Hip-Hop"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
51 N_("Jazz"), N_("Metal"), N_("New Age"), N_("Oldies"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
52 N_("Other"), N_("Pop"), N_("R&B"), N_("Rap"), N_("Reggae"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
53 N_("Rock"), N_("Techno"), N_("Industrial"), N_("Alternative"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
54 N_("Ska"), N_("Death Metal"), N_("Pranks"), N_("Soundtrack"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
55 N_("Euro-Techno"), N_("Ambient"), N_("Trip-Hop"), N_("Vocal"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
56 N_("Jazz+Funk"), N_("Fusion"), N_("Trance"), N_("Classical"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
57 N_("Instrumental"), N_("Acid"), N_("House"), N_("Game"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
58 N_("Sound Clip"), N_("Gospel"), N_("Noise"), N_("AlternRock"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
59 N_("Bass"), N_("Soul"), N_("Punk"), N_("Space"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
60 N_("Meditative"), N_("Instrumental Pop"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
61 N_("Instrumental Rock"), N_("Ethnic"), N_("Gothic"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
62 N_("Darkwave"), N_("Techno-Industrial"), N_("Electronic"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
63 N_("Pop-Folk"), N_("Eurodance"), N_("Dream"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
64 N_("Southern Rock"), N_("Comedy"), N_("Cult"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
65 N_("Gangsta Rap"), N_("Top 40"), N_("Christian Rap"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
66 N_("Pop/Funk"), N_("Jungle"), N_("Native American"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
67 N_("Cabaret"), N_("New Wave"), N_("Psychedelic"), N_("Rave"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
68 N_("Showtunes"), N_("Trailer"), N_("Lo-Fi"), N_("Tribal"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
69 N_("Acid Punk"), N_("Acid Jazz"), N_("Polka"), N_("Retro"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
70 N_("Musical"), N_("Rock & Roll"), N_("Hard Rock"), N_("Folk"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
71 N_("Folk/Rock"), N_("National Folk"), N_("Swing"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
72 N_("Fast-Fusion"), N_("Bebob"), N_("Latin"), N_("Revival"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
73 N_("Celtic"), N_("Bluegrass"), N_("Avantgarde"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
74 N_("Gothic Rock"), N_("Progressive Rock"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
75 N_("Psychedelic Rock"), N_("Symphonic Rock"), N_("Slow Rock"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
76 N_("Big Band"), N_("Chorus"), N_("Easy Listening"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
77 N_("Acoustic"), N_("Humour"), N_("Speech"), N_("Chanson"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
78 N_("Opera"), N_("Chamber Music"), N_("Sonata"), N_("Symphony"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
79 N_("Booty Bass"), N_("Primus"), N_("Porn Groove"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
80 N_("Satire"), N_("Slow Jam"), N_("Club"), N_("Tango"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
81 N_("Samba"), N_("Folklore"), N_("Ballad"), N_("Power Ballad"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
82 N_("Rhythmic Soul"), N_("Freestyle"), N_("Duet"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
83 N_("Punk Rock"), N_("Drum Solo"), N_("A Cappella"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
84 N_("Euro-House"), N_("Dance Hall"), N_("Goa"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
85 N_("Drum & Bass"), N_("Club-House"), N_("Hardcore"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
86 N_("Terror"), N_("Indie"), N_("BritPop"), N_("Negerpunk"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
87 N_("Polsk Punk"), N_("Beat"), N_("Christian Gangsta Rap"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
88 N_("Heavy Metal"), N_("Black Metal"), N_("Crossover"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
89 N_("Contemporary Christian"), N_("Christian Rock"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
90 N_("Merengue"), N_("Salsa"), N_("Thrash Metal"),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
91 N_("Anime"), N_("JPop"), N_("Synthpop")
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
92 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
93
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
94 double
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
95 mpg123_compute_tpf(struct frame *fr)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
96 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
97 const int bs[4] = { 0, 384, 1152, 1152 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
98 double tpf;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
99
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
100 tpf = bs[fr->lay];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
101 tpf /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
102 return tpf;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
103 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
104
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
105 static void
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
106 set_synth_functions(struct frame *fr)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
107 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
108 typedef int (*func) (real *, int, unsigned char *, int *);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
109 typedef int (*func_mono) (real *, unsigned char *, int *);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
110 typedef void (*func_dct36) (real *, real *, real *, real *, real *);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
111
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
112 int ds = fr->down_sample;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
113 int p8 = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
114
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
115 static func funcs[][3] = {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
116 {mpg123_synth_1to1,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
117 mpg123_synth_2to1,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
118 mpg123_synth_4to1},
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
119 {mpg123_synth_1to1_8bit,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
120 mpg123_synth_2to1_8bit,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
121 mpg123_synth_4to1_8bit},
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
122 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
123
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
124 static func_mono funcs_mono[2][4] = {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
125 {mpg123_synth_1to1_mono,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
126 mpg123_synth_2to1_mono,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
127 mpg123_synth_4to1_mono},
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
128 {mpg123_synth_1to1_8bit_mono,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
129 mpg123_synth_2to1_8bit_mono,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
130 mpg123_synth_4to1_8bit_mono}
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
131 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
132
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
133 if (mpg123_cfg.resolution == 8)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
134 p8 = 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
135 fr->synth = funcs[p8][ds];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
136 fr->synth_mono = funcs_mono[p8][ds];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
137 fr->synth_type = SYNTH_FPU;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
138
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
139 if (p8) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
140 mpg123_make_conv16to8_table();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
141 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
142 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
143
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
144 static void
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
145 init(void)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
146 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
147 ConfigDb *db;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
148
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
149 mpg123_make_decode_tables(outscale);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
150
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
151 mpg123_cfg.resolution = 16;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
152 mpg123_cfg.channels = 2;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
153 mpg123_cfg.downsample = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
154 mpg123_cfg.http_buffer_size = 128;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
155 mpg123_cfg.http_prebuffer = 25;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
156 mpg123_cfg.proxy_port = 8080;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
157 mpg123_cfg.proxy_use_auth = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
158 mpg123_cfg.proxy_user = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
159 mpg123_cfg.proxy_pass = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
160 mpg123_cfg.use_udp_channel = TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
161 mpg123_cfg.title_override = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
162 mpg123_cfg.disable_id3v2 = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
163 mpg123_cfg.detect_by = DETECT_EXTENSION;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
164 mpg123_cfg.default_synth = SYNTH_AUTO;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
165
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
166 mpg123_cfg.title_encoding_enabled = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
167 mpg123_cfg.title_encoding = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
168
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
169 db = bmp_cfg_db_open();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
170
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
171 bmp_cfg_db_get_int(db, "MPG123", "resolution", &mpg123_cfg.resolution);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
172 bmp_cfg_db_get_int(db, "MPG123", "channels", &mpg123_cfg.channels);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
173 bmp_cfg_db_get_int(db, "MPG123", "downsample", &mpg123_cfg.downsample);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
174 bmp_cfg_db_get_int(db, "MPG123", "http_buffer_size",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
175 &mpg123_cfg.http_buffer_size);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
176 bmp_cfg_db_get_int(db, "MPG123", "http_prebuffer",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
177 &mpg123_cfg.http_prebuffer);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
178 bmp_cfg_db_get_bool(db, "MPG123", "save_http_stream",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
179 &mpg123_cfg.save_http_stream);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
180 if (!bmp_cfg_db_get_string
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
181 (db, "MPG123", "save_http_path", &mpg123_cfg.save_http_path))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
182 mpg123_cfg.save_http_path = g_strdup(g_get_home_dir());
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
183
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
184 bmp_cfg_db_get_bool(db, "MPG123", "use_udp_channel",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
185 &mpg123_cfg.use_udp_channel);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
186
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
187 bmp_cfg_db_get_bool(db, "MPG123", "use_proxy", &mpg123_cfg.use_proxy);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
188 if (!bmp_cfg_db_get_string
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
189 (db, "MPG123", "proxy_host", &mpg123_cfg.proxy_host))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
190 mpg123_cfg.proxy_host = g_strdup("localhost");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
191 bmp_cfg_db_get_int(db, "MPG123", "proxy_port", &mpg123_cfg.proxy_port);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
192 bmp_cfg_db_get_bool(db, "MPG123", "proxy_use_auth",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
193 &mpg123_cfg.proxy_use_auth);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
194 bmp_cfg_db_get_string(db, "MPG123", "proxy_user", &mpg123_cfg.proxy_user);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
195 bmp_cfg_db_get_string(db, "MPG123", "proxy_pass", &mpg123_cfg.proxy_pass);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
196
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
197 bmp_cfg_db_get_bool(db, "MPG123", "title_override",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
198 &mpg123_cfg.title_override);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
199 bmp_cfg_db_get_bool(db, "MPG123", "disable_id3v2",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
200 &mpg123_cfg.disable_id3v2);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
201 if (!bmp_cfg_db_get_string
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
202 (db, "MPG123", "id3_format", &mpg123_cfg.id3_format))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
203 mpg123_cfg.id3_format = g_strdup("%p - %t");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
204 bmp_cfg_db_get_int(db, "MPG123", "detect_by", &mpg123_cfg.detect_by);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
205 bmp_cfg_db_get_int(db, "MPG123", "default_synth",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
206 &mpg123_cfg.default_synth);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
207
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
208 bmp_cfg_db_get_bool(db, "MPG123", "title_encoding_enabled", &mpg123_cfg.title_encoding_enabled);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
209 bmp_cfg_db_get_string(db, "MPG123", "title_encoding", &mpg123_cfg.title_encoding);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
210 if (mpg123_cfg.title_encoding_enabled)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
211 mpg123_id3_encoding_list = g_strsplit_set(mpg123_cfg.title_encoding, ENCODING_SEPARATOR, 0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
212
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
213 bmp_cfg_db_close(db);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
214
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
215 if (mpg123_cfg.resolution != 16 && mpg123_cfg.resolution != 8)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
216 mpg123_cfg.resolution = 16;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
217
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
218 mpg123_cfg.channels = CLAMP(mpg123_cfg.channels, 0, 2);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
219 mpg123_cfg.downsample = CLAMP(mpg123_cfg.downsample, 0, 2);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
220 mpg123_getcpuflags(&cpu_fflags, &cpu_efflags);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
221 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
222
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
223 static void
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
224 cleanup(void)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
225 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
226 g_strfreev(mpg123_id3_encoding_list);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
227 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
228
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
229 /* needed for is_our_file() */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
230 static int
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
231 read_n_bytes(VFSFile * file, guint8 * buf, int n)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
232 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
233
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
234 if (vfs_fread(buf, 1, n, file) != n) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
235 return FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
236 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
237 return TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
238 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
239
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
240 static guint32
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
241 convert_to_header(guint8 * buf)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
242 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
243
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
244 return (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + buf[3];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
245 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
246
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
247 static guint32
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
248 convert_to_long(guint8 * buf)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
249 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
250
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
251 return (buf[3] << 24) + (buf[2] << 16) + (buf[1] << 8) + buf[0];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
252 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
253
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
254 static guint16
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
255 read_wav_id(char *filename)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
256 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
257 VFSFile *file;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
258 guint16 wavid;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
259 guint8 buf[4];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
260 guint32 head;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
261 long seek;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
262
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
263 if (!(file = vfs_fopen(filename, "rb"))) { /* Could not open file */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
264 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
265 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
266 if (!(read_n_bytes(file, buf, 4))) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
267 vfs_fclose(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
268 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
269 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
270 head = convert_to_header(buf);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
271 if (head == ('R' << 24) + ('I' << 16) + ('F' << 8) + 'F') { /* Found a riff -- maybe WAVE */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
272 if (vfs_fseek(file, 4, SEEK_CUR) != 0) { /* some error occured */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
273 vfs_fclose(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
274 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
275 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
276 if (!(read_n_bytes(file, buf, 4))) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
277 vfs_fclose(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
278 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
279 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
280 head = convert_to_header(buf);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
281 if (head == ('W' << 24) + ('A' << 16) + ('V' << 8) + 'E') { /* Found a WAVE */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
282 seek = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
283 do {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
284 /* we'll be looking for the fmt-chunk which comes before the data-chunk */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
285 /* A chunk consists of an header identifier (4 bytes), the length of the chunk
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
286 (4 bytes), and the chunkdata itself, padded to be an even number of bytes.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
287 We'll skip all chunks until we find the "data"-one which could contain
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
288 mpeg-data */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
289 if (seek != 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
290 if (vfs_fseek(file, seek, SEEK_CUR) != 0) { /* some error occured */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
291 vfs_fclose(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
292 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
293 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
294 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
295 if (!(read_n_bytes(file, buf, 4))) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
296 vfs_fclose(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
297 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
298 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
299 head = convert_to_header(buf);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
300 if (!(read_n_bytes(file, buf, 4))) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
301 vfs_fclose(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
302 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
303 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
304 seek = convert_to_long(buf);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
305 seek = seek + (seek % 2); /* Has to be even (padding) */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
306 if (seek >= 2
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
307 && head == ('f' << 24) + ('m' << 16) + ('t' << 8) + ' ') {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
308 if (!(read_n_bytes(file, buf, 2))) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
309 vfs_fclose(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
310 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
311 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
312 wavid = buf[0] + 256 * buf[1];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
313 seek -= 2;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
314 /* we could go on looking for
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
315 other things, but all we
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
316 wanted was the wavid */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
317 vfs_fclose(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
318 return wavid;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
319 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
320 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
321 while (head != ('d' << 24) + ('a' << 16) + ('t' << 8) + 'a');
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
322 /* it's RIFF WAVE */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
323 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
324 /* it's RIFF */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
325 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
326 /* it's not even RIFF */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
327 vfs_fclose(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
328 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
329 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
330
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
331 #define DET_BUF_SIZE 1024
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
332
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
333 static gboolean
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
334 mpg123_detect_by_content(char *filename)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
335 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
336 VFSFile *file;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
337 guchar tmp[4];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
338 guint32 head;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
339 struct frame fr;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
340 guchar buf[DET_BUF_SIZE];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
341 int in_buf, i;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
342 gboolean ret = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
343
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
344 if ((file = vfs_fopen(filename, "rb")) == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
345 return FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
346 if (vfs_fread(tmp, 1, 4, file) != 4)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
347 goto done;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
348 head = convert_to_header(tmp);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
349 while (!mpg123_head_check(head)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
350 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
351 * The mpeg-stream can start anywhere in the file,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
352 * so we check the entire file
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
353 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
354 /* Optimize this */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
355 in_buf = vfs_fread(buf, 1, DET_BUF_SIZE, file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
356 if (in_buf == 0)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
357 goto done;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
358
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
359 for (i = 0; i < in_buf; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
360 head <<= 8;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
361 head |= buf[i];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
362 if (mpg123_head_check(head)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
363 vfs_fseek(file, i + 1 - in_buf, SEEK_CUR);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
364 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
365 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
366 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
367 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
368 if (mpg123_decode_header(&fr, head)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
369 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
370 * We found something which looks like a MPEG-header.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
371 * We check the next frame too, to be sure
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
372 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
373
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
374 if (vfs_fseek(file, fr.framesize, SEEK_CUR) != 0)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
375 goto done;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
376 if (vfs_fread(tmp, 1, 4, file) != 4)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
377 goto done;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
378 head = convert_to_header(tmp);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
379 if (mpg123_head_check(head) && mpg123_decode_header(&fr, head))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
380 ret = TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
381 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
382
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
383 done:
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
384 vfs_fclose(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
385 return ret;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
386 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
387
354
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
388 static gboolean
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
389 mpg123_detect_by_content_stream(gchar *url)
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
390 {
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
391 gchar *buf, inbuf[BUFSIZE_X];
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
392 struct hostent *hp;
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
393 struct sockaddr_in sa;
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
394 gint s, i, y = 0;
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
395 gchar *user, *pass, *host, *filename;
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
396 gint port;
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
397
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
398 g_strstrip(url);
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
399
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
400 parse_url(url, &user, &pass, &host, &port, &filename);
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
401
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
402 if (!(s = socket(AF_INET, SOCK_STREAM, 0)))
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
403 {
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
404 perror("socket");
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
405 return FALSE;
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
406 }
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
407
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
408 if ((hp = gethostbyname(host)) == NULL)
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
409 {
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
410 g_print("[stream detect] Unable to resolve %s\n", host);
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
411 close(s);
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
412 return FALSE;
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
413 }
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
414
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
415 memset(&sa, '\0', sizeof(sa));
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
416 sa.sin_family = AF_INET;
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
417 sa.sin_port = htons(port);
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
418 memcpy(&sa.sin_addr, hp->h_addr, hp->h_length);
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
419
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
420 if (connect(s, (struct sockaddr *)&sa, sizeof(sa)) < 0)
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
421 {
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
422 perror("connect");
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
423 return FALSE;
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
424 }
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
425
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
426 g_print("[stream detect] connected to %s, port %d\n", host, port);
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
427
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
428 buf = g_strdup_printf("GET /%s HTTP/1.0\r\nUser-Agent: " PACKAGE "/" PACKAGE_VERSION "\r\n\r\n", filename ? filename : "");
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
429 i = write(s, buf, strlen(buf));
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
430 g_free(buf);
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
431
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
432 if (i == -1)
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
433 {
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
434 perror("write");
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
435 return FALSE;
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
436 }
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
437
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
438 /* don't ask. --nenolod */
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
439 while ((i = read(s, inbuf + y, BUFSIZE_X - y)) != 0 && y < BUFSIZE_X)
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
440 {
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
441 inbuf[y + i] = '\0';
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
442 y += i;
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
443 }
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
444
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
445 close(s);
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
446
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
447 buf = strtok(inbuf, "\n");
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
448 while ((buf = strtok(NULL, "\n")) != NULL)
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
449 {
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
450 if (!g_strncasecmp("content-type:audio/mpeg", buf, 23) ||
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
451 !g_strncasecmp("icy-br:", buf, 7) || /* XXX ShoutCAST sometimes doesnt send the content-type header */
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
452 !g_strncasecmp("Content-Type: audio/mpeg", buf, 24))
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
453 {
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
454 g_print("[stream detect] server is providing audio/mpeg stream\n");
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
455 return TRUE;
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
456 }
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
457 }
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
458
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
459 g_print("[stream detect] server is NOT providing audio/mpeg stream\n");
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
460 return FALSE;
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
461 }
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
462
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
463 static int
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
464 is_our_file(char *filename)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
465 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
466 char *ext;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
467 guint16 wavid;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
468
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
469 /* FIXME: wtf? */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
470 /* We assume all http:// (except those ending in .ogg) are mpeg --
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
471 * why do we do that? */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
472 if (!strncasecmp(filename, "http://", 7)) {
354
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
473 #ifdef NOTYET
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
474 ext = strrchr(filename, '.');
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
475 if (ext) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
476 if (!strncasecmp(ext, ".ogg", 4))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
477 return FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
478 if (!strncasecmp(ext, ".rm", 3) ||
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
479 !strncasecmp(ext, ".ra", 3) ||
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
480 !strncasecmp(ext, ".rpm", 4) ||
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
481 !strncasecmp(ext, ".ram", 4))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
482 return FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
483 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
484 return TRUE;
354
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
485 #else
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
486 return mpg123_detect_by_content_stream(filename);
e2775c9b8b13 [svn] very rudementary http stream detection support for mpg123-clone.
nenolod
parents: 353
diff changeset
487 #endif
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
488 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
489 if (mpg123_cfg.detect_by == DETECT_CONTENT)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
490 return (mpg123_detect_by_content(filename));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
491
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
492 ext = strrchr(filename, '.');
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
493 if (ext) {
353
18f881216679 [svn] mpg123-clone: Add '.mp3.part' to list of allowed extension types.
nenolod
parents: 352
diff changeset
494 if (!strncasecmp(ext, ".mp2", 4) || !strncasecmp(ext, ".mp3", 4) || !strncasecmp((ext - 4), ".mp3.part", 9) ) {
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
495 return TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
496 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
497 if (!strncasecmp(ext, ".wav", 4)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
498 wavid = read_wav_id(filename);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
499 if (wavid == 85 || wavid == 80) { /* Microsoft says 80, files say 85... */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
500 return TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
501 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
502 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
503 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
504
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
505 if (mpg123_cfg.detect_by == DETECT_BOTH)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
506 return (mpg123_detect_by_content(filename));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
507 return FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
508 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
509
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
510 static void
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
511 play_frame(struct frame *fr)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
512 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
513 if (fr->error_protection) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
514 bsi.wordpointer += 2;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
515 /* mpg123_getbits(16); *//* skip crc */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
516 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
517 if (!fr->do_layer(fr)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
518 skip_frames = 2;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
519 mpg123_info->output_audio = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
520 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
521 else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
522 if (!skip_frames)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
523 mpg123_info->output_audio = TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
524 else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
525 skip_frames--;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
526 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
527 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
528
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
529 static const char *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
530 get_id3_genre(unsigned char genre_code)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
531 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
532 if (genre_code < GENRE_MAX)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
533 return gettext(mpg123_id3_genres[genre_code]);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
534
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
535 return "";
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
536 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
537
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
538 guint
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
539 mpg123_strip_spaces(char *src, size_t n)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
540 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
541 gchar *space = NULL, /* last space in src */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
542 *start = src;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
543
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
544 while (n--)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
545 switch (*src++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
546 case '\0':
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
547 n = 0; /* breaks out of while loop */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
548
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
549 src--;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
550 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
551 case ' ':
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
552 if (space == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
553 space = src - 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
554 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
555 default:
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
556 space = NULL; /* don't terminate intermediate spaces */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
557
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
558 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
559 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
560 if (space != NULL) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
561 src = space;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
562 *src = '\0';
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
563 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
564 return src - start;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
565 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
566
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
567 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
568 * Function extname (filename)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
569 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
570 * Return pointer within filename to its extenstion, or NULL if
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
571 * filename has no extension.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
572 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
573 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
574 static gchar *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
575 extname(const char *filename)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
576 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
577 gchar *ext = strrchr(filename, '.');
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
578
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
579 if (ext != NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
580 ++ext;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
581
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
582 return ext;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
583 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
584
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
585 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
586 * Function id3v1_to_id3v2 (v1, v2)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
587 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
588 * Convert ID3v1 tag `v1' to ID3v2 tag `v2'.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
589 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
590 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
591 void
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
592 mpg123_id3v1_to_id3v2(struct id3v1tag_t *v1, struct id3tag_t *v2)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
593 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
594 memset(v2, 0, sizeof(struct id3tag_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
595 strncpy(v2->title, v1->title, 30);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
596 strncpy(v2->artist, v1->artist, 30);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
597 strncpy(v2->album, v1->album, 30);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
598 strncpy(v2->comment, v1->u.v1_0.comment, 30);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
599 strncpy(v2->genre, get_id3_genre(v1->genre), sizeof(v2->genre));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
600 g_strstrip(v2->title);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
601 g_strstrip(v2->artist);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
602 g_strstrip(v2->album);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
603 g_strstrip(v2->comment);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
604 g_strstrip(v2->genre);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
605 v2->year = atoi(v1->year);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
606
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
607 /* Check for v1.1 tags. */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
608 if (v1->u.v1_1.__zero == 0)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
609 v2->track_number = v1->u.v1_1.track_number;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
610 else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
611 v2->track_number = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
612 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
613
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
614 static char *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
615 mpg123_getstr(char *str)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
616 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
617 if (str && strlen(str) > 0)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
618 return str;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
619 return NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
620 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
621
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
622 static gchar *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
623 convert_id3_title(gchar * title)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
624 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
625 gchar **encoding = mpg123_id3_encoding_list;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
626 gchar *new_title = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
627
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
628 if (g_utf8_validate(title, -1, NULL))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
629 return title;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
630
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
631 while (*encoding && !new_title) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
632 new_title = g_convert(title, strlen(title), "UTF-8", *encoding++,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
633 NULL, NULL, NULL);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
634 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
635
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
636 if (new_title) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
637 g_free(title);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
638 return new_title;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
639 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
640
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
641 /* FIXME: We're relying on BMP core to provide fallback
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
642 * conversion */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
643 return title;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
644 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
645
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
646 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
647 * Function mpg123_format_song_title (tag, filename)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
648 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
649 * Create song title according to `tag' and/or `filename' and
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
650 * return it. The title must be subsequently freed using g_free().
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
651 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
652 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
653 gchar *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
654 mpg123_format_song_title(struct id3tag_t * tag, gchar * filename)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
655 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
656 gchar *title = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
657 TitleInput *input;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
658
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
659 input = bmp_title_input_new();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
660
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
661 if (tag) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
662 input->performer = mpg123_getstr(tag->artist);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
663 input->album_name = mpg123_getstr(tag->album);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
664 input->track_name = mpg123_getstr(tag->title);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
665 input->year = tag->year;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
666 input->track_number = tag->track_number;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
667 input->genre = mpg123_getstr(tag->genre);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
668 input->comment = mpg123_getstr(tag->comment);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
669 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
670
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
671 input->file_name = g_path_get_basename(filename);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
672 input->file_path = g_path_get_dirname(filename);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
673 input->file_ext = extname(filename);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
674
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
675 title = xmms_get_titlestring(mpg123_cfg.title_override ?
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
676 mpg123_cfg.id3_format :
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
677 xmms_get_gentitle_format(), input);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
678
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
679 if (!title) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
680 /* Format according to filename. */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
681 title = g_path_get_basename(filename);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
682 if (extname(title))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
683 *(extname(title) - 1) = '\0'; /* removes period */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
684 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
685
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
686 g_free(input->file_path);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
687 g_free(input->file_name);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
688 g_free(input);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
689
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
690 if (mpg123_cfg.title_encoding_enabled)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
691 title = convert_id3_title(title);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
692
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
693 return title;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
694 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
695
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
696 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
697 * Function mpg123_get_id3v2 (id3d, tag)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
698 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
699 * Get desired contents from the indicated id3tag and store it in
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
700 * `tag'.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
701 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
702 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
703 void
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
704 mpg123_get_id3v2(struct id3_tag *id3d, struct id3tag_t *tag)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
705 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
706 struct id3_frame *id3frm;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
707 gchar *txt;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
708 gint tlen, num;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
709
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
710 #define ID3_SET(_tid,_fld) \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
711 { \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
712 id3frm = id3_get_frame( id3d, _tid, 1 ); \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
713 if (id3frm) { \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
714 txt = _tid == ID3_TCON ? id3_get_content(id3frm) \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
715 : id3_get_text(id3frm); \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
716 if(txt) \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
717 { \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
718 tlen = strlen(txt); \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
719 if ( tlen >= sizeof(tag->_fld) ) \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
720 tlen = sizeof(tag->_fld)-1; \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
721 strncpy( tag->_fld, txt, tlen ); \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
722 tag->_fld[tlen] = 0; \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
723 g_free(txt); \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
724 } \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
725 else \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
726 tag->_fld[0] = 0; \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
727 } else { \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
728 tag->_fld[0] = 0; \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
729 } \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
730 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
731
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
732 #define ID3_SET_NUM(_tid,_fld) \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
733 { \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
734 id3frm = id3_get_frame(id3d, _tid, 1); \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
735 if (id3frm) { \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
736 num = id3_get_text_number(id3frm); \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
737 tag->_fld = num >= 0 ? num : 0; \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
738 } else \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
739 tag->_fld = 0; \
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
740 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
741
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
742 ID3_SET(ID3_TIT2, title);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
743 ID3_SET(ID3_TPE1, artist);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
744 if (strlen(tag->artist) == 0)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
745 ID3_SET(ID3_TPE2, artist);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
746 ID3_SET(ID3_TALB, album);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
747 ID3_SET_NUM(ID3_TYER, year);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
748 ID3_SET_NUM(ID3_TRCK, track_number);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
749 ID3_SET(ID3_COMM, comment);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
750 ID3_SET(ID3_TCON, genre);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
751 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
752
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
753
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
754 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
755 * Function get_song_title (fd, filename)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
756 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
757 * Get song title of file. File position of `fd' will be
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
758 * clobbered. `fd' may be NULL, in which case `filename' is opened
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
759 * separately. The returned song title must be subsequently freed
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
760 * using g_free().
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
761 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
762 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
763 static gchar *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
764 get_song_title(VFSFile * fd, char *filename)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
765 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
766 VFSFile *file = fd;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
767 char *ret = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
768 struct id3v1tag_t id3v1tag;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
769 struct id3tag_t id3tag;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
770
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
771 if (file || (file = vfs_fopen(filename, "rb")) != 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
772 struct id3_tag *id3 = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
773
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
774 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
775 * Try reading ID3v2 tag.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
776 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
777 if (!mpg123_cfg.disable_id3v2) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
778 vfs_fseek(file, 0, SEEK_SET);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
779 id3 = id3_open_fp(file, 0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
780 if (id3) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
781 mpg123_get_id3v2(id3, &id3tag);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
782 ret = mpg123_format_song_title(&id3tag, filename);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
783 id3_close(id3);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
784 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
785 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
786
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
787 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
788 * Try reading ID3v1 tag.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
789 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
790 if (!id3 && (vfs_fseek(file, -1 * sizeof(id3v1tag), SEEK_END) == 0) &&
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
791 (vfs_fread(&id3v1tag, 1, sizeof(id3v1tag), file) ==
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
792 sizeof(id3v1tag)) && (strncmp(id3v1tag.tag, "TAG", 3) == 0)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
793 mpg123_id3v1_to_id3v2(&id3v1tag, &id3tag);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
794 ret = mpg123_format_song_title(&id3tag, filename);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
795 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
796
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
797 if (!fd)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
798 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
799 * File was opened in this function.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
800 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
801 vfs_fclose(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
802 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
803
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
804 if (ret == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
805 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
806 * Unable to get ID3 tag.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
807 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
808 ret = mpg123_format_song_title(NULL, filename);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
809
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
810 return ret;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
811 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
812
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
813 static long
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
814 get_song_length(VFSFile * file)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
815 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
816 int len;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
817 char tmp[4];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
818
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
819 vfs_fseek(file, 0, SEEK_END);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
820 len = vfs_ftell(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
821 vfs_fseek(file, -128, SEEK_END);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
822 vfs_fread(tmp, 1, 3, file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
823 if (!strncmp(tmp, "TAG", 3))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
824 len -= 128;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
825 return len;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
826 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
827
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
828
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
829 static guint
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
830 get_song_time(VFSFile * file)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
831 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
832 guint32 head;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
833 guchar tmp[4], *buf;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
834 struct frame frm;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
835 xing_header_t xing_header;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
836 double tpf, bpf;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
837 guint32 len;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
838
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
839 if (!file)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
840 return -1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
841
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
842 vfs_fseek(file, 0, SEEK_SET);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
843 if (vfs_fread(tmp, 1, 4, file) != 4)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
844 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
845 head = convert_to_header(tmp);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
846 while (!mpg123_head_check(head)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
847 head <<= 8;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
848 if (vfs_fread(tmp, 1, 1, file) != 1)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
849 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
850 head |= tmp[0];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
851 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
852 if (mpg123_decode_header(&frm, head)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
853 buf = g_malloc(frm.framesize + 4);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
854 vfs_fseek(file, -4, SEEK_CUR);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
855 vfs_fread(buf, 1, frm.framesize + 4, file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
856 tpf = mpg123_compute_tpf(&frm);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
857 if (mpg123_get_xing_header(&xing_header, buf)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
858 g_free(buf);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
859 if (xing_header.bytes == 0)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
860 xing_header.bytes = get_song_length(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
861 return (tpf * xing_header.frames * 1000);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
862 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
863 g_free(buf);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
864 bpf = mpg123_compute_bpf(&frm);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
865 len = get_song_length(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
866 return ((guint) (len / bpf) * tpf * 1000);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
867 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
868 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
869 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
870
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
871 static void
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
872 get_song_info(char *filename, char **title_real, int *len_real)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
873 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
874 VFSFile *file;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
875
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
876 (*len_real) = -1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
877 (*title_real) = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
878
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
879 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
880 * TODO: Getting song info from http streams.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
881 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
882 if (!strncasecmp(filename, "http://", 7))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
883 return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
884
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
885 if ((file = vfs_fopen(filename, "rb")) != NULL) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
886 (*len_real) = get_song_time(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
887 (*title_real) = get_song_title(file, filename);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
888 vfs_fclose(file);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
889 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
890 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
891
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
892 static int
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
893 open_output(void)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
894 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
895 int r;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
896 AFormat fmt = mpg123_cfg.resolution == 16 ? FMT_S16_NE : FMT_U8;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
897 int freq = mpg123_freqs[fr.sampling_frequency] >> mpg123_cfg.downsample;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
898 int channels = mpg123_cfg.channels == 2 ? fr.stereo : 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
899 r = mpg123_ip.output->open_audio(fmt, freq, channels);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
900
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
901 if (r && dopause) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
902 mpg123_ip.output->pause(TRUE);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
903 dopause = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
904 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
905
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
906 return r;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
907 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
908
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
909
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
910 static int
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
911 mpg123_seek(struct frame *fr, xing_header_t * xh, gboolean vbr, int time)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
912 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
913 int jumped = -1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
914
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
915 if (xh) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
916 int percent = ((double) time * 100.0) /
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
917 (mpg123_info->num_frames * mpg123_info->tpf);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
918 int byte = mpg123_seek_point(xh, percent);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
919 jumped = mpg123_stream_jump_to_byte(fr, byte);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
920 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
921 else if (vbr && mpg123_length > 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
922 int byte = ((guint64) time * 1000 * mpg123_info->filesize) /
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
923 mpg123_length;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
924 jumped = mpg123_stream_jump_to_byte(fr, byte);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
925 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
926 else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
927 int frame = time / mpg123_info->tpf;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
928 jumped = mpg123_stream_jump_to_frame(fr, frame);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
929 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
930
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
931 return jumped;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
932 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
933
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
934
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
935 static void *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
936 decode_loop(void *arg)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
937 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
938 gboolean have_xing_header = FALSE, vbr = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
939 int disp_count = 0, temp_time;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
940 char *filename = arg;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
941 xing_header_t xing_header;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
942
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
943 /* This is used by fileinfo on http streams */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
944 mpg123_bitrate = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
945
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
946 mpg123_pcm_sample = g_malloc0(32768);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
947 mpg123_pcm_point = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
948 mpg123_filename = filename;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
949
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
950 mpg123_read_frame_init();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
951
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
952 mpg123_open_stream(filename, -1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
953
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
954 if (mpg123_info->eof || !mpg123_read_frame(&fr))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
955 mpg123_info->eof = TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
956
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
957 if (!mpg123_info->eof && mpg123_info->going) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
958 if (mpg123_cfg.channels == 2)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
959 fr.single = -1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
960 else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
961 fr.single = 3;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
962
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
963 fr.down_sample = mpg123_cfg.downsample;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
964 fr.down_sample_sblimit = SBLIMIT >> mpg123_cfg.downsample;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
965 set_synth_functions(&fr);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
966 mpg123_init_layer3(fr.down_sample_sblimit);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
967
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
968 mpg123_info->tpf = mpg123_compute_tpf(&fr);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
969 if (strncasecmp(filename, "http://", 7)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
970 if (mpg123_stream_check_for_xing_header(&fr, &xing_header)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
971 mpg123_info->num_frames = xing_header.frames;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
972 have_xing_header = TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
973 mpg123_read_frame(&fr);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
974 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
975 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
976
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
977 for (;;) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
978 memcpy(&temp_fr, &fr, sizeof(struct frame));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
979 if (!mpg123_read_frame(&temp_fr)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
980 mpg123_info->eof = TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
981 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
982 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
983 if (fr.lay != temp_fr.lay ||
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
984 fr.sampling_frequency != temp_fr.sampling_frequency ||
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
985 fr.stereo != temp_fr.stereo || fr.lsf != temp_fr.lsf)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
986 memcpy(&fr, &temp_fr, sizeof(struct frame));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
987 else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
988 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
989 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
990
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
991 if (!have_xing_header && strncasecmp(filename, "http://", 7))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
992 mpg123_info->num_frames = mpg123_calc_numframes(&fr);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
993
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
994 memcpy(&fr, &temp_fr, sizeof(struct frame));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
995 mpg123_bitrate = tabsel_123[fr.lsf][fr.lay - 1][fr.bitrate_index];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
996 disp_bitrate = mpg123_bitrate;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
997 mpg123_frequency = mpg123_freqs[fr.sampling_frequency];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
998 mpg123_stereo = fr.stereo;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
999 mpg123_layer = fr.lay;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1000 mpg123_lsf = fr.lsf;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1001 mpg123_mpeg25 = fr.mpeg25;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1002 mpg123_mode = fr.mode;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1003
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1004 if (strncasecmp(filename, "http://", 7)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1005 mpg123_length = mpg123_info->num_frames * mpg123_info->tpf * 1000;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1006 if (!mpg123_title)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1007 mpg123_title = get_song_title(NULL, filename);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1008 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1009 else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1010 if (!mpg123_title)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1011 mpg123_title = mpg123_http_get_title(filename);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1012 mpg123_length = -1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1013 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1014
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1015 mpg123_ip.set_info(mpg123_title, mpg123_length,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1016 mpg123_bitrate * 1000,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1017 mpg123_freqs[fr.sampling_frequency], fr.stereo);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1018
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1019 output_opened = TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1020
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1021 if (!open_output()) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1022 audio_error = TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1023 mpg123_info->eof = TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1024 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1025 else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1026 play_frame(&fr);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1027 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1028
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1029 mpg123_info->first_frame = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1030 while (mpg123_info->going) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1031 if (mpg123_info->jump_to_time != -1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1032 void *xp = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1033 if (have_xing_header)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1034 xp = &xing_header;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1035 if (mpg123_seek(&fr, xp, vbr, mpg123_info->jump_to_time) > -1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1036 mpg123_ip.output->flush(mpg123_info->jump_to_time * 1000);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1037 mpg123_info->eof = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1038 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1039 mpg123_info->jump_to_time = -1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1040 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1041 if (!mpg123_info->eof) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1042 if (mpg123_read_frame(&fr) != 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1043 if (fr.lay != mpg123_layer || fr.lsf != mpg123_lsf) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1044 memcpy(&temp_fr, &fr, sizeof(struct frame));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1045 if (mpg123_read_frame(&temp_fr) != 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1046 if (fr.lay == temp_fr.lay && fr.lsf == temp_fr.lsf) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1047 mpg123_layer = fr.lay;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1048 mpg123_lsf = fr.lsf;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1049 memcpy(&fr, &temp_fr, sizeof(struct frame));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1050 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1051 else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1052 memcpy(&fr, &temp_fr, sizeof(struct frame));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1053 skip_frames = 2;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1054 mpg123_info->output_audio = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1055 continue;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1056 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1057
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1058 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1059 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1060 if (mpg123_freqs[fr.sampling_frequency] != mpg123_frequency
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1061 || mpg123_stereo != fr.stereo) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1062 memcpy(&temp_fr, &fr, sizeof(struct frame));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1063 if (mpg123_read_frame(&temp_fr) != 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1064 if (fr.sampling_frequency ==
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1065 temp_fr.sampling_frequency
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1066 && temp_fr.stereo == fr.stereo) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1067 mpg123_ip.output->buffer_free();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1068 mpg123_ip.output->buffer_free();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1069 while (mpg123_ip.output->buffer_playing()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1070 && mpg123_info->going
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1071 && mpg123_info->jump_to_time == -1)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1072 xmms_usleep(20000);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1073 if (!mpg123_info->going)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1074 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1075 temp_time = mpg123_ip.output->output_time();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1076 mpg123_ip.output->close_audio();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1077 mpg123_frequency =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1078 mpg123_freqs[fr.sampling_frequency];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1079 mpg123_stereo = fr.stereo;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1080 if (!mpg123_ip.output->
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1081 open_audio(mpg123_cfg.resolution ==
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1082 16 ? FMT_S16_NE : FMT_U8,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1083 mpg123_freqs[fr.sampling_frequency]
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1084 >> mpg123_cfg.downsample,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1085 mpg123_cfg.channels ==
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1086 2 ? fr.stereo : 1)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1087 audio_error = TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1088 mpg123_info->eof = TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1089 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1090 mpg123_ip.output->flush(temp_time);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1091 mpg123_ip.set_info(mpg123_title, mpg123_length,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1092 mpg123_bitrate * 1000,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1093 mpg123_frequency,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1094 mpg123_stereo);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1095 memcpy(&fr, &temp_fr, sizeof(struct frame));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1096 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1097 else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1098 memcpy(&fr, &temp_fr, sizeof(struct frame));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1099 skip_frames = 2;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1100 mpg123_info->output_audio = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1101 continue;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1102 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1103 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1104 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1105
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1106 if (tabsel_123[fr.lsf][fr.lay - 1][fr.bitrate_index] !=
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1107 mpg123_bitrate)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1108 mpg123_bitrate =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1109 tabsel_123[fr.lsf][fr.lay - 1][fr.bitrate_index];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1110
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1111 if (!disp_count) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1112 disp_count = 20;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1113 if (mpg123_bitrate != disp_bitrate) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1114 /* FIXME networks streams */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1115 disp_bitrate = mpg123_bitrate;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1116 if (!have_xing_header
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1117 && strncasecmp(filename, "http://", 7)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1118 double rel = mpg123_relative_pos();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1119 if (rel) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1120 mpg123_length =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1121 mpg123_ip.output->written_time() / rel;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1122 vbr = TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1123 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1124
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1125 if (rel == 0 || !(mpg123_length > 0)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1126 mpg123_info->num_frames =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1127 mpg123_calc_numframes(&fr);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1128 mpg123_info->tpf = mpg123_compute_tpf(&fr);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1129 mpg123_length =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1130 mpg123_info->num_frames *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1131 mpg123_info->tpf * 1000;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1132 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1133
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1134
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1135 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1136 mpg123_ip.set_info(mpg123_title, mpg123_length,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1137 mpg123_bitrate * 1000,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1138 mpg123_frequency, mpg123_stereo);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1139 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1140 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1141 else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1142 disp_count--;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1143 play_frame(&fr);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1144 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1145 else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1146 mpg123_ip.output->buffer_free();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1147 mpg123_ip.output->buffer_free();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1148 mpg123_info->eof = TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1149 xmms_usleep(10000);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1150 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1151 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1152 else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1153 xmms_usleep(10000);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1154 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1155 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1156 g_free(mpg123_title);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1157 mpg123_title = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1158 mpg123_stream_close();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1159 if (output_opened && !audio_error)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1160 mpg123_ip.output->close_audio();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1161 g_free(mpg123_pcm_sample);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1162 mpg123_filename = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1163 g_free(filename);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1164
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1165 return NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1166 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1167
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1168 static void
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1169 play_file(char *filename)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1170 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1171 memset(&fr, 0, sizeof(struct frame));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1172 memset(&temp_fr, 0, sizeof(struct frame));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1173
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1174 mpg123_info = g_malloc0(sizeof(PlayerInfo));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1175 mpg123_info->going = 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1176 mpg123_info->first_frame = TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1177 mpg123_info->output_audio = TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1178 mpg123_info->jump_to_time = -1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1179 skip_frames = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1180 audio_error = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1181 output_opened = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1182 dopause = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1183
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1184 decode_thread = g_thread_create(decode_loop, g_strdup(filename), TRUE,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1185 NULL);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1186 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1187
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1188 static void
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1189 stop(void)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1190 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1191 if (mpg123_info && mpg123_info->going) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1192 mpg123_info->going = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1193 g_thread_join(decode_thread);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1194 g_free(mpg123_info);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1195 mpg123_info = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1196 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1197 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1198
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1199 static void
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1200 seek(int time)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1201 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1202 mpg123_info->jump_to_time = time;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1203
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1204 while (mpg123_info->jump_to_time != -1)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1205 xmms_usleep(10000);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1206 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1207
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1208 static void
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1209 do_pause(short p)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1210 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1211 if (output_opened)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1212 mpg123_ip.output->pause(p);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1213 else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1214 dopause = p;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1215 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1216
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1217 static int
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1218 get_time(void)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1219 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1220 if (audio_error)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1221 return -2;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1222 if (!mpg123_info)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1223 return -1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1224 if (!mpg123_info->going
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1225 || (mpg123_info->eof && !mpg123_ip.output->buffer_playing()))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1226 return -1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1227 return mpg123_ip.output->output_time();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1228 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1229
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1230 static void
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1231 aboutbox(void)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1232 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1233 static GtkWidget *aboutbox;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1234
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1235 if (aboutbox != NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1236 return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1237
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1238 aboutbox = xmms_show_message(_("About MPEG Audio Plugin"),
223
e7e9a86c0c01 [svn] Update credits on here reflecting audacious-decoder changes.
nenolod
parents: 177
diff changeset
1239 _("Audacious decoding engine by William Pitcock <nenolod@nenolod.net>, derived from:\n"
e7e9a86c0c01 [svn] Update credits on here reflecting audacious-decoder changes.
nenolod
parents: 177
diff changeset
1240 "mpg123 decoding engine by Michael Hipp <mh@mpg123.de>\n"
e7e9a86c0c01 [svn] Update credits on here reflecting audacious-decoder changes.
nenolod
parents: 177
diff changeset
1241 "Derived partially from mpg123 0.59s.mc3 as well.\n"
129
ce9d4aa5889a [svn] Update the credits to note the code sync that occured.
nenolod
parents: 61
diff changeset
1242 "Based on the original XMMS plugin."),
ce9d4aa5889a [svn] Update the credits to note the code sync that occured.
nenolod
parents: 61
diff changeset
1243 _("Ok"),
ce9d4aa5889a [svn] Update the credits to note the code sync that occured.
nenolod
parents: 61
diff changeset
1244 FALSE, NULL, NULL);
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1245
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1246 g_signal_connect(G_OBJECT(aboutbox), "destroy",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1247 G_CALLBACK(gtk_widget_destroyed), &aboutbox);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1248 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1249
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1250 InputPlugin mpg123_ip = {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1251 NULL,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1252 NULL,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1253 NULL, /* Description */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1254 init,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1255 aboutbox,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1256 mpg123_configure,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1257 is_our_file,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1258 NULL,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1259 play_file,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1260 stop,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1261 do_pause,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1262 seek,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1263 mpg123_set_eq,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1264 get_time,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1265 NULL, NULL,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1266 cleanup,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1267 NULL,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1268 NULL, NULL, NULL,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1269 get_song_info,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1270 mpg123_file_info_box, /* file_info_box */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1271 NULL
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1272 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1273
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1274 InputPlugin *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1275 get_iplugin_info(void)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1276 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1277 mpg123_ip.description = g_strdup_printf(_("MPEG Audio Plugin"));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1278 return &mpg123_ip;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1279 }