How to write file to external storage using superpowered SDK in android?

后端 未结 1 1526
南方客
南方客 2021-01-14 04:36

While implementing a project using superpowered for Android audio effects like flunge, echo, reverb etc I am able to make recording through native and write file in external

相关标签:
1条回答
  • 2021-01-14 04:59

    I had a requirement to apply effect on just recorded audio (so I have original wav and apply effect to it). Here is a shapshot of method which apply effect on original file and save it to separate file:

    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;
    

    }

    New file will be created with applied effect. Hope it will help you somehow!

    0 讨论(0)
提交回复
热议问题