Mercurial > audlegacy
comparison Plugins/Input/console/Audacious_Driver.cpp @ 334:0daaddb10914 trunk
[svn] Implement GYM playback.
author | chainsaw |
---|---|
date | Sun, 25 Dec 2005 13:31:46 -0800 |
parents | 1e642d74d68c |
children | b2335a7ec34a |
comparison
equal
deleted
inserted
replaced
333:42cdc99e395a | 334:0daaddb10914 |
---|---|
34 #endif | 34 #endif |
35 | 35 |
36 static Spc_Emu *spc = NULL; | 36 static Spc_Emu *spc = NULL; |
37 static Nsf_Emu *nsf = NULL; | 37 static Nsf_Emu *nsf = NULL; |
38 static Gbs_Emu *gbs = NULL; | 38 static Gbs_Emu *gbs = NULL; |
39 static Gym_Emu *gym = NULL; | |
39 static GThread *decode_thread; | 40 static GThread *decode_thread; |
40 GStaticMutex playback_mutex = G_STATIC_MUTEX_INIT; | 41 GStaticMutex playback_mutex = G_STATIC_MUTEX_INIT; |
41 | 42 |
42 static void *play_loop_spc(gpointer arg); | 43 static void *play_loop_spc(gpointer arg); |
43 static void *play_loop_nsf(gpointer arg); | 44 static void *play_loop_nsf(gpointer arg); |
44 static void *play_loop_gbs(gpointer arg); | 45 static void *play_loop_gbs(gpointer arg); |
46 static void *play_loop_gym(gpointer arg); | |
45 static void console_init(void); | 47 static void console_init(void); |
46 extern "C" void console_aboutbox(void); | 48 extern "C" void console_aboutbox(void); |
47 static void console_stop(void); | 49 static void console_stop(void); |
48 static void console_pause(gshort p); | 50 static void console_pause(gshort p); |
49 static int get_time(void); | 51 static int get_time(void); |
63 return PLAY_TYPE_SPC; | 65 return PLAY_TYPE_SPC; |
64 if (!strcasecmp(ext, ".nsf")) | 66 if (!strcasecmp(ext, ".nsf")) |
65 return PLAY_TYPE_NSF; | 67 return PLAY_TYPE_NSF; |
66 if (!strcasecmp(ext, ".gbs")) | 68 if (!strcasecmp(ext, ".gbs")) |
67 return PLAY_TYPE_GBS; | 69 return PLAY_TYPE_GBS; |
70 if (!strcasecmp(ext, ".gym")) | |
71 return PLAY_TYPE_GYM; | |
68 } | 72 } |
69 | 73 |
70 return 0; | 74 return 0; |
71 } | 75 } |
72 | 76 |
115 gchar *title; | 119 gchar *title; |
116 title = g_path_get_basename(filename); | 120 title = g_path_get_basename(filename); |
117 return title; | 121 return title; |
118 } | 122 } |
119 | 123 |
124 static gchar *get_title_gym(gchar *filename) | |
125 { | |
126 gchar *title; | |
127 title = g_path_get_basename(filename); | |
128 return title; | |
129 } | |
130 | |
120 static gchar *get_title(gchar *filename) | 131 static gchar *get_title(gchar *filename) |
121 { | 132 { |
122 switch (is_our_file(filename)) | 133 switch (is_our_file(filename)) |
123 { | 134 { |
124 case PLAY_TYPE_SPC: | 135 case PLAY_TYPE_SPC: |
127 case PLAY_TYPE_NSF: | 138 case PLAY_TYPE_NSF: |
128 return get_title_nsf(filename); | 139 return get_title_nsf(filename); |
129 break; | 140 break; |
130 case PLAY_TYPE_GBS: | 141 case PLAY_TYPE_GBS: |
131 return get_title_gbs(filename); | 142 return get_title_gbs(filename); |
143 break; | |
144 case PLAY_TYPE_GYM: | |
145 return get_title_gym(filename); | |
132 break; | 146 break; |
133 } | 147 } |
134 | 148 |
135 return NULL; | 149 return NULL; |
136 } | 150 } |
253 | 267 |
254 if (audcfg.loop_length) | 268 if (audcfg.loop_length) |
255 console_ip.set_info(name, audcfg.loop_length * 1000, | 269 console_ip.set_info(name, audcfg.loop_length * 1000, |
256 gbs->voice_count() * 1000, samplerate, 2); | 270 gbs->voice_count() * 1000, samplerate, 2); |
257 else | 271 else |
258 console_ip.set_info(name, -1, nsf->voice_count() * 1000, | 272 console_ip.set_info(name, -1, gbs->voice_count() * 1000, |
259 samplerate, 2); | 273 samplerate, 2); |
260 | 274 |
261 g_free(name); | 275 g_free(name); |
262 | 276 |
263 if (!console_ip.output->open_audio(MY_FMT, samplerate, 2)) | 277 if (!console_ip.output->open_audio(MY_FMT, samplerate, 2)) |
266 playing_type = PLAY_TYPE_GBS; | 280 playing_type = PLAY_TYPE_GBS; |
267 | 281 |
268 decode_thread = g_thread_create(play_loop_gbs, gbs, TRUE, NULL); | 282 decode_thread = g_thread_create(play_loop_gbs, gbs, TRUE, NULL); |
269 } | 283 } |
270 | 284 |
285 static void play_file_gym(char *filename) | |
286 { | |
287 gchar *name; | |
288 Emu_Std_Reader reader; | |
289 Gym_Emu::header_t header; | |
290 gint samplerate; | |
291 | |
292 if (audcfg.resample == TRUE) | |
293 samplerate = audcfg.resample_rate; | |
294 else | |
295 samplerate = 44100; | |
296 | |
297 reader.open(filename); | |
298 reader.read(&header, sizeof(header)); | |
299 | |
300 gym = new Gym_Emu; | |
301 gym->init(samplerate); | |
302 gym->load(header, reader); | |
303 gym->start_track(0); | |
304 | |
305 console_ip_is_going = TRUE; | |
306 | |
307 name = get_title(filename); | |
308 | |
309 if (audcfg.loop_length) | |
310 console_ip.set_info(name, audcfg.loop_length * 1000, | |
311 gym->voice_count() * 1000, samplerate, 2); | |
312 else | |
313 console_ip.set_info(name, -1, gym->voice_count() * 1000, | |
314 samplerate, 2); | |
315 | |
316 g_free(name); | |
317 | |
318 if (!console_ip.output->open_audio(MY_FMT, samplerate, 2)) | |
319 return; | |
320 | |
321 playing_type = PLAY_TYPE_GYM; | |
322 | |
323 decode_thread = g_thread_create(play_loop_gym, gym, TRUE, NULL); | |
324 } | |
325 | |
271 static void play_file(char *filename) | 326 static void play_file(char *filename) |
272 { | 327 { |
273 switch (is_our_file(filename)) | 328 switch (is_our_file(filename)) |
274 { | 329 { |
275 case PLAY_TYPE_SPC: | 330 case PLAY_TYPE_SPC: |
278 case PLAY_TYPE_NSF: | 333 case PLAY_TYPE_NSF: |
279 play_file_nsf(filename); | 334 play_file_nsf(filename); |
280 break; | 335 break; |
281 case PLAY_TYPE_GBS: | 336 case PLAY_TYPE_GBS: |
282 play_file_gbs(filename); | 337 play_file_gbs(filename); |
338 break; | |
339 case PLAY_TYPE_GYM: | |
340 play_file_gym(filename); | |
283 break; | 341 break; |
284 } | 342 } |
285 } | 343 } |
286 | 344 |
287 static void seek(gint time) | 345 static void seek(gint time) |
431 g_thread_exit(NULL); | 489 g_thread_exit(NULL); |
432 | 490 |
433 return NULL; | 491 return NULL; |
434 } | 492 } |
435 | 493 |
494 static void *play_loop_gym(gpointer arg) | |
495 { | |
496 g_static_mutex_lock(&playback_mutex); | |
497 Gym_Emu *my_gym = (Gym_Emu *) arg; | |
498 Music_Emu::sample_t buf[1024]; | |
499 | |
500 for (;;) | |
501 { | |
502 if (!console_ip_is_going) | |
503 break; | |
504 | |
505 my_gym->play(1024, buf); | |
506 | |
507 if ((console_ip.output->output_time() / 1000) > | |
508 audcfg.loop_length && audcfg.loop_length != 0) | |
509 break; | |
510 console_ip.add_vis_pcm(console_ip.output->written_time(), | |
511 MY_FMT, 1, 2048, buf); | |
512 while(console_ip.output->buffer_free() < 2048) | |
513 xmms_usleep(10000); | |
514 console_ip.output->write_audio(buf, 2048); | |
515 } | |
516 | |
517 delete gym; | |
518 console_ip.output->close_audio(); | |
519 console_ip_is_going = FALSE; | |
520 playing_type = PLAY_TYPE_NONE; | |
521 g_static_mutex_unlock(&playback_mutex); | |
522 g_thread_exit(NULL); | |
523 | |
524 return NULL; | |
525 } | |
526 | |
436 static int get_time(void) | 527 static int get_time(void) |
437 { | 528 { |
438 if (console_ip_is_going == TRUE) | 529 if (console_ip_is_going == TRUE) |
439 return console_ip.output->output_time(); | 530 return console_ip.output->output_time(); |
440 else | 531 else |