Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- applyEffect(const char *input, const char *output, int effectId) {
- SuperpoweredDecoder *decoder = new SuperpoweredDecoder();
- const char *openError = decoder->open(input, false);
- if (openError) {
- delete decoder;
- return false;
- };
- FILE *fd = createWAV(output, decoder->samplerate, 2);
- if (!fd) {
- delete decoder;
- return false;
- };
- float effectMix = 0.5f;
- SuperpoweredFX *effect = NULL;
- if (effectId == 0) {
- effect = new SuperpoweredEcho(decoder->samplerate);
- ((SuperpoweredEcho *) effect)->setMix(effectMix);
- } else if (effectId == 1) {
- effect = new SuperpoweredReverb(decoder->samplerate);
- ((SuperpoweredReverb *) effect)->setMix(effectMix);
- }
- if (effect == NULL) {
- delete decoder;
- return false;
- }
- effect->enable(true);
- // Create a buffer for the 16-bit integer samples coming from the decoder.
- short int *intBuffer = (short int *)malloc(decoder->samplesPerFrame * 2 * sizeof(short int) + 16384);
- // Create a buffer for the 32-bit floating point samples required by the effect.
- float *floatBuffer = (float *)malloc(decoder->samplesPerFrame * 2 * sizeof(float) + 1024);
- // Processing.
- while (true) {
- // Decode one frame. samplesDecoded will be overwritten with the actual decoded number of samples.
- unsigned int samplesDecoded = decoder->samplesPerFrame;
- if (decoder->decode(intBuffer, &samplesDecoded) == SUPERPOWEREDDECODER_ERROR) {
- break;
- }
- if (samplesDecoded < 1) {
- break;
- }
- // Apply the effect.
- // Convert the decoded PCM samples from 16-bit integer to 32-bit floating point.
- SuperpoweredShortIntToFloat(intBuffer, floatBuffer, samplesDecoded);
- effect->process(floatBuffer, floatBuffer, samplesDecoded);
- // Convert the PCM samples from 32-bit floating point to 16-bit integer.
- SuperpoweredFloatToShortInt(floatBuffer, intBuffer, samplesDecoded);
- }
- // Write the audio to disk.
- fwrite(intBuffer, 1, samplesDecoded * 4, fd);
- };
- // Cleanup.
- closeWAV(fd);
- delete decoder;
- delete effect;
- free(intBuffer);
- free(floatBuffer);
- return true;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement