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