游戏启动器Ogg Vorbis播放未正确结束

时间:2012-06-16 07:26:06

标签: qt audio symbian ogg

我最近发现了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 

提前谢谢。

0 个答案:

没有答案