Я использую библиотеку Oboe C ++ для воспроизведения звуков в моем приложении для Android. Я хочу изменить высоту звука в своих аудиосэмплах. Итак, я начал создавать значение с плавающей запятой «mPos» для хранения текущего воспроизводимого кадра и добавлять значение «mPitch» на каждом этапе.
Кажется, что звук воспроизводится правильно с новым шагом, но он удваивается сам, когда высота звука высокая (например, 1,2) и издает странный шум, а когда высота звука низкая (например, 0,212).
Это мое первое аудиопрограммирование, я провел много исследований, прежде чем опубликовать этот вопрос. Я даже отправляю сообщения напрямую в службу поддержки "Гобой", но без ответа. Кто-нибудь знает, как правильно реализовать Pitch?
streamLength всегда 192
channelCount всегда 2
Код:
void Player::renderAudio(float *stream, int32_t streamLength){
const int32_t channelCount = mSound->getChannelCount();
if (mIsPlaying){
float framesToRenderFromData = streamLength ;
float totalSourceFrames = mSound->getTotalFrames()/mPitch;
const float *data = mSound->getData();
// Check whether we're about to reach the end of the recording
if (mPos + streamLength >= totalSourceFrames ){
framesToRenderFromData = (totalSourceFrames - mPos);
mIsPlaying = false;
}
for (int i = 0; i < framesToRenderFromData; ++i) {
for (int j = 0; j < channelCount; ++j) {
if(j % 2 == 0){
stream[(i*channelCount)+j] = (data[((size_t)mPos * channelCount)) + j] * mLeftVol) * mVol;
}else{
stream[(i*channelCount)+j] = (data[((size_t)mPos * channelCount)) + j] * mRightVol) * mVol;
}
}
mPos += mPitch;
if(mPos >= totalSourceFrames){
mPos = 0;
}
}
if (framesToRenderFromData < streamLength){
renderSilence(&stream[(size_t)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;
}
}
void Player::setPitch(float pitchData){
mPitch = pitchData;
};