一个fmod应用程序,他首先要加上以下头文件
#include "../../api/inc/fmod.hpp"
#include "../../api/inc/fmod_errors.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
然后定义声音系统(FMOD::System)、声音(FMOD::Sound)、声道(FMOD::Channel)、声音出现的位置(FMOD_VECTOR)、一个用于判断的结果(FMOD_RESULT)这几个变量。通常情况下还要定一个版本的参数用于检查当前版本是否过时。例如:
  FMOD::System    *system;
    FMOD::Sound    *sound1, *sound2, *sound3;
    FMOD::Channel  *channel1 = 0, *channel2 = 0, *channel3 = 0;
    FMOD_RESULT    result;
    FMOD_VECTOR    listenerpos  = { 0.0f, 0.0f, -1.0f * DISTANCEFACTOR };
unsigned int    version;//定义版本的变量
定义好变量之后,就开始编写我们需要的声音资源。下面是一般的步骤:
1. 创建FMOD系统
APIFMOD_RESULT System_Create( FMOD::System ** system);
程序中:result = FMOD::System_Create(&system);
参数为指向系统变量指针的指针;
如果创建系统变量成功,就返回FMOD_OK;没有成功就返回FMOD_RESULT中的任意一项。
2. 检查当前版本是否过时
APIFMOD_RESULT System::getVersion( unsigned int * version);
程序中:result = system->getVersion(&version);
参数为指向版本变量的指针;
如果创建版本变量成功,就返回FMOD_OK;没有成功就返回FMOD_RESULT中的任意一项。
3. 初始化系统和声音设备
必须在FMOD::System_Creat之后,所有用户代码之前就要执行。
APIFMOD_RESULT System::init( int maxchannels, FMOD_INITFLAGS flags, void *extradriverdata);
程序中:result = system->init(100, FMOD_INIT_NORMAL, 0);
maxchannels:FMOD中最大的声道数
FMOD_INITFLAGS
FMOD_OUTPUTTYPE:输出查检
如果初始化成功,就返回FMOD_OK;没有成功就返回FMOD_RESULT中的任意一项。
4. 开始创建自己需要的声音
APIFMOD_RESULT System::createSound(const char * name_or_data, FMOD_MODE mode,
                                FMOD_CREATESOUNDEXINFO *exinfo, FMOD::Sound ** sound);
程序中:result = system->createSound("../media/drumloop.wav", FMOD_SOFTWARE | FMOD_3D, 0, &sound1);
name_or_data:声音资源文件名或者URL
mode:打开声音的模式。
FMOD_CREATESOUNDEXINFO:希望用户提供个多信息。一般设为0
FMOD::Sound:指向声音资源变量指针的指针
5. system的头文件设置声音可听见的最小和最远距离
APISound::set3DMinMaxDistance(float min, float max)
程序中:sound1->set3DMinMaxDistance(2.0f * DISTANCEFACTOR, 10000.0f * DISTANCEFACTOR);
min: 最小距离
max: 最大距离
6. 开始播放音乐
APIFMOD_RESULT System::playSound(FMOD_CHANNELINDEX channelid,FMOD::So
und *sound,
bool paused, FMOD::Channel **channel);
程序中:result = system->playSound(FMOD_CHANNEL_FREE, sound1, true, &channel            1);
FMOD_CHANNELINDEX 得到空闲的声道
FMOD::Sound 之前定义好的声音变量
paused 事后停止
FMOD::Channel 得到的声道的指针
7. 设置声道的位置以及速度
APIFMOD_RESULT Channel::set3DAttributes(const FMOD_VECTOR * pos, const FMOD_VECTOR * vel); 
    程序中:result = channel1->set3DAttributes(&pos, &vel);
    pos:声道位置
    vel:声道速度
8. 得到当前可得到的2d3d的声道数目
APIFMOD_RESULT System::getHardwareChannels(int *num2d,int *num3d,int*total);
程序中:result = system->getHardwareChannels(&num2d, &num3d, 0);
num2d:可以混合3d的数目
num3d:可以混合2d的数目
totaltotal = num3d + num2d
9. 更新3d的位置速度和方向
APIFMOD_RESULT System::set3DListenerAttributes(int listener, const FMOD_VECTOR *pos,
      const FMOD_VECTOR *vel, const FMOD_VECTOR *forward,const FMOD_VECTOR *up);
程序中:result=system->set3DListenerAttributes(0,&listenerpos, &vel, &forward, &up);
listener:如果环境中只有一个听者,则设置为0
pos:听者的位置
vel :从声音的起始位置到达听者耳朵时,每一秒的位移
forward :听者前方的方向
up:听者上方的方向
接着就是一个循环更新以及用户自己的键盘响应操作了。该操作是在一个do..while或者while循环中完成的。例如:
do
//通过函数kbhit()得到键盘响应消息;然后通过getch()得到我们具体要相应的哪个键
      if (kbhit())
        {
            key = getch();
            if (key == '1')
            {  //根据得到的键,响应该键的响应函数
                bool paused;
                channel1->getPaused(&paused);
                channel1->setPaused(!paused);
            }
        }
//更新听者
……..
//更新系统
system->update();
//程序中自规定50ms更新一次,所以要sleep50ms;又因为是从0开始计时的,所以要减去1
        Sleep(INTERFACE_UPDATETIME - 1);
} while (key != 27);
最后逐一释放之前创建的声音和系统
    result = sound1->release();//释放声音资源
    result = system->close();//先将系统关闭
    result = system->release();//然后释放自己
其实通过这一个例子;就可以总结出,只要是创建任何东西(例如创建系统、声音、更新3d)、初始化、开始播放、释放自己等API都是系统的接口;而设置声音的属性(位置、速度、是否停止等)是由声道变量提供的API接口的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。