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