# HG changeset patch # User chainsaw # Date 1135546306 28800 # Node ID 0daaddb109146546a40b7c40a52a4cf5aa9674ce # Parent 42cdc99e395a29a81f8f615a235afafea35a59eb [svn] Implement GYM playback. diff -r 42cdc99e395a -r 0daaddb10914 Plugins/Input/console/Audacious_Driver.cpp --- a/Plugins/Input/console/Audacious_Driver.cpp Sun Dec 25 13:11:21 2005 -0800 +++ b/Plugins/Input/console/Audacious_Driver.cpp Sun Dec 25 13:31:46 2005 -0800 @@ -36,12 +36,14 @@ static Spc_Emu *spc = NULL; static Nsf_Emu *nsf = NULL; static Gbs_Emu *gbs = NULL; +static Gym_Emu *gym = NULL; static GThread *decode_thread; GStaticMutex playback_mutex = G_STATIC_MUTEX_INIT; static void *play_loop_spc(gpointer arg); static void *play_loop_nsf(gpointer arg); static void *play_loop_gbs(gpointer arg); +static void *play_loop_gym(gpointer arg); static void console_init(void); extern "C" void console_aboutbox(void); static void console_stop(void); @@ -65,6 +67,8 @@ return PLAY_TYPE_NSF; if (!strcasecmp(ext, ".gbs")) return PLAY_TYPE_GBS; + if (!strcasecmp(ext, ".gym")) + return PLAY_TYPE_GYM; } return 0; @@ -117,6 +121,13 @@ return title; } +static gchar *get_title_gym(gchar *filename) +{ + gchar *title; + title = g_path_get_basename(filename); + return title; +} + static gchar *get_title(gchar *filename) { switch (is_our_file(filename)) @@ -130,6 +141,9 @@ case PLAY_TYPE_GBS: return get_title_gbs(filename); break; + case PLAY_TYPE_GYM: + return get_title_gym(filename); + break; } return NULL; @@ -255,7 +269,7 @@ console_ip.set_info(name, audcfg.loop_length * 1000, gbs->voice_count() * 1000, samplerate, 2); else - console_ip.set_info(name, -1, nsf->voice_count() * 1000, + console_ip.set_info(name, -1, gbs->voice_count() * 1000, samplerate, 2); g_free(name); @@ -268,6 +282,47 @@ decode_thread = g_thread_create(play_loop_gbs, gbs, TRUE, NULL); } +static void play_file_gym(char *filename) +{ + gchar *name; + Emu_Std_Reader reader; + Gym_Emu::header_t header; + gint samplerate; + + if (audcfg.resample == TRUE) + samplerate = audcfg.resample_rate; + else + samplerate = 44100; + + reader.open(filename); + reader.read(&header, sizeof(header)); + + gym = new Gym_Emu; + gym->init(samplerate); + gym->load(header, reader); + gym->start_track(0); + + console_ip_is_going = TRUE; + + name = get_title(filename); + + if (audcfg.loop_length) + console_ip.set_info(name, audcfg.loop_length * 1000, + gym->voice_count() * 1000, samplerate, 2); + else + console_ip.set_info(name, -1, gym->voice_count() * 1000, + samplerate, 2); + + g_free(name); + + if (!console_ip.output->open_audio(MY_FMT, samplerate, 2)) + return; + + playing_type = PLAY_TYPE_GYM; + + decode_thread = g_thread_create(play_loop_gym, gym, TRUE, NULL); +} + static void play_file(char *filename) { switch (is_our_file(filename)) @@ -281,6 +336,9 @@ case PLAY_TYPE_GBS: play_file_gbs(filename); break; + case PLAY_TYPE_GYM: + play_file_gym(filename); + break; } } @@ -433,6 +491,39 @@ return NULL; } +static void *play_loop_gym(gpointer arg) +{ + g_static_mutex_lock(&playback_mutex); + Gym_Emu *my_gym = (Gym_Emu *) arg; + Music_Emu::sample_t buf[1024]; + + for (;;) + { + if (!console_ip_is_going) + break; + + my_gym->play(1024, buf); + + if ((console_ip.output->output_time() / 1000) > + audcfg.loop_length && audcfg.loop_length != 0) + break; + console_ip.add_vis_pcm(console_ip.output->written_time(), + MY_FMT, 1, 2048, buf); + while(console_ip.output->buffer_free() < 2048) + xmms_usleep(10000); + console_ip.output->write_audio(buf, 2048); + } + + delete gym; + console_ip.output->close_audio(); + console_ip_is_going = FALSE; + playing_type = PLAY_TYPE_NONE; + g_static_mutex_unlock(&playback_mutex); + g_thread_exit(NULL); + + return NULL; +} + static int get_time(void) { if (console_ip_is_going == TRUE)