bool sbsms_convert(const char *filenameIn, const char *filenameOut, bool bAnalyze, bool bSynthesize, progress_cb progressCB, void *data, float rate0, float rate1, float pitch0, float pitch1, float volume) { bool status = true; int srOut = 44100; long blockSize; int channels; SampleCountType samplesIn; int srIn; SampleCountType samplesToOutput; SampleCountType samplesToInput; bool bRead = false; bool bWrite = false; audio *abuf = NULL; float *fbuf = NULL; SBSMSInterface *iface = NULL; SBSMSInterface *ifacePre = NULL; SBSMS *sbsms = NULL; PcmWriter *writer = NULL; AudioDecoder *decoder = NULL; AudioDecoder *decoderPre = NULL; SBSMSQuality quality(&SBSMSQualityStandard); Slide rateSlide(SlideLinearInputRate,rate0,rate1); Slide pitchSlide(SlideLinearOutputRate,pitch0,pitch1); if(bAnalyze) { float preProgress = 0.0f; decoder = import(filenameIn); if(!decoder) { printf("File: %s cannot be opened\n",filenameIn); exit(-1); } srIn = decoder->getSampleRate(); channels = decoder->getChannels(); samplesIn = decoder->getFrames(); samplesToInput = (SampleCountType) (samplesIn*(float)srOut/(float)srIn); float pitch = (srOut == srIn?1.0f:(float)srOut / (float)srIn); iface = new SBSMSInterfaceDecoder(&rateSlide,&pitchSlide,false, channels,samplesToInput,0,&quality,decoder,pitch); sbsms = new SBSMS(channels,&quality,bSynthesize); samplesToOutput = iface->getSamplesToOutput(); if(bSynthesize) { blockSize = quality.getFrameSize(); fbuf = (float*)calloc(blockSize*channels,sizeof(float)); abuf = (audio*)calloc(blockSize,sizeof(audio)); writer = new PcmWriter(filenameOut,samplesToOutput,srOut,channels); if(writer->isError()) { printf("File: %s cannot be opened\n",filenameOut); status = false; goto cleanup; } SampleCountType pos = 0; long ret = -1; while(pos<samplesToOutput && ret) { long lastPercent=0; ret = sbsms->read(iface,abuf,blockSize); if(pos+ret > samplesToOutput) { ret = (long)(samplesToOutput - pos); } audio_convert_from(fbuf,0,abuf,0,ret,channels); for(int k=0;k<ret*channels;k++) { fbuf[k] *= volume; } if(ret) writer->write(fbuf, ret); pos += ret; float progress = (float)pos / (float)samplesToOutput; progressCB(progress,"Progress",data); } writer->close(); } } cleanup: if(decoderPre) delete decoderPre; if(decoder) delete decoder; if(fbuf) free(fbuf); if(abuf) free(abuf); if(sbsms) delete sbsms; if(iface) delete iface; if(ifacePre) delete ifacePre; if(writer) delete writer; return status; }