Mercurial > audlegacy-plugins
annotate src/aac/src/libmp4.c @ 583:dad887da4642 trunk
[svn] - Fixed crash at opening AAC files
- However, still crashes when current song is stopped (can't fix this
now)
author | mf0102 |
---|---|
date | Tue, 30 Jan 2007 12:55:38 -0800 |
parents | 914c96de3244 |
children | 5e2b137a24fe |
rev | line source |
---|---|
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
1 #include <glib.h> |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
2 #include <gtk/gtk.h> |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
3 #include <string.h> |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
4 #include <stdlib.h> |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
5 #include "faad.h" |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
6 #include "mp4ff.h" |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
7 #include "tagging.h" |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
8 |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
9 #include <audacious/plugin.h> |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
10 #include <audacious/output.h> |
4
0ad4849f6219
[svn] - the first pass missed some libaudacious references, this fixes them
nenolod
parents:
0
diff
changeset
|
11 #include <audacious/util.h> |
0ad4849f6219
[svn] - the first pass missed some libaudacious references, this fixes them
nenolod
parents:
0
diff
changeset
|
12 #include <audacious/titlestring.h> |
0ad4849f6219
[svn] - the first pass missed some libaudacious references, this fixes them
nenolod
parents:
0
diff
changeset
|
13 #include <audacious/vfs.h> |
527
d124034ebea3
[svn] - glib/gi18n.h -> audacious/i18n.h for automatic dgettext support
nenolod
parents:
393
diff
changeset
|
14 #include <audacious/i18n.h> |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
15 |
583 | 16 #define MP4_VERSION VERSION |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
17 |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
18 /* |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
19 * BUFFER_SIZE is the highest amount of memory that can be pulled. |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
20 * We use this for sanity checks, among other things, as mp4ff needs |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
21 * a labotomy sometimes. |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
22 */ |
583 | 23 #define BUFFER_SIZE FAAD_MIN_STREAMSIZE*64 |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
24 |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
25 /* |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
26 * AAC_MAGIC is the pattern that marks the beginning of an MP4 container. |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
27 */ |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
28 #define AAC_MAGIC (unsigned char [4]) { 0xFF, 0xF9, 0x5C, 0x80 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
29 |
583 | 30 static void mp4_init(void); |
31 static void mp4_about(void); | |
32 static int mp4_is_our_file(char *); | |
33 static void mp4_play(InputPlayback *); | |
34 static void mp4_stop(InputPlayback *); | |
35 static void mp4_pause(InputPlayback *, short); | |
36 static void mp4_seek(InputPlayback *, int); | |
37 static int mp4_get_time(InputPlayback *); | |
38 static void mp4_cleanup(void); | |
39 static void mp4_get_song_title_len(char *filename, char **, int *); | |
40 static TitleInput* mp4_get_song_tuple(char *); | |
41 static int mp4_is_our_fd(char *, VFSFile *); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
42 |
374 | 43 gchar *mp4_fmts[] = { "m4a", "mp4", "aac", NULL }; |
44 | |
583 | 45 static void * mp4_decode(void *); |
46 static gchar * mp4_get_song_title(char *filename); | |
47 static void audmp4_file_info_box(gchar *); | |
48 gboolean buffer_playing; | |
49 | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
50 InputPlugin mp4_ip = |
583 | 51 { |
52 0, // handle | |
53 0, // filename | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
54 "MP4 Audio Plugin", |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
55 mp4_init, |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
56 mp4_about, |
583 | 57 0, // configuration |
58 mp4_is_our_file, | |
59 0, //scandir | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
60 mp4_play, |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
61 mp4_stop, |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
62 mp4_pause, |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
63 mp4_seek, |
583 | 64 0, // set equalizer |
65 mp4_get_time, | |
66 0, // get volume | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
67 0, |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
68 mp4_cleanup, |
583 | 69 0, // obsolete |
70 0, // send visualisation data | |
71 0, // set player window info | |
72 0, // set song title text | |
73 mp4_get_song_title_len, // get song title text | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
74 0, // info box |
583 | 75 0, // to output plugin |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
76 mp4_get_song_tuple, |
255 | 77 0, |
78 0, | |
583 | 79 mp4_is_our_fd, |
374 | 80 mp4_fmts, |
583 | 81 }; |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
82 |
583 | 83 typedef struct _mp4cfg |
84 { | |
85 #define FILE_UNKNOWN 0 | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
86 #define FILE_MP4 1 |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
87 #define FILE_AAC 2 |
583 | 88 gshort file_type; |
89 } Mp4Config; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
90 |
583 | 91 static Mp4Config mp4cfg; |
92 static GThread *decodeThread; | |
93 GStaticMutex mutex = G_STATIC_MUTEX_INIT; | |
94 static int seekPosition = -1; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
95 |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
96 void getMP4info(char*); |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
97 int getAACTrack(mp4ff_t *); |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
98 |
583 | 99 static guint32 mp4_read_callback(void *data, void *buffer, guint32 len) |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
100 { |
583 | 101 if (data == NULL || buffer == NULL) |
102 return -1; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
103 |
583 | 104 return vfs_fread(buffer, 1, len, (VFSFile *) data); |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
105 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
106 |
583 | 107 static guint32 mp4_seek_callback(void *data, guint64 pos) |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
108 { |
583 | 109 if (data == NULL) |
110 return -1; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
111 |
583 | 112 return vfs_fseek((VFSFile *) data, pos, SEEK_SET); |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
113 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
114 |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
115 static gchar * |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
116 extname(const char *filename) |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
117 { |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
118 gchar *ext = strrchr(filename, '.'); |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
119 |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
120 if (ext != NULL) |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
121 ++ext; |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
122 |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
123 return ext; |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
124 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
125 |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
126 InputPlugin *get_iplugin_info(void) |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
127 { |
583 | 128 return(&mp4_ip); |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
129 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
130 |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
131 static void mp4_init(void) |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
132 { |
583 | 133 mp4cfg.file_type = FILE_UNKNOWN; |
134 seekPosition = -1; | |
135 return; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
136 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
137 |
561
914c96de3244
[svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents:
559
diff
changeset
|
138 static void mp4_play(InputPlayback *playback) |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
139 { |
583 | 140 buffer_playing = TRUE; |
141 decodeThread = g_thread_create((GThreadFunc)mp4_decode, playback, TRUE, NULL); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
142 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
143 |
561
914c96de3244
[svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents:
559
diff
changeset
|
144 static void mp4_stop(InputPlayback *playback) |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
145 { |
583 | 146 if (buffer_playing) |
147 { | |
148 buffer_playing = FALSE; | |
149 g_thread_join(decodeThread); | |
150 playback->output->close_audio(); | |
151 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
152 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
153 |
583 | 154 static int mp4_is_our_file(char *filename) |
262
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
155 { |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
156 VFSFile *file; |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
157 gchar* extension; |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
158 gchar magic[8]; |
393 | 159 |
160 memset(magic, '\0', 8); | |
161 | |
262
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
162 extension = strrchr(filename, '.'); |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
163 if ((file = vfs_fopen(filename, "rb"))) { |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
164 vfs_fread(magic, 1, 8, file); |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
165 if (!memcmp(magic, AAC_MAGIC, 4)) { |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
166 vfs_fclose(file); |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
167 return 1; |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
168 } |
583 | 169 if (!memcmp(magic, "ID3", 3)) { // ID3 tag bolted to the front, obfuscated magic bytes |
262
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
170 vfs_fclose(file); |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
171 if (extension &&( |
583 | 172 !strcasecmp(extension, ".mp4") || // official extension |
173 !strcasecmp(extension, ".m4a") || // Apple mp4 extension | |
174 !strcasecmp(extension, ".aac") // old MPEG2/4-AAC extension | |
175 )) | |
176 return 1; | |
177 else | |
178 return 0; | |
262
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
179 } |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
180 if (!memcmp(&magic[4], "ftyp", 4)) { |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
181 vfs_fclose(file); |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
182 return 1; |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
183 } |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
184 vfs_fclose(file); |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
185 } |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
186 return 0; |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
187 } |
f653f1219db2
[svn] So input.c wants to have the old-style function available...
chainsaw
parents:
255
diff
changeset
|
188 |
583 | 189 static int mp4_is_our_fd(char *filename, VFSFile* file) |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
190 { |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
191 gchar* extension; |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
192 gchar magic[8]; |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
193 |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
194 extension = strrchr(filename, '.'); |
255 | 195 vfs_fread(magic, 1, 8, file); |
196 if (!memcmp(magic, AAC_MAGIC, 4)) | |
197 return 1; | |
198 if (!memcmp(&magic[4], "ftyp", 4)) | |
199 return 1; | |
583 | 200 if (!memcmp(magic, "ID3", 3)) { // ID3 tag bolted to the front, obfuscated magic bytes |
255 | 201 if (extension &&( |
583 | 202 !strcasecmp(extension, ".mp4") || // official extension |
203 !strcasecmp(extension, ".m4a") || // Apple mp4 extension | |
204 !strcasecmp(extension, ".aac") // old MPEG2/4-AAC extension | |
255 | 205 )) |
206 return 1; | |
207 else | |
208 return 0; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
209 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
210 return 0; |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
211 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
212 |
583 | 213 static void mp4_about(void) |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
214 { |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
215 static GtkWidget *aboutbox; |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
216 |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
217 if(aboutbox!=NULL) |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
218 return; |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
219 aboutbox = xmms_show_message("About MP4 AAC player plugin", |
583 | 220 "Using libfaad2-" FAAD2_VERSION " for decoding.\n" |
221 "Copyright (c) 2005-2006 Audacious team", | |
222 "Ok", FALSE, NULL, NULL); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
223 g_signal_connect(G_OBJECT(aboutbox), "destroy", |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
224 G_CALLBACK(gtk_widget_destroyed), |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
225 &aboutbox); |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
226 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
227 |
583 | 228 static void mp4_pause(InputPlayback *playback, short flag) |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
229 { |
561
914c96de3244
[svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents:
559
diff
changeset
|
230 playback->output->pause(flag); |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
231 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
232 |
583 | 233 static void mp4_seek(InputPlayback *data, int time) |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
234 { |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
235 seekPosition = time; |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
236 while(buffer_playing && seekPosition!=-1) |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
237 xmms_usleep(10000); |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
238 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
239 |
583 | 240 static int mp4_get_time(InputPlayback *playback) |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
241 { |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
242 if(!buffer_playing) |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
243 return (-1); |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
244 else |
561
914c96de3244
[svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents:
559
diff
changeset
|
245 return (playback->output->output_time()); |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
246 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
247 |
583 | 248 static void mp4_cleanup(void) |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
249 { |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
250 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
251 |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
252 static TitleInput *mp4_get_song_tuple(char *fn) |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
253 { |
583 | 254 mp4ff_callback_t *mp4cb = g_malloc0(sizeof(mp4ff_callback_t)); |
255 VFSFile *mp4fh; | |
256 mp4ff_t *mp4file; | |
257 TitleInput *input = NULL; | |
258 gchar *filename = g_strdup(fn); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
259 |
583 | 260 mp4fh = vfs_fopen(filename, "rb"); |
261 mp4cb->read = mp4_read_callback; | |
262 mp4cb->seek = mp4_seek_callback; | |
263 mp4cb->user_data = mp4fh; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
264 |
583 | 265 if (!(mp4file = mp4ff_open_read(mp4cb))) { |
266 g_free(mp4cb); | |
267 vfs_fclose(mp4fh); | |
268 } else { | |
269 gint mp4track= getAACTrack(mp4file); | |
270 gint numSamples = mp4ff_num_samples(mp4file, mp4track); | |
271 guint framesize = 1024; | |
272 gulong samplerate; | |
273 guchar channels; | |
274 gint msDuration; | |
275 mp4AudioSpecificConfig mp4ASC; | |
276 gchar *tmpval; | |
277 guchar *buffer = NULL; | |
278 guint bufferSize = 0; | |
279 faacDecHandle decoder; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
280 |
583 | 281 if (mp4track == -1) |
282 return NULL; | |
283 | |
284 decoder = faacDecOpen(); | |
285 mp4ff_get_decoder_config(mp4file, mp4track, &buffer, &bufferSize); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
286 |
583 | 287 if ( !buffer ) { |
288 faacDecClose(decoder); | |
289 return FALSE; | |
290 } | |
291 if ( faacDecInit2(decoder, buffer, bufferSize, | |
292 &samplerate, &channels) < 0 ) { | |
293 faacDecClose(decoder); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
294 |
583 | 295 return FALSE; |
296 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
297 |
583 | 298 /* Add some hacks for SBR profile */ |
299 if (AudioSpecificConfig(buffer, bufferSize, &mp4ASC) >= 0) { | |
300 if (mp4ASC.frameLengthFlag == 1) framesize = 960; | |
301 if (mp4ASC.sbr_present_flag == 1) framesize *= 2; | |
302 } | |
303 | |
304 g_free(buffer); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
305 |
583 | 306 faacDecClose(decoder); |
307 | |
308 msDuration = ((float)numSamples * (float)(framesize - 1.0)/(float)samplerate) * 1000; | |
309 | |
310 input = bmp_title_input_new(); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
311 |
583 | 312 mp4ff_meta_get_title(mp4file, &input->track_name); |
313 mp4ff_meta_get_album(mp4file, &input->album_name); | |
314 mp4ff_meta_get_artist(mp4file, &input->performer); | |
315 mp4ff_meta_get_date(mp4file, &tmpval); | |
316 mp4ff_meta_get_genre(mp4file, &input->genre); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
317 |
583 | 318 if (tmpval) |
319 { | |
320 input->year = atoi(tmpval); | |
321 free(tmpval); | |
322 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
323 |
583 | 324 input->file_name = g_path_get_basename(filename); |
325 input->file_path = g_path_get_dirname(filename); | |
326 input->file_ext = extname(filename); | |
327 input->length = msDuration; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
328 |
583 | 329 free (mp4cb); |
330 vfs_fclose(mp4fh); | |
331 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
332 |
583 | 333 return input; |
334 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
335 |
583 | 336 static void mp4_get_song_title_len(char *filename, char **title, int *len) |
337 { | |
338 (*title) = mp4_get_song_title(filename); | |
339 (*len) = -1; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
340 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
341 |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
342 static gchar *mp4_get_song_title(char *filename) |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
343 { |
583 | 344 mp4ff_callback_t *mp4cb = g_malloc0(sizeof(mp4ff_callback_t)); |
345 VFSFile *mp4fh; | |
346 mp4ff_t *mp4file; | |
347 gchar *title = NULL; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
348 |
583 | 349 mp4fh = vfs_fopen(filename, "rb"); |
350 mp4cb->read = mp4_read_callback; | |
351 mp4cb->seek = mp4_seek_callback; | |
352 mp4cb->user_data = mp4fh; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
353 |
583 | 354 if (!(mp4file = mp4ff_open_read(mp4cb))) { |
355 g_free(mp4cb); | |
356 vfs_fclose(mp4fh); | |
357 } else { | |
358 TitleInput *input; | |
359 gchar *tmpval; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
360 |
583 | 361 input = bmp_title_input_new(); |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
362 |
583 | 363 mp4ff_meta_get_title(mp4file, &input->track_name); |
364 mp4ff_meta_get_album(mp4file, &input->album_name); | |
365 mp4ff_meta_get_artist(mp4file, &input->performer); | |
366 mp4ff_meta_get_date(mp4file, &tmpval); | |
367 mp4ff_meta_get_genre(mp4file, &input->genre); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
368 |
583 | 369 if (tmpval) |
370 { | |
371 input->year = atoi(tmpval); | |
372 free(tmpval); | |
373 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
374 |
583 | 375 input->file_name = g_path_get_basename(filename); |
376 input->file_path = g_path_get_dirname(filename); | |
377 input->file_ext = extname(filename); | |
378 | |
379 title = xmms_get_titlestring(xmms_get_gentitle_format(), input); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
380 |
583 | 381 free (input->track_name); |
382 free (input->album_name); | |
383 free (input->performer); | |
384 free (input->genre); | |
385 free (input->file_name); | |
386 free (input->file_path); | |
387 free (input); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
388 |
583 | 389 free (mp4cb); |
390 vfs_fclose(mp4fh); | |
391 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
392 |
583 | 393 if (!title) |
394 { | |
395 title = g_path_get_basename(filename); | |
396 if (extname(title)) | |
397 *(extname(title) - 1) = '\0'; | |
398 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
399 |
583 | 400 return title; |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
401 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
402 |
561
914c96de3244
[svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents:
559
diff
changeset
|
403 static int my_decode_mp4( InputPlayback *playback, char *filename, mp4ff_t *mp4file ) |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
404 { |
583 | 405 // We are reading a MP4 file |
406 gint mp4track= getAACTrack(mp4file); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
407 |
583 | 408 if ( mp4track < 0 ) { |
409 //TODO: check here for others Audio format..... | |
410 g_print("Unsupported Audio track type\n"); | |
411 } | |
412 else { | |
413 faacDecHandle decoder; | |
414 unsigned char *buffer = NULL; | |
415 guint bufferSize = 0; | |
416 gulong samplerate; | |
417 guchar channels; | |
418 //guint avgBitrate; | |
419 gulong msDuration; | |
420 gulong numSamples; | |
421 gulong sampleID = 1; | |
422 unsigned int framesize = 1024; | |
423 mp4AudioSpecificConfig mp4ASC; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
424 |
583 | 425 gchar *xmmstitle = NULL; |
426 xmmstitle = mp4_get_song_title(filename); | |
427 if(xmmstitle == NULL) | |
428 xmmstitle = g_strdup(filename); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
429 |
583 | 430 decoder = faacDecOpen(); |
431 mp4ff_get_decoder_config(mp4file, mp4track, &buffer, &bufferSize); | |
432 if ( !buffer ) { | |
433 faacDecClose(decoder); | |
434 return FALSE; | |
435 } | |
436 if ( faacDecInit2(decoder, buffer, bufferSize, | |
437 &samplerate, &channels) < 0 ) { | |
438 faacDecClose(decoder); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
439 |
583 | 440 return FALSE; |
441 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
442 |
583 | 443 /* Add some hacks for SBR profile */ |
444 if (AudioSpecificConfig(buffer, bufferSize, &mp4ASC) >= 0) { | |
445 if (mp4ASC.frameLengthFlag == 1) framesize = 960; | |
446 if (mp4ASC.sbr_present_flag == 1) framesize *= 2; | |
447 } | |
448 | |
449 g_free(buffer); | |
450 if( !channels ) { | |
451 faacDecClose(decoder); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
452 |
583 | 453 return FALSE; |
454 } | |
455 numSamples = mp4ff_num_samples(mp4file, mp4track); | |
456 msDuration = ((float)numSamples * (float)(framesize - 1.0)/(float)samplerate) * 1000; | |
457 playback->output->open_audio(FMT_S16_NE, samplerate, channels); | |
458 playback->output->flush(0); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
459 |
583 | 460 mp4_ip.set_info(xmmstitle, msDuration, |
461 mp4ff_get_avg_bitrate( mp4file, mp4track ), | |
462 samplerate,channels); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
463 |
583 | 464 while ( buffer_playing ) { |
465 void* sampleBuffer; | |
466 faacDecFrameInfo frameInfo; | |
467 gint rc; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
468 |
583 | 469 /* Seek if seek position has changed */ |
470 if ( seekPosition!=-1 ) { | |
471 sampleID = (float)seekPosition*(float)samplerate/(float)(framesize - 1.0); | |
472 playback->output->flush(seekPosition*1000); | |
473 seekPosition = -1; | |
474 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
475 |
583 | 476 /* Otherwise continue playing */ |
477 buffer=NULL; | |
478 bufferSize=0; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
479 |
583 | 480 /* If we've run to the end of the file, we're done. */ |
481 if(sampleID >= numSamples){ | |
482 /* Finish playing before we close the | |
483 output. */ | |
484 while ( playback->output->buffer_playing() ) { | |
485 xmms_usleep(10000); | |
486 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
487 |
583 | 488 playback->output->flush(seekPosition*1000); |
489 playback->output->close_audio(); | |
490 faacDecClose(decoder); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
491 |
583 | 492 g_static_mutex_lock(&mutex); |
493 buffer_playing = FALSE; | |
494 g_static_mutex_unlock(&mutex); | |
495 g_thread_exit(NULL); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
496 |
583 | 497 return FALSE; |
498 } | |
499 rc= mp4ff_read_sample(mp4file, mp4track, | |
500 sampleID++, &buffer, &bufferSize); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
501 |
583 | 502 /*g_print(":: %d/%d\n", sampleID-1, numSamples);*/ |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
503 |
583 | 504 /* If we can't read the file, we're done. */ |
505 if((rc == 0) || (buffer== NULL) || (bufferSize == 0) || (bufferSize > BUFFER_SIZE)){ | |
506 g_print("MP4: read error\n"); | |
507 sampleBuffer = NULL; | |
508 sampleID=0; | |
509 playback->output->buffer_free(); | |
510 playback->output->close_audio(); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
511 |
583 | 512 faacDecClose(decoder); |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
513 |
583 | 514 return FALSE; |
515 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
516 |
583 | 517 /* g_print(" :: %d/%d\n", bufferSize, BUFFER_SIZE); */ |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
518 |
583 | 519 sampleBuffer= faacDecDecode(decoder, |
520 &frameInfo, | |
521 buffer, | |
522 bufferSize); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
523 |
583 | 524 /* If there was an error decoding, we're done. */ |
525 if(frameInfo.error > 0){ | |
526 g_print("MP4: %s\n", | |
527 faacDecGetErrorMessage(frameInfo.error)); | |
528 playback->output->close_audio(); | |
529 faacDecClose(decoder); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
530 |
583 | 531 return FALSE; |
532 } | |
533 if(buffer){ | |
534 g_free(buffer); | |
535 buffer=NULL; | |
536 bufferSize=0; | |
537 } | |
538 if (buffer_playing == FALSE) | |
539 { | |
540 playback->output->close_audio(); | |
541 return FALSE; | |
542 } | |
543 produce_audio(playback->output->written_time(), | |
544 FMT_S16_NE, | |
545 channels, | |
546 frameInfo.samples<<1, | |
547 sampleBuffer, &buffer_playing); | |
548 } | |
549 playback->output->close_audio(); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
550 |
583 | 551 faacDecClose(decoder); |
552 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
553 |
583 | 554 return TRUE; |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
555 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
556 |
561
914c96de3244
[svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents:
559
diff
changeset
|
557 static void my_decode_aac( InputPlayback *playback, char *filename ) |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
558 { |
583 | 559 // WE ARE READING AN AAC FILE |
560 VFSFile *file = NULL; | |
561 faacDecHandle decoder = 0; | |
562 guchar *buffer = 0; | |
563 gulong bufferconsumed = 0; | |
564 gulong samplerate = 0; | |
565 guchar channels; | |
566 gulong buffervalid = 0; | |
567 TitleInput* input; | |
568 gchar *temp = g_strdup(filename); | |
569 gchar *ext = strrchr(temp, '.'); | |
570 gchar *xmmstitle = NULL; | |
571 faacDecConfigurationPtr config; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
572 |
583 | 573 if((file = vfs_fopen(filename, "rb")) == 0){ |
574 g_print("AAC: can't find file %s\n", filename); | |
575 buffer_playing = FALSE; | |
576 g_static_mutex_unlock(&mutex); | |
577 g_thread_exit(NULL); | |
578 } | |
579 if((decoder = faacDecOpen()) == NULL){ | |
580 g_print("AAC: Open Decoder Error\n"); | |
581 vfs_fclose(file); | |
582 buffer_playing = FALSE; | |
583 g_static_mutex_unlock(&mutex); | |
584 g_thread_exit(NULL); | |
585 } | |
586 config = faacDecGetCurrentConfiguration(decoder); | |
587 config->useOldADTSFormat = 0; | |
588 faacDecSetConfiguration(decoder, config); | |
589 if((buffer = g_malloc(BUFFER_SIZE)) == NULL){ | |
590 g_print("AAC: error g_malloc\n"); | |
591 vfs_fclose(file); | |
592 buffer_playing = FALSE; | |
593 faacDecClose(decoder); | |
594 g_static_mutex_unlock(&mutex); | |
595 g_thread_exit(NULL); | |
596 } | |
597 if((buffervalid = vfs_fread(buffer, 1, BUFFER_SIZE, file))==0){ | |
598 g_print("AAC: Error reading file\n"); | |
599 g_free(buffer); | |
600 vfs_fclose(file); | |
601 buffer_playing = FALSE; | |
602 faacDecClose(decoder); | |
603 g_static_mutex_unlock(&mutex); | |
604 g_thread_exit(NULL); | |
605 } | |
606 XMMS_NEW_TITLEINPUT(input); | |
607 input->file_name = (char*)g_basename(temp); | |
608 input->file_ext = ext ? ext+1 : NULL; | |
609 input->file_path = temp; | |
610 if(!strncmp((char*)buffer, "ID3", 3)){ | |
611 gint size = 0; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
612 |
583 | 613 vfs_fseek(file, 0, SEEK_SET); |
614 size = (buffer[6]<<21) | (buffer[7]<<14) | (buffer[8]<<7) | buffer[9]; | |
615 size+=10; | |
616 vfs_fread(buffer, 1, size, file); | |
617 buffervalid = vfs_fread(buffer, 1, BUFFER_SIZE, file); | |
618 } | |
619 xmmstitle = xmms_get_titlestring(xmms_get_gentitle_format(), input); | |
620 if(xmmstitle == NULL) | |
621 xmmstitle = g_strdup(input->file_name); | |
622 if(temp) g_free(temp); | |
623 if(input->performer) g_free(input->performer); | |
624 if(input->album_name) g_free(input->album_name); | |
625 if(input->track_name) g_free(input->track_name); | |
626 if(input->genre) g_free(input->genre); | |
627 g_free(input); | |
628 bufferconsumed = faacDecInit(decoder, | |
629 buffer, | |
630 buffervalid, | |
631 &samplerate, | |
632 &channels); | |
633 if(playback->output->open_audio(FMT_S16_NE,samplerate,channels) == FALSE){ | |
634 g_print("AAC: Output Error\n"); | |
635 g_free(buffer); buffer=0; | |
636 faacDecClose(decoder); | |
637 vfs_fclose(file); | |
638 playback->output->close_audio(); | |
639 g_free(xmmstitle); | |
640 buffer_playing = FALSE; | |
641 g_static_mutex_unlock(&mutex); | |
642 g_thread_exit(NULL); | |
643 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
644 |
583 | 645 mp4_ip.set_info(xmmstitle, -1, -1, samplerate, channels); |
646 playback->output->flush(0); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
647 |
583 | 648 while(buffer_playing && buffervalid > 0){ |
649 faacDecFrameInfo finfo; | |
650 unsigned long samplesdecoded; | |
651 char* sample_buffer = NULL; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
652 |
583 | 653 if(bufferconsumed > 0){ |
654 memmove(buffer, &buffer[bufferconsumed], buffervalid-bufferconsumed); | |
655 buffervalid -= bufferconsumed; | |
656 buffervalid += vfs_fread(&buffer[buffervalid], 1, | |
657 BUFFER_SIZE-buffervalid, file); | |
658 bufferconsumed = 0; | |
659 } | |
660 sample_buffer = faacDecDecode(decoder, &finfo, buffer, buffervalid); | |
661 if(finfo.error){ | |
662 config = faacDecGetCurrentConfiguration(decoder); | |
663 if(config->useOldADTSFormat != 1){ | |
664 faacDecClose(decoder); | |
665 decoder = faacDecOpen(); | |
666 config = faacDecGetCurrentConfiguration(decoder); | |
667 config->useOldADTSFormat = 1; | |
668 faacDecSetConfiguration(decoder, config); | |
669 finfo.bytesconsumed=0; | |
670 finfo.samples = 0; | |
671 faacDecInit(decoder, | |
672 buffer, | |
673 buffervalid, | |
674 &samplerate, | |
675 &channels); | |
676 }else{ | |
677 g_print("FAAD2 Warning %s\n", faacDecGetErrorMessage(finfo.error)); | |
678 buffervalid = 0; | |
679 } | |
680 } | |
681 bufferconsumed += finfo.bytesconsumed; | |
682 samplesdecoded = finfo.samples; | |
683 if((samplesdecoded<=0) && !sample_buffer){ | |
684 g_print("AAC: error sample decoding\n"); | |
685 continue; | |
686 } | |
687 produce_audio(playback->output->written_time(), | |
688 FMT_S16_LE, channels, | |
689 samplesdecoded<<1, sample_buffer, &buffer_playing); | |
690 } | |
691 playback->output->buffer_free(); | |
692 playback->output->close_audio(); | |
693 buffer_playing = FALSE; | |
694 g_free(buffer); | |
695 faacDecClose(decoder); | |
696 g_free(xmmstitle); | |
697 vfs_fclose(file); | |
698 seekPosition = -1; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
699 |
583 | 700 buffer_playing = FALSE; |
701 g_static_mutex_unlock(&mutex); | |
702 g_thread_exit(NULL); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
703 } |
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
704 |
583 | 705 static void *mp4_decode( void *args ) |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
706 { |
583 | 707 mp4ff_callback_t *mp4cb = g_malloc0(sizeof(mp4ff_callback_t)); |
708 VFSFile *mp4fh; | |
709 mp4ff_t *mp4file; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
710 |
583 | 711 InputPlayback *playback = args; |
712 char *filename = playback->filename; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
713 |
583 | 714 mp4fh = vfs_fopen(filename, "rb"); |
715 mp4cb->read = mp4_read_callback; | |
716 mp4cb->seek = mp4_seek_callback; | |
717 mp4cb->user_data = mp4fh; | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
718 |
583 | 719 g_static_mutex_lock(&mutex); |
720 seekPosition= -1; | |
721 buffer_playing= TRUE; | |
722 g_static_mutex_unlock(&mutex); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
723 |
583 | 724 mp4file= mp4ff_open_read(mp4cb); |
725 if( !mp4file ) { | |
726 mp4cfg.file_type = FILE_AAC; | |
727 vfs_fclose(mp4fh); | |
728 g_free(mp4cb); | |
729 } | |
730 else { | |
731 mp4cfg.file_type = FILE_MP4; | |
732 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
733 |
583 | 734 if ( mp4cfg.file_type == FILE_MP4 ) { |
735 my_decode_mp4( playback, filename, mp4file ); | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
736 |
583 | 737 g_free(args); |
738 vfs_fclose(mp4fh); | |
739 g_static_mutex_lock(&mutex); | |
740 buffer_playing = FALSE; | |
741 g_static_mutex_unlock(&mutex); | |
742 g_thread_exit(NULL); | |
743 } | |
744 else { | |
745 my_decode_aac( playback, filename ); | |
746 } | |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
747 |
583 | 748 return NULL; |
0
13389e613d67
[svn] - initial import of audacious-plugins tree (lots to do)
nenolod
parents:
diff
changeset
|
749 } |