Mercurial > audlegacy
annotate Plugins/Input/mpg123/mpg123.c @ 994:3d2984564cb8 trunk
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
author | chainsaw |
---|---|
date | Sun, 30 Apr 2006 18:04:43 -0700 |
parents | a9ac4beb4e15 |
children | e64eb333b63f |
rev | line source |
---|---|
61 | 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 | 3 |
4 #include <glib.h> | |
5 #include <glib/gi18n.h> | |
6 #include <gtk/gtk.h> | |
7 #include <stdlib.h> | |
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 | 20 |
957
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
21 #include "libaudacious/util.h" |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
22 #include "libaudacious/configdb.h" |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
23 #include "libaudacious/vfs.h" |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
24 #include "libaudacious/titlestring.h" |
61 | 25 #include "audacious/util.h" |
957
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
26 #include <tag_c.h> |
61 | 27 |
28 static const long outscale = 32768; | |
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 | 32 static struct frame fr, temp_fr; |
33 | |
34 PlayerInfo *mpg123_info = NULL; | |
35 static GThread *decode_thread; | |
36 | |
37 static gboolean audio_error = FALSE, output_opened = FALSE, dopause = FALSE; | |
38 gint mpg123_bitrate, mpg123_frequency, mpg123_length, mpg123_layer, | |
39 mpg123_lsf; | |
40 gchar *mpg123_title = NULL, *mpg123_filename = NULL; | |
41 static int disp_bitrate, skip_frames = 0; | |
42 static int cpu_fflags, cpu_efflags; | |
43 gboolean mpg123_stereo, mpg123_mpeg25; | |
44 int mpg123_mode; | |
45 | |
46 gchar **mpg123_id3_encoding_list = NULL; | |
47 | |
957
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
48 static TagLib_File *taglib_file; |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
49 static TagLib_Tag *taglib_tag; |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
50 static const TagLib_AudioProperties *taglib_ap; |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
51 |
61 | 52 const char *mpg123_id3_genres[GENRE_MAX] = { |
53 N_("Blues"), N_("Classic Rock"), N_("Country"), N_("Dance"), | |
54 N_("Disco"), N_("Funk"), N_("Grunge"), N_("Hip-Hop"), | |
55 N_("Jazz"), N_("Metal"), N_("New Age"), N_("Oldies"), | |
56 N_("Other"), N_("Pop"), N_("R&B"), N_("Rap"), N_("Reggae"), | |
57 N_("Rock"), N_("Techno"), N_("Industrial"), N_("Alternative"), | |
58 N_("Ska"), N_("Death Metal"), N_("Pranks"), N_("Soundtrack"), | |
59 N_("Euro-Techno"), N_("Ambient"), N_("Trip-Hop"), N_("Vocal"), | |
60 N_("Jazz+Funk"), N_("Fusion"), N_("Trance"), N_("Classical"), | |
61 N_("Instrumental"), N_("Acid"), N_("House"), N_("Game"), | |
62 N_("Sound Clip"), N_("Gospel"), N_("Noise"), N_("AlternRock"), | |
63 N_("Bass"), N_("Soul"), N_("Punk"), N_("Space"), | |
64 N_("Meditative"), N_("Instrumental Pop"), | |
65 N_("Instrumental Rock"), N_("Ethnic"), N_("Gothic"), | |
66 N_("Darkwave"), N_("Techno-Industrial"), N_("Electronic"), | |
67 N_("Pop-Folk"), N_("Eurodance"), N_("Dream"), | |
68 N_("Southern Rock"), N_("Comedy"), N_("Cult"), | |
69 N_("Gangsta Rap"), N_("Top 40"), N_("Christian Rap"), | |
70 N_("Pop/Funk"), N_("Jungle"), N_("Native American"), | |
71 N_("Cabaret"), N_("New Wave"), N_("Psychedelic"), N_("Rave"), | |
72 N_("Showtunes"), N_("Trailer"), N_("Lo-Fi"), N_("Tribal"), | |
73 N_("Acid Punk"), N_("Acid Jazz"), N_("Polka"), N_("Retro"), | |
74 N_("Musical"), N_("Rock & Roll"), N_("Hard Rock"), N_("Folk"), | |
75 N_("Folk/Rock"), N_("National Folk"), N_("Swing"), | |
76 N_("Fast-Fusion"), N_("Bebob"), N_("Latin"), N_("Revival"), | |
77 N_("Celtic"), N_("Bluegrass"), N_("Avantgarde"), | |
78 N_("Gothic Rock"), N_("Progressive Rock"), | |
79 N_("Psychedelic Rock"), N_("Symphonic Rock"), N_("Slow Rock"), | |
80 N_("Big Band"), N_("Chorus"), N_("Easy Listening"), | |
81 N_("Acoustic"), N_("Humour"), N_("Speech"), N_("Chanson"), | |
82 N_("Opera"), N_("Chamber Music"), N_("Sonata"), N_("Symphony"), | |
83 N_("Booty Bass"), N_("Primus"), N_("Porn Groove"), | |
84 N_("Satire"), N_("Slow Jam"), N_("Club"), N_("Tango"), | |
85 N_("Samba"), N_("Folklore"), N_("Ballad"), N_("Power Ballad"), | |
86 N_("Rhythmic Soul"), N_("Freestyle"), N_("Duet"), | |
87 N_("Punk Rock"), N_("Drum Solo"), N_("A Cappella"), | |
88 N_("Euro-House"), N_("Dance Hall"), N_("Goa"), | |
89 N_("Drum & Bass"), N_("Club-House"), N_("Hardcore"), | |
90 N_("Terror"), N_("Indie"), N_("BritPop"), N_("Negerpunk"), | |
91 N_("Polsk Punk"), N_("Beat"), N_("Christian Gangsta Rap"), | |
92 N_("Heavy Metal"), N_("Black Metal"), N_("Crossover"), | |
93 N_("Contemporary Christian"), N_("Christian Rock"), | |
94 N_("Merengue"), N_("Salsa"), N_("Thrash Metal"), | |
95 N_("Anime"), N_("JPop"), N_("Synthpop") | |
96 }; | |
97 | |
98 double | |
99 mpg123_compute_tpf(struct frame *fr) | |
100 { | |
101 const int bs[4] = { 0, 384, 1152, 1152 }; | |
102 double tpf; | |
103 | |
104 tpf = bs[fr->lay]; | |
105 tpf /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf); | |
106 return tpf; | |
107 } | |
108 | |
109 static void | |
110 set_synth_functions(struct frame *fr) | |
111 { | |
970
0f294f2b0a9b
[svn] - integer-mode decoding accuracy improvements
nenolod
parents:
969
diff
changeset
|
112 typedef int (*func) (mpgdec_real *, int, unsigned char *, int *); |
0f294f2b0a9b
[svn] - integer-mode decoding accuracy improvements
nenolod
parents:
969
diff
changeset
|
113 typedef int (*func_mono) (mpgdec_real *, unsigned char *, int *); |
0f294f2b0a9b
[svn] - integer-mode decoding accuracy improvements
nenolod
parents:
969
diff
changeset
|
114 typedef void (*func_dct36) (mpgdec_real *, mpgdec_real *, mpgdec_real *, mpgdec_real *, mpgdec_real *); |
61 | 115 |
116 int ds = fr->down_sample; | |
117 int p8 = 0; | |
118 | |
119 static func funcs[][3] = { | |
120 {mpg123_synth_1to1, | |
121 mpg123_synth_2to1, | |
122 mpg123_synth_4to1}, | |
123 {mpg123_synth_1to1_8bit, | |
124 mpg123_synth_2to1_8bit, | |
125 mpg123_synth_4to1_8bit}, | |
126 }; | |
127 | |
128 static func_mono funcs_mono[2][4] = { | |
129 {mpg123_synth_1to1_mono, | |
130 mpg123_synth_2to1_mono, | |
131 mpg123_synth_4to1_mono}, | |
132 {mpg123_synth_1to1_8bit_mono, | |
133 mpg123_synth_2to1_8bit_mono, | |
134 mpg123_synth_4to1_8bit_mono} | |
135 }; | |
136 | |
137 if (mpg123_cfg.resolution == 8) | |
138 p8 = 1; | |
139 fr->synth = funcs[p8][ds]; | |
140 fr->synth_mono = funcs_mono[p8][ds]; | |
141 fr->synth_type = SYNTH_FPU; | |
142 | |
143 if (p8) { | |
144 mpg123_make_conv16to8_table(); | |
145 } | |
146 } | |
147 | |
148 static void | |
149 init(void) | |
150 { | |
151 ConfigDb *db; | |
152 | |
153 mpg123_make_decode_tables(outscale); | |
154 | |
813
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
155 memset(&mpg123_cfg, 0, sizeof(mpg123_cfg)); |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
156 |
61 | 157 mpg123_cfg.resolution = 16; |
158 mpg123_cfg.channels = 2; | |
159 mpg123_cfg.downsample = 0; | |
160 mpg123_cfg.http_buffer_size = 128; | |
161 mpg123_cfg.http_prebuffer = 25; | |
162 mpg123_cfg.proxy_port = 8080; | |
163 mpg123_cfg.proxy_use_auth = FALSE; | |
164 mpg123_cfg.proxy_user = NULL; | |
165 mpg123_cfg.proxy_pass = NULL; | |
166 mpg123_cfg.use_udp_channel = TRUE; | |
167 mpg123_cfg.title_override = FALSE; | |
168 mpg123_cfg.disable_id3v2 = FALSE; | |
169 mpg123_cfg.default_synth = SYNTH_AUTO; | |
170 | |
171 mpg123_cfg.title_encoding_enabled = FALSE; | |
172 mpg123_cfg.title_encoding = NULL; | |
173 | |
174 db = bmp_cfg_db_open(); | |
175 | |
176 bmp_cfg_db_get_int(db, "MPG123", "resolution", &mpg123_cfg.resolution); | |
177 bmp_cfg_db_get_int(db, "MPG123", "channels", &mpg123_cfg.channels); | |
178 bmp_cfg_db_get_int(db, "MPG123", "downsample", &mpg123_cfg.downsample); | |
179 bmp_cfg_db_get_int(db, "MPG123", "http_buffer_size", | |
180 &mpg123_cfg.http_buffer_size); | |
181 bmp_cfg_db_get_int(db, "MPG123", "http_prebuffer", | |
182 &mpg123_cfg.http_prebuffer); | |
183 bmp_cfg_db_get_bool(db, "MPG123", "save_http_stream", | |
184 &mpg123_cfg.save_http_stream); | |
185 if (!bmp_cfg_db_get_string | |
186 (db, "MPG123", "save_http_path", &mpg123_cfg.save_http_path)) | |
187 mpg123_cfg.save_http_path = g_strdup(g_get_home_dir()); | |
188 | |
189 bmp_cfg_db_get_bool(db, "MPG123", "use_udp_channel", | |
190 &mpg123_cfg.use_udp_channel); | |
191 | |
192 bmp_cfg_db_get_bool(db, "MPG123", "use_proxy", &mpg123_cfg.use_proxy); | |
193 if (!bmp_cfg_db_get_string | |
194 (db, "MPG123", "proxy_host", &mpg123_cfg.proxy_host)) | |
195 mpg123_cfg.proxy_host = g_strdup("localhost"); | |
196 bmp_cfg_db_get_int(db, "MPG123", "proxy_port", &mpg123_cfg.proxy_port); | |
197 bmp_cfg_db_get_bool(db, "MPG123", "proxy_use_auth", | |
198 &mpg123_cfg.proxy_use_auth); | |
199 bmp_cfg_db_get_string(db, "MPG123", "proxy_user", &mpg123_cfg.proxy_user); | |
200 bmp_cfg_db_get_string(db, "MPG123", "proxy_pass", &mpg123_cfg.proxy_pass); | |
201 | |
202 bmp_cfg_db_get_bool(db, "MPG123", "title_override", | |
203 &mpg123_cfg.title_override); | |
204 bmp_cfg_db_get_bool(db, "MPG123", "disable_id3v2", | |
205 &mpg123_cfg.disable_id3v2); | |
206 if (!bmp_cfg_db_get_string | |
207 (db, "MPG123", "id3_format", &mpg123_cfg.id3_format)) | |
208 mpg123_cfg.id3_format = g_strdup("%p - %t"); | |
209 bmp_cfg_db_get_int(db, "MPG123", "default_synth", | |
210 &mpg123_cfg.default_synth); | |
211 | |
212 bmp_cfg_db_get_bool(db, "MPG123", "title_encoding_enabled", &mpg123_cfg.title_encoding_enabled); | |
213 bmp_cfg_db_get_string(db, "MPG123", "title_encoding", &mpg123_cfg.title_encoding); | |
214 if (mpg123_cfg.title_encoding_enabled) | |
215 mpg123_id3_encoding_list = g_strsplit_set(mpg123_cfg.title_encoding, ENCODING_SEPARATOR, 0); | |
216 | |
217 bmp_cfg_db_close(db); | |
218 | |
219 if (mpg123_cfg.resolution != 16 && mpg123_cfg.resolution != 8) | |
220 mpg123_cfg.resolution = 16; | |
221 | |
222 mpg123_cfg.channels = CLAMP(mpg123_cfg.channels, 0, 2); | |
223 mpg123_cfg.downsample = CLAMP(mpg123_cfg.downsample, 0, 2); | |
224 mpg123_getcpuflags(&cpu_fflags, &cpu_efflags); | |
225 } | |
226 | |
227 static void | |
228 cleanup(void) | |
229 { | |
813
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
230 g_free(mpg123_ip.description); |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
231 mpg123_ip.description = NULL; |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
232 |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
233 if (mpg123_cfg.save_http_path) { |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
234 free(mpg123_cfg.save_http_path); |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
235 mpg123_cfg.save_http_path = NULL; |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
236 } |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
237 |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
238 if (mpg123_cfg.proxy_host) { |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
239 free(mpg123_cfg.proxy_host); |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
240 mpg123_cfg.proxy_host = NULL; |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
241 } |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
242 |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
243 if (mpg123_cfg.proxy_user) { |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
244 free(mpg123_cfg.proxy_user); |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
245 mpg123_cfg.proxy_user = NULL; |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
246 } |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
247 |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
248 if (mpg123_cfg.proxy_pass) { |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
249 free(mpg123_cfg.proxy_pass); |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
250 mpg123_cfg.proxy_pass = NULL; |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
251 } |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
252 |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
253 if (mpg123_cfg.id3_format) { |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
254 free(mpg123_cfg.id3_format); |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
255 mpg123_cfg.id3_format = NULL; |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
256 } |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
257 |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
258 if (mpg123_cfg.title_encoding) { |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
259 free(mpg123_cfg.title_encoding); |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
260 mpg123_cfg.title_encoding = NULL; |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
261 } |
c8cf439179b8
[svn] - Fix a ton and a half of memory leaks, via the wonderful Leonardo Boshell <leonardop -at- gentoo.org>.
nenolod
parents:
778
diff
changeset
|
262 |
61 | 263 g_strfreev(mpg123_id3_encoding_list); |
264 } | |
265 | |
994
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
266 static guint32 |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
267 convert_to_header(guint8 * buf) |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
268 { |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
269 return (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + buf[3]; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
270 } |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
271 |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
272 |
777 | 273 #if 0 |
61 | 274 #define DET_BUF_SIZE 1024 |
275 | |
276 static gboolean | |
277 mpg123_detect_by_content(char *filename) | |
278 { | |
279 VFSFile *file; | |
280 guchar tmp[4]; | |
281 guint32 head; | |
282 struct frame fr; | |
283 guchar buf[DET_BUF_SIZE]; | |
284 int in_buf, i; | |
285 gboolean ret = FALSE; | |
775 | 286 guint cyc = 0; |
61 | 287 |
288 if ((file = vfs_fopen(filename, "rb")) == NULL) | |
289 return FALSE; | |
290 if (vfs_fread(tmp, 1, 4, file) != 4) | |
291 goto done; | |
292 head = convert_to_header(tmp); | |
773 | 293 while (!mpg123_head_check(head)) { |
61 | 294 /* |
295 * The mpeg-stream can start anywhere in the file, | |
296 * so we check the entire file | |
762
a22aa7bfa108
[svn] - try to avoid a buffer overflow when detecting an MPEG stream
nenolod
parents:
761
diff
changeset
|
297 * |
771 | 298 * Incorrect! We give up past ten iterations of this |
762
a22aa7bfa108
[svn] - try to avoid a buffer overflow when detecting an MPEG stream
nenolod
parents:
761
diff
changeset
|
299 * code for safety's sake. Buffer overflows suck. --nenolod |
61 | 300 */ |
301 /* Optimize this */ | |
302 in_buf = vfs_fread(buf, 1, DET_BUF_SIZE, file); | |
303 if (in_buf == 0) | |
304 goto done; | |
305 | |
306 for (i = 0; i < in_buf; i++) { | |
307 head <<= 8; | |
308 head |= buf[i]; | |
309 if (mpg123_head_check(head)) { | |
310 vfs_fseek(file, i + 1 - in_buf, SEEK_CUR); | |
311 break; | |
312 } | |
313 } | |
775 | 314 |
315 if (++cyc > 20) | |
316 goto done; | |
61 | 317 } |
318 if (mpg123_decode_header(&fr, head)) { | |
319 /* | |
320 * We found something which looks like a MPEG-header. | |
321 * We check the next frame too, to be sure | |
322 */ | |
323 | |
324 if (vfs_fseek(file, fr.framesize, SEEK_CUR) != 0) | |
325 goto done; | |
326 if (vfs_fread(tmp, 1, 4, file) != 4) | |
327 goto done; | |
328 head = convert_to_header(tmp); | |
329 if (mpg123_head_check(head) && mpg123_decode_header(&fr, head)) | |
330 ret = TRUE; | |
331 } | |
332 | |
333 done: | |
334 vfs_fclose(file); | |
335 return ret; | |
336 } | |
777 | 337 #endif |
61 | 338 |
339 static int | |
340 is_our_file(char *filename) | |
341 { | |
653 | 342 gchar *ext = strrchr(filename, '.'); |
343 | |
761 | 344 if (!strncasecmp(filename, "http://", 7) && (ext && strncasecmp(ext, ".ogg", 4))) |
684
d991052592f6
[svn] - Roll back broken HTTP-based stream detection code.
nenolod
parents:
653
diff
changeset
|
345 return TRUE; |
777 | 346 else if (ext && (!strncasecmp(ext, ".mp3", 4) |
347 || !strncasecmp(ext, ".mp2", 4) | |
348 || !strncasecmp(ext, ".mpg", 4))) | |
349 return TRUE; | |
653 | 350 |
778 | 351 return FALSE; |
61 | 352 } |
353 | |
354 static void | |
355 play_frame(struct frame *fr) | |
356 { | |
357 if (fr->error_protection) { | |
358 bsi.wordpointer += 2; | |
359 /* mpg123_getbits(16); *//* skip crc */ | |
360 } | |
361 if (!fr->do_layer(fr)) { | |
362 skip_frames = 2; | |
363 mpg123_info->output_audio = FALSE; | |
364 } | |
365 else { | |
366 if (!skip_frames) | |
367 mpg123_info->output_audio = TRUE; | |
368 else | |
369 skip_frames--; | |
370 } | |
371 } | |
372 | |
994
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
373 static const char * |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
374 get_id3_genre(unsigned char genre_code) |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
375 { |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
376 if (genre_code < GENRE_MAX) |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
377 return gettext(mpg123_id3_genres[genre_code]); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
378 |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
379 return ""; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
380 } |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
381 |
61 | 382 guint |
383 mpg123_strip_spaces(char *src, size_t n) | |
384 { | |
385 gchar *space = NULL, /* last space in src */ | |
386 *start = src; | |
387 | |
388 while (n--) | |
389 switch (*src++) { | |
390 case '\0': | |
391 n = 0; /* breaks out of while loop */ | |
392 | |
393 src--; | |
394 break; | |
395 case ' ': | |
396 if (space == NULL) | |
397 space = src - 1; | |
398 break; | |
399 default: | |
400 space = NULL; /* don't terminate intermediate spaces */ | |
401 | |
402 break; | |
403 } | |
404 if (space != NULL) { | |
405 src = space; | |
406 *src = '\0'; | |
407 } | |
408 return src - start; | |
409 } | |
410 | |
411 /* | |
412 * Function extname (filename) | |
413 * | |
414 * Return pointer within filename to its extenstion, or NULL if | |
415 * filename has no extension. | |
416 * | |
417 */ | |
418 static gchar * | |
419 extname(const char *filename) | |
420 { | |
421 gchar *ext = strrchr(filename, '.'); | |
422 | |
423 if (ext != NULL) | |
424 ++ext; | |
425 | |
426 return ext; | |
427 } | |
428 | |
994
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
429 /* |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
430 * Function id3v1_to_id3v2 (v1, v2) |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
431 * |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
432 * Convert ID3v1 tag `v1' to ID3v2 tag `v2'. |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
433 * |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
434 */ |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
435 void |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
436 mpg123_id3v1_to_id3v2(struct id3v1tag_t *v1, struct id3tag_t *v2) |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
437 { |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
438 memset(v2, 0, sizeof(struct id3tag_t)); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
439 strncpy(v2->title, v1->title, 30); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
440 strncpy(v2->artist, v1->artist, 30); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
441 strncpy(v2->album, v1->album, 30); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
442 strncpy(v2->comment, v1->u.v1_0.comment, 30); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
443 strncpy(v2->genre, get_id3_genre(v1->genre), sizeof(v2->genre)); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
444 g_strstrip(v2->title); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
445 g_strstrip(v2->artist); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
446 g_strstrip(v2->album); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
447 g_strstrip(v2->comment); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
448 g_strstrip(v2->genre); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
449 { |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
450 char y[5]; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
451 memcpy(y, v1->year, 4); y[4]=0; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
452 v2->year = atoi(y); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
453 } |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
454 |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
455 /* Check for v1.1 tags. */ |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
456 if (v1->u.v1_1.__zero == 0) |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
457 v2->track_number = v1->u.v1_1.track_number; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
458 else |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
459 v2->track_number = 0; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
460 } |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
461 |
974 | 462 #define REMOVE_NONEXISTANT_TAG(x) if (!*x) { x = NULL; } |
463 | |
61 | 464 /* |
465 * Function mpg123_format_song_title (tag, filename) | |
466 * | |
467 * Create song title according to `tag' and/or `filename' and | |
468 * return it. The title must be subsequently freed using g_free(). | |
469 * | |
470 */ | |
471 gchar * | |
957
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
472 mpg123_format_song_title(TagLib_Tag *taglib_tag, gchar * filename) |
61 | 473 { |
474 gchar *title = NULL; | |
475 TitleInput *input; | |
476 | |
477 input = bmp_title_input_new(); | |
478 | |
957
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
479 if (taglib_tag) { |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
480 input->performer = taglib_tag_artist(taglib_tag); |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
481 input->album_name = taglib_tag_album(taglib_tag); |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
482 input->track_name = taglib_tag_title(taglib_tag); |
974 | 483 |
484 mpg123_strip_spaces(input->performer,strlen(input->performer)); | |
485 mpg123_strip_spaces(input->album_name,strlen(input->album_name)); | |
486 mpg123_strip_spaces(input->track_name,strlen(input->track_name)); | |
487 | |
957
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
488 input->year = taglib_tag_year(taglib_tag); |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
489 input->track_number = taglib_tag_track(taglib_tag); |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
490 input->genre = taglib_tag_genre(taglib_tag); |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
491 input->comment = taglib_tag_comment(taglib_tag); |
974 | 492 |
493 /* remove any blank tags, fucking taglib */ | |
494 REMOVE_NONEXISTANT_TAG(input->performer); | |
495 REMOVE_NONEXISTANT_TAG(input->album_name); | |
496 REMOVE_NONEXISTANT_TAG(input->track_name); | |
497 REMOVE_NONEXISTANT_TAG(input->genre); | |
498 REMOVE_NONEXISTANT_TAG(input->comment); | |
61 | 499 } |
500 | |
501 input->file_name = g_path_get_basename(filename); | |
502 input->file_path = g_path_get_dirname(filename); | |
503 input->file_ext = extname(filename); | |
504 | |
505 title = xmms_get_titlestring(mpg123_cfg.title_override ? | |
506 mpg123_cfg.id3_format : | |
507 xmms_get_gentitle_format(), input); | |
508 | |
974 | 509 if (!title /* || strlen(input->track_name) == 0 */) { |
61 | 510 /* Format according to filename. */ |
511 title = g_path_get_basename(filename); | |
512 if (extname(title)) | |
513 *(extname(title) - 1) = '\0'; /* removes period */ | |
514 } | |
515 | |
516 g_free(input->file_path); | |
517 g_free(input->file_name); | |
518 g_free(input); | |
519 | |
520 return title; | |
521 } | |
522 | |
523 /* | |
957
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
524 * Function get_song_title (filename) |
61 | 525 * |
526 */ | |
527 static gchar * | |
957
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
528 get_song_title(char *filename) |
61 | 529 { |
530 char *ret = NULL; | |
957
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
531 taglib_file = taglib_file_new(filename); |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
532 if(taglib_file) { |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
533 taglib_tag = taglib_file_tag(taglib_file); |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
534 taglib_ap = taglib_file_audioproperties(taglib_file); |
61 | 535 } |
536 | |
957
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
537 ret = mpg123_format_song_title(taglib_tag, filename); |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
538 |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
539 taglib_file_free(taglib_file); |
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
540 taglib_tag_free_strings(); |
61 | 541 return ret; |
542 } | |
543 | |
994
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
544 static long |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
545 get_song_length(VFSFile * file) |
61 | 546 { |
547 int len; | |
994
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
548 char tmp[4]; |
61 | 549 |
994
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
550 vfs_fseek(file, 0, SEEK_END); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
551 len = vfs_ftell(file); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
552 vfs_fseek(file, -128, SEEK_END); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
553 vfs_fread(tmp, 1, 3, file); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
554 if (!strncmp(tmp, "TAG", 3)) |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
555 len -= 128; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
556 return len; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
557 } |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
558 |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
559 |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
560 static guint |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
561 get_song_time(VFSFile * file) |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
562 { |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
563 guint32 head; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
564 guchar tmp[4], *buf; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
565 struct frame frm; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
566 xing_header_t xing_header; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
567 double tpf, bpf; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
568 guint32 len; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
569 |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
570 if (!file) |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
571 return -1; |
61 | 572 |
994
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
573 vfs_fseek(file, 0, SEEK_SET); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
574 if (vfs_fread(tmp, 1, 4, file) != 4) |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
575 return 0; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
576 head = convert_to_header(tmp); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
577 while (!mpg123_head_check(head)) { |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
578 head <<= 8; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
579 if (vfs_fread(tmp, 1, 1, file) != 1) |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
580 return 0; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
581 head |= tmp[0]; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
582 } |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
583 if (mpg123_decode_header(&frm, head)) { |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
584 buf = g_malloc(frm.framesize + 4); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
585 vfs_fseek(file, -4, SEEK_CUR); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
586 vfs_fread(buf, 1, frm.framesize + 4, file); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
587 tpf = mpg123_compute_tpf(&frm); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
588 if (mpg123_get_xing_header(&xing_header, buf)) { |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
589 g_free(buf); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
590 if (xing_header.bytes == 0) |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
591 xing_header.bytes = get_song_length(file); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
592 return (tpf * xing_header.frames * 1000); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
593 } |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
594 g_free(buf); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
595 bpf = mpg123_compute_bpf(&frm); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
596 len = get_song_length(file); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
597 return ((guint) (len / bpf) * tpf * 1000); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
598 } |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
599 return 0; |
61 | 600 } |
601 | |
602 static void | |
603 get_song_info(char *filename, char **title_real, int *len_real) | |
604 { | |
994
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
605 VFSFile *file; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
606 |
61 | 607 (*len_real) = -1; |
608 (*title_real) = NULL; | |
609 | |
610 /* | |
611 * TODO: Getting song info from http streams. | |
612 */ | |
613 if (!strncasecmp(filename, "http://", 7)) | |
614 return; | |
615 | |
994
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
616 if ((file = vfs_fopen(filename, "rb")) != NULL) { |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
617 (*len_real) = get_song_time(file); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
618 (*title_real) = get_song_title(filename); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
619 vfs_fclose(file); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
620 } |
61 | 621 } |
622 | |
623 static int | |
624 open_output(void) | |
625 { | |
626 int r; | |
627 AFormat fmt = mpg123_cfg.resolution == 16 ? FMT_S16_NE : FMT_U8; | |
628 int freq = mpg123_freqs[fr.sampling_frequency] >> mpg123_cfg.downsample; | |
629 int channels = mpg123_cfg.channels == 2 ? fr.stereo : 1; | |
630 r = mpg123_ip.output->open_audio(fmt, freq, channels); | |
631 | |
632 if (r && dopause) { | |
633 mpg123_ip.output->pause(TRUE); | |
634 dopause = FALSE; | |
635 } | |
636 | |
637 return r; | |
638 } | |
639 | |
640 | |
641 static int | |
642 mpg123_seek(struct frame *fr, xing_header_t * xh, gboolean vbr, int time) | |
643 { | |
644 int jumped = -1; | |
645 | |
646 if (xh) { | |
647 int percent = ((double) time * 100.0) / | |
648 (mpg123_info->num_frames * mpg123_info->tpf); | |
649 int byte = mpg123_seek_point(xh, percent); | |
650 jumped = mpg123_stream_jump_to_byte(fr, byte); | |
651 } | |
652 else if (vbr && mpg123_length > 0) { | |
653 int byte = ((guint64) time * 1000 * mpg123_info->filesize) / | |
654 mpg123_length; | |
655 jumped = mpg123_stream_jump_to_byte(fr, byte); | |
656 } | |
657 else { | |
658 int frame = time / mpg123_info->tpf; | |
659 jumped = mpg123_stream_jump_to_frame(fr, frame); | |
660 } | |
661 | |
662 return jumped; | |
663 } | |
664 | |
665 | |
666 static void * | |
667 decode_loop(void *arg) | |
668 { | |
669 gboolean have_xing_header = FALSE, vbr = FALSE; | |
670 int disp_count = 0, temp_time; | |
671 char *filename = arg; | |
672 xing_header_t xing_header; | |
673 | |
674 /* This is used by fileinfo on http streams */ | |
675 mpg123_bitrate = 0; | |
676 | |
677 mpg123_pcm_sample = g_malloc0(32768); | |
678 mpg123_pcm_point = 0; | |
679 mpg123_filename = filename; | |
680 | |
681 mpg123_read_frame_init(); | |
682 | |
683 mpg123_open_stream(filename, -1); | |
684 | |
685 if (mpg123_info->eof || !mpg123_read_frame(&fr)) | |
686 mpg123_info->eof = TRUE; | |
687 | |
688 if (!mpg123_info->eof && mpg123_info->going) { | |
689 if (mpg123_cfg.channels == 2) | |
690 fr.single = -1; | |
691 else | |
692 fr.single = 3; | |
693 | |
694 fr.down_sample = mpg123_cfg.downsample; | |
695 fr.down_sample_sblimit = SBLIMIT >> mpg123_cfg.downsample; | |
696 set_synth_functions(&fr); | |
697 mpg123_init_layer3(fr.down_sample_sblimit); | |
698 | |
699 mpg123_info->tpf = mpg123_compute_tpf(&fr); | |
700 if (strncasecmp(filename, "http://", 7)) { | |
701 if (mpg123_stream_check_for_xing_header(&fr, &xing_header)) { | |
702 mpg123_info->num_frames = xing_header.frames; | |
703 have_xing_header = TRUE; | |
704 mpg123_read_frame(&fr); | |
705 } | |
706 } | |
707 | |
708 for (;;) { | |
709 memcpy(&temp_fr, &fr, sizeof(struct frame)); | |
710 if (!mpg123_read_frame(&temp_fr)) { | |
711 mpg123_info->eof = TRUE; | |
712 break; | |
713 } | |
714 if (fr.lay != temp_fr.lay || | |
715 fr.sampling_frequency != temp_fr.sampling_frequency || | |
716 fr.stereo != temp_fr.stereo || fr.lsf != temp_fr.lsf) | |
717 memcpy(&fr, &temp_fr, sizeof(struct frame)); | |
718 else | |
719 break; | |
720 } | |
721 | |
722 if (!have_xing_header && strncasecmp(filename, "http://", 7)) | |
723 mpg123_info->num_frames = mpg123_calc_numframes(&fr); | |
724 | |
725 memcpy(&fr, &temp_fr, sizeof(struct frame)); | |
726 mpg123_bitrate = tabsel_123[fr.lsf][fr.lay - 1][fr.bitrate_index]; | |
727 disp_bitrate = mpg123_bitrate; | |
728 mpg123_frequency = mpg123_freqs[fr.sampling_frequency]; | |
729 mpg123_stereo = fr.stereo; | |
730 mpg123_layer = fr.lay; | |
731 mpg123_lsf = fr.lsf; | |
732 mpg123_mpeg25 = fr.mpeg25; | |
733 mpg123_mode = fr.mode; | |
734 | |
735 if (strncasecmp(filename, "http://", 7)) { | |
736 mpg123_length = mpg123_info->num_frames * mpg123_info->tpf * 1000; | |
737 if (!mpg123_title) | |
957
12f57026da8f
[svn] First attempt at introducing taglib here. Very rough, needs polishing. Please wear protective goggles before opening the file dialog. It *will* explode.
chainsaw
parents:
813
diff
changeset
|
738 mpg123_title = get_song_title(filename); |
61 | 739 } |
740 else { | |
741 if (!mpg123_title) | |
742 mpg123_title = mpg123_http_get_title(filename); | |
743 mpg123_length = -1; | |
744 } | |
745 | |
746 mpg123_ip.set_info(mpg123_title, mpg123_length, | |
747 mpg123_bitrate * 1000, | |
748 mpg123_freqs[fr.sampling_frequency], fr.stereo); | |
749 | |
750 output_opened = TRUE; | |
751 | |
752 if (!open_output()) { | |
753 audio_error = TRUE; | |
754 mpg123_info->eof = TRUE; | |
755 } | |
756 else | |
757 play_frame(&fr); | |
758 } | |
759 | |
760 mpg123_info->first_frame = FALSE; | |
761 while (mpg123_info->going) { | |
762 if (mpg123_info->jump_to_time != -1) { | |
763 void *xp = NULL; | |
764 if (have_xing_header) | |
765 xp = &xing_header; | |
766 if (mpg123_seek(&fr, xp, vbr, mpg123_info->jump_to_time) > -1) { | |
767 mpg123_ip.output->flush(mpg123_info->jump_to_time * 1000); | |
768 mpg123_info->eof = FALSE; | |
769 } | |
770 mpg123_info->jump_to_time = -1; | |
771 } | |
772 if (!mpg123_info->eof) { | |
773 if (mpg123_read_frame(&fr) != 0) { | |
774 if (fr.lay != mpg123_layer || fr.lsf != mpg123_lsf) { | |
775 memcpy(&temp_fr, &fr, sizeof(struct frame)); | |
776 if (mpg123_read_frame(&temp_fr) != 0) { | |
777 if (fr.lay == temp_fr.lay && fr.lsf == temp_fr.lsf) { | |
778 mpg123_layer = fr.lay; | |
779 mpg123_lsf = fr.lsf; | |
780 memcpy(&fr, &temp_fr, sizeof(struct frame)); | |
781 } | |
782 else { | |
783 memcpy(&fr, &temp_fr, sizeof(struct frame)); | |
784 skip_frames = 2; | |
785 mpg123_info->output_audio = FALSE; | |
786 continue; | |
787 } | |
788 | |
789 } | |
790 } | |
791 if (mpg123_freqs[fr.sampling_frequency] != mpg123_frequency | |
792 || mpg123_stereo != fr.stereo) { | |
793 memcpy(&temp_fr, &fr, sizeof(struct frame)); | |
794 if (mpg123_read_frame(&temp_fr) != 0) { | |
795 if (fr.sampling_frequency == | |
796 temp_fr.sampling_frequency | |
797 && temp_fr.stereo == fr.stereo) { | |
798 mpg123_ip.output->buffer_free(); | |
799 mpg123_ip.output->buffer_free(); | |
800 while (mpg123_ip.output->buffer_playing() | |
801 && mpg123_info->going | |
802 && mpg123_info->jump_to_time == -1) | |
803 xmms_usleep(20000); | |
804 if (!mpg123_info->going) | |
805 break; | |
806 temp_time = mpg123_ip.output->output_time(); | |
807 mpg123_ip.output->close_audio(); | |
808 mpg123_frequency = | |
809 mpg123_freqs[fr.sampling_frequency]; | |
810 mpg123_stereo = fr.stereo; | |
811 if (!mpg123_ip.output-> | |
812 open_audio(mpg123_cfg.resolution == | |
813 16 ? FMT_S16_NE : FMT_U8, | |
814 mpg123_freqs[fr.sampling_frequency] | |
815 >> mpg123_cfg.downsample, | |
816 mpg123_cfg.channels == | |
817 2 ? fr.stereo : 1)) { | |
818 audio_error = TRUE; | |
819 mpg123_info->eof = TRUE; | |
820 } | |
821 mpg123_ip.output->flush(temp_time); | |
822 mpg123_ip.set_info(mpg123_title, mpg123_length, | |
823 mpg123_bitrate * 1000, | |
824 mpg123_frequency, | |
825 mpg123_stereo); | |
826 memcpy(&fr, &temp_fr, sizeof(struct frame)); | |
827 } | |
828 else { | |
829 memcpy(&fr, &temp_fr, sizeof(struct frame)); | |
830 skip_frames = 2; | |
831 mpg123_info->output_audio = FALSE; | |
832 continue; | |
833 } | |
834 } | |
835 } | |
836 | |
837 if (tabsel_123[fr.lsf][fr.lay - 1][fr.bitrate_index] != | |
838 mpg123_bitrate) | |
839 mpg123_bitrate = | |
840 tabsel_123[fr.lsf][fr.lay - 1][fr.bitrate_index]; | |
841 | |
842 if (!disp_count) { | |
843 disp_count = 20; | |
844 if (mpg123_bitrate != disp_bitrate) { | |
845 /* FIXME networks streams */ | |
846 disp_bitrate = mpg123_bitrate; | |
847 if (!have_xing_header | |
848 && strncasecmp(filename, "http://", 7)) { | |
849 double rel = mpg123_relative_pos(); | |
850 if (rel) { | |
851 mpg123_length = | |
852 mpg123_ip.output->written_time() / rel; | |
853 vbr = TRUE; | |
854 } | |
855 | |
856 if (rel == 0 || !(mpg123_length > 0)) { | |
857 mpg123_info->num_frames = | |
858 mpg123_calc_numframes(&fr); | |
859 mpg123_info->tpf = mpg123_compute_tpf(&fr); | |
860 mpg123_length = | |
861 mpg123_info->num_frames * | |
862 mpg123_info->tpf * 1000; | |
863 } | |
864 | |
865 | |
866 } | |
867 mpg123_ip.set_info(mpg123_title, mpg123_length, | |
868 mpg123_bitrate * 1000, | |
869 mpg123_frequency, mpg123_stereo); | |
870 } | |
871 } | |
872 else | |
873 disp_count--; | |
874 play_frame(&fr); | |
875 } | |
876 else { | |
877 mpg123_ip.output->buffer_free(); | |
878 mpg123_ip.output->buffer_free(); | |
879 mpg123_info->eof = TRUE; | |
880 xmms_usleep(10000); | |
881 } | |
882 } | |
883 else { | |
884 xmms_usleep(10000); | |
885 } | |
886 } | |
887 g_free(mpg123_title); | |
888 mpg123_title = NULL; | |
889 mpg123_stream_close(); | |
890 if (output_opened && !audio_error) | |
891 mpg123_ip.output->close_audio(); | |
892 g_free(mpg123_pcm_sample); | |
893 mpg123_filename = NULL; | |
894 g_free(filename); | |
895 | |
896 return NULL; | |
897 } | |
898 | |
899 static void | |
900 play_file(char *filename) | |
901 { | |
902 memset(&fr, 0, sizeof(struct frame)); | |
903 memset(&temp_fr, 0, sizeof(struct frame)); | |
904 | |
905 mpg123_info = g_malloc0(sizeof(PlayerInfo)); | |
906 mpg123_info->going = 1; | |
907 mpg123_info->first_frame = TRUE; | |
908 mpg123_info->output_audio = TRUE; | |
909 mpg123_info->jump_to_time = -1; | |
910 skip_frames = 0; | |
911 audio_error = FALSE; | |
912 output_opened = FALSE; | |
913 dopause = FALSE; | |
914 | |
915 decode_thread = g_thread_create(decode_loop, g_strdup(filename), TRUE, | |
916 NULL); | |
917 } | |
918 | |
919 static void | |
920 stop(void) | |
921 { | |
922 if (mpg123_info && mpg123_info->going) { | |
923 mpg123_info->going = FALSE; | |
924 g_thread_join(decode_thread); | |
925 g_free(mpg123_info); | |
926 mpg123_info = NULL; | |
927 } | |
928 } | |
929 | |
930 static void | |
931 seek(int time) | |
932 { | |
933 mpg123_info->jump_to_time = time; | |
934 | |
935 while (mpg123_info->jump_to_time != -1) | |
936 xmms_usleep(10000); | |
937 } | |
938 | |
939 static void | |
940 do_pause(short p) | |
941 { | |
942 if (output_opened) | |
943 mpg123_ip.output->pause(p); | |
944 else | |
945 dopause = p; | |
946 } | |
947 | |
948 static int | |
949 get_time(void) | |
950 { | |
951 if (audio_error) | |
952 return -2; | |
953 if (!mpg123_info) | |
954 return -1; | |
955 if (!mpg123_info->going | |
956 || (mpg123_info->eof && !mpg123_ip.output->buffer_playing())) | |
957 return -1; | |
958 return mpg123_ip.output->output_time(); | |
959 } | |
960 | |
961 static void | |
962 aboutbox(void) | |
963 { | |
964 static GtkWidget *aboutbox; | |
965 | |
966 if (aboutbox != NULL) | |
967 return; | |
968 | |
969 aboutbox = xmms_show_message(_("About MPEG Audio Plugin"), | |
223
e7e9a86c0c01
[svn] Update credits on here reflecting audacious-decoder changes.
nenolod
parents:
177
diff
changeset
|
970 _("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
|
971 "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
|
972 "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
|
973 "Based on the original XMMS plugin."), |
ce9d4aa5889a
[svn] Update the credits to note the code sync that occured.
nenolod
parents:
61
diff
changeset
|
974 _("Ok"), |
ce9d4aa5889a
[svn] Update the credits to note the code sync that occured.
nenolod
parents:
61
diff
changeset
|
975 FALSE, NULL, NULL); |
61 | 976 |
977 g_signal_connect(G_OBJECT(aboutbox), "destroy", | |
978 G_CALLBACK(gtk_widget_destroyed), &aboutbox); | |
979 } | |
980 | |
981 InputPlugin mpg123_ip = { | |
982 NULL, | |
983 NULL, | |
984 NULL, /* Description */ | |
985 init, | |
986 aboutbox, | |
987 mpg123_configure, | |
988 is_our_file, | |
989 NULL, | |
990 play_file, | |
991 stop, | |
992 do_pause, | |
993 seek, | |
994 mpg123_set_eq, | |
995 get_time, | |
996 NULL, NULL, | |
997 cleanup, | |
998 NULL, | |
999 NULL, NULL, NULL, | |
1000 get_song_info, | |
1001 mpg123_file_info_box, /* file_info_box */ | |
1002 NULL | |
1003 }; | |
1004 | |
1005 InputPlugin * | |
1006 get_iplugin_info(void) | |
1007 { | |
1008 mpg123_ip.description = g_strdup_printf(_("MPEG Audio Plugin")); | |
1009 return &mpg123_ip; | |
1010 } |