Mercurial > audlegacy-plugins
annotate src/wma/wma.c @ 1952:17a6441c71b6
Some missed #include "" to <> changes.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 02 Oct 2007 01:59:24 +0300 |
parents | 2ebeb7816c5e |
children | 6acf1bda788b |
rev | line source |
---|---|
878 | 1 /* |
2 * Audacious WMA input plugin | |
1072 | 3 * (C) 2005, 2006, 2007 Audacious development team |
878 | 4 * |
5 * Based on: | |
6 * xmms-wma - WMA player for BMP | |
7 * Copyright (C) 2004,2005 McMCC <mcmcc@mail.ru> | |
8 * bmp-wma - WMA player for BMP | |
9 * Copyright (C) 2004 Roman Bogorodskiy <bogorodskiy@inbox.ru> | |
10 * | |
11 * This program is free software; you can redistribute it and/or modify | |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
24 */ | |
25 #define _XOPEN_SOURCE 600 | |
1784 | 26 |
27 #include "config.h" | |
28 | |
878 | 29 #include <stdlib.h> |
30 #include <unistd.h> | |
31 #include <math.h> | |
32 #include <stdbool.h> | |
33 #include <stdio.h> | |
34 #include <string.h> | |
35 #include <strings.h> | |
36 #include <glib.h> | |
37 | |
1950
2ebeb7816c5e
Change from "" to <>-style includes. With thanks to ccr for the correct sed voodoo.
chainsaw@localhost
parents:
1784
diff
changeset
|
38 #include <audacious/plugin.h> |
2ebeb7816c5e
Change from "" to <>-style includes. With thanks to ccr for the correct sed voodoo.
chainsaw@localhost
parents:
1784
diff
changeset
|
39 #include <audacious/output.h> |
2ebeb7816c5e
Change from "" to <>-style includes. With thanks to ccr for the correct sed voodoo.
chainsaw@localhost
parents:
1784
diff
changeset
|
40 #include <audacious/util.h> |
2ebeb7816c5e
Change from "" to <>-style includes. With thanks to ccr for the correct sed voodoo.
chainsaw@localhost
parents:
1784
diff
changeset
|
41 #include <audacious/vfs.h> |
2ebeb7816c5e
Change from "" to <>-style includes. With thanks to ccr for the correct sed voodoo.
chainsaw@localhost
parents:
1784
diff
changeset
|
42 #include <audacious/strings.h> |
1952
17a6441c71b6
Some missed #include "" to <> changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1950
diff
changeset
|
43 #include <audacious/i18n.h> |
1950
2ebeb7816c5e
Change from "" to <>-style includes. With thanks to ccr for the correct sed voodoo.
chainsaw@localhost
parents:
1784
diff
changeset
|
44 #include <audacious/main.h> |
2ebeb7816c5e
Change from "" to <>-style includes. With thanks to ccr for the correct sed voodoo.
chainsaw@localhost
parents:
1784
diff
changeset
|
45 #include <audacious/tuple.h> |
1952
17a6441c71b6
Some missed #include "" to <> changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1950
diff
changeset
|
46 #include <audacious/tuple_formatter.h> |
878 | 47 |
48 #include "avcodec.h" | |
49 #include "avformat.h" | |
50 | |
51 #define ABOUT_TXT "Adapted for use in audacious by Tony Vroon (chainsaw@gentoo.org) from\n \ | |
52 the BEEP-WMA plugin which is Copyright (C) 2004,2005 Mokrushin I.V. aka McMCC (mcmcc@mail.ru)\n \ | |
53 and the BMP-WMA plugin which is Copyright (C) 2004 Roman Bogorodskiy <bogorodskiy@inbox.ru>.\n \ | |
54 This plugin based on source code " LIBAVCODEC_IDENT "\nby Fabrice Bellard from \ | |
55 http://ffmpeg.sourceforge.net.\n\n \ | |
56 This program is free software; you can redistribute it and/or modify \n \ | |
57 it under the terms of the GNU General Public License as published by \n \ | |
58 the Free Software Foundation; either version 2 of the License, or \n \ | |
59 (at your option) any later version. \n\n \ | |
60 This program is distributed in the hope that it will be useful, \n \ | |
61 but WITHOUT ANY WARRANTY; without even the implied warranty of \n \ | |
62 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. \n \ | |
63 See the GNU General Public License for more details.\n" | |
64 #define PLUGIN_NAME "Audacious-WMA" | |
65 #define PLUGIN_VERSION "v.1.0.5" | |
66 #define ST_BUFF 1024 | |
67 | |
68 static int wma_decode = 0; | |
69 static gboolean wma_pause = 0; | |
70 static int wma_seekpos = -1; | |
71 static int wma_st_buff, wma_idx, wma_idx2; | |
72 static GThread *wma_decode_thread; | |
73 GStaticMutex wma_mutex = G_STATIC_MUTEX_INIT; | |
74 static AVCodecContext *c = NULL; | |
75 static AVFormatContext *ic = NULL; | |
76 static AVCodecContext *c2 = NULL; | |
77 static AVFormatContext *ic2 = NULL; | |
78 static uint8_t *wma_outbuf, *wma_s_outbuf; | |
79 | |
80 char description[64]; | |
81 static void wma_about(void); | |
82 static void wma_init(void); | |
83 static int wma_is_our_file(char *filename); | |
84 static int wma_is_our_fd(char *filename, VFSFile *fd); | |
85 static void wma_play_file(InputPlayback *data); | |
86 static void wma_stop(InputPlayback *data); | |
87 static void wma_seek(InputPlayback *data, int time); | |
88 static void wma_do_pause(InputPlayback *data, short p); | |
89 static void wma_get_song_info(char *filename, char **title, int *length); | |
1425
a25c2cfcce83
New tuple API conversion for WMA, first try.
Tony Vroon <chainsaw@gentoo.org>
parents:
1395
diff
changeset
|
90 static Tuple *wma_get_song_tuple(char *filename); |
878 | 91 static char *wsong_title; |
92 static int wsong_time; | |
93 | |
94 static GtkWidget *dialog1, *button1, *label1; | |
1072 | 95 static gchar *fmts[] = { "wma", NULL }; |
878 | 96 |
97 InputPlugin wma_ip = | |
98 { | |
1072 | 99 .description = "Windows Media Audio (WMA) Plugin", |
100 .init = wma_init, | |
101 .about = wma_about, | |
102 .is_our_file = wma_is_our_file, | |
103 .play_file = wma_play_file, | |
104 .stop = wma_stop, | |
105 .pause = wma_do_pause, | |
106 .seek = wma_seek, | |
107 .get_song_info = wma_get_song_info, | |
108 .get_song_tuple = wma_get_song_tuple, | |
109 .is_our_file_from_vfs = wma_is_our_fd, | |
110 .vfs_extensions = fmts, | |
878 | 111 }; |
112 | |
1072 | 113 InputPlugin *wma_iplist[] = { &wma_ip, NULL }; |
114 | |
1395
761e17b23e0c
added Discovery plugin type
Cristi Magherusan <majeru@atheme-project.org>
parents:
1390
diff
changeset
|
115 DECLARE_PLUGIN(wma, NULL, NULL, wma_iplist, NULL, NULL, NULL, NULL, NULL); |
1072 | 116 |
878 | 117 static gchar *str_twenty_to_space(gchar * str) |
118 { | |
119 gchar *match, *match_end; | |
120 | |
121 g_return_val_if_fail(str != NULL, NULL); | |
122 | |
123 while ((match = strstr(str, "%20"))) { | |
124 match_end = match + 3; | |
125 *match++ = ' '; | |
126 while (*match_end) | |
127 *match++ = *match_end++; | |
128 *match = 0; | |
129 } | |
130 | |
131 return str; | |
132 } | |
133 | |
134 static void wma_about(void) | |
135 { | |
136 char *title; | |
137 char *message; | |
138 | |
139 if (dialog1) return; | |
140 | |
141 title = (char *)g_malloc(80); | |
142 message = (char *)g_malloc(1000); | |
143 memset(title, 0, 80); | |
144 memset(message, 0, 1000); | |
145 | |
146 sprintf(title, _("About %s"), PLUGIN_NAME); | |
147 sprintf(message, "%s %s\n\n%s", PLUGIN_NAME, PLUGIN_VERSION, ABOUT_TXT); | |
148 | |
149 dialog1 = gtk_dialog_new(); | |
150 g_signal_connect(G_OBJECT(dialog1), "destroy", | |
151 G_CALLBACK(gtk_widget_destroyed), &dialog1); | |
152 gtk_window_set_title(GTK_WINDOW(dialog1), title); | |
153 gtk_window_set_policy(GTK_WINDOW(dialog1), FALSE, FALSE, FALSE); | |
154 gtk_container_border_width(GTK_CONTAINER(dialog1), 5); | |
155 label1 = gtk_label_new(message); | |
156 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog1)->vbox), label1, TRUE, TRUE, 0); | |
157 gtk_widget_show(label1); | |
158 | |
159 button1 = gtk_button_new_with_label(_(" Close ")); | |
160 g_signal_connect_swapped(G_OBJECT(button1), "clicked", | |
161 G_CALLBACK(gtk_widget_destroy), | |
162 GTK_OBJECT(dialog1)); | |
163 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog1)->action_area), button1, | |
164 FALSE, FALSE, 0); | |
165 | |
166 gtk_widget_show(button1); | |
167 gtk_widget_show(dialog1); | |
168 gtk_widget_grab_focus(button1); | |
169 g_free(title); | |
170 g_free(message); | |
171 } | |
172 | |
173 static void wma_init(void) | |
174 { | |
175 avcodec_init(); | |
176 avcodec_register_all(); | |
177 av_register_all(); | |
178 } | |
179 | |
180 static int wma_is_our_file(char *filename) | |
181 { | |
182 AVCodec *codec2; | |
183 | |
184 if(av_open_input_file(&ic2, str_twenty_to_space(filename), NULL, 0, NULL) < 0) return 0; | |
185 | |
186 for(wma_idx2 = 0; wma_idx2 < ic2->nb_streams; wma_idx2++) { | |
187 c2 = &ic2->streams[wma_idx2]->codec; | |
188 if(c2->codec_type == CODEC_TYPE_AUDIO) break; | |
189 } | |
190 | |
191 av_find_stream_info(ic2); | |
192 | |
193 codec2 = avcodec_find_decoder(c2->codec_id); | |
194 | |
195 if(!codec2) { | |
196 av_close_input_file(ic2); | |
197 return 0; | |
198 } | |
199 | |
200 av_close_input_file(ic2); | |
201 return 1; | |
202 } | |
203 | |
204 static int wma_is_our_fd(char *filename, VFSFile *fd) | |
205 { | |
206 AVCodec *codec2; | |
207 | |
208 if(av_open_input_vfsfile(&ic2, filename, fd, NULL, 0, NULL) < 0) return 0; | |
209 | |
210 for(wma_idx2 = 0; wma_idx2 < ic2->nb_streams; wma_idx2++) { | |
211 c2 = &ic2->streams[wma_idx2]->codec; | |
212 if(c2->codec_type == CODEC_TYPE_AUDIO) break; | |
213 } | |
214 | |
215 av_find_stream_info(ic2); | |
216 | |
217 codec2 = avcodec_find_decoder(c2->codec_id); | |
218 | |
1156 | 219 if (!codec2) { |
220 av_close_input_vfsfile(ic2); | |
221 return 0; | |
222 } | |
223 | |
224 av_close_input_vfsfile(ic2); | |
878 | 225 return 1; |
226 } | |
227 | |
228 static void wma_do_pause(InputPlayback *playback, short p) | |
229 { | |
230 wma_pause = p; | |
231 playback->output->pause(wma_pause); | |
232 } | |
233 | |
234 static void wma_seek(InputPlayback *playback, int time) | |
235 { | |
236 wma_seekpos = time; | |
237 if(wma_pause) playback->output->pause(0); | |
1676
aee4ebea943a
xmms_usleep() was removed, use g_usleep()
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
238 while(wma_decode && wma_seekpos!=-1) g_usleep(10000); |
878 | 239 if(wma_pause) playback->output->pause(1); |
240 } | |
241 | |
242 static gchar *extname(const char *filename) | |
243 { | |
244 gchar *ext = strrchr(filename, '.'); | |
245 if(ext != NULL) ++ext; | |
246 return ext; | |
247 } | |
248 | |
1687
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
249 static void _assoc_string(Tuple *tuple, const gint nfield, const gchar *str) |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
250 { |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
251 if (strlen(str) > 0) |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
252 tuple_associate_string(tuple, nfield, NULL, str); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
253 } |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
254 |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
255 static void _assoc_int(Tuple *tuple, const gint nfield, const gint val) |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
256 { |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
257 if (val > 0) |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
258 tuple_associate_int(tuple, nfield, NULL, val); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
259 } |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
260 |
1425
a25c2cfcce83
New tuple API conversion for WMA, first try.
Tony Vroon <chainsaw@gentoo.org>
parents:
1395
diff
changeset
|
261 static Tuple *wma_get_song_tuple(gchar * filename) |
878 | 262 { |
1430
bf7d4c236d9f
Start using tuple_new_from_filename.
Tony Vroon <chainsaw@gentoo.org>
parents:
1425
diff
changeset
|
263 Tuple *ti = tuple_new_from_filename(filename); |
878 | 264 AVFormatContext *in = NULL; |
265 | |
266 if (av_open_input_file(&in, str_twenty_to_space(filename), NULL, 0, NULL) < 0) | |
267 return NULL; | |
268 | |
1687
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
269 tuple_associate_string(ti, FIELD_CODEC, NULL, "Windows Media Audio (WMA)"); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
270 tuple_associate_string(ti, FIELD_QUALITY, NULL, "lossy"); |
1425
a25c2cfcce83
New tuple API conversion for WMA, first try.
Tony Vroon <chainsaw@gentoo.org>
parents:
1395
diff
changeset
|
271 |
878 | 272 av_find_stream_info(in); |
273 | |
1687
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
274 _assoc_string(ti, FIELD_TITLE, in->title); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
275 _assoc_string(ti, FIELD_ARTIST, in->author); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
276 _assoc_string(ti, FIELD_ALBUM, in->album); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
277 _assoc_string(ti, FIELD_COMMENT, in->comment); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
278 _assoc_string(ti, FIELD_GENRE, in->genre); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
279 _assoc_int(ti, FIELD_YEAR, in->year); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
280 _assoc_int(ti, FIELD_TRACK_NUMBER, in->track); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
281 _assoc_int(ti, FIELD_LENGTH, in->duration / 1000); |
878 | 282 |
283 av_close_input_file(in); | |
284 | |
1430
bf7d4c236d9f
Start using tuple_new_from_filename.
Tony Vroon <chainsaw@gentoo.org>
parents:
1425
diff
changeset
|
285 return ti; |
878 | 286 } |
287 | |
288 static gchar *get_song_title(AVFormatContext *in, gchar * filename) | |
289 { | |
290 gchar *ret = NULL; | |
1438
dc3e28d3b92a
mpc: convert, wma: fixes
William Pitcock <nenolod@atheme-project.org>
parents:
1430
diff
changeset
|
291 Tuple *ti = tuple_new_from_filename(filename); |
878 | 292 |
1687
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
293 tuple_associate_string(ti, FIELD_CODEC, NULL, "Windows Media Audio (WMA)"); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
294 tuple_associate_string(ti, FIELD_QUALITY, NULL, "lossy"); |
1438
dc3e28d3b92a
mpc: convert, wma: fixes
William Pitcock <nenolod@atheme-project.org>
parents:
1430
diff
changeset
|
295 |
1687
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
296 _assoc_string(ti, FIELD_TITLE, in->title); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
297 _assoc_string(ti, FIELD_ARTIST, in->author); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
298 _assoc_string(ti, FIELD_ALBUM, in->album); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
299 _assoc_string(ti, FIELD_COMMENT, in->comment); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
300 _assoc_string(ti, FIELD_GENRE, in->genre); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
301 _assoc_int(ti, FIELD_YEAR, in->year); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
302 _assoc_int(ti, FIELD_TRACK_NUMBER, in->track); |
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
303 _assoc_int(ti, FIELD_LENGTH, in->duration / 1000); |
1438
dc3e28d3b92a
mpc: convert, wma: fixes
William Pitcock <nenolod@atheme-project.org>
parents:
1430
diff
changeset
|
304 |
1510
3a252050736c
replace tuple_formatter_process_string() with tuple_formatter_make_title_string() except that for streamings.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1473
diff
changeset
|
305 ret = tuple_formatter_make_title_string(ti, get_gentitle_format()); |
895
5d7e6f06c9b7
[svn] - now wma can handle wide characters in metadata.
yaz
parents:
878
diff
changeset
|
306 |
878 | 307 return ret; |
308 } | |
309 | |
310 static guint get_song_time(AVFormatContext *in) | |
311 { | |
312 if(in->duration) | |
313 return in->duration/1000; | |
314 else | |
315 return 0; | |
316 } | |
317 | |
318 static void wma_get_song_info(char *filename, char **title_real, int *len_real) | |
319 { | |
1438
dc3e28d3b92a
mpc: convert, wma: fixes
William Pitcock <nenolod@atheme-project.org>
parents:
1430
diff
changeset
|
320 Tuple *tuple = wma_get_song_tuple(filename); |
878 | 321 |
322 if (tuple == NULL) | |
323 return; | |
324 | |
1687
d158ce84fda7
Modified for Tuplez/plugin API changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
325 (*len_real) = tuple_get_int(tuple, FIELD_LENGTH, NULL); |
1510
3a252050736c
replace tuple_formatter_process_string() with tuple_formatter_make_title_string() except that for streamings.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1473
diff
changeset
|
326 (*title_real) = tuple_formatter_make_title_string(tuple, get_gentitle_format()); |
878 | 327 } |
328 | |
329 static void wma_playbuff(InputPlayback *playback, int out_size) | |
330 { | |
331 FifoBuffer f; | |
332 int sst_buff; | |
333 | |
334 fifo_init(&f, out_size*2); | |
335 fifo_write(&f, wma_outbuf, out_size, &f.wptr); | |
336 while(!fifo_read(&f, wma_s_outbuf, wma_st_buff, &f.rptr) && wma_decode) | |
337 { | |
338 sst_buff = wma_st_buff; | |
339 if(wma_pause) memset(wma_s_outbuf, 0, sst_buff); | |
1676
aee4ebea943a
xmms_usleep() was removed, use g_usleep()
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
340 while(playback->output->buffer_free() < wma_st_buff) g_usleep(20000); |
878 | 341 produce_audio(playback->output->written_time(), FMT_S16_NE, |
342 c->channels, sst_buff, (short *)wma_s_outbuf, NULL); | |
343 memset(wma_s_outbuf, 0, sst_buff); | |
344 } | |
345 fifo_free(&f); | |
346 return; | |
347 } | |
348 | |
349 static void *wma_play_loop(void *arg) | |
350 { | |
351 InputPlayback *playback = arg; | |
352 uint8_t *inbuf_ptr; | |
353 int out_size, size, len; | |
354 AVPacket pkt; | |
355 | |
356 g_static_mutex_lock(&wma_mutex); | |
1390
095595555e7b
Fix WMA playback.
William Pitcock <nenolod@atheme-project.org>
parents:
1190
diff
changeset
|
357 while(playback->playing) |
095595555e7b
Fix WMA playback.
William Pitcock <nenolod@atheme-project.org>
parents:
1190
diff
changeset
|
358 { |
878 | 359 if(wma_seekpos != -1) |
360 { | |
361 av_seek_frame(ic, wma_idx, wma_seekpos * 1000000LL); | |
362 playback->output->flush(wma_seekpos * 1000); | |
363 wma_seekpos = -1; | |
364 } | |
365 | |
366 if(av_read_frame(ic, &pkt) < 0) break; | |
367 | |
368 size = pkt.size; | |
369 inbuf_ptr = pkt.data; | |
370 | |
371 if(size == 0) break; | |
372 | |
373 while(size > 0){ | |
374 len = avcodec_decode_audio(c, (short *)wma_outbuf, &out_size, | |
375 inbuf_ptr, size); | |
376 if(len < 0) break; | |
377 | |
378 if(out_size <= 0) continue; | |
379 | |
380 wma_playbuff(playback, out_size); | |
381 | |
382 size -= len; | |
383 inbuf_ptr += len; | |
384 if(pkt.data) av_free_packet(&pkt); | |
385 } | |
386 } | |
1676
aee4ebea943a
xmms_usleep() was removed, use g_usleep()
Matti Hamalainen <ccr@tnsp.org>
parents:
1510
diff
changeset
|
387 while(playback->playing && playback->output->buffer_playing()) g_usleep(30000); |
1168 | 388 playback->playing = 0; |
878 | 389 if(wma_s_outbuf) g_free(wma_s_outbuf); |
390 if(wma_outbuf) g_free(wma_outbuf); | |
391 if(pkt.data) av_free_packet(&pkt); | |
392 if(c) avcodec_close(c); | |
393 if(ic) av_close_input_file(ic); | |
394 g_static_mutex_unlock(&wma_mutex); | |
395 return(NULL); | |
396 } | |
397 | |
398 static void wma_play_file(InputPlayback *playback) | |
399 { | |
400 char *filename = playback->filename; | |
401 AVCodec *codec; | |
402 | |
1390
095595555e7b
Fix WMA playback.
William Pitcock <nenolod@atheme-project.org>
parents:
1190
diff
changeset
|
403 if(av_open_input_file(&ic, filename, NULL, 0, NULL) < 0) return; |
878 | 404 |
405 for(wma_idx = 0; wma_idx < ic->nb_streams; wma_idx++) { | |
406 c = &ic->streams[wma_idx]->codec; | |
407 if(c->codec_type == CODEC_TYPE_AUDIO) break; | |
408 } | |
409 | |
410 av_find_stream_info(ic); | |
411 | |
412 codec = avcodec_find_decoder(c->codec_id); | |
413 | |
414 if(!codec) return; | |
415 | |
416 if(avcodec_open(c, codec) < 0) return; | |
417 | |
418 wsong_title = get_song_title(ic, filename); | |
419 wsong_time = get_song_time(ic); | |
420 | |
421 if(playback->output->open_audio(FMT_S16_NE, c->sample_rate, c->channels) <= 0) return; | |
422 | |
423 wma_st_buff = ST_BUFF; | |
424 | |
1075
37abd9b3de4b
[svn] - conversion to yaz's style was not needed, just API v2 ;p
nenolod
parents:
1072
diff
changeset
|
425 wma_ip.set_info(wsong_title, wsong_time, c->bit_rate, c->sample_rate, c->channels); |
878 | 426 |
427 /* av_malloc() will wrap posix_memalign() if necessary -nenolod */ | |
428 wma_s_outbuf = av_malloc(wma_st_buff); | |
429 wma_outbuf = av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE); | |
430 | |
431 wma_seekpos = -1; | |
432 wma_decode = 1; | |
1168 | 433 playback->playing = 1; |
1390
095595555e7b
Fix WMA playback.
William Pitcock <nenolod@atheme-project.org>
parents:
1190
diff
changeset
|
434 wma_decode_thread = g_thread_self(); |
1447
195b5657303e
updated input plugins to use set_pb_ready to signal to the core that they're ready for playback
Giacomo Lozito <james@develia.org>
parents:
1438
diff
changeset
|
435 playback->set_pb_ready(playback); |
1390
095595555e7b
Fix WMA playback.
William Pitcock <nenolod@atheme-project.org>
parents:
1190
diff
changeset
|
436 wma_play_loop(playback); |
878 | 437 } |
438 | |
439 static void wma_stop(InputPlayback *playback) | |
440 { | |
441 wma_decode = 0; | |
1168 | 442 playback->playing = 0; |
878 | 443 if(wma_pause) wma_do_pause(playback, 0); |
444 g_thread_join(wma_decode_thread); | |
445 playback->output->close_audio(); | |
446 } |