OpenAl或Cocos2dx存在错误

时间:2014-11-15 11:08:13

标签: c++ cocos2d-x openal

在场景中播放sfx for循环:

CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("sfx_timesup.mp3", true);

设置一个bt按下播放另一个sfx:

CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("sfx_bt.mp3", false);

按bt后31次将停止循环sfx。

#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"
USING_NS_CC;

CCScene* HelloWorld::scene(){
    CCScene *scene = CCScene::create();
    HelloWorld *layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}
bool HelloWorld::init(){
    if ( !CCLayer::init() ) {
        return false;
    }
    CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("sfx_timesup.wav", true);

    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
                                        "CloseNormal.png",
                                        "CloseSelected.png",
                                        this,
                                        menu_selector(HelloWorld::menuCloseCallback));
    pCloseItem->setPosition(ccp(visibleSize.width/2 ,visibleSize.height/2));
    pCloseItem->setScale(10);
    CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
    pMenu->setPosition(CCPointZero);
    this->addChild(pMenu, 1);
    return true;
}
void HelloWorld::menuCloseCallback(CCObject* pSender){
    CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("sfx_bt.wav", false);
}

在cocosdenshion.mm中 这一行:

int sourceIndex = [self _getSourceIndexForSourceGroup:sourceGroupId];

无法识别索引是循环还是播放。

点击bt后31次。它将循环声道并结束循环效果。

2 个答案:

答案 0 :(得分:1)

最后,我终于找到了问题并修复了它。

您需要修改CDAudioManager.m文件中的init函数

添加代码:

[soundEngine setSourceGroupNonInterruptible:0 isNonInterruptible:TRUE];

后行:

soundEngine = [[CDSoundEngine alloc] init];

默认cocos2d声音引擎不检查循环或播放sfx。现在它会做到的。为什么我:<发现这么难。因为游戏警告sfx奇怪地停止,然后找到sfx播放问题,然后进入黑洞(声音引擎):<好难过......

答案 1 :(得分:0)

cocos2d-x 3.8中仍然存在此错误,我只是在此运行:)我有更好的解决方法:

在CocosDension.m函数playSound中添加以下代码:

for(int i = 0; i < sourceTotal_; i++){
    ALint state;
    ALuint source = _sources[i].sourceId;
    alGetSourcei(source, AL_SOURCE_STATE, &state);
    if (state != AL_PLAYING && state != AL_PAUSED) {
        sourceIndex = i;
        break;
    }
}

之间:

int sourceIndex = [self _getSourceIndexForSourceGroup:sourceGroupId];//This method ensures sourceIndex is valid

if (sourceIndex != CD_NO_SOURCE) {