【Cocos2d-x】SimpleAudioEngineではなくAudioEngineを使う

Cocos2d-x3.3beta0から、サウンド再生用に新しくAudioEngineクラスが作られた
今までCocos2d-xで使っていたSimpleAudioEngineではできなかった、
再生時間の取得や終了時のコールバックなどが取れるようになったので、せっかくなので使ってみることにした
ただ、SimpleAudioEngineと違い、BGMとSEで分けられていないため、BGMを切り替える場合は前のBGMを止める必要ができたり、
音量等も個別に切り替える必要ができてきたため、そこら辺を管理するManagerクラスを作ってみた
以下コード

AudioManager.h


#include "cocos2d.h"

class AudioManager
{
public:
    enum BgmType
    {
        BGM_A = 0,
        None,
    };
    enum SeType
    {
        SE_A = 0,
    };
    
    static AudioManager* getInstance();
    AudioManager();
    void init();
    
    void playBgm(BgmType type, bool loop = true);
    void playSe(SeType type);
    
    CC_PROPERTY(float, _bgmVolume, BgmVolume);
    CC_PROPERTY(float, _seVolume, SeVolume);
    void setVolume(float volume);
    
    CC_PROPERTY(bool, _mute, Mute);
    
    void saveParams();
    
private:
    struct BgmData
    {
        BgmData()
        {
            bgmId = -1;
            type = None;
            playing = false;
        }
        int bgmId;
        BgmType type;
        bool playing;
    };
    
    std::string getBgmPath(BgmType type);
    std::string getSePath(SeType type);
    
    BgmData _bgmData;
    
    std::vector<int> _seList;
    
    float getMuteBgmVolume(){return _mute ? 0.0f : _bgmVolume;};
    float getMuteSeVolume(){return _mute ? 0.0f : _seVolume;};
    
    
    void finishCallBack(int audioID, std::string filePath);
    
    
};

AudioManager.cpp


#include "AudioManager.h"
#include "audio/include/AudioEngine.h"

USING_NS_CC;
using namespace experimental;

static AudioManager* _instance;

AudioManager* AudioManager::getInstance()
{
    if (!_instance) {
        _instance = new AudioManager();
        _instance->init();
    }
    return _instance;
}

AudioManager::AudioManager()
:_bgmData(BgmData())
, _seList(std::vector<int>())
, _bgmVolume(1.0)
, _seVolume(1.0)
{
    
}

void AudioManager::init()
{
    _mute = UserDefault::getInstance()->getBoolForKey("mute", false);
    _bgmVolume = UserDefault::getInstance()->getFloatForKey("bgm_volume", 1.0f);
    _seVolume = UserDefault::getInstance()->getFloatForKey("se_volume", 1.0f);
    
}

void AudioManager::playBgm(AudioManager::BgmType type, bool loop)
{
    if (!_bgmData.playing || _bgmData.type != type) {
        if (_bgmData.playing) {
            AudioEngine::stop(_bgmData.bgmId);
        }
        _bgmData.bgmId = AudioEngine::play2d(getBgmPath(type), loop, getMuteBgmVolume());
        _bgmData.type = type;
        _bgmData.playing = true;
        AudioEngine::setFinishCallback(_bgmData.bgmId, CC_CALLBACK_2(AudioManager::finishCallBack, this));
    }
    
}

void AudioManager::playSe(AudioManager::SeType type)
{
    int id = AudioEngine::play2d(getSePath(type), false, getMuteSeVolume());
    _seList.push_back(id);
    AudioEngine::setFinishCallback(id, CC_CALLBACK_2(AudioManager::finishCallBack, this));
    
    
}

void AudioManager::setBgmVolume(float var)
{
    _bgmVolume = var;
    if (_bgmData.playing) {
        AudioEngine::setVolume(_bgmData.bgmId, getMuteBgmVolume());
    }
}

float AudioManager::getBgmVolume()
{
    return _bgmVolume;
}

void AudioManager::setSeVolume(float var)
{
    _seVolume = var;
    for (auto id : _seList) {
        AudioEngine::setVolume(id, getMuteSeVolume());
    }
}

float AudioManager::getSeVolume()
{
    return _seVolume;
}

void AudioManager::setVolume(float volume)
{
    setBgmVolume(volume);
    setSeVolume(volume);
}

void AudioManager::setMute(bool mute)
{
    if (_mute != mute) {
        _mute = mute;
        
        setBgmVolume(getBgmVolume());
        setSeVolume(getSeVolume());
    }
    
}

bool AudioManager::getMute()
{
    return _mute;
}

std::string AudioManager::getBgmPath(AudioManager::BgmType type)
{
    std::string path;
    switch (type) {
        case BGM_A:
            path = "bgm.mp3";
            break;
            
        default:
            path = "";
            break;
    }
    return path;
}


std::string AudioManager::getSePath(AudioManager::SeType type)
{
    std::string path;
    switch (type) {
        case SE_A:
            path = "se.mp3";
            break;
            
        default:
            path = "";
            break;
    }
    return path;
}

void AudioManager::finishCallBack(int audioID, std::string filePath)
{
    if (audioID == _bgmData.bgmId) {
        if (!AudioEngine::isLoop(audioID)) {
            _bgmData.playing = false;
            _bgmData.type = None;
            _bgmData.bgmId = -1;
        }
    } else {
        auto it = std::find(_seList.begin(), _seList.end(), audioID);
        if (it != _seList.end()) {
            _seList.erase(it);
        }
        
    }
    
    
}


void AudioManager::saveParams()
{
    UserDefault::getInstance()->setBoolForKey("mute", _mute);
    UserDefault::getInstance()->setFloatForKey("bgm_volume", _bgmVolume);
    UserDefault::getInstance()->setFloatForKey("se_volume", _seVolume);
    
}

まだSEとかは実際に再生していないので不具合がある可能性あり
自分メモ用なので関数名がおかしかったり頂けない実装があったりするかもなので、まあ参考程度にしていただければ

広告

~ by ころさめ : 10月 28, 2014.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。