1

嘿聪明的人 :) 我有一个音乐应用程序,我想为样本音频添加一些实时音效。如何通过代码创建“混响”或“延迟”效果?

我正在使用“双簧管库进行音频流传输。

我试图学习如何去做,但我不知道我做错了什么?

这是我的渲染代码:

void Player::renderAudio(float *stream, int32_t streamLength){

    const int32_t channelCount = mSound->getChannelCount();

    // Reverb Configuration
    int delayMilliseconds = 5 * 1000;
    int delaySamples =(int)((float)delayMilliseconds * kSampleRateHz / 1000.0F); // 48,000hz
    float decay = 5000.0f; // Some random number

    if (mIsPlaying){

        int32_t framesToRenderFromData = streamLength ;
        float totalSourceFrames = mSound->getTotalFrames();  // Note change here
        const float *data = mSound->getData();


        if ( mPos >= totalSourceFrames ) {
            framesToRenderFromData = 0.0f;
        }

        for (int i = 0; i < framesToRenderFromData; ++i) {

            //Stereo Channel
            for (int j = 0; j < channelCount; ++j) {
                stream[(i * channelCount) + j]+= data[((size_t)mPos) * channelCount + j] * mMasterVol;
            }

            //Increment position (pitch supported)
            mPos += mPitch;
            if ( ((size_t)mPos) >= totalSourceFrames ) {
                framesToRenderFromData = (size_t)mPos;
                mPos = 0.0f;
                mIsPlaying = false;
                break;
            }

        }

        //Reverb algorithm?!?! Do nothing...
        for (int x = 0; x <framesToRenderFromData - delaySamples; x++){
            stream[x + delaySamples] += (short)((float)stream[x] * decay);
        }
        
        if (framesToRenderFromData < streamLength){
            renderSilence(&stream[framesToRenderFromData], streamLength * channelCount);
        }
    } else {
        renderSilence(stream, streamLength * channelCount);
    }
}

void Player::renderSilence(float *start, int32_t numSamples){
    for (int i = 0; i < numSamples; ++i) {
        start[i] = 0;
    }
}

谢谢!

4

0 回答 0