Mercurial > audlegacy
annotate Plugins/Input/mpg123/mpg123.c @ 1090:09eb2c83097a trunk
[svn] Psychoaccoustics support (to disable, temporarily add -UPSYCHO to your CFLAGS.):
This commit brings psychoaccoustics support (as used in mp3surround decoders) to libmpgdec.
For example, we can now almost fully compensate for lack of bandwidth in ISO compliant MP3 encodings.
In addition, further inaccuracies with pitch and the lack of reverb feeling that some MP3s have are
detected and automatically compensated for.
author | nenolod |
---|---|
date | Sat, 20 May 2006 20:36:10 -0700 |
parents | 592ef16386aa |
children | 9b4e9be457f0 |
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", "title_override", | |
193 &mpg123_cfg.title_override); | |
194 bmp_cfg_db_get_bool(db, "MPG123", "disable_id3v2", | |
195 &mpg123_cfg.disable_id3v2); | |
196 if (!bmp_cfg_db_get_string | |
197 (db, "MPG123", "id3_format", &mpg123_cfg.id3_format)) | |
198 mpg123_cfg.id3_format = g_strdup("%p - %t"); | |
199 bmp_cfg_db_get_int(db, "MPG123", "default_synth", | |
200 &mpg123_cfg.default_synth); | |
201 | |
202 bmp_cfg_db_get_bool(db, "MPG123", "title_encoding_enabled", &mpg123_cfg.title_encoding_enabled); | |
203 bmp_cfg_db_get_string(db, "MPG123", "title_encoding", &mpg123_cfg.title_encoding); | |
204 if (mpg123_cfg.title_encoding_enabled) | |
205 mpg123_id3_encoding_list = g_strsplit_set(mpg123_cfg.title_encoding, ENCODING_SEPARATOR, 0); | |
206 | |
1071
592ef16386aa
[svn] - use global proxy configuration instead of individual configurations (chainsaw)
nenolod
parents:
997
diff
changeset
|
207 bmp_cfg_db_get_bool(db, NULL, "use_proxy", &mpg123_cfg.use_proxy); |
592ef16386aa
[svn] - use global proxy configuration instead of individual configurations (chainsaw)
nenolod
parents:
997
diff
changeset
|
208 bmp_cfg_db_get_string(db, NULL, "proxy_host", &mpg123_cfg.proxy_host); |
592ef16386aa
[svn] - use global proxy configuration instead of individual configurations (chainsaw)
nenolod
parents:
997
diff
changeset
|
209 bmp_cfg_db_get_int(db, NULL, "proxy_port", &mpg123_cfg.proxy_port); |
592ef16386aa
[svn] - use global proxy configuration instead of individual configurations (chainsaw)
nenolod
parents:
997
diff
changeset
|
210 bmp_cfg_db_get_bool(db, NULL, "proxy_use_auth", &mpg123_cfg.proxy_use_auth); |
592ef16386aa
[svn] - use global proxy configuration instead of individual configurations (chainsaw)
nenolod
parents:
997
diff
changeset
|
211 bmp_cfg_db_get_string(db, NULL, "proxy_user", &mpg123_cfg.proxy_user); |
592ef16386aa
[svn] - use global proxy configuration instead of individual configurations (chainsaw)
nenolod
parents:
997
diff
changeset
|
212 bmp_cfg_db_get_string(db, NULL, "proxy_pass", &mpg123_cfg.proxy_pass); |
592ef16386aa
[svn] - use global proxy configuration instead of individual configurations (chainsaw)
nenolod
parents:
997
diff
changeset
|
213 |
61 | 214 bmp_cfg_db_close(db); |
215 | |
216 if (mpg123_cfg.resolution != 16 && mpg123_cfg.resolution != 8) | |
217 mpg123_cfg.resolution = 16; | |
218 | |
219 mpg123_cfg.channels = CLAMP(mpg123_cfg.channels, 0, 2); | |
220 mpg123_cfg.downsample = CLAMP(mpg123_cfg.downsample, 0, 2); | |
221 mpg123_getcpuflags(&cpu_fflags, &cpu_efflags); | |
1090
09eb2c83097a
[svn] Psychoaccoustics support (to disable, temporarily add -UPSYCHO to your CFLAGS.):
nenolod
parents:
1071
diff
changeset
|
222 |
09eb2c83097a
[svn] Psychoaccoustics support (to disable, temporarily add -UPSYCHO to your CFLAGS.):
nenolod
parents:
1071
diff
changeset
|
223 psycho_init(); |
61 | 224 } |
225 | |
226 static void | |
227 cleanup(void) | |
228 { | |
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
|
229 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
|
230 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
|
231 |
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 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
|
233 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
|
234 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
|
235 } |
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 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
|
238 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
|
239 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
|
240 } |
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 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
|
243 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
|
244 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
|
245 } |
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 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
|
248 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
|
249 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
|
250 } |
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 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
|
253 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
|
254 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
|
255 } |
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 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
|
258 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
|
259 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
|
260 } |
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 |
61 | 262 g_strfreev(mpg123_id3_encoding_list); |
263 } | |
264 | |
994
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
265 static guint32 |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
266 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
|
267 { |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
268 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
|
269 } |
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 |
777 | 272 #if 0 |
61 | 273 #define DET_BUF_SIZE 1024 |
274 | |
275 static gboolean | |
276 mpg123_detect_by_content(char *filename) | |
277 { | |
278 VFSFile *file; | |
279 guchar tmp[4]; | |
280 guint32 head; | |
281 struct frame fr; | |
282 guchar buf[DET_BUF_SIZE]; | |
283 int in_buf, i; | |
284 gboolean ret = FALSE; | |
775 | 285 guint cyc = 0; |
61 | 286 |
287 if ((file = vfs_fopen(filename, "rb")) == NULL) | |
288 return FALSE; | |
289 if (vfs_fread(tmp, 1, 4, file) != 4) | |
290 goto done; | |
291 head = convert_to_header(tmp); | |
773 | 292 while (!mpg123_head_check(head)) { |
61 | 293 /* |
294 * The mpeg-stream can start anywhere in the file, | |
295 * 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
|
296 * |
771 | 297 * 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
|
298 * code for safety's sake. Buffer overflows suck. --nenolod |
61 | 299 */ |
300 /* Optimize this */ | |
301 in_buf = vfs_fread(buf, 1, DET_BUF_SIZE, file); | |
302 if (in_buf == 0) | |
303 goto done; | |
304 | |
305 for (i = 0; i < in_buf; i++) { | |
306 head <<= 8; | |
307 head |= buf[i]; | |
308 if (mpg123_head_check(head)) { | |
309 vfs_fseek(file, i + 1 - in_buf, SEEK_CUR); | |
310 break; | |
311 } | |
312 } | |
775 | 313 |
314 if (++cyc > 20) | |
315 goto done; | |
61 | 316 } |
317 if (mpg123_decode_header(&fr, head)) { | |
318 /* | |
319 * We found something which looks like a MPEG-header. | |
320 * We check the next frame too, to be sure | |
321 */ | |
322 | |
323 if (vfs_fseek(file, fr.framesize, SEEK_CUR) != 0) | |
324 goto done; | |
325 if (vfs_fread(tmp, 1, 4, file) != 4) | |
326 goto done; | |
327 head = convert_to_header(tmp); | |
328 if (mpg123_head_check(head) && mpg123_decode_header(&fr, head)) | |
329 ret = TRUE; | |
330 } | |
331 | |
332 done: | |
333 vfs_fclose(file); | |
334 return ret; | |
335 } | |
777 | 336 #endif |
61 | 337 |
338 static int | |
339 is_our_file(char *filename) | |
340 { | |
653 | 341 gchar *ext = strrchr(filename, '.'); |
342 | |
761 | 343 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
|
344 return TRUE; |
777 | 345 else if (ext && (!strncasecmp(ext, ".mp3", 4) |
346 || !strncasecmp(ext, ".mp2", 4) | |
347 || !strncasecmp(ext, ".mpg", 4))) | |
348 return TRUE; | |
653 | 349 |
778 | 350 return FALSE; |
61 | 351 } |
352 | |
353 static void | |
354 play_frame(struct frame *fr) | |
355 { | |
356 if (fr->error_protection) { | |
357 bsi.wordpointer += 2; | |
358 /* mpg123_getbits(16); *//* skip crc */ | |
359 } | |
360 if (!fr->do_layer(fr)) { | |
361 skip_frames = 2; | |
362 mpg123_info->output_audio = FALSE; | |
363 } | |
364 else { | |
365 if (!skip_frames) | |
366 mpg123_info->output_audio = TRUE; | |
367 else | |
368 skip_frames--; | |
369 } | |
370 } | |
371 | |
994
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
372 static const char * |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
373 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
|
374 { |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
375 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
|
376 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
|
377 |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
378 return ""; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
379 } |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
380 |
61 | 381 guint |
382 mpg123_strip_spaces(char *src, size_t n) | |
383 { | |
384 gchar *space = NULL, /* last space in src */ | |
385 *start = src; | |
386 | |
387 while (n--) | |
388 switch (*src++) { | |
389 case '\0': | |
390 n = 0; /* breaks out of while loop */ | |
391 | |
392 src--; | |
393 break; | |
394 case ' ': | |
395 if (space == NULL) | |
396 space = src - 1; | |
397 break; | |
398 default: | |
399 space = NULL; /* don't terminate intermediate spaces */ | |
400 | |
401 break; | |
402 } | |
403 if (space != NULL) { | |
404 src = space; | |
405 *src = '\0'; | |
406 } | |
407 return src - start; | |
408 } | |
409 | |
410 /* | |
411 * Function extname (filename) | |
412 * | |
413 * Return pointer within filename to its extenstion, or NULL if | |
414 * filename has no extension. | |
415 * | |
416 */ | |
417 static gchar * | |
418 extname(const char *filename) | |
419 { | |
420 gchar *ext = strrchr(filename, '.'); | |
421 | |
422 if (ext != NULL) | |
423 ++ext; | |
424 | |
425 return ext; | |
426 } | |
427 | |
994
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
428 /* |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
429 * 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
|
430 * |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
431 * 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
|
432 * |
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 void |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
435 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
|
436 { |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
437 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
|
438 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
|
439 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
|
440 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
|
441 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
|
442 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
|
443 g_strstrip(v2->title); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
444 g_strstrip(v2->artist); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
445 g_strstrip(v2->album); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
446 g_strstrip(v2->comment); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
447 g_strstrip(v2->genre); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
448 { |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
449 char y[5]; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
450 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
|
451 v2->year = atoi(y); |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
452 } |
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 /* 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
|
455 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
|
456 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
|
457 else |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
458 v2->track_number = 0; |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
459 } |
3d2984564cb8
[svn] Taglib length determination veto by nenolod, reverting. Leaving fileinfo optimizations in place, though.
chainsaw
parents:
993
diff
changeset
|
460 |
974 | 461 #define REMOVE_NONEXISTANT_TAG(x) if (!*x) { x = NULL; } |
462 | |
61 | 463 /* |
464 * Function mpg123_format_song_title (tag, filename) | |
465 * | |
466 * Create song title according to `tag' and/or `filename' and | |
467 * return it. The title must be subsequently freed using g_free(). | |
468 * | |
469 */ | |
470 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
|
471 mpg123_format_song_title(TagLib_Tag *taglib_tag, gchar * filename) |
61 | 472 { |
473 gchar *title = NULL; | |
474 TitleInput *input; | |
475 | |
476 input = bmp_title_input_new(); | |
477 | |
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
|
478 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
|
479 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
|
480 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
|
481 input->track_name = taglib_tag_title(taglib_tag); |
974 | 482 |
483 mpg123_strip_spaces(input->performer,strlen(input->performer)); | |
484 mpg123_strip_spaces(input->album_name,strlen(input->album_name)); | |
485 mpg123_strip_spaces(input->track_name,strlen(input->track_name)); | |
486 | |
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
|
487 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
|
488 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
|
489 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
|
490 input->comment = taglib_tag_comment(taglib_tag); |
974 | 491 |
492 /* remove any blank tags, fucking taglib */ | |
493 REMOVE_NONEXISTANT_TAG(input->performer); | |
494 REMOVE_NONEXISTANT_TAG(input->album_name); | |
495 REMOVE_NONEXISTANT_TAG(input->track_name); | |
496 REMOVE_NONEXISTANT_TAG(input->genre); | |
497 REMOVE_NONEXISTANT_TAG(input->comment); | |
61 | 498 } |
499 | |
500 input->file_name = g_path_get_basename(filename); | |
501 input->file_path = g_path_get_dirname(filename); | |
502 input->file_ext = extname(filename); | |
503 | |
504 title = xmms_get_titlestring(mpg123_cfg.title_override ? | |
505 mpg123_cfg.id3_format : | |
506 xmms_get_gentitle_format(), input); | |
507 | |
974 | 508 if (!title /* || strlen(input->track_name) == 0 */) { |
61 | 509 /* Format according to filename. */ |
510 title = g_path_get_basename(filename); | |
511 if (extname(title)) | |
512 *(extname(title) - 1) = '\0'; /* removes period */ | |
513 } | |
514 | |
515 g_free(input->file_path); | |
516 g_free(input->file_name); | |
517 g_free(input); | |
518 | |
519 return title; | |
520 } | |
521 | |
522 /* | |
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
|
523 * Function get_song_title (filename) |
61 | 524 * |
525 */ | |
526 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
|
527 get_song_title(char *filename) |
61 | 528 { |
529 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
|
530 taglib_file = taglib_file_new(filename); |
997
e64eb333b63f
[svn] Properly nullify the tag pointer or we could be passing a stale one.
chainsaw
parents:
994
diff
changeset
|
531 taglib_tag = 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
|
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 } |