comparison src/psf2/plugin.c @ 2749:290357060cdb

More work on tuples.
author William Pitcock <nenolod@atheme.org>
date Mon, 30 Jun 2008 23:17:59 -0500
parents fe0d1cff2cd0
children 6319a15e7243
comparison
equal deleted inserted replaced
2748:fe0d1cff2cd0 2749:290357060cdb
67 *length = (uint64)size; 67 *length = (uint64)size;
68 68
69 return AO_SUCCESS; 69 return AO_SUCCESS;
70 } 70 }
71 71
72 Tuple *psf2_tuple(gchar *filename)
73 {
74 Tuple *t;
75 corlett_t *c;
76 guchar *buf;
77 gsize sz;
78
79 aud_vfs_file_get_contents(filename, (gchar **) &buf, &sz);
80
81 if (!buf)
82 return NULL;
83
84 if (corlett_decode(buf, sz, NULL, NULL, &c) != AO_SUCCESS)
85 return NULL;
86
87 t = aud_tuple_new_from_filename(filename);
88
89 aud_tuple_associate_int(t, FIELD_LENGTH, NULL, psfTimeToMS(c->inf_length));
90 aud_tuple_associate_string(t, FIELD_ARTIST, NULL, c->inf_artist);
91 aud_tuple_associate_string(t, FIELD_ALBUM, NULL, c->inf_game);
92 aud_tuple_associate_string(t, -1, "game", c->inf_game);
93 aud_tuple_associate_string(t, FIELD_TITLE, NULL, c->inf_title);
94 aud_tuple_associate_string(t, FIELD_COPYRIGHT, NULL, c->inf_copy);
95 aud_tuple_associate_string(t, FIELD_QUALITY, NULL, "sequenced");
96 aud_tuple_associate_string(t, FIELD_CODEC, NULL, "PlayStation2 Audio");
97 aud_tuple_associate_string(t, -1, "console", "PlayStation 2");
98
99 free(c);
100 g_free(buf);
101
102 return t;
103 }
104
105 gchar *psf2_title(gchar *filename, gint *length)
106 {
107 gchar *title = NULL;
108 Tuple *tuple = psf2_tuple(filename);
109
110 if (tuple != NULL)
111 {
112 title = aud_tuple_formatter_make_title_string(tuple, aud_get_gentitle_format());
113 *length = aud_tuple_get_int(tuple, FIELD_LENGTH, NULL);
114 aud_tuple_free(tuple);
115 }
116 else
117 {
118 title = g_path_get_basename(filename);
119 *length = -1;
120 }
121
122 return title;
123 }
124
72 void psf2_play(InputPlayback *data) 125 void psf2_play(InputPlayback *data)
73 { 126 {
74 guchar *buffer; 127 guchar *buffer;
75 gsize size; 128 gsize size;
76 uint32 filesig; 129 uint32 filesig;
130 gint length;
131 gchar *title = psf2_title(data->filename, &length);
77 132
78 path = g_strdup(data->filename); 133 path = g_strdup(data->filename);
79 aud_vfs_file_get_contents(data->filename, (gchar **) &buffer, &size); 134 aud_vfs_file_get_contents(data->filename, (gchar **) &buffer, &size);
80 135
81 // now try to identify the file 136 // now try to identify the file
108 return; 163 return;
109 } 164 }
110 165
111 data->output->open_audio(FMT_S16_NE, 44100, 2); 166 data->output->open_audio(FMT_S16_NE, 44100, 2);
112 167
168 data->set_params(data, title, length, 44100*2*2*8, 44100, 2);
169
113 data->playing = TRUE; 170 data->playing = TRUE;
114 data->set_pb_ready(data); 171 data->set_pb_ready(data);
115 while (data->playing) 172 while (data->playing)
116 { 173 {
117 psf2_execute(data); 174 psf2_execute(data);
118 } 175 }
119 176
120 g_free(buffer); 177 g_free(buffer);
121 g_free(path); 178 g_free(path);
179 g_free(title);
122 } 180 }
123 181
124 void psf2_update(unsigned char *buffer, long count, InputPlayback *playback) 182 void psf2_update(unsigned char *buffer, long count, InputPlayback *playback)
125 { 183 {
126 const int mask = ~((((16 / 8) * 2)) - 1); 184 const int mask = ~((((16 / 8) * 2)) - 1);
168 void psf2_pause(InputPlayback *playback, short p) 226 void psf2_pause(InputPlayback *playback, short p)
169 { 227 {
170 playback->output->pause(p); 228 playback->output->pause(p);
171 } 229 }
172 230
173 static int psf2_is_our_fd(gchar *filename, VFSFile *file) 231 int psf2_is_our_fd(gchar *filename, VFSFile *file)
174 { 232 {
175 gchar magic[4]; 233 gchar magic[4];
176 aud_vfs_fread(magic, 1, 4, file); 234 aud_vfs_fread(magic, 1, 4, file);
177 235
178 if (!memcmp(magic, "PSF\x02", 4)) 236 if (!memcmp(magic, "PSF\x02", 4))
179 return 1; 237 return 1;
180 238
181 return 0; 239 return 0;
182 }
183
184 static Tuple *psf2_tuple(gchar *filename)
185 {
186 Tuple *t;
187 corlett_t *c;
188 guchar *buf;
189 gsize sz;
190
191 aud_vfs_file_get_contents(filename, (gchar **) &buf, &sz);
192
193 if (!buf)
194 return NULL;
195
196 if (corlett_decode(buf, sz, NULL, NULL, &c) != AO_SUCCESS)
197 return NULL;
198
199 t = aud_tuple_new_from_filename(filename);
200
201 aud_tuple_associate_int(t, FIELD_LENGTH, NULL, psfTimeToMS(c->inf_length));
202 aud_tuple_associate_string(t, FIELD_ARTIST, NULL, c->inf_artist);
203 aud_tuple_associate_string(t, FIELD_ALBUM, NULL, c->inf_game);
204 aud_tuple_associate_string(t, -1, "game", c->inf_game);
205 aud_tuple_associate_string(t, FIELD_TITLE, NULL, c->inf_title);
206 aud_tuple_associate_string(t, FIELD_COPYRIGHT, NULL, c->inf_copy);
207 aud_tuple_associate_string(t, FIELD_QUALITY, NULL, "sequenced");
208 aud_tuple_associate_string(t, FIELD_CODEC, NULL, "PlayStation2 Audio");
209 aud_tuple_associate_string(t, -1, "console", "PlayStation 2");
210
211 free(c);
212 g_free(buf);
213
214 return t;
215 } 240 }
216 241
217 gchar *psf2_fmts[] = { "psf2", "minipsf2", NULL }; 242 gchar *psf2_fmts[] = { "psf2", "minipsf2", NULL };
218 243
219 InputPlugin psf2_ip = 244 InputPlugin psf2_ip =