static void linux_play (int argc, char *argv []) { static short buffer [BUFFER_LEN] ; SNDFILE *sndfile ; SF_INFO sfinfo ; int k, audio_device, readcount, subformat ; for (k = 1 ; k < argc ; k++) { memset (&sfinfo, 0, sizeof (sfinfo)) ; printf ("Playing %s\n", argv [k]) ; if (! (sndfile = sf_open (argv [k], SFM_READ, &sfinfo))) { puts (sf_strerror (NULL)) ; continue ; } ; if (sfinfo.channels < 1 || sfinfo.channels > 2) { printf ("Error : channels = %d.\n", sfinfo.channels) ; continue ; } ; audio_device = linux_open_dsp_device (sfinfo.channels, sfinfo.samplerate) ; subformat = sfinfo.format & SF_FORMAT_SUBMASK ; if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) { static float float_buffer [BUFFER_LEN] ; double scale ; int m ; sf_command (sndfile, SFC_CALC_SIGNAL_MAX, &scale, sizeof (scale)) ; if (scale < 1e-10) scale = 1.0 ; else scale = 32700.0 / scale ; while ((readcount = sf_read_float (sndfile, float_buffer, BUFFER_LEN))) { for (m = 0 ; m < readcount ; m++) buffer [m] = scale * float_buffer [m] ; write (audio_device, buffer, readcount * sizeof (short)) ; } ; } else { while ((readcount = sf_read_short (sndfile, buffer, BUFFER_LEN))) write (audio_device, buffer, readcount * sizeof (short)) ; } ; sf_close (sndfile) ; close (audio_device) ; } ; return ; } /* linux_play */
//---------------------------------------------------------------------------------------------- // TITLE : linux_play // // WORK : // // DATE : 2004. 11. 29 //---------------------------------------------------------------------------------------------- int linux_play ( char *argv ) { static short buffer [BUFFER_LEN] ; SNDFILE *sndfile ; SF_INFO sfinfo ; int k, audio_device, readcount, subformat ; memset (&sfinfo, 0, sizeof (sfinfo)) ; //printf ("Playing %s\n", argv [k]) ; if (! (sndfile = sf_open (argv, SFM_READ, &sfinfo))) { puts (sf_strerror (NULL)) ; return -1; } if (sfinfo.channels < 1 || sfinfo.channels > 2) { printf ("Error : channels = %d.\n", sfinfo.channels) ; return -2; } audio_device = linux_open_dsp_device (sfinfo.channels, sfinfo.samplerate) ; subformat = sfinfo.format & SF_FORMAT_SUBMASK ; if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE) { static float float_buffer [BUFFER_LEN] ; double scale ; int m ; sf_command (sndfile, SFC_CALC_SIGNAL_MAX, &scale, sizeof (scale)) ; if (scale < 1e-10) scale = 1.0 ; else scale = 32700.0 / scale ; while ((readcount = sf_read_float (sndfile, float_buffer, BUFFER_LEN))) { for (m = 0 ; m < readcount ; m++) { buffer [m] = scale * float_buffer [m] ; } write (audio_device, buffer, readcount * sizeof (short)); // 중지하고 싶을때 여기에 조건문을 넣는다. if( Sound_Stop_Flag > 0 ) break; } } else { while ((readcount = sf_read_short (sndfile, buffer, BUFFER_LEN))) { write (audio_device, buffer, readcount * sizeof (short)) ; // 중지하고 싶을때 여기에 조건문을 넣는다. if( Sound_Stop_Flag > 0 ) break; } } ; close (audio_device) ; sf_close (sndfile) ; return 0; };