背景: 我的背景音乐作为音效播放,因为我想在每次重复曲调之间改变音高。
问题: 在播放背景音乐时,会发生许多其他短音效。播放一定数量的音效后,我的背景音乐(也是音效)会中断。队列似乎在循环,因此在播放了 50 个音效之后,当播放第 51 个时,无论是否完成,第一个都会被释放。
方向请求: 我可以看到两个方向可能与此问题有关。1.不将背景音乐作为效果播放,并弄清楚如何将音高更改为背景音乐而不是效果 2.如何确保效果将保留到完成为止。
谢谢
背景: 我的背景音乐作为音效播放,因为我想在每次重复曲调之间改变音高。
问题: 在播放背景音乐时,会发生许多其他短音效。播放一定数量的音效后,我的背景音乐(也是音效)会中断。队列似乎在循环,因此在播放了 50 个音效之后,当播放第 51 个时,无论是否完成,第一个都会被释放。
方向请求: 我可以看到两个方向可能与此问题有关。1.不将背景音乐作为效果播放,并弄清楚如何将音高更改为背景音乐而不是效果 2.如何确保效果将保留到完成为止。
谢谢
SimpleAudioEngine 不允许您控制通道,因此它只会在其内部分配的通道之一中播放您的音效。最终所有频道都在播放音频。在这种情况下,当要播放一个新的音频文件并且所有通道都已经在播放时,SimpleAudioEngine 将取消一个现有的音频文件。有时这将是您的背景音乐。当。
解决此问题的通常方法是专门为背景音乐分配(分配)一个音频通道。没有其他音频会尝试在该频道上播放音频。您将不得不使用“常规”的CocosDenshion API。看起来您需要使用CDAudioManager或CDSoundEngine,但我没有使用 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类播放的所有其他音频文件。