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