14.1 播放2D音效

CLion项目文件位于 samples\audio\fmod_play_2d_audio

2D音效一般用在UI系统中,比较直观的感受就是左右耳听到的音量大小一致。

下面用fmod解析并播放下面3个wav音效:

  1. 背景音乐,循环播放。
  2. 刀攻击音效。
  3. 法术技能音效。

来熟悉FMOD的使用,分3步走:

创建类 Audio 对上面3个操作进行封装,结构如下:

///file:source/audio/audio.cpp line:10

void Audio::Init(){
    FMOD_RESULT       result;
    // 创建FMOD System实例
    result=FMOD_System_Create(&fmod_system_);
    spdlog::info("FMOD::System_Create ret code {}",result);
    //获取版本号
    unsigned int      version;
    result = FMOD_System_GetVersion(fmod_system_,&version);
    spdlog::info("FMOD_System_GetVersion ret code {}",result);
    if (version < FMOD_VERSION){
        spdlog::critical("FMOD lib version {} doesn't match header version {}", version, FMOD_VERSION);
        return;
    }
    //初始化 系统
    result=FMOD_System_Init(fmod_system_,32,FMOD_INIT_NORMAL,0);
    spdlog::info("FMOD_System_Init ret code {}",result);
}


FMOD_RESULT Audio::Update() {
    return FMOD_System_Update(fmod_system_);
}

FMOD_RESULT
Audio::CreateSound(const char *name_or_data,FMOD_MODE mode,FMOD_CREATESOUNDEXINFO *ex_info,FMOD_SOUND **sound) {
    return FMOD_System_CreateSound(fmod_system_,name_or_data,mode,ex_info,sound);
}


FMOD_RESULT Audio::PlaySound(FMOD_SOUND *sound,FMOD_CHANNELGROUP *channel_group,bool paused,FMOD_CHANNEL **channel) {
    return FMOD_System_PlaySound(fmod_system_,sound,channel_group,paused,channel);
}

1.初始化FMOD

在申请使用硬件资源时,都需要初始化,渲染之前需要初始化OpenGL,现在播放音效之前需要初始化FMOD。

在应用程序初始化的时候调用Audio::Init()

///file:source/utils/application.cpp line:70

void Application::Init() {
    ......

    //初始化 fmod
    Audio::Init();
}

在刷帧的时候调用Audio::Update()

///file:source/utils/application.cpp line:139

void Application::Update(){
    ......

    Audio::Update();
}

Update每一帧调用FMOD_System_Update,主要是更新3d音频位置、执行回调等作用。

2.加载音效文件

初始化 Fmod之后,就可以加载wav音效文件,创建FMOD_SOUND实例。

在 example的 LoginScene.Awake()中进行创建。

///file:example/login_scene.cpp line:49

void LoginScene::Awake() {
    ......

    CreateSounds();
}

void LoginScene::CreateSounds() {
    FMOD_RESULT result;
    // 战斗背景音乐
    result = Audio::CreateSound((Application::data_path() + "audio/war_bgm.wav").c_str(), FMOD_2D | FMOD_LOOP_NORMAL,nullptr, &sound_1);
    // 刀攻击音效
    result = Audio::CreateSound((Application::data_path() + "audio/knife_attack.wav").c_str(), FMOD_2D, nullptr, &sound_2);
    // 魔法攻击音效
    result = Audio::CreateSound((Application::data_path() + "audio/magic_attack.wav").c_str(), FMOD_2D, nullptr, &sound_3);
}

Audio::CreateSound传入的参数 FMOD_MODE用的比较多的有以下几个:

FMOD_DEFAULT:默认配置
FMOD_LOOP_OFF:关闭循环
FMOD_LOOP_NORMAL:循环
FMOD_2D:设置为2D音效
FMOD_3D:设置为3D音效

如果加载成功,返回 result == FMOD_OK 并且设置 sound_1,否则返回错误码。

3.播放音效

通过按键 1、2、3来控制3个音效的播放/暂停。

///file:example/login_scene.cpp line:152

void LoginScene::Update() {
    ......

    //按 1 2 3 播放/暂停 3个音效
    if(Input::GetKeyUp(KEY_CODE_1)){
        PlayPauseSound(sound_1,&channel_1);
    }else if(Input::GetKeyUp(KEY_CODE_2)){
        PlayPauseSound(sound_2,&channel_2);
    }else if(Input::GetKeyUp(KEY_CODE_3)){
        PlayPauseSound(sound_3,&channel_3);
    }
}

void LoginScene::PlayPauseSound(FMOD_SOUND *sound, FMOD_CHANNEL** channel) {
    FMOD_RESULT result;
    FMOD_BOOL paused=false;
    //判断音效是否暂停
    result = FMOD_Channel_GetPaused(*channel, &paused);//音效播放完毕后,channel被回收,返回 FMOD_ERR_INVALID_HANDLE
    switch(result){
        case FMOD_OK:
            //暂停播放
            result= FMOD_Channel_SetPaused(*channel, !paused);
            break;
        case FMOD_ERR_INVALID_PARAM://channel默认是nullptr,非法参数。
        case FMOD_ERR_INVALID_HANDLE://音效播放完毕后,channel被回收。
        case FMOD_ERR_CHANNEL_STOLEN://音效播放完毕后,channel被回收且被分配给其他Sound。
            //播放音效
            result = Audio::PlaySound(sound, nullptr, false, channel);
            break;
    }
}

运行项目,测试播放音效。

Copyright © captainchen all right reserved,powered by GitbookFile Modify: 2021-08-29 16:40:21

results matching ""

    No results matching ""

    results matching ""

      No results matching ""