CorpSms/UBox/phonic_ubox.h
2025-02-27 16:58:16 +08:00

624 lines
21 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __PHONIC_UBOX_INCLUDE__
#define __PHONIC_UBOX_INCLUDE__
#ifndef WINVER
#define WINVER 0x0501
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
#include <windows.h>
#include <iostream>
/*
#ifdef PHONIC_UBOX_EXPORTS
#define PHONIC_UBOX_API extern "C" __declspec(dllexport)
#else
#define PHONIC_UBOX_API extern "C" __declspec(dllimport)
#endif
*/
#ifdef __cplusplus
extern "C" {
#endif
typedef unsigned long UBOX_HANDLE;
#define INVALID_UBOX_HANDLE (UBOX_HANDLE)(-1)
#define VOICE_FRAME_TIME 20 //语音帧时间,单位:毫秒
/* ---------------------------------------------
BusyInfo.busy_dual_frequency = 0;
BusyInfo.busy_frequency0 = 450;
BusyInfo.busy_frequency1 = 420;
BusyInfo.busy_on = 35;
BusyInfo.busy_off = 35;
BusyInfo.busy_on_off_error = 5;
BusyInfo.busy_enery_gate = 12;
BusyInfo.busy_period_count = 3;
*/
struct tagBusyInfo
{
long busy_dual_frequency;
long busy_frequency0;
long busy_frequency1;
long busy_on;
long busy_off;
long busy_on_off_error;
long busy_enery_gate;
long busy_period_count;
};
typedef enum ENUM_VOICE_CODER
{
CODER_ALAW = 0,
CODER_PCM = 1,
CODER_G729 = 3,
CODER_SPEEX = 20,
CODER_MP3 = 38,
CODER_ULAW = 100,
}VOICE_CODER;
typedef enum ENUM_UBOX_WORK_MODE
{
UBOX_MODE_RECORD = 0, //录音模式, 通常使用的模式
UBOX_MODE_DIAG = 1, //诊断模式, 用于捕获线路信息供信号分析之用支持的语音编码方式是CODER_PCM
UBOX_MODE_CONFIG = 2, //配置模式,
}UBOX_WORK_MODE;
typedef enum ENUM_UBOX_STATE
{
UBOX_STATE_PLUG_OUT = 0, //无此设备,或设备已被拔出
//当设备被拔出时,不需要调用 stop_record(),因为 phonic_ubox 已经自动为你调用过了!
UBOX_STATE_RESET = 1, //复位态,表示既非振铃也非摘机的状态。如果此前为振铃态,则此状态表示振铃已停止,如果此前为摘机态,则此状态表示已挂机。
UBOX_STATE_RINGING = 2, //振铃态,表示已检测到线路振铃信号,如果振铃停止,则将触发 UBOX_EVENT_RESET 事件,并汇报 UBOX_STATE_RESET 状态。
UBOX_STATE_HOOK_OFF = 3, //检测到电话机摘机
UBOX_STATE_HANG = 4, //悬空态,
UBOX_STATE_IDLE = 5,
UBOX_STATE_REVERSE_HOOKOFF = 6, //反向摘机,指软件摘机
UBOX_STATE_POSITIVIE_HOOKOFF = 7, //正向摘机,指软件摘机
}UBOX_STATE;
typedef enum ENUM_UBOX_EVENT
{
UBOX_EVENT_DEVICE_PLUG_IN = 1, //检测到设备插入回调函数中param1、param2、param3、param4未使用
//参数如果没有说明,未使用,下同
UBOX_EVENT_DEVICE_PLUG_OUT = 2, //检测到设备拔出,
UBOX_EVENT_ALARM = 3, //报警,param1参照UBOX_ALARM的定义设备工作不正常软件退出检查设备驱动程序是否安装好
UBOX_EVENT_LINE_RESET = 10, //复位:摘机->挂机,振铃->停振 硬件LED灭 已经将该事件分为两个挂机和停振事件
UBOX_EVENT_LINE_RINGING = 11, //振铃硬件LED亮
UBOX_EVENT_LINE_HOOK_OFF = 12, //摘机硬件LED亮
UBOX_EVENT_LINE_HANG = 13, //检测到线路悬空 默认线路电压小于3V认为线路悬空硬件LED闪烁
//UBOX_EVENT_LING_FLUSH = 14, //?? 需要吗?
UBOX_EVENT_RING_CANCEL = 15, //振铃取消当末次振铃停止超过6秒则触发此事件
UBOX_EVENT_LINE_VOLTAGE = 16, //线路电压事件param1是线路电压值param1不会出现等于0的电压。
UBOX_EVENT_STREAM_VOICE = 20, //流式录音事件param1是录音数据地址需要转换unsigned char* pvoice= (unsigned char*)param1
// param2是录音数据长度
UBOX_EVENT_CALLER_ID = 21, //param1是号码地址 param2是时间地址 param3是姓名地址 param4没有用
//需要类型转换 char* pszcallId =(char*)param1, char* pszcalltime=(char*)param2,
//char* pszcallname=(char*) param3
UBOX_EVENT_DTMF_DOWN = 22, //按键事件param1是按键键值
UBOX_EVENT_DTMF_UP = 23,
UBOX_EVENT_DEVICE_ERROR = 24, //设备错误,需要软件重新启动,不然接收不到主叫号码
UBOX_EVENT_DEVICE_PLAY_END = 25, //放音完毕
UBOX_EVENT_DEVICE_PLAY_ERROR = 26, //放音异常
UBOX_EVENT_DEVICE_BUSY_TONE = 27, //检测到忙音,对方挂机
UBOX_EVENT_CALLOUTFINISH = 28, //呼出完成,表示拨号结束
UBOX_EVENT_POLARITY = 29, //检测到极性反转
UBOX_EVENT_LINE_HOOK_UP = 30, //挂机
UBOX_EVENT_LINE_RING_STOP = 31, //停振
}UBOX_EVENT;
typedef enum ENUM_UBOX_ERROR_CODE
{
UBOX_ERR_SUCCESS = 0, //操作成功
UBOX_ERR_SYSTEM = -1, //系统错误,调用操作系统(windows)的方法时出现错误.
UBOX_ERR_DEVICE_NOT_FOUND = -2, //没有这个设备,可能设备已经被拔出
UBOX_ERR_INVALID_HANDLE = -3, //不合法的 UBOX_HANDLE
UBOX_ERR_INVALID_PARAMETER = -4, //不合法的输入参数
UBOX_ERR_EXCEPTION = -5, //发生异常
UBOX_ERR_INVALID_WORK_MODE = -6, //错误的工作模式
UBOX_ERR_UBOX_NOT_OPEN = -7, //ubox设备尚未打开
UBOX_ERR_CANNOT_CREATE_DIR = -10, //未能创建目录当指定录音时如果文件名包含目录路径则ubox将试图建立相应的目录树。
UBOX_ERR_CANNOT_CREATE_FILE = -11, //未能创建录音文件
UBOX_ERR_INVALID_VOICE_CODER = -12, //不支持的语音编码
UBOX_ERR_DEVICE_BUSY = -13, //设备忙,当设备已经在录音的时候再次指示其同类型(文件与文件、STREAM与STREAM)的录音,就会返回此错误码
UBOX_ERR_LINE_NOT_FOUND = -14,
UBOX_ERR_USING = -15, //不支持该功能,错误使用
}UBOX_ERROR_CODE;
typedef enum ENUM_UBOX_ALARM
{
UBOX_ALARM_CAN_FIND_MIC = 1, //未能找到 ubox 的 MIC 设备
UBOX_ALARM_CAN_OPEN_MIC = 2, //未能打开 ubox 的 MIC 设备
UBOX_ALARM_CAN_OPEN_PLAY = 3, //未能打开 ubox 的 放音 设备
UBOX_ALARM_DEVICE_ERROR = 4, //设备故障
}UBOX_ALARM;
//事件回调函数
typedef void ( CALLBACK* UBoxEventNotifyProc )(
UBOX_HANDLE uboxHnd //设备句柄
, int eventID //事件参考UBOX_EVENT的定义
, unsigned long param1 //下面几个参数不同的事件,其含义不同
, unsigned long param2
, unsigned long param3
, unsigned long param4
);
/*注意事项:
插上USB录音盒硬件会成为系统默认录音设备。硬件版本号3.0以上会修改默认放音设备,软件启动后不能保证修改成系统原来的默认放音
vista就不能修改。二次开发的软件在软件帮助中需要告诉用户修改默认录放音频设备。在“控制面板”->“声音、语音和音频设备"->“声音、音频设备属性”
->"音频",从设备列表中选择默认声音播放和录音设备。
*/
//ubox_open:
//功能proc 回调函数
//参数mode 设置 ubox 的工作模式,通常的方式是录音方式
//说明这个函数成功调用并不表示USB设备打开成功,事件UBOX_EVENT_DEVICE_PLUG_IN通知上层程序设备已插入
// 收到UBOX_EVENT_ALARM和UBOX_EVENT_DEVICE_ERROR上层应用程序要对它们处理否则不能正确工作参考这个两个事件的说明
//所有其他函数都必须在 ubox_open() 之后才能使用,
// 否则,对于返回类型为 int 的函数将返回 UBOX_ERR_SYSTEM
// 对于返回类型为 UBOX_HANDLE 的函数将返回 INVALID_UBOX_HANDLE。
int WINAPI ubox_open(UBoxEventNotifyProc proc, UBOX_WORK_MODE mode);
typedef int (__stdcall *Mubox_open)(UBoxEventNotifyProc proc, UBOX_WORK_MODE mode);
void WINAPI ubox_close(void);
typedef void (__stdcall *Mubox_close)(void);
//ubox_get_work_mode:
//功能:返回当前工作模式
//返回UBOX_WORK_MODE
int WINAPI ubox_get_work_mode( void );
typedef int (__stdcall *Mubox_get_work_mode)(void);
//ubox_check_coder:
//功能:检查指定的语音编码是否合法
//返回0 语音编码是合法的,
// UBOX_ERR_INVALID_VOICE_CODER 语音编码不合法
//说明:此函数可工作在任何模式。
int WINAPI ubox_check_coder( int coder );
//ubox_get_line_state:
//功能:
//说明:此函数必需在 UBOX_MODE_RECORD 和 UBOX_MODE_DIAG 模式下使用,否则返回 UBOX_ERR_INVALID_WORK_MODE。
int WINAPI ubox_get_line_state( UBOX_HANDLE uboxHnd);
//ubox_record_file:
//功能:
//说明:此函数必需在 UBOX_MODE_RECORD 和 UBOX_MODE_DIAG 模式下使用,否则返回 UBOX_ERR_INVALID_WORK_MODE。
//第三个参数参考VOICE_CODER
int WINAPI ubox_record_file(UBOX_HANDLE uboxHnd, const char* filename, int coder );
typedef int (__stdcall *Mubox_record_file)(UBOX_HANDLE uboxHnd, const char* filename, int coder);
//ubox_record_stream:
//功能: 开始流式录音第三个参数参考VOICE_CODER语音数据以UBOX_EVENT_STREAM_VOICE事件通知
//说明:此函数必需在 UBOX_MODE_RECORD 和 UBOX_MODE_DIAG 模式下使用,否则返回 UBOX_ERR_INVALID_WORK_MODE。
int WINAPI ubox_record_stream(UBOX_HANDLE uboxHnd, int coder );
typedef int (__stdcall *Mubox_record_stream)(UBOX_HANDLE uboxHnd, int coder );
//ubox_stop_record:
//功能:停止文件和流式录音
//说明:此函数必需在 UBOX_MODE_RECORD 和 UBOX_MODE_DIAG 模式下使用,否则返回 UBOX_ERR_INVALID_WORK_MODE。
int WINAPI ubox_stop_record(UBOX_HANDLE uboxHnd);
typedef int (__stdcall *Mubox_stop_record)(UBOX_HANDLE uboxHnd);
//注意:停止使用
//ubox_set_volume:
//功能设置音量设置音量为0db就可以了
//说明volume取值范围0-19db
int WINAPI ubox_set_volume(UBOX_HANDLE uboxHnd,int volume );
//注意:停止使用
//ubox_set_volume:
//功能:设置放音音量
//说明volume取值范围-12db-6db
int WINAPI ubox_set_Speakervolume(UBOX_HANDLE uboxHnd, int volume );
//ubox_get_hang_threshold:
//功能:读取悬空门限值
//说明:此函数必需在 UBOX_MODE_CONFIG 模式下使用,否则返回 UBOX_ERR_INVALID_WORK_MODE。
int WINAPI ubox_get_hang_threshold(UBOX_HANDLE uboxHnd );
//ubox_set_hang_threshold:
//功能设置悬空门限值参考ubox_set_hookoff_threshold中的说明
int WINAPI ubox_set_hang_threshold(UBOX_HANDLE uboxHnd, int threshold );
//ubox_get_hookoff_threshold:
//功能:读取摘机门限值
//说明:此函数必需在 UBOX_MODE_CONFIG 模式下使用,否则返回 UBOX_ERR_INVALID_WORK_MODE。
int WINAPI ubox_get_hookoff_threshold(UBOX_HANDLE uboxHnd);
//ubox_set_hookoff_threshold:
//功能设置摘机门限值threshold的值是稳定摘机电压和挂机电压的之和的一半摘机电压和挂机电压测量调用ubox_start_read_line_voltage
//和ubox_stop_read_line_voltage参考这个两个函数的用法.
int WINAPI ubox_set_hookoff_threshold(UBOX_HANDLE uboxHnd, int threshold );
/*硬件是通过压控方式检测电话状态,通常情况下,挂机线路直流电压48V左右,摘机线路直流电压会降到6V左右。USB录音盒设置默认摘机门限值为18V,
当线路电压大于18V,软件判断为挂机状态,小于18V软件判断为摘机状态。由于电话线的所处的环境不同,线路直流电压值不同,可能摘机线路电压要
大于摘机门限值,或者挂机电压小于摘机门限值,这样软件不能正确检测到电话状态,需要重新设置摘机门限值*/
//功能开始检测线路电压每隔200ms送上UBOX_EVENT_LINE_VOLTAGE事件通知,回调函数中param1就是线路电压值剩下的参数没有用
// 线路电压有一定波动,必须测量一段时间,取平均值,必须调用结束检测线路电压函数
// 成功返回UBOX_ERR_SUCCESS错误返回为非0
int WINAPI ubox_start_read_line_voltage(UBOX_HANDLE uboxHnd);
//功能结束检测线路电压成功返回UBOX_ERR_SUCCESS错误返回为非0
int WINAPI ubox_stop_read_line_voltage(UBOX_HANDLE uboxHnd);
//功能在设备打开后才可以获取硬件的版本号成功返回UBOX_ERR_SUCCESS错误返回为非0 version_num由整数部分和1位小数部分组成
//整数部分是主版本号,小数部分是次版本号
//参数说明第一个参数是设备句柄第二个参数是获取版本号假如你的设备句柄是2定义float versionnum调用ubox_get_device_versionnum2versionnum
int WINAPI ubox_get_device_versionnum(UBOX_HANDLE uboxHnd,float &version_num);
//功能在设备打开后手动摘电话机上层应用软件自动拨号成功返回UBOX_ERR_SUCCESS错误返回为非0硬件版本号小于3.0不支持拨号功能
//参数说明第一个参数是设备句柄第二个参数是拨号的号码假如你的设备句柄是2要拨打10000调用ubox_send_dtmf2"10000"
int WINAPI ubox_send_dtmf(UBOX_HANDLE uboxHnd,const char* dmftfstring);
typedef int (__stdcall *Mubox_send_dtmf)(UBOX_HANDLE uboxHnd,const char* dmftfstring);
//功能在设备打开后播放语音文件该PC具有音频文件的解码器都能播放。成功返回UBOX_ERR_SUCCESS错误返回为非0
//注意一边播放文件会影响录音的效果。放音通道是单声道硬件版本号小于3.0不支持放音功能
int WINAPI ubox_play_file(UBOX_HANDLE uboxHnd,const char* filename);
//功能在设备打开后停止播放成功返回UBOX_ERR_SUCCESS错误返回-1
int WINAPI ubox_stop_play(UBOX_HANDLE uboxHnd);
//功能在设备打开后正在播放调用这个函数暂停再调用一次又继续播放成功返回UBOX_ERR_SUCCESS错误返回为非0
int WINAPI ubox_play_pause(UBOX_HANDLE uboxHnd);
//功能在设备成功打开后打开和关闭AGC,第二参数为true,关闭agc,为false时打开agc,默认情况下是打开agc.成功返回UBOX_ERR_SUCCESS错误返回为非0
int WINAPI ubox_close_agc(UBOX_HANDLE uboxHnd,bool bclose);
//功能:在设备成功打开后,此函数必需在 UBOX_MODE_CONFIG 模式下使用,读取eeprom区域的数据成功返回UBOX_ERR_SUCCESS错误返回为非0,
//最后三个参数输入不正确返回UBOX_ERR_INVALID_PARAMETER
//addr地址范围为0x00-0x07,必须在这个范围内读取数据最大长度为8个字节,第三个参数为读取数据的地址
//用法假如uboxHnd1addr=0x00,unsigned char readdata[8]
//ubox_read_eeprom(1,0x00,&readata[0],8),调用成功后读取的数据在readdata中
int WINAPI ubox_read_eeprom(UBOX_HANDLE uboxHnd,unsigned char addr,unsigned char* outdata,int len);
//功能:在设备成功打开后,此函数可在任何模式下使用,写入eeprom区域的数据成功返回UBOX_ERR_SUCCESS错误返回为非0
//最后三个参数输入不正确返回UBOX_ERR_INVALID_PARAMETER
//addr地址范围为0x00-0x08,必须在这个范围内写入数据最大长度为8个字节,第三个参数为写入数据的地址
//用法假如uboxHnd1addr=0x00,unsigned char writedata[8] ={0x01,0x20,0x30,0x31,0x32,0x33,0x40,0x70}
//ubox_write_eeprom(1,0x00,&writedata[0],8),可以在同一个地址区域调用ubox_read_eeprom验证读取的数据和写入数据是否相等
int WINAPI ubox_write_eeprom(UBOX_HANDLE uboxHnd,unsigned char addr,unsigned char* indata,int len);
//功能:在设备成功打开后,此函数可在任何模式下使用,读取eeprom区域的数据成功返回UBOX_ERR_SUCCESS错误返回为非0,
//最后三个参数输入不正确返回UBOX_ERR_INVALID_PARAMETER
//addr地址范围为0x00-0x08,必须在这个范围内读取数据最大长度为8个字节,并且addr+len不要大于8第三个参数为读取数据的地址
//用法假如uboxHnd1addr=0x00,unsigned char readdata[8]
//ubox_read_eeprom(1,0x00,&readata[0],8),调用成功后读取的数据在readdata中
//注意调用ubox_write_eeprom写成功后读取其正确值必须在软件重新启动后调用ubox_read_eepromEx才能正确读取上次修改的值。
int WINAPI ubox_read_eepromEx(UBOX_HANDLE uboxHnd,unsigned char addr,unsigned char* outdata,int len);
//功能在设备成功打开后软件摘机成功返回UBOX_ERR_SUCCESS错误返回为非0
//注意必须在硬件版本3.0以上才支持
int WINAPI ubox_soft_hook_off(UBOX_HANDLE uboxHnd);
//功能在设备成功打开后软件挂机成功返回UBOX_ERR_SUCCESS错误返回为非0
//注意必须在硬件版本3.0以上才支持
int WINAPI ubox_soft_hook_on(UBOX_HANDLE uboxHnd);
////功能在设备成功打开后此函数读取用户号成功返回用户号长度错误返回为小于0的数,
//用户号的长度是8个字节,所以 参数len不小于8, user-num可用地址空间不能小于8个字节。
// 如果需要用户号请联系我公司
int WINAPI ubox_get_usernum(UBOX_HANDLE uboxHnd,unsigned char* user_num,int len);
//功能在设备成功打开后如果忙音收不到才需要设置该参数此函数设置忙音参数成功返回UBOX_ERR_SUCCESS错误返回为非0,
int WINAPI ubox_set_busy_tone(UBOX_HANDLE uboxHnd,const tagBusyInfo busyinfo);
//功能: 在设备成功打开后,获取设备名字
//返回值是设备名字的长度设备名字为Fi3001B 是1路高阻录音 设备名字为Fi3002B 是2路高阻录音 设备名字为Fi3102A 是两路外线 设备名字为Fi3101A 是1路带耳麦
int WINAPI ubox_get_product_name(UBOX_HANDLE uboxHnd, char* product_name);
//功能在设备成功打开后此函数设置留言模式参数bset=true 打开留言参数bset=false 关闭留言参数成功返回UBOX_ERR_SUCCESS错误返回为非0,
//注意:需要设置留言模式下才需要打开留言参数。
//要退出留言模式,必须关闭留言参数,否则麦克风不能用
int WINAPI ubox_set_message_param(UBOX_HANDLE uboxHnd,bool bset);
//功能在设备成功打开后此函数用于是否打开蜂鸣器bset=true 蜂鸣器bset=false 关闭蜂鸣器成功返回UBOX_ERR_SUCCESS错误返回为非0,
//注意:默认是关闭蜂鸣器。其作用只接耳麦时,来电时提示用户,如果蜂鸣器已打开,振铃时蜂鸣器会响。
int WINAPI ubox_open_buzzer_switch(UBOX_HANDLE uboxHnd,bool bset);
//获取产品ID号返回值就是产品ID,对应的值如下:
// 1 FI3102A 2路USB 外线
// 2 FI3002B 2路USB录音盒
// 3 FI3001B 1路USB录音盒
// 4 FI3101A 带耳麦的USB语音盒1外1内
int WINAPI ubox_get_product_ID(UBOX_HANDLE uboxHnd);
//打开日志文件该函数可以在调用ubox_open之前调用
//level=0, 显示所有日志信息
//level =1, 显示错误和警告信息显示
void WINAPI ubox_open_logfile(long level);
//关闭日志文件
void WINAPI ubox_close_logfile();
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
class ubox_state_formator
{
int state_code_;
ubox_state_formator();
public:
ubox_state_formator( int code ):state_code_(code){;}
ubox_state_formator( const ubox_state_formator& rhs):state_code_(rhs.state_code_){;}
ubox_state_formator& operator = ( const ubox_state_formator& rhs)
{
state_code_ = rhs.state_code_;
return *this;
}
friend std::ostream & operator << (std::ostream& os ,const ubox_state_formator& me )
{
switch( me.state_code_ )
{
case UBOX_STATE_PLUG_OUT:
os << "状态=" << me.state_code_ << " : 空设备";
break;
case UBOX_STATE_RESET:
os << "状态=" << me.state_code_ << " : 复位";
break;
case UBOX_STATE_RINGING:
os << "状态=" << me.state_code_ << " : 振铃";
break;
case UBOX_STATE_HOOK_OFF:
os << "状态=" << me.state_code_ << " : 摘机";
break;
case UBOX_STATE_HANG:
os << "状态=" << me.state_code_ << " : 悬空";
break;
case UBOX_STATE_REVERSE_HOOKOFF:
os << "状态=" << me.state_code_ << " : 反向摘机";
break;
case UBOX_STATE_POSITIVIE_HOOKOFF:
os << "状态=" << me.state_code_ << " : 正向摘机";
break;
/* case UBOX_STATE_TELEPHONE_HOOKON:
os << "状态=" << me.state_code_ << " : 电话机挂机";
break;*/
default:
os << "状态=" << me.state_code_ << " : 未定义";
break;
}
return os;
}
};
class ubox_event_formator
{
int event_code_;
ubox_event_formator();
public:
ubox_event_formator( int code ):event_code_(code){;}
ubox_event_formator( const ubox_event_formator& rhs):event_code_(rhs.event_code_){;}
ubox_event_formator& operator = ( const ubox_event_formator& rhs)
{
event_code_ = rhs.event_code_;
return *this;
}
friend std::ostream & operator << (std::ostream& os ,const ubox_event_formator& me )
{
switch( me.event_code_ )
{
case UBOX_EVENT_DEVICE_PLUG_IN:
os << "事件=" << me.event_code_ << " : 设备插入";
break;
case UBOX_EVENT_DEVICE_PLUG_OUT:
os << "事件=" << me.event_code_ << " : 设备拔出";
break;
case UBOX_EVENT_LINE_RESET:
os << "事件=" << me.event_code_ << " : 线路复位";
break;
case UBOX_EVENT_LINE_RINGING:
os << "事件=" << me.event_code_ << " : 线路振铃";
break;
case UBOX_EVENT_LINE_HOOK_OFF:
os << "事件=" << me.event_code_ << " : 线路摘机";
break;
case UBOX_EVENT_LINE_HANG://检测到线路悬空
os << "事件=" << me.event_code_ << " : 线路悬空";
break;
case UBOX_EVENT_STREAM_VOICE:
os << "事件=" << me.event_code_ << " : 实时语音";
break;
case UBOX_EVENT_CALLER_ID:
os << "事件=" << me.event_code_ << " : 来电号码";
break;
case UBOX_EVENT_DTMF_DOWN:
os << "事件=" << me.event_code_ << " : DTMF按下";
break;
case UBOX_EVENT_DTMF_UP:
os << "事件=" << me.event_code_ << " : DTMF释放";
break;
case UBOX_EVENT_ALARM:
os << "事件=" << me.event_code_ << " : 警报通知";
break;
case UBOX_EVENT_RING_CANCEL:
os << "事件=" << me.event_code_ << " : 振铃取消";
break;
default:
os << "事件=" << me.event_code_ << " : 未定义的事件码";
break;
}
return os;
}
};
class ubox_err
{
int err_code_;
public:
ubox_err(int code):err_code_(code){;}
friend std::ostream & operator << (std::ostream& os ,const ubox_err& me )
{
switch( me.err_code_ )
{
case UBOX_ERR_SUCCESS:
os << "错误码=" << me.err_code_ << " : 操作成功";
break;
case UBOX_ERR_SYSTEM:
os << "错误码=" << me.err_code_ << " : 系统错误";
break;
case UBOX_ERR_DEVICE_NOT_FOUND:
os << "错误码=" << me.err_code_ << " : 无此设备";
break;
case UBOX_ERR_INVALID_HANDLE:
os << "错误码=" << me.err_code_ << " : 非法的 UBOX_HANDLE";
break;
case UBOX_ERR_INVALID_PARAMETER:
os << "错误码=" << me.err_code_ << " : 非法参数";
break;
case UBOX_ERR_CANNOT_CREATE_DIR:
os << "错误码=" << me.err_code_ << " : 未能创建目录";
break;
case UBOX_ERR_CANNOT_CREATE_FILE:
os << "错误码=" << me.err_code_ << " : 未能创建录音文件";
break;
case UBOX_ERR_INVALID_VOICE_CODER:
os << "错误码=" << me.err_code_ << " : 不支持的语音编码";
break;
case UBOX_ERR_INVALID_WORK_MODE:
os << "错误码=" << me.err_code_ << " : 错误的工作模式";
break;
case UBOX_ERR_EXCEPTION:
os << "错误码=" << me.err_code_ << " : 发生异常";
break;
case UBOX_ERR_DEVICE_BUSY:
os << "错误码=" << me.err_code_ << " : 设备忙";
break;
case UBOX_ERR_UBOX_NOT_OPEN:
os << "错误码=" << me.err_code_ << " : ubox设备尚未打开";
break;
default:
os << "错误码=" << me.err_code_ << " : 未定义的错误码";
break;
}
return os;
}
};
/*
ubox_err 使用范例:
int result = ubox_record_stream(uboxHnd, coder );
if( result != UBOX_ERR_SUCCESS )
{
std::cout << "ubox_record_stream(, " << coder << " ) faild! "
<< ubox_err(result)
<< std::endl;
}
*/
#endif //__cplusplus
#endif//__PHONIC_UBOX_INCLUDE__