Mercurial > audlegacy-plugins
annotate src/tta/libtta.c @ 1270:d73eed18f3f4
make tta decode easy to be interrupted.
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Sun, 15 Jul 2007 19:22:12 +0900 |
parents | 0d5b0f861bf0 |
children | 2a6865d42dc4 |
rev | line source |
---|---|
290 | 1 /* |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
2 * libtta.c |
290 | 3 * |
4 * Description: TTA input plug-in for Audacious | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
5 * Developed by: Alexander Djourik <ald@true-audio.com> |
290 | 6 * Audacious port: Yoshiki Yazawa <yaz@cc.rim.or.jp> |
7 * | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
8 * Copyright (c) 2007 Alexander Djourik. All rights reserved. |
290 | 9 * |
10 */ | |
11 | |
12 /* | |
13 * This library is free software; you can redistribute it and/or | |
14 * modify it under the terms of the GNU Lesser General Public | |
15 * License as published by the Free Software Foundation; either | |
16 * version 2.1 of the License, or (at your option) any later version. | |
17 * | |
18 * This library is distributed in the hope that it will be useful, | |
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
21 * Lesser General Public License for more details. | |
22 * | |
23 * You should have received a copy of the GNU Lesser General Public | |
24 * License along with this library; if not, write to the Free Software | |
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
26 * | |
27 * Please see the file COPYING in this directory for full copyright | |
28 * information. | |
29 */ | |
528 | 30 |
31 #ifdef HAVE_CONFIG_H | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
32 #include "config.h" |
528 | 33 #endif |
34 | |
290 | 35 #include <stdio.h> |
36 #include <stdlib.h> | |
37 #include <string.h> | |
38 #include <time.h> | |
39 #include <sys/types.h> | |
40 #include <sys/stat.h> | |
41 #include <glib.h> | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
42 #include <pthread.h> |
290 | 43 #include <string.h> |
44 | |
45 #include <audacious/util.h> | |
46 #include <audacious/plugin.h> | |
47 #include <audacious/titlestring.h> | |
48 #include <audacious/vfs.h> | |
520
8f1785471613
[svn] - add missing inclusion of audacious/strings.h where necessary
giacomo
parents:
443
diff
changeset
|
49 #include <audacious/output.h> |
8f1785471613
[svn] - add missing inclusion of audacious/strings.h where necessary
giacomo
parents:
443
diff
changeset
|
50 #include <audacious/strings.h> |
527
d124034ebea3
[svn] - glib/gi18n.h -> audacious/i18n.h for automatic dgettext support
nenolod
parents:
520
diff
changeset
|
51 #include <audacious/i18n.h> |
290 | 52 |
661 | 53 #include <audacious/id3tag.h> |
290 | 54 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
55 #define PLUGIN_VERSION "1.4" |
290 | 56 #define PROJECT_URL "<http://www.true-audio.com>" |
57 | |
58 #include "ttalib.h" | |
59 | |
60 #define OUTPUT_ERROR (MEMORY_ERROR+1) | |
61 #define MAX_BSIZE (MAX_BPS>>3) | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
62 #define BYTES(x) ((x) * sizeof(id3_ucs4_t)) |
290 | 63 |
64 static void init (); | |
65 static void cleanup (); | |
66 static int is_our_file (char *filename); | |
561
914c96de3244
[svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents:
528
diff
changeset
|
67 static void play_file (InputPlayback *playback); |
914c96de3244
[svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents:
528
diff
changeset
|
68 static void tta_pause (InputPlayback *playback, short paused); |
914c96de3244
[svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents:
528
diff
changeset
|
69 static void stop (InputPlayback *playback); |
914c96de3244
[svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents:
528
diff
changeset
|
70 static void seek (InputPlayback *playback, int time); |
914c96de3244
[svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents:
528
diff
changeset
|
71 static int get_time (InputPlayback *playback); |
290 | 72 static void get_song_info (char *filename, char **title, int *length); |
73 static void file_info (char *filename); | |
74 static void about (); | |
75 static TitleInput *get_song_tuple(char *filename); | |
76 static gchar *extname(const char *filename); | |
851 | 77 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
78 static pthread_t decode_thread; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
79 static char sample_buffer[PCM_BUFFER_LENGTH * MAX_BSIZE * MAX_NCH]; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
80 static tta_info info; // currently playing file info |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
81 static int seek_position = -1; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
82 static int playing = FALSE; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
83 static int read_samples = -1; |
290 | 84 |
372
a157306caf03
[svn] - finalize the plugin-side of the extension-assist ABI
nenolod
parents:
368
diff
changeset
|
85 gchar *tta_fmts[] = { "tta", NULL }; |
a157306caf03
[svn] - finalize the plugin-side of the extension-assist ABI
nenolod
parents:
368
diff
changeset
|
86 |
290 | 87 InputPlugin tta_ip = |
88 { | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
89 NULL, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
90 NULL, |
1087 | 91 "True Audio Plugin", |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
92 init, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
93 about, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
94 NULL, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
95 is_our_file, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
96 NULL, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
97 play_file, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
98 stop, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
99 tta_pause, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
100 seek, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
101 NULL, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
102 get_time, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
103 NULL, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
104 NULL, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
105 cleanup, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
106 NULL, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
107 NULL, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
108 NULL, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
109 NULL, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
110 get_song_info, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
111 file_info, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
112 NULL, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
113 get_song_tuple, // get_song_tuple |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
114 NULL, // set_song_tuple |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
115 NULL, // buffer |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
116 NULL, // vfs |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
117 tta_fmts, |
290 | 118 }; |
119 | |
1087 | 120 InputPlugin *tta_iplist[] = { &tta_ip, NULL }; |
121 | |
122 DECLARE_PLUGIN(tta, NULL, NULL, tta_iplist, NULL, NULL, NULL, NULL); | |
290 | 123 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
124 size_t |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
125 file_size (char *filename) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
126 { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
127 VFSFile *f; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
128 size_t size = -1; |
290 | 129 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
130 if ((f = vfs_fopen (filename, "r"))) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
131 { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
132 vfs_fseek (f, 0, SEEK_END); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
133 size = vfs_ftell (f); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
134 vfs_fclose (f); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
135 } |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
136 return size; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
137 } |
851 | 138 |
290 | 139 static void |
140 tta_error (int error) | |
141 { | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
142 char *message; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
143 static GtkWidget *errorbox; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
144 if (errorbox != NULL) return; |
290 | 145 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
146 switch (error) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
147 { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
148 case OPEN_ERROR: |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
149 message = "Can't open file\n"; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
150 break; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
151 case FORMAT_ERROR: |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
152 message = "Not supported file format\n"; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
153 break; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
154 case FILE_ERROR: |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
155 message = "File is corrupted\n"; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
156 break; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
157 case READ_ERROR: |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
158 message = "Can't read from file\n"; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
159 break; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
160 case MEMORY_ERROR: |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
161 message = "Insufficient memory available\n"; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
162 break; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
163 case OUTPUT_ERROR: |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
164 message = "Output plugin error\n"; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
165 break; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
166 default: |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
167 message = "Unknown error\n"; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
168 break; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
169 } |
290 | 170 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
171 xmms_show_message ("TTA Decoder Error", message, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
172 "Ok", FALSE, NULL, NULL); |
290 | 173 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
174 gtk_signal_connect(GTK_OBJECT(errorbox), "destroy", |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
175 G_CALLBACK(gtk_widget_destroyed), &errorbox); |
290 | 176 } |
177 | |
178 static gchar * | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
179 get_song_title(TitleInput *tuple) |
290 | 180 { |
1166 | 181 return xmms_get_titlestring(xmms_get_gentitle_format(), tuple); |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
182 } |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
183 |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
184 static void |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
185 get_song_info (char *filename, char **title, int *length) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
186 { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
187 TitleInput *tuple; |
290 | 188 |
1165 | 189 *length = -1; |
190 *title = NULL; | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
191 |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
192 if ((tuple = get_song_tuple(filename)) != NULL) { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
193 *length = tuple->length; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
194 *title = get_song_title(tuple); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
195 } |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
196 |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
197 bmp_title_input_free(tuple); |
290 | 198 } |
199 | |
200 static void * | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
201 play_loop (void *arg) |
290 | 202 { |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
203 InputPlayback *playback = arg; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
204 int bufsize = PCM_BUFFER_LENGTH * info.BSIZE * info.NCH; |
290 | 205 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
206 //////////////////////////////////////// |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
207 // decode PCM_BUFFER_LENGTH samples |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
208 // into the current PCM buffer position |
290 | 209 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
210 while (playing) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
211 { |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
212 while ((read_samples = get_samples ((unsigned char *)sample_buffer)) > 0) |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
213 { |
851 | 214 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
215 while ((playback->output->buffer_free () < bufsize) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
216 && seek_position == -1) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
217 { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
218 if (!playing) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
219 goto DONE; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
220 xmms_usleep (10000); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
221 } |
852
421d5587b761
[svn] - remove unnecessary sleep code so that out_lame can encode at full speed.
yaz
parents:
851
diff
changeset
|
222 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
223 if (seek_position == -1) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
224 { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
225 produce_audio(playback->output->written_time(), |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
226 ((info.BPS == 8) ? FMT_U8 : FMT_S16_LE), |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
227 info.NCH, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
228 read_samples * info.NCH * info.BSIZE, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
229 sample_buffer, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
230 NULL); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
231 } |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
232 else |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
233 { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
234 set_position (seek_position); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
235 playback->output->flush (seek_position * SEEK_STEP); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
236 seek_position = -1; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
237 } |
1270
d73eed18f3f4
make tta decode easy to be interrupted.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1237
diff
changeset
|
238 if(!playing) |
d73eed18f3f4
make tta decode easy to be interrupted.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1237
diff
changeset
|
239 goto DONE; |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
240 } |
851 | 241 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
242 playback->output->buffer_free (); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
243 playback->output->buffer_free (); |
1270
d73eed18f3f4
make tta decode easy to be interrupted.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1237
diff
changeset
|
244 while (playback->output->buffer_playing()) { |
d73eed18f3f4
make tta decode easy to be interrupted.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1237
diff
changeset
|
245 xmms_usleep(10000); |
d73eed18f3f4
make tta decode easy to be interrupted.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1237
diff
changeset
|
246 if(!playing) |
d73eed18f3f4
make tta decode easy to be interrupted.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1237
diff
changeset
|
247 goto DONE; |
d73eed18f3f4
make tta decode easy to be interrupted.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1237
diff
changeset
|
248 } |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
249 } |
290 | 250 |
851 | 251 DONE: |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
252 //////////////////////// |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
253 // destroy memory pools |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
254 player_stop (); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
255 |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
256 /////////////////////////////// |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
257 // close currently playing file |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
258 close_tta_file (&info); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
259 |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
260 pthread_exit (NULL); |
290 | 261 } |
262 | |
263 static void | |
264 init () | |
265 { | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
266 memset (&info, 0, sizeof (tta_info)); |
290 | 267 } |
268 | |
269 static void | |
270 cleanup () | |
271 { | |
272 } | |
273 | |
274 static void | |
275 about () | |
276 { | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
277 static GtkWidget *aboutbox; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
278 if (aboutbox != NULL) return; |
290 | 279 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
280 aboutbox = xmms_show_message( |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
281 "About True Audio Plugin", |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
282 "TTA input plugin" PLUGIN_VERSION "for BMP\n" |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
283 "Copyright (c) 2004 True Audio Software\n" |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
284 PROJECT_URL, "Ok", FALSE, NULL, NULL); |
290 | 285 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
286 gtk_signal_connect(GTK_OBJECT(aboutbox), "destroy", |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
287 G_CALLBACK(gtk_widget_destroyed), &aboutbox); |
290 | 288 } |
289 | |
290 static GtkWidget *window = NULL; | |
291 static GtkWidget *filename_entry, *title_entry, | |
292 *artist_entry, *album_entry, | |
293 *year_entry, *tracknum_entry, | |
294 *comment_entry, *genre_entry, | |
295 *info_frame; | |
296 | |
297 static void | |
298 file_info (char *filename) | |
299 { | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
300 tta_info ttainfo; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
301 char *title; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
302 gchar *utf_filename = NULL; |
290 | 303 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
304 if (!window) { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
305 GtkWidget *vbox, *hbox, *left_vbox, *table; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
306 GtkWidget *label, *filename_hbox, *button_ok; |
290 | 307 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
308 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
309 gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
310 gtk_signal_connect(GTK_OBJECT(window), "destroy", |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
311 G_CALLBACK(gtk_widget_destroyed), &window); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
312 gtk_container_set_border_width(GTK_CONTAINER(window), 10); |
290 | 313 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
314 vbox = gtk_vbox_new(FALSE, 10); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
315 gtk_container_add(GTK_CONTAINER(window), vbox); |
290 | 316 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
317 filename_hbox = gtk_hbox_new(FALSE, 5); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
318 gtk_box_pack_start(GTK_BOX(vbox), filename_hbox, FALSE, TRUE, 0); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
319 label = gtk_label_new("Filename:"); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
320 gtk_box_pack_start(GTK_BOX(filename_hbox), label, FALSE, TRUE, 0); |
290 | 321 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
322 filename_entry = gtk_entry_new_with_max_length(1024); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
323 gtk_editable_set_editable(GTK_EDITABLE(filename_entry), FALSE); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
324 gtk_box_pack_start(GTK_BOX(filename_hbox), filename_entry, TRUE, TRUE, 0); |
290 | 325 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
326 hbox = gtk_hbox_new(FALSE, 10); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
327 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
328 left_vbox = gtk_vbox_new(FALSE, 10); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
329 gtk_box_pack_start(GTK_BOX(hbox), left_vbox, FALSE, FALSE, 0); |
290 | 330 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
331 info_frame = gtk_frame_new("ID3 Tag:"); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
332 gtk_box_pack_start(GTK_BOX(left_vbox), info_frame, FALSE, FALSE, 0); |
290 | 333 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
334 table = gtk_table_new(5, 5, FALSE); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
335 gtk_container_set_border_width(GTK_CONTAINER(table), 5); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
336 gtk_container_add(GTK_CONTAINER(info_frame), table); |
290 | 337 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
338 label = gtk_label_new("Title:"); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
339 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
340 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 5, 5); |
290 | 341 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
342 title_entry = gtk_entry_new_with_max_length(1024); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
343 gtk_editable_set_editable(GTK_EDITABLE(title_entry), FALSE); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
344 gtk_table_attach(GTK_TABLE(table), title_entry, 1, 4, 0, 1, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
345 GTK_FILL | GTK_EXPAND | GTK_SHRINK, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
346 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); |
290 | 347 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
348 label = gtk_label_new("Artist:"); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
349 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
350 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
351 GTK_FILL, GTK_FILL, 5, 5); |
290 | 352 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
353 artist_entry = gtk_entry_new_with_max_length(1024); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
354 gtk_editable_set_editable(GTK_EDITABLE(artist_entry), FALSE); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
355 gtk_table_attach(GTK_TABLE(table), artist_entry, 1, 4, 1, 2, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
356 GTK_FILL | GTK_EXPAND | GTK_SHRINK, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
357 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); |
290 | 358 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
359 label = gtk_label_new("Album:"); |
290 | 360 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); |
361 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3, | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
362 GTK_FILL, GTK_FILL, 5, 5); |
290 | 363 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
364 album_entry = gtk_entry_new_with_max_length(1024); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
365 gtk_editable_set_editable(GTK_EDITABLE(album_entry), FALSE); |
290 | 366 gtk_table_attach(GTK_TABLE(table), album_entry, 1, 4, 2, 3, |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
367 GTK_FILL | GTK_EXPAND | GTK_SHRINK, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
368 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); |
290 | 369 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
370 label = gtk_label_new("Comment:"); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
371 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
372 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
373 GTK_FILL, GTK_FILL, 5, 5); |
290 | 374 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
375 comment_entry = gtk_entry_new_with_max_length(1024); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
376 gtk_editable_set_editable(GTK_EDITABLE(comment_entry), FALSE); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
377 gtk_table_attach(GTK_TABLE(table), comment_entry, 1, 4, 3, 4, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
378 GTK_FILL | GTK_EXPAND | GTK_SHRINK, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
379 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); |
290 | 380 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
381 label = gtk_label_new("Year:"); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
382 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
383 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 4, 5, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
384 GTK_FILL, GTK_FILL, 5, 5); |
290 | 385 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
386 year_entry = gtk_entry_new_with_max_length(4); |
290 | 387 gtk_editable_set_editable(GTK_EDITABLE(year_entry), FALSE); |
388 gtk_widget_set_usize(year_entry, 40, -1); | |
389 gtk_table_attach(GTK_TABLE(table), year_entry, 1, 2, 4, 5, | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
390 GTK_FILL | GTK_EXPAND | GTK_SHRINK, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
391 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); |
290 | 392 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
393 label = gtk_label_new("Track number:"); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
394 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
395 gtk_table_attach(GTK_TABLE(table), label, 2, 3, 4, 5, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
396 GTK_FILL, GTK_FILL, 5, 5); |
290 | 397 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
398 tracknum_entry = gtk_entry_new_with_max_length(3); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
399 gtk_editable_set_editable(GTK_EDITABLE(tracknum_entry), FALSE); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
400 gtk_widget_set_usize(tracknum_entry, 40, -1); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
401 gtk_table_attach(GTK_TABLE(table), tracknum_entry, 3, 4, 4, 5, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
402 GTK_FILL | GTK_EXPAND | GTK_SHRINK, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
403 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); |
290 | 404 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
405 label = gtk_label_new("Genre:"); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
406 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
407 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 5, 6, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
408 GTK_FILL, GTK_FILL, 5, 5); |
290 | 409 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
410 genre_entry = gtk_entry_new_with_max_length(1024); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
411 gtk_editable_set_editable(GTK_EDITABLE(genre_entry), FALSE); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
412 gtk_widget_set_usize(genre_entry, 40, -1); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
413 gtk_table_attach(GTK_TABLE(table), genre_entry, 1, 4, 5, 6, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
414 GTK_FILL | GTK_EXPAND | GTK_SHRINK, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
415 GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 5); |
290 | 416 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
417 button_ok = gtk_button_new_with_label("Ok"); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
418 gtk_signal_connect_object(GTK_OBJECT(button_ok), "clicked", |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
419 G_CALLBACK(gtk_widget_destroy), G_OBJECT(window)); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
420 GTK_WIDGET_SET_FLAGS(button_ok, GTK_CAN_DEFAULT); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
421 gtk_box_pack_start(GTK_BOX(vbox), button_ok, TRUE, TRUE, 0); |
290 | 422 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
423 gtk_widget_show_all (window); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
424 } |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
425 |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
426 utf_filename = str_to_utf8(filename); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
427 title = g_strdup_printf(_("File Info - %s"), g_basename(utf_filename)); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
428 gtk_window_set_title(GTK_WINDOW(window), title); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
429 g_free(title); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
430 |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
431 gtk_entry_set_text(GTK_ENTRY(filename_entry), utf_filename); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
432 gtk_editable_set_position(GTK_EDITABLE(filename_entry), -1); |
290 | 433 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
434 title = g_strdup(g_basename(utf_filename)); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
435 gtk_entry_set_text(GTK_ENTRY(title_entry), title); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
436 |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
437 g_free(title); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
438 g_free(utf_filename); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
439 |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
440 if (open_tta_file (filename, &ttainfo, 0) >= 0) |
290 | 441 { |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
442 gtk_entry_set_text(GTK_ENTRY(title_entry), (gchar *)ttainfo.ID3.title); |
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
443 gtk_entry_set_text(GTK_ENTRY(artist_entry), (gchar *)ttainfo.ID3.artist); |
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
444 gtk_entry_set_text(GTK_ENTRY(album_entry), (gchar *)ttainfo.ID3.album); |
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
445 gtk_entry_set_text(GTK_ENTRY(year_entry), (gchar *)ttainfo.ID3.year); |
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
446 gtk_entry_set_text(GTK_ENTRY(tracknum_entry), (gchar *)ttainfo.ID3.track); |
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
447 gtk_entry_set_text(GTK_ENTRY(comment_entry), (gchar *)ttainfo.ID3.comment); |
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
448 gtk_entry_set_text(GTK_ENTRY(genre_entry), (gchar *)ttainfo.ID3.genre); |
290 | 449 } |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
450 close_tta_file (&ttainfo); |
290 | 451 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
452 gtk_widget_set_sensitive(info_frame, TRUE); |
290 | 453 } |
454 | |
455 static int | |
456 is_our_file (char *filename) | |
457 { | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
458 gchar *ext = strrchr(filename, '.'); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
459 |
1152
949457464b28
[svn] - fix for crash when file extension is not available.
yaz
parents:
1087
diff
changeset
|
460 if (ext && !strncasecmp(ext, ".tta", 4)) |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
461 return TRUE; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
462 |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
463 return FALSE; |
290 | 464 } |
465 | |
466 static void | |
561
914c96de3244
[svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents:
528
diff
changeset
|
467 play_file (InputPlayback *playback) |
290 | 468 { |
1237
0d5b0f861bf0
- quick fix for link breakage to libaudid3tag.so when --prefix is specified.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1190
diff
changeset
|
469 gchar *filename = playback->filename; |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
470 char *title; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
471 int datasize, origsize, bitrate; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
472 TitleInput *tuple = NULL; |
290 | 473 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
474 playing = FALSE; |
290 | 475 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
476 //////////////////////////////////////// |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
477 // open TTA file |
1237
0d5b0f861bf0
- quick fix for link breakage to libaudid3tag.so when --prefix is specified.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1190
diff
changeset
|
478 if (open_tta_file (filename, &info, 0) > 0) |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
479 { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
480 tta_error (info.STATE); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
481 close_tta_file (&info); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
482 return; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
483 } |
290 | 484 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
485 //////////////////////////////////////// |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
486 // initialize TTA player |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
487 if (player_init (&info) < 0) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
488 { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
489 tta_error (info.STATE); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
490 close_tta_file (&info); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
491 return; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
492 } |
290 | 493 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
494 if (playback->output->open_audio ((info.BPS == 8) ? FMT_U8 : FMT_S16_LE, |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
495 info.SAMPLERATE, info.NCH) == 0) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
496 { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
497 tta_error (OUTPUT_ERROR); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
498 close_tta_file (&info); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
499 return; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
500 } |
290 | 501 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
502 tuple = get_song_tuple(filename); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
503 title = get_song_title(tuple); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
504 bmp_title_input_free(tuple); |
290 | 505 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
506 datasize = file_size(filename) - info.DATAPOS; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
507 origsize = info.DATALENGTH * info.BSIZE * info.NCH; |
290 | 508 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
509 bitrate = (int) ((float) datasize / origsize * |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
510 (info.SAMPLERATE * info.NCH * info.BPS)); |
290 | 511 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
512 tta_ip.set_info (title, 1000 * info.LENGTH, bitrate, info.SAMPLERATE, info.NCH); |
290 | 513 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
514 if (title) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
515 g_free (title); |
290 | 516 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
517 playing = TRUE; |
1165 | 518 playback->playing = 1; |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
519 seek_position = -1; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
520 read_samples = -1; |
290 | 521 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
522 pthread_create (&decode_thread, NULL, play_loop, playback); |
290 | 523 } |
524 | |
525 static void | |
561
914c96de3244
[svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents:
528
diff
changeset
|
526 tta_pause (InputPlayback *playback, short paused) |
290 | 527 { |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
528 playback->output->pause (paused); |
290 | 529 } |
851 | 530 |
290 | 531 static void |
561
914c96de3244
[svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents:
528
diff
changeset
|
532 stop (InputPlayback *playback) |
290 | 533 { |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
534 if (playing) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
535 { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
536 playing = FALSE; |
1165 | 537 playback->playing = 0; |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
538 pthread_join (decode_thread, NULL); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
539 playback->output->close_audio (); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
540 close_tta_file (&info); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
541 read_samples = 0; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
542 } |
290 | 543 } |
544 | |
545 static void | |
568 | 546 seek (InputPlayback *data, int time) |
290 | 547 { |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
548 if (playing) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
549 { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
550 seek_position = 1000 * time / SEEK_STEP; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
551 |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
552 while (seek_position != -1) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
553 xmms_usleep (10000); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
554 } |
290 | 555 } |
556 | |
557 static int | |
561
914c96de3244
[svn] Convert plugins to use InputPlayback.output instead of InputPlugin.output
iabervon
parents:
528
diff
changeset
|
558 get_time (InputPlayback *playback) |
290 | 559 { |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
560 if (playing && (read_samples || playback->output->buffer_playing())) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
561 return playback->output->output_time(); |
290 | 562 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
563 return -1; |
290 | 564 } |
565 | |
566 static TitleInput * | |
567 get_song_tuple(char *filename) | |
568 { | |
569 TitleInput *tuple = NULL; | |
570 tta_info *ttainfo; | |
571 VFSFile *file; | |
572 | |
573 ttainfo = g_malloc0(sizeof(tta_info)); | |
574 | |
575 if((file = vfs_fopen(filename, "rb")) != NULL) { | |
576 if(open_tta_file(filename, ttainfo, 0) >= 0) { | |
577 tuple = bmp_title_input_new(); | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
578 |
290 | 579 tuple->file_name = g_path_get_basename(filename); |
580 tuple->file_path = g_path_get_dirname(filename); | |
581 tuple->file_ext = extname(filename); | |
582 tuple->length = ttainfo->LENGTH * 1000; | |
583 | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
584 if (ttainfo->ID3.id3has) { |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
585 if(ttainfo->ID3.artist && strlen((char *)ttainfo->ID3.artist)) |
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
586 tuple->performer = g_strdup((gchar *)ttainfo->ID3.artist); |
1166 | 587 |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
588 if(ttainfo->ID3.album && strlen((char *)ttainfo->ID3.album)) |
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
589 tuple->album_name = g_strdup((gchar *)ttainfo->ID3.album); |
1166 | 590 |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
591 if(ttainfo->ID3.title && strlen((char *)ttainfo->ID3.title)) |
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
592 tuple->track_name = g_strdup((gchar *)ttainfo->ID3.title); |
1166 | 593 |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
594 if(ttainfo->ID3.year && strlen((char *)ttainfo->ID3.year)) |
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
595 tuple->year = atoi((char *)ttainfo->ID3.year); |
1166 | 596 |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
597 if(ttainfo->ID3.track && strlen((char *)ttainfo->ID3.track)) |
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
598 tuple->track_number = atoi((char *)ttainfo->ID3.track); |
1166 | 599 |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
600 if(ttainfo->ID3.genre && strlen((char *)ttainfo->ID3.genre)) |
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
601 tuple->genre = g_strdup((gchar *)ttainfo->ID3.genre); |
1166 | 602 |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
603 if(ttainfo->ID3.comment && strlen((char *)ttainfo->ID3.comment)) |
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
604 tuple->comment = g_strdup((gchar *)ttainfo->ID3.comment); |
290 | 605 } |
606 close_tta_file (ttainfo); | |
607 } | |
608 vfs_fclose(file); | |
609 } | |
610 return tuple; | |
611 } | |
612 | |
613 static gchar * | |
614 extname(const char *filename) | |
615 { | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
616 gchar *ext = strrchr(filename, '.'); |
290 | 617 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
618 if (ext != NULL) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
619 ++ext; |
290 | 620 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
621 return ext; |
290 | 622 } |
623 | |
624 /* return length in letters */ | |
625 size_t tta_ucs4len(id3_ucs4_t *ucs) | |
626 { | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
627 id3_ucs4_t *ptr = ucs; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
628 size_t len = 0; |
290 | 629 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
630 while(*ptr++ != 0) |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
631 len++; |
290 | 632 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
633 return len; |
290 | 634 } |
635 | |
636 /* duplicate id3_ucs4_t string. new string will be terminated with 0. */ | |
637 id3_ucs4_t *tta_ucs4dup(id3_ucs4_t *org) | |
638 { | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
639 id3_ucs4_t *new = NULL; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
640 size_t len = tta_ucs4len(org); |
290 | 641 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
642 new = g_malloc0((len + 1) * sizeof(id3_ucs4_t)); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
643 memcpy(new, org, len * sizeof(id3_ucs4_t)); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
644 *(new + len) = 0; //terminate |
290 | 645 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
646 return new; |
290 | 647 } |
648 | |
649 id3_ucs4_t *tta_parse_genre(const id3_ucs4_t *string) | |
650 { | |
651 id3_ucs4_t *ret = NULL; | |
652 id3_ucs4_t *tmp = NULL; | |
653 id3_ucs4_t *genre = NULL; | |
654 id3_ucs4_t *ptr, *end, *tail, *tp; | |
655 size_t ret_len = 0; //num of ucs4 char! | |
656 size_t tmp_len = 0; | |
657 gboolean is_num = TRUE; | |
658 | |
659 tail = (id3_ucs4_t *)string + tta_ucs4len((id3_ucs4_t *)string); | |
660 | |
661 ret = g_malloc0(1024); | |
662 | |
663 for(ptr = (id3_ucs4_t *)string; *ptr != 0 && ptr <= tail; ptr++) { | |
664 if(*ptr == '(') { | |
665 if(*(++ptr) == '(') { // escaped text like: ((something) | |
666 for(end = ptr; *end != ')' && *end != 0;) { // copy "(something)" | |
667 end++; | |
668 } | |
669 end++; //include trailing ')' | |
670 memcpy(ret, ptr, BYTES(end - ptr)); | |
671 ret_len += (end - ptr); | |
672 *(ret + ret_len) = 0; //terminate | |
673 ptr = end + 1; | |
674 } | |
675 else { | |
676 // reference to an id3v1 genre code | |
677 for(end = ptr; *end != ')' && *end != 0;) { | |
678 end++; | |
679 } | |
680 | |
681 tmp = g_malloc0(BYTES(end - ptr + 1)); | |
682 memcpy(tmp, ptr, BYTES(end - ptr)); | |
683 *(tmp + (end - ptr)) = 0; //terminate | |
684 ptr += end - ptr; | |
685 | |
686 genre = (id3_ucs4_t *)id3_genre_name((const id3_ucs4_t *)tmp); | |
687 | |
688 g_free(tmp); | |
689 tmp = NULL; | |
690 | |
691 tmp_len = tta_ucs4len(genre); | |
692 | |
693 memcpy(ret + BYTES(ret_len), genre, BYTES(tmp_len)); | |
694 | |
695 ret_len += tmp_len; | |
696 *(ret + ret_len) = 0; //terminate | |
697 } | |
698 } | |
699 else { | |
700 for(end = ptr; *end != '(' && *end != 0; ) { | |
701 end++; | |
702 } | |
703 // scan string to determine whether a genre code number or not | |
704 tp = ptr; | |
705 is_num = TRUE; | |
706 while(tp < end) { | |
707 if(*tp < '0' || *tp > '9') { // anything else than number appears. | |
708 is_num = FALSE; | |
709 break; | |
710 } | |
711 tp++; | |
712 } | |
713 if(is_num) { | |
714 #ifdef DEBUG | |
715 printf("is_num!\n"); | |
716 #endif | |
717 tmp = g_malloc0(BYTES(end - ptr + 1)); | |
718 memcpy(tmp, ptr, BYTES(end - ptr)); | |
719 *(tmp + (end - ptr)) = 0; //terminate | |
720 ptr += end - ptr; | |
721 | |
722 genre = (id3_ucs4_t *)id3_genre_name((const id3_ucs4_t *)tmp); | |
723 #ifdef DEBUG | |
724 printf("genre length = %d\n", tta_ucs4len(genre)); | |
725 #endif | |
726 g_free(tmp); | |
727 tmp = NULL; | |
728 | |
729 tmp_len = tta_ucs4len(genre); | |
730 | |
731 memcpy(ret + BYTES(ret_len), genre, BYTES(tmp_len)); | |
732 | |
733 ret_len += tmp_len; | |
734 *(ret + ret_len) = 0; //terminate | |
735 } | |
736 else { // plain text | |
737 #ifdef DEBUG | |
738 printf("plain!\n"); | |
739 printf("ret_len = %d\n", ret_len); | |
740 #endif | |
741 memcpy(ret + BYTES(ret_len), ptr, BYTES(end - ptr)); | |
742 ret_len = ret_len + (end - ptr); | |
743 *(ret + ret_len) = 0; //terminate | |
744 ptr += (end - ptr); | |
745 } | |
746 } | |
747 } | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
748 |
290 | 749 return ret; |
750 } | |
751 | |
752 gchar *tta_input_id3_get_string(struct id3_tag * tag, char *frame_name) | |
753 { | |
754 gchar *rtn; | |
755 gchar *rtn2; | |
756 const id3_ucs4_t *string_const; | |
757 id3_ucs4_t *string; | |
758 id3_ucs4_t *ucsptr; | |
759 struct id3_frame *frame; | |
760 union id3_field *field; | |
761 gboolean flagutf = FALSE; | |
762 | |
763 frame = id3_tag_findframe(tag, frame_name, 0); | |
764 if (!frame) | |
765 return NULL; | |
766 | |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
767 if (!strcmp(frame_name, ID3_FRAME_COMMENT)) |
290 | 768 field = id3_frame_field(frame, 3); |
769 else | |
770 field = id3_frame_field(frame, 1); | |
771 | |
772 if (!field) | |
773 return NULL; | |
774 | |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
775 if (!strcmp(frame_name, ID3_FRAME_COMMENT)) |
290 | 776 string_const = id3_field_getfullstring(field); |
777 else | |
778 string_const = id3_field_getstrings(field, 0); | |
779 | |
780 if (!string_const) | |
781 return NULL; | |
782 | |
783 string = tta_ucs4dup((id3_ucs4_t *)string_const); | |
784 | |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
785 if (!strcmp(frame_name, ID3_FRAME_GENRE)) { |
290 | 786 id3_ucs4_t *string2 = NULL; |
787 string2 = tta_parse_genre(string); | |
788 g_free((void *)string); | |
789 string = string2; | |
790 } | |
791 | |
792 ucsptr = (id3_ucs4_t *)string; | |
793 while (*ucsptr) { | |
794 if (*ucsptr > 0x000000ffL) { | |
795 flagutf = TRUE; | |
796 break; | |
797 } | |
798 ucsptr++; | |
799 } | |
800 | |
801 if (flagutf) { | |
802 #ifdef DEBUG | |
803 g_message("aud-tta: flagutf!\n"); | |
804 #endif | |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
805 rtn = (gchar *)id3_ucs4_utf8duplicate(string); |
290 | 806 } |
807 else { | |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
808 rtn = (gchar *)id3_ucs4_latin1duplicate(string); |
290 | 809 rtn2 = str_to_utf8(rtn); |
810 free(rtn); | |
811 rtn = rtn2; | |
812 } | |
813 g_free(string); | |
814 string = NULL; | |
815 #ifdef DEBUG | |
816 g_print("string = %s\n", rtn); | |
817 #endif | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
818 |
290 | 819 return rtn; |
820 } | |
821 | |
822 int get_id3_tags (const char *filename, tta_info *ttainfo) { | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
823 int id3v2_size = 0; |
290 | 824 gchar *str = NULL; |
825 | |
826 struct id3_file *id3file = NULL; | |
827 struct id3_tag *tag = NULL; | |
828 | |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
829 id3file = id3_file_open (filename, ID3_FILE_MODE_READONLY); |
290 | 830 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
831 if (id3file) { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
832 tag = id3_file_tag (id3file); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
833 |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
834 if (tag) { |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
835 ttainfo->ID3.id3has = 1; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
836 id3v2_size = tag->paddedsize; |
290 | 837 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
838 str = tta_input_id3_get_string (tag, ID3_FRAME_ARTIST); |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
839 if(str) strncpy((char *)ttainfo->ID3.artist, str, MAX_LINE); |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
840 free(str); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
841 str = NULL; |
290 | 842 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
843 str = tta_input_id3_get_string (tag, ID3_FRAME_ALBUM); |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
844 if(str) strncpy((char *)ttainfo->ID3.album, str, MAX_LINE); |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
845 free(str); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
846 str = NULL; |
290 | 847 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
848 str = tta_input_id3_get_string (tag, ID3_FRAME_TITLE); |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
849 if(str) strncpy((char *)ttainfo->ID3.title, str, MAX_LINE); |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
850 free(str); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
851 str = NULL; |
290 | 852 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
853 str = tta_input_id3_get_string (tag, ID3_FRAME_YEAR); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
854 if(!str) str = tta_input_id3_get_string (tag, "TYER"); |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
855 if(str) strncpy((char *)ttainfo->ID3.year, str, MAX_YEAR); |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
856 free(str); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
857 str = NULL; |
290 | 858 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
859 str = tta_input_id3_get_string (tag, ID3_FRAME_TRACK); |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
860 if(str) strncpy((char *)ttainfo->ID3.track, str, MAX_TRACK); |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
861 free(str); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
862 str = NULL; |
290 | 863 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
864 str = tta_input_id3_get_string (tag, ID3_FRAME_GENRE); |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
865 if(str) strncpy((char *)ttainfo->ID3.genre, str, MAX_GENRE); |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
866 free(str); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
867 str = NULL; |
290 | 868 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
869 str = tta_input_id3_get_string (tag, ID3_FRAME_COMMENT); |
1190
ed2d7787779e
more warning elimination.
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents:
1166
diff
changeset
|
870 if(str) strncpy((char *)ttainfo->ID3.comment, str, MAX_LINE); |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
871 free(str); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
872 str = NULL; |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
873 } |
290 | 874 |
1012
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
875 id3_file_close(id3file); |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
876 } |
d0d99b22e393
[svn] import major update by Aleksander Djuric (the original author).
yaz
parents:
912
diff
changeset
|
877 |
290 | 878 return id3v2_size; // not used |
879 } |