嘿聪明的人 :) 我有一个音乐应用程序,我想为样本音频添加一些实时音效。如何通过代码创建“混响”或“延迟”效果?
我正在使用“双簧管库进行音频流传输。
我试图学习如何去做,但我不知道我做错了什么?
这是我的渲染代码:
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;
}
}
谢谢!