游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3570|回复: 0

如何使用FMOD实现两个声音的循环播放

[复制链接]

1

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-4-9 12:59:00 | 显示全部楼层 |阅读模式
我想通过回调函数来判断FMOD_CHANNEL_CALLBACKTYPE_END的状态,确定一个声音是否结束,如果一个声音结束,马上播放另一个声音。主程序中使用WaitForSingleObject (hSoundOverEvent, INFINITE)来等待回调函数的状态。现在的问题是:主程序停在WaitForSingleObject处,不能实现循环播放。查看帮助文档,说channel::setCallback必须依赖System::update,也就是说只有当声音播放完毕后你还要调用System::update,才能得到FMOD_CHANNEL_CALLBACKTYPE_END的状态。可是如果这样就失去了WaitForSingleObject的意义,因为其不能自动触发。
请问:怎么才能用FMOD实现两个声音的循环播放呢?(注:不用播放列表技术。)代码如下

include <windows.h>
#include <stdio.h>
#include <conio.h>

#include "../../api/inc/fmod.hpp"
#include "../../api/inc/fmod_errors.h"

void ERRCHECK(FMOD_RESULT result)
{
    if (result != FMOD_OK)
    {
        printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));
        exit(-1);
    }
}

HANDLE hSoundOverEvent = NULL;

/* 一个声音片段播放完毕时回调*/
FMOD_RESULT  F_CALLBACK callbackChannel(FMOD_CHANNEL * channel, FMOD_CHANNEL_CALLBACKTYPE type, void * commanddata1, void * commanddata2)
{
        FMOD::Channel *cppchannel = (FMOD::Channel *)channel;

        if(type == FMOD_CHANNEL_CALLBACKTYPE_END)
        {
                SetEvent(hSoundOverEvent);
        };

        return FMOD_OK;
}

int main(int argc, char *argv[])
{
        /************************************
              Create sound system
         ***********************************/
   
        FMOD::System     *system;
         FMOD::Sound      *sound1, *sound2;
        FMOD::Channel    *channel;
        FMOD_RESULT       result;
        int                 key;
        FMOD_MODE                  modeTyre = FMOD_LOOP_OFF | FMOD_SOFTWARE;

        result = FMOD::System_Create(&system);
        ERRCHECK(result);

        result = system->init(32, FMOD_INIT_NORMAL, 0);
         ERRCHECK(result);

        result = system->createSound("../wavesource/v40_20ms.wav", modeTyre, 0, &sound1);
        ERRCHECK(result);
        result = system->createSound("../wavesource/v80_20ms.wav", modeTyre, 0, &sound2);
        ERRCHECK(result);
        result = system->playSound(FMOD_CHANNEL_FREE, sound1, false, &channel);
        ERRCHECK(result);

        int        i= 1;
       
        do
        {
                if(_kbhit())
                {
                        key = getch();
                }
                if((i & 1) == 0)
                     result = system->playSound(FMOD_CHANNEL_FREE, sound2, false, &channel);
                else
                     result = system->playSound(FMOD_CHANNEL_FREE, sound1, false, &channel);
                i +=1;
                channel->setCallback(callbackChannel);
                system->update();
                WaitForSingleObject (hSoundOverEvent, INFINITE);
        } while (key != 27);


    /*        Shut down    */
   
    result = sound1->release();
    ERRCHECK(result);
    result = sound2->release();
    ERRCHECK(result);
    result = system->close();
    ERRCHECK(result);
    result = system->release();

    return 0;
}
abcabc
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-12-22 21:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表