/* * playwav.c * --------- 23 Fevrier 2005 */ #include #include #include #include /* for the sound output */ #include "ecoute.h" /*==------------------------------------------------------------------==*/ int wav_player(char *fname, WINDOW *popup) { SNDFILE * sndf; SF_INFO sfinfo; int driver; ao_sample_format format; ao_device * device; char chaine[120]; short * samples; int lu; long total_lu; #if DEBUG_LEVEL fprintf(stderr, ">>> %s ( '%s' %p )\n", __func__, fname, popup); #endif /* * get help from 'sndfile' for getting datas */ memset(&sfinfo, 0, sizeof(sfinfo)); sndf = sf_open(fname, SFM_READ, &sfinfo); if (sndf==NULL) { mvwaddstr(popup, 4, 4, "Invalid file ?"); wrefresh(popup); getch(); delwin(popup); touchwin(stdscr); refresh(); return -1; } sprintf(chaine, "frames %lu", (unsigned long)sfinfo.frames); mvwaddstr(popup, 2, 5, chaine); sprintf(chaine, "smplrate %d", sfinfo.samplerate); mvwaddstr(popup, 3, 5, chaine); sprintf(chaine, "channels %d", sfinfo.channels); mvwaddstr(popup, 4, 5, chaine); sprintf(chaine, "format 0x%x", sfinfo.format); mvwaddstr(popup, 5, 5, chaine); sprintf(chaine, "sections %d", sfinfo.sections); mvwaddstr(popup, 6, 5, chaine); wrefresh(popup); #if DEBUG_LEVEL > 1 getch(); /* XXX */ #endif /* * memory allocation * warning, we can get multiples channels. */ if ( NULL == (samples = malloc(T_BUFFER*sizeof(short))) ) { perror("memory shortage in WAV player"); abort(); } /* * initialize the "Cabasse Sampan" output device (aka libao) */ ao_initialize(); driver = ao_default_driver_id(); /* XXX valeurs provisoires XXX */ memset(&format, 0, sizeof(ao_sample_format)); format.bits = 16; format.channels = sfinfo.channels; format.rate = sfinfo.samplerate; format.byte_format = AO_FMT_LITTLE; /* XXX ??? */ device = ao_open_live(driver, &format, NULL); if (device == NULL) { fprintf(stderr, "\nEcoute: Error open device\n"); /* * comment connaitre la cause de l'erreur ? */ abort(); } /* * ********************** * * the playing loop * * ********************** */ total_lu = 0L; while ( (lu=sf_read_short(sndf, samples, T_BUFFER)) > 0 ) { ao_play(device, (char *)samples, lu*2); total_lu += (long)lu; progress_bar(popup, total_lu/sfinfo.channels, sfinfo.frames, 0); wrefresh(popup); /* HERE WE HAVE TO DETECT A 'STOP LISTEN' FUNCTION. */ } /* * shutdown "La voix du Theatre" */ ao_close(device); ao_shutdown(); /* * memory release */ free(samples); /* * releasing 'sndfile' ressources */ sf_close(sndf); #if DEBUG_LEVEL fprintf(stderr, " end of %s\n", __func__); #endif return -1; } /*==------------------------------------------------------------------==*/