我最近发现了Qt Game Enabler库,想在我使用Qt组件的Symbian项目中使用它。
我已成功抓取了库的音频部分,我能够播放一个小问题的Ogg Vorbis文件。当我播放一个文件并且它第一次到达结尾时,而不是回到开始(因为我已将其设置为无限循环)它将返回几秒钟并播放直到结束。当它第二次结束时,就是它正确地返回到开始并且整个周期再次开始(结束,返回几秒钟,再次结束,回到开始,依此类推等等等)。
我已经设法找出它决定在几秒钟内返回的代码,但是不知道做出任何改变。
源文件名为VorbisSource,是一个GameEnabler :: AudioSource。播放音频的相关源代码如下:
unsigned int channelLength(m_decoder->decodedLength() - 2);
unsigned int samplesToWrite(bufferLength / 2);
unsigned int amount(0);
unsigned int totalMixed(0);
while (samplesToWrite > 0) {
unsigned int samplesLeft;
if (m_fixedInc == 0) {
// No speed set. Will lead to division by zero error if not set.
setSpeed(GEDefaultAudioSpeed);
}
samplesLeft = m_fixedInc > 0 ? channelLength - (m_fixedPos >> 12) :
(m_fixedPos >> 12);
// This is how much we can mix at least.
unsigned int maxMixAmount = (int)(((long long int)(samplesLeft) << 12) /
qAbs(m_fixedInc));
if (maxMixAmount > samplesToWrite) {
maxMixAmount = samplesToWrite;
}
if (maxMixAmount > 0) {
amount = mixBlock(target+totalMixed * 2, maxMixAmount);
if (amount == 0) {
// Error!
break;
}
totalMixed += amount;
}
else {
amount = 0;
m_fixedPos = m_fixedInc > 0 ? channelLength<<12 : 0; // <------------------------------- THIS IS WHERE THE PROBLEM IS
}
// The sample ended. Check the looping variables and see what to do.
if ((m_fixedPos >> 12) >= channelLength || m_fixedPos <= 0) {
m_fixedPos += m_fixedInc > 0 ? -((qint64)channelLength << 12) :
((qint64)channelLength << 12);
if (m_loopCount > 0)
m_loopCount--;
if (m_loopCount == 0) {
// No more loops, stop the sample and return the amount of
// samples already mixed.
stop();
break;
}
}
samplesToWrite -= amount;
if (samplesToWrite < 1)
break;
}
在某些时候,maxMixAmount被设置为零(我相信它在文件的末尾),而不是结束声音,它根据这行代码返回几秒钟:
m_fixedPos = m_fixedInc > 0 ? channelLength<<12 : 0;
我的第一个想法可能是因为vorbis文件具有可变比特率并且VorbisSource没有预料到它,但是在更改它时,会出现同样的问题。我选择哪个文件也没关系,这是相同的行为。
我的下一个猜测是,它的移动量是错误的,但我不知道适量是多少。
以下是Game Enabler的一些输出信息,如果它有帮助:
GE::AudioOut::AudioOut(GE::AudioSource*, QObject*) : 65 : Buffer size: 32768
virtual void GE::AudioOut::run() : 145 : Starting thread.
int GE::VorbisDecoder::vorbisInit() : 400 : stb vorbis init complete, used 3527 bytes, error 0
int GE::VorbisDecoder::vorbisInit() : 408 : sample_rate: 44100
int GE::VorbisDecoder::vorbisInit() : 409 : channels: 1
int GE::VorbisDecoder::vorbisInit() : 410 : max_frame_size: 2048
提前谢谢。