1

背景: 我的背景音乐作为音效播放,因为我想在每次重复曲调之间改变音高。

问题: 在播放背景音乐时,会发生许多其他短音效。播放一定数量的音效后,我的背景音乐(也是音效)会中断。队列似乎在循环,因此在播放了 50 个音效之后,当播放第 51 个时,无论是否完成,第一个都会被释放。

方向请求: 我可以看到两个方向可能与此问题有关。1.不将背景音乐作为效果播放,并弄清楚如何将音高更改为背景音乐而不是效果 2.如何确保效果将保留到完成为止。

谢谢

4

1 回答 1

4

SimpleAudioEngine 不允许您控制通道,因此它只会在其内部分配的通道之一中播放您的音效。最终所有频道都在播放音频。在这种情况下,当要播放一个新的音频文件并且所有通道都已经在播放时,SimpleAudioEngine 将取消一个现有的音频文件。有时这将是您的背景音乐。当。

解决此问题的通常方法是专门为背景音乐分配(分配)一个音频通道。没有其他音频会尝试在该频道上播放音频。您将不得不使用“常规”的CocosDenshion API。看起来您需要使用CDAudioManagerCDSoundEngine,但我没有使用 CocosDenshion 的频道的经验。

就我个人而言,我从未使用过 CocosDenshion,每当我需要更多控制时,我发现ObjectAL API 更容易理解并且它具有出色的文档。我为在特定通道上播放声音的 ObjectAL 制作了以下辅助函数。我只是为我的背景音乐实例化了一个ALChannelSource,并且只通过该频道播放背景音乐。返回的ALSoundSource甚至允许您在播放音频时更改音高、平移等。

+(id<ALSoundSource>) playEffect:(NSString*)effect channel:(ALChannelSource*)channel loop:(bool)loop
{
    id<ALSoundSource> soundSource = nil;

    if (channel)
    {
        ALBuffer* buffer = [[OALAudioSupport sharedInstance] bufferFromFile:effect];
        soundSource = [channel play:buffer loop:loop];
    }

    return soundSource;
}

我通过OALSimpleAudio类播放的所有其他音频文件。

于 2011-10-15T21:57:27.520 回答