Mercurial > audlegacy-plugins
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 = |
