TimestretchBufferProvider::~TimestretchBufferProvider() { ALOGV("~TimestretchBufferProvider(%p)", this); sonicDestroyStream(mSonicStream); if (mBuffer.frameCount != 0) { mTrackBufferProvider->releaseBuffer(&mBuffer); } free(mLocalBufferData); }
/* Create a sonic stream. Return NULL only if we are out of memory and cannot allocate the stream. */ sonicStream sonicCreateStream( int sampleRate, int numChannels) { sonicStream stream = (sonicStream)calloc(1, sizeof(struct sonicStreamStruct)); int minPeriod = sampleRate/SONIC_MAX_PITCH; int maxPeriod = sampleRate/SONIC_MIN_PITCH; int maxRequired = 2*maxPeriod; if(stream == NULL) { return NULL; } stream->inputBufferSize = maxRequired; stream->inputBuffer = (short *)calloc(maxRequired, sizeof(short)*numChannels); if(stream->inputBuffer == NULL) { sonicDestroyStream(stream); return NULL; } stream->outputBufferSize = maxRequired; stream->outputBuffer = (short *)calloc(maxRequired, sizeof(short)*numChannels); if(stream->outputBuffer == NULL) { sonicDestroyStream(stream); return NULL; } stream->pitchBufferSize = maxRequired; stream->pitchBuffer = (short *)calloc(maxRequired, sizeof(short)*numChannels); if(stream->pitchBuffer == NULL) { sonicDestroyStream(stream); return NULL; } stream->downSampleBuffer = (short *)calloc(maxRequired, sizeof(short)); stream->speed = 1.0f; stream->pitch = 1.0f; stream->volume = 1.0f; stream->sampleRate = sampleRate; stream->numChannels = numChannels; stream->minPeriod = minPeriod; stream->maxPeriod = maxPeriod; stream->maxRequired = maxRequired; return stream; }
// Teardown the C data structure. void Java_org_vinuxproject_sonic_Sonic_closeNative( JNIEnv *env, jobject thiz, jlong sonicID) { sonicInst inst = getInst(sonicID); sonicStream stream = inst->stream; LOGV("Destroying stream"); sonicDestroyStream(stream); free(inst->byteBuf); free(inst); }
/* Run sonic. */ static void runSonic( waveFile inFile, waveFile outFile, float speed, float pitch, float rate, float volume, int emulateChordPitch, int quality, int sampleRate, int numChannels) { sonicStream stream = sonicCreateStream(sampleRate, numChannels); short inBuffer[BUFFER_SIZE], outBuffer[BUFFER_SIZE]; int samplesRead, samplesWritten; sonicSetSpeed(stream, speed); sonicSetPitch(stream, pitch); sonicSetRate(stream, rate); sonicSetVolume(stream, volume); sonicSetChordPitch(stream, emulateChordPitch); sonicSetQuality(stream, quality); do { samplesRead = readFromWaveFile(inFile, inBuffer, BUFFER_SIZE/numChannels); if(samplesRead == 0) { sonicFlushStream(stream); } else { sonicWriteShortToStream(stream, inBuffer, samplesRead); } do { samplesWritten = sonicReadShortFromStream(stream, outBuffer, BUFFER_SIZE/numChannels); if(samplesWritten > 0) { writeToWaveFile(outFile, outBuffer, samplesWritten); } } while(samplesWritten > 0); } while(samplesRead > 0); sonicDestroyStream(stream); }
~rate_controller() { if(stream) sonicDestroyStream(stream); }
~speech_stream() { if(sonic_stream) sonicDestroyStream(sonic_stream); }