Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿

刚做完了盖莫音频引擎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系列音乐文件的支持了
(不过听人说这个解码似乎不太好处理)

到时候欢迎下载啊
posted on 2010-04-24 18:18 ccsdu2009 阅读(1160) 评论(2)  编辑 收藏 引用 所属分类: Game引擎
Comments
  • # re: 盖莫音频引擎1.2.8进阶(1):音频录入
    ccsdu2009
    Posted @ 2010-04-25 15:00
    写的有点问题 应该采用多线程处理!  回复  更多评论   
  • # re: 盖莫音频引擎1.2.8进阶(1):音频录入
    俏物悄语
    Posted @ 2010-04-25 15:23
    不错啊~学习了  回复  更多评论   

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理