游戏开发论坛

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

盖莫音频引擎1.2.8进阶(1):音频录入

[复制链接]

50

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2010-4-24 18:22:00 | 显示全部楼层 |阅读模式
盖莫音频引擎1.2.8进阶(1):音频录入
刚做完了盖莫音频引擎1.2.8的音频录入功能
这个比较简单
就是把听到的音频保存为一定格式的音频文件(当前只设计了保存为wav文件)

接口很简单
如下:

////////////////////////////////////////////////////////////
/// 定义音频录入类接口
////////////////////////////////////////////////////////////

class AudioCapture : public Object  
{
public:
    /////////////////////////////////////////////////////////

//! 构造,析构音频录入

/////////////////////////////////////////////////////////

    AudioCapture();
    virtual
~AudioCapture();
   
    /////////////////////////////////////////////////////////

//! 捕获,停止捕获音频数据

/////////////////////////////////////////////////////////


virtual
void CaptureData() =
0;   
    virtual
void StopCapture() =
0;
   
       DECLARE_OBJECT(AudioCapture)      
};



只有2个函数
一个是音频数据分批录入
一个就是停止录入音频数据
那么该指针从哪里获取呢?
当然是AudioDevice了

如下(这是盖莫音频引擎的中枢)

/////////////////////////////////////////////////////////
//! 定义音频设备基类
/////////////////////////////////////////////////////////
class AudioDevice : public Object
{
public:
    /////////////////////////////////////////////////////////

//! 初始化,卸载音频设备

/////////////////////////////////////////////////////////


virtual
bool Init(const  engine_string &devicename,
                      uint16 eax_effect_num,
                      uint   output_freq) =
0;
    virtual
bool Deinit() =
0;        
    /////////////////////////////////////////////////////////

//! 获取音频引擎版本号

/////////////////////////////////////////////////////////

virtual
const
char* GetVerson() const
=
0;

    /////////////////////////////////////////////////////////

//! 获取音频引擎作者

/////////////////////////////////////////////////////////

virtual
const
char* GetMaker() const
=
0;

    /////////////////////////////////////////////////////////

//! 查询音频设备是否支持指定格式的音频文件

/////////////////////////////////////////////////////////

virtual
bool IsSupport(const AudioFileType& type) =
0;

    /////////////////////////////////////////////////////////

//! 抓取音频音源指针(最大可获取255个音源)

/////////////////////////////////////////////////////////

virtual AudioSource*  GetAudioSource() =
0;

    /////////////////////////////////////////////////////////

//! 获取听者指针

/////////////////////////////////////////////////////////

virtual AudioListener* GetAudioListener() =
0;
   
    /////////////////////////////////////////////////////////

//! 获取音频捕获设备指针(参数为音频名字)(当前仅仅支持wav格式)(全局唯一)

/////////////////////////////////////////////////////////


virtual RefPtr<AudioCapture> GetAudioCapture(const engine_string& name =
"capture")const
=
0;     
   
    /////////////////////////////////////////////////////////

//! 获取音频设备列表个数

/////////////////////////////////////////////////////////

virtual uint16 GetAudioDeviceNumber() =
0;  
    virtual engine_string GetDeviceByIndex(uint8 index) =
0;  
   
    /////////////////////////////////////////////////////////

//! 获取默认设备名

/////////////////////////////////////////////////////////


virtual engine_string GetDefaultDeviceName()const
=
0;   
   
    DECLARE_OBJECT(AudioDevice)
};

那么如何使用盖莫音频引擎录入音频呢?
如下:
/*!==========================================================================
*
*  盖莫游戏引擎(GaiMo Game Engine)
*
*  版权所有 (C) 2009-2009 成都盖莫软件技术工作室 保留所有权利
*  Copyright (C) 成都盖莫软件技术工作室.  All Rights Reserved.
*
*  了解更多情况,请访问 http://www.gaimo.net
****************************************************************************/
#include <GEngine/Gaimo.hpp>
//! 使用盖莫游戏引擎内核命名空间
using
namespace core;
using
namespace std;

int Main()
{
    RefPtr<Device> device = InitDevice("音频捕获");
    //! 获取音频设备指针
    RefPtr<core::AudioDevice> audiodevice = device->GetAudioDevice();
    //! 获取音频设备个数
    uint16 number = audiodevice->GetAudioDeviceNumber();
    for(int i =
0; i < number ; i++)
    {
        std::cout<<audiodevice->GetDeviceByIndex(i)<<std::endl;        
    }  
    //! 初始化音频设备
    engine_string audiodeviceinde = audiodevice->GetDeviceByIndex(0);
    cout<<"初始化音频设备"<<audiodevice->Init(audiodeviceinde,4,0)<<endl;  
   
    //! 获取音频录入指针
    RefPtr<AudioCapture> audiocapture = audiodevice->GetAudioCapture("capture");
   
    //! 获取录制开始时间

float time = device->GetTime();
   
    BEGIN_LOOP(device)
        //! 录制时间10秒

if(device->GetTime() > time +10)
            break;
        audiocapture->CaptureData();
         
    END_LOOP(device)
   
    audiocapture->StopCapture();
    return EXIT_SUCCESS;
}
步骤就是从设备指针获取音频管理器指针
从音频管理器指针获取音频录入指针
然后在录入过程中调用数据录入函数
停止录入的时候调用StopAudioCapture即可!

当然这是基于盖莫游戏引擎的音频录入
过些天我要发布一个单独的盖莫音频引擎sdk(第三次发布)

题外话
在盖莫游戏引擎2.1.2中音频部分需要增加的功能就是对midi,mid.mod系列音乐文件的支持了
(不过听人说这个解码似乎不太好处理)

到时候欢迎下载啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-1 19:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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