punk@13: #include punk@13: #include punk@13: #include punk@13: #include punk@13: #include punk@13: #include "SndfileWavUtil.h" punk@13: punk@13: void punk@13: generate_wav(const char * pcmfilename, const char * samplewavfilename, const char * outputwavfilename) punk@13: { punk@13: char outfilename[2048]; punk@13: SNDFILE * outfile ; punk@13: SNDFILE * wavfile ; punk@13: SNDFILE * pcmfile ; punk@13: SF_INFO wavinfo ; punk@13: SF_INFO pcminfo ; punk@13: int buff; punk@13: SF_INSTRUMENT inst ; punk@13: punk@13: memset (&wavinfo, 0, sizeof (wavinfo)) ; punk@13: punk@13: punk@13: wavfile = sf_open(samplewavfilename, SFM_READ, &wavinfo); punk@13: punk@13: if (wavfile == NULL){ punk@13: printf ("\nERROR : Not able to open wav file named '%s' : %s/\n", samplewavfilename, sf_strerror (NULL)) ; punk@13: exit (1) ; punk@13: } ; punk@13: punk@13: printf("WAV format: %x\n", wavinfo.format); punk@13: punk@13: if (!((wavinfo.format & SF_FORMAT_PCM_16) && (wavinfo.channels == 1) && punk@13: (wavinfo.format & SF_FORMAT_WAV))){ punk@13: printf("\nERROR : .wav file must be SF_FORMAT_PCM_16 in mono\n"); punk@13: } punk@13: punk@13: pcminfo.format = SF_FORMAT_RAW | SF_FORMAT_PCM_16; punk@13: pcminfo.samplerate = wavinfo.samplerate; punk@13: pcminfo.channels = wavinfo.channels; punk@13: punk@13: pcmfile = sf_open(pcmfilename, SFM_READ, &pcminfo); punk@13: punk@13: if (pcmfile == NULL){ punk@13: printf ("\nERROR : Not able to open pcm file named '%s' : %s/\n", pcmfilename, sf_strerror (NULL)) ; punk@13: exit (1) ; punk@13: } ; punk@13: punk@13: punk@13: punk@13: outfile = sf_open(outputwavfilename, SFM_WRITE, &wavinfo); punk@13: punk@13: memset (&inst, 0, sizeof (inst)) ; punk@13: punk@13: for(int i = SF_STR_FIRST; i <= SF_STR_LAST; i = i + 1) { punk@13: const char * str = sf_get_string(wavfile,i); punk@13: if(str != NULL) { punk@13: sf_set_string(outfile,i,str); punk@13: } punk@13: } punk@13: punk@13: if (outfile == NULL){ punk@13: printf ("\nERROR : Not able to create wav file named '%s' : %s/\n", outfilename, sf_strerror (NULL)) ; punk@13: exit (1) ; punk@13: } ; punk@13: punk@13: while(sf_read_int(pcmfile, &buff, 1) == 1){ punk@13: if(sf_write_int(outfile, &buff, 1) != 1){ punk@13: printf("\nERROR : unable to write to '%s' : %s/\n", outfilename, sf_strerror(NULL)); punk@13: } punk@13: } punk@13: punk@13: sf_close (wavfile) ; punk@13: sf_close (outfile) ; punk@13: sf_close (pcmfile) ; punk@13: punk@13: } punk@13: punk@13: punk@13: void punk@13: generate_pcm (const char * wavfilename, const char * pcmfilename) punk@13: { punk@13: SNDFILE * wavfile ; punk@13: SNDFILE * pcmfile ; punk@13: SF_INFO wavinfo ; punk@13: SF_INFO pcminfo ; punk@13: int buff; punk@13: punk@13: memset (&wavinfo, 0, sizeof (wavinfo)) ; punk@13: memset (&pcminfo, 0, sizeof (pcminfo)) ; punk@13: punk@13: wavfile = sf_open (wavfilename, SFM_READ, &wavinfo) ; punk@13: punk@13: if (wavfile == NULL){ punk@13: printf ("\nERROR : Not able to open wav file named '%s' : %s/\n", wavfilename, sf_strerror (NULL)) ; punk@13: exit (1) ; punk@13: } ; punk@13: punk@13: pcminfo.format = SF_FORMAT_RAW | SF_FORMAT_PCM_16; punk@13: pcminfo.samplerate = wavinfo.samplerate; punk@13: pcminfo.channels = wavinfo.channels; punk@13: punk@13: if ((!wavinfo.format & SF_FORMAT_PCM_16) || (!wavinfo.channels == 1)){ punk@13: printf("\nERROR : .wav file must be SF_FORMAT_PCM_16 and mono\n"); punk@13: } punk@13: punk@13: pcmfile = sf_open (pcmfilename, SFM_WRITE, &pcminfo) ; punk@13: punk@13: if (pcmfile == NULL){ punk@13: printf ("\nERROR : Not able to create pcm file named '%s' : %s/\n", pcmfilename, sf_strerror (NULL)) ; punk@13: exit (1) ; punk@13: } ; punk@13: punk@13: while(sf_read_int(wavfile, &buff, 1) == 1){ punk@13: if(sf_write_int(pcmfile, &buff, 1) != 1){ punk@13: printf("\nERROR : unable to write to '%s' : %s/\n", pcmfilename, sf_strerror(NULL)); punk@13: } punk@13: } punk@13: punk@13: sf_close (wavfile) ; punk@13: sf_close (pcmfile) ; punk@13: } punk@13: punk@13: punk@13: punk@13: