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