求救!为什么在公司定制的6.0手机用TAPI打电话没声音啊
#include <windows.h>
#include <tapi.h>
#include <Extapi.h>
#define TAPI_API_LOW_VERSION 0x00020000
#define TAPI_API_HIGH_VERSION 0x00030000
/*******************************************************************
** 函数名: CloseLine
** 函数描述: 关闭电话线路
** 参数: 无
** 返回: 无
********************************************************************/
static void CloseLine()
{
LONG lRes;
if( g_CurrentLineInfo.hCurrentCall != NULL )//如果存在电话句柄
{
lRes = lineDrop( g_CurrentLineInfo.hCurrentCall, NULL, 0 );
lineDeallocateCall( g_CurrentLineInfo.hCurrentCall );//释放句柄
g_CurrentLineInfo.hCurrentCall = NULL;//设为NULL
}
if( g_CurrentLineInfo.hLine != NULL )//如果存在电话线路
{
lRes = lineClose(g_CurrentLineInfo.hLine);
lRes = lineShutdown(g_hLineApp);
g_CurrentLineInfo.hLine = NULL;
}
memset( (VOID*)&g_CurrentLineInfo, 0, sizeof(LINEINFO) );//重新初始当前线路信息
}
/*******************************************************************
** 函数名: SelectLine
** 函数描述: 选择合适的线路,获得可用的TAPI板本,并返回线路设备ID
** 参数: [in] hLineApp:电话线路应用实例
[in] dwNumberDevices: 线路设备数
[in] dwAPIVersionLow: 协商的最低版本号
[in] dwAPIVersionHigh :协商的最高版本号
[in] psTSPLineName:蜂窝线路名称
** 返回: 线路设备ID
********************************************************************/
static DWORD SelectLine(const HLINEAPP hLineApp,
const DWORD dwNumberDevices,
const DWORD dwAPIVersionLow,
const DWORD dwAPIVersionHigh,
const TCHAR* const psTSPLineName//蜂窝
)
{
BYTE* pLineDevCapsBytes;
DWORD dwCurrentDevID;
DWORD dwReturn = 0xffffffff;
for(dwCurrentDevID = 0 ; dwCurrentDevID < dwNumberDevices ;//从lineInitialize获得的线路设备数
dwCurrentDevID++)
{
DWORD dwAPIVersion;
LINEEXTENSIONID LineExtensionID ;
//协商板本号
if(0 == lineNegotiateAPIVersion(hLineApp, dwCurrentDevID,
dwAPIVersionLow, dwAPIVersionHigh,
&dwAPIVersion, &LineExtensionID))
{
LINEDEVCAPS LineDevCaps;
LineDevCaps.dwTotalSize = sizeof(LineDevCaps);
if(0 == lineGetDevCaps(hLineApp, dwCurrentDevID,
dwAPIVersion, 0, &LineDevCaps))
{
pLineDevCapsBytes = (BYTE*)malloc(sizeof(BYTE)*LineDevCaps.dwNeededSize);//new BYTE[LineDevCaps.dwNeededSize];
if(0 != pLineDevCapsBytes)
{
LINEDEVCAPS* pLineDevCaps = (LINEDEVCAPS*)pLineDevCapsBytes;
pLineDevCaps->dwTotalSize = LineDevCaps.dwNeededSize;
if(0 == lineGetDevCaps(hLineApp, dwCurrentDevID,
dwAPIVersion, 0, pLineDevCaps))
{
if(!(_tcscmp((_TCHAR*)((BYTE*)pLineDevCaps+pLineDevCaps->dwLineNameOffset), psTSPLineName)))
{
g_CurrentLineInfo.dwAPIVersion = dwAPIVersion;//获得支持的TAPI版本号
dwReturn = dwCurrentDevID;//返回线路设备ID
}
}
free(pLineDevCapsBytes);
}
}
}
}
return dwReturn;
}
/*******************************************************************
** 函数名: MakePhoneCall
** 函数描述: 拔打指定号码
** 参数: [in] hCall:电话句柄
[in] lpszPhoneNum: 电话号码
[in] pnSize: 电话号码长度
** 返回: true: 呼叫成功
false:呼叫失败
********************************************************************/
static BOOLEAN MakePhoneCall(HCALL* hCall, LPCTSTR lpszPhoneNum, DWORD pnSize)
{
DWORD dwSizeOfTransOut = sizeof (LINETRANSLATEOUTPUT);
LPLINECALLPARAMS lpCallParams = NULL;
LPLINETRANSLATEOUTPUT lpTransOutput = NULL;
TCHAR szDialablePhoneNum[TAPIMAXDESTADDRESSSIZE + 1] = {'\0'};
g_MakeCallRequestID = 0;
//拔打电话
g_MakeCallRequestID = lineMakeCall(g_CurrentLineInfo.hLine,
&(*hCall), lpszPhoneNum, 0, lpCallParams);
g_hCheckedCall = *hCall;
g_CurrentLineInfo.hCurrentCall = *hCall;
if (g_MakeCallRequestID >= 0) //如果lineMakeCALL返回的是正数,则成功,并不允许当前线路可用
{
g_bCurrentLineAvail = FALSE;
}
else
{//关闭线路
goto exit;
}
return TRUE;
exit:
{
CloseLine();
return FALSE;
}
}
/*******************************************************************
** 函数名: InitializeTAPI
** 函数描述: 初始化TAPI
** 参数: 无
** 返回: 无
********************************************************************/
static DWORD InitializeTAPI ()
{
DWORD dwReturn = lineInitialize(&g_hLineApp,g_hInst,(LINECALLBACK) lineCallbackFunc,
szAppName,&g_dwNumDevs);
return dwReturn;
}
/*******************************************************************
** 函数名: InitCallLine
** 函数描述: 初始化电话线
** 参数: 无
** 返回: 无
********************************************************************/
static BOOLEAN InitCallLine()
{
DWORD lRes;
CloseLine();
lRes = InitializeTAPI ();//初始化TAPI,并获得设备线路数
g_dwMediaMode = LINEMEDIAMODE_INTERACTIVEVOICE |
LINEMEDIAMODE_DATAMODEM ;//媒体类型,传递给lineOpen使用
g_dwTAPIVer = 0x00020000;
//选择合适的线路,获得可用的TAPI板本,并返回线路设备ID
g_dwDevId = SelectLine(g_hLineApp,g_dwNumDevs,
TAPI_API_LOW_VERSION,
TAPI_API_HIGH_VERSION,
CELLTSP_LINENAME_STRING);
if(g_dwDevId == 0xffffffff)//无可用则关闭
{
lineShutdown(g_hLineApp);
return (FALSE);
}
//g_hLineApp已在Initialize里注册了,LINECALLPRIVILEGE_MONITOR表示应用程序只能打电话
lRes = lineOpen(g_hLineApp, g_dwDevId, &g_CurrentLineInfo.hLine, g_CurrentLineInfo.dwAPIVersion,
0x00000000, 1, LINECALLPRIVILEGE_MONITOR , g_dwMediaMode, NULL);
g_lResforcall = lRes;//将linopen返回的状态信息。。
if(lRes != 0)
{ //无法打开线路设备
lineShutdown(g_hLineApp);
return FALSE;
}
//设置优先级
lineSetAppPriority( szAppName, LINEMEDIAMODE_INTERACTIVEVOICE, NULL, 0, NULL, 1 );
return TRUE;
}
/*******************************************************************
** 函数名: CallingThreadProc
** 函数描述: 播打电话的线程函数
** 参数:
** 返回:
********************************************************************/
static DWORD CallingThreadProc(LPVOID pData) /*播打电话的线程回调函数*/
{
TCHAR szDialablePhoneNum[TAPIMAXDESTADDRESSSIZE + 1] = {'\0'};
DWORD dwTextLength = 0;
if( !InitCallLine() )
goto EXIT;
//拔打电话
_tcscpy( szDialablePhoneNum, g_szServerNum );
dwTextLength = _tcslen( g_szServerNum );
if( !MakePhoneCall(&g_CurrentLineInfo.hCurrentCall,
szDialablePhoneNum, dwTextLength * 2) )
{
goto EXIT;
}
if( g_CurrentLineInfo.hCurrentCall == NULL )
goto EXIT;
CloseHandle(m_hCallThread);
m_hCallThread = NULL;
return TRUE;
EXIT:
CloseLine();
CloseHandle(m_hCallThread);
m_hCallThread = NULL;
return 0;
}
相关推荐
Brew FAQ.pdf 电子资料
高通提供的 Brew FAQ.pdf 电子资料 有助于手机开发人员使用!
AmTapi ActiveX控件
<br> AmTapi ActiveX控件 是一个兼容TAPI的电话控件,TAPI是电话学API(Telephony API),由Intel和Microsoft共同开发,是32位Windows版本标准。TAPI能在一个广泛的电话硬件平台上实现彼此之间的电话设备共享,提供处理不同媒体声音,数据等信息的共同方法。<br><br> AmTapi ActiveX控件 能进行电话呼叫和回答电话,检测呼叫者ID,检测远程DTMF音调,生成DTMF音调,列举已安装的电话设备,根据用户的设置翻译电话号码等。<br><br> AmTapi ActiveX控件 (Lite Edition)的特点: 监测SIT音调; 回答电话; 挂断电话; 呼叫过程信息和呼叫状态; 翻译电话号码; 打电话:拨打全部或部分号码; 产生DTMF:0-9, *, #, A-D; 检测DTMF音调; 呼叫特权:所有者,监控者,所有者+监控者; 媒体模式:交互式语音,自动语音,数据,传真; 区域会话:Windows拨号属性会话; 电话设备/modem 设置对话; 获取/设置当前有线设备; 发现硬件设备性能; 列举已安装的电话,Modem设备; 获取/设置当前设置信息; 使用amWave录制和播放WAVE文件。
无刷直流电机模糊神经网络PID-模糊PID-传统PID三种控制对比Simulink仿真
内容概要:本文系统研究了无刷直流电机(BLDCM)在Simulink环境下的三种控制策略:传统PID控制、模糊PID控制以及模糊神经网络PID控制。研究基于三相桥式星型全控电路结构,构建了转速电流双闭环控制系统,并通过Matlab/Simulink搭建仿真模型,全面对比分析了三种算法在动态响应速度、稳态精度、抗干扰能力及系统鲁棒性等方面的性能差异。文章深入阐述了各控制方法的设计原理与实现机制,重点突出了模糊逻辑与神经网络在自适应调节PID参数方面的优势,验证了智能控制算法在提升电机控制品质上的显著效果。同时,文档提供了详实的仿真资源、参考文献和技术说明,有助于读者复现实验并深化对先进控制策略的理解与应用。 适合人群:具备自动控制理论基础和MATLAB/Simulink仿真能力的电气工程、自动化及相关专业的研究生、科研人员及工程技术人员,特别适用于从事电机驱动系统设计、智能控制算法开发等领域的专业人士。 使用场景及目标:①用于教学与科研中对比分析传统PID、模糊PID与模糊神经网络PID在无刷直流电机调速系统中的控制性能差异;②为高性能电机控制器的设计与优化提供仿真验证平台,支持参数整定与控制策略选型;③辅助完成毕业设计、科研项目或工业应用中的控制算法评估与改进。 阅读建议:建议读者结合所提供的Simulink模型与参考文献,逐步复现仿真过程,重点关注不同控制器的参数整定方法、响应曲线特征及其在负载扰动下的表现。可进一步拓展研究方向,如引入无位置传感器控制、滑模观测器或模型预测控制等先进控制技术,以深化对现代电机智能控制体系的理解与创新能力。
分省份-城投债信用利差跟踪(私募债)20260206.xlsx
分省份-城投债信用利差跟踪(私募债)20260206.xlsx
高校技术转移办公室人员如何高效管理技术成果全生命周期?.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。


