TAPI监测不到来电,怎么办呀?

kittig 2005-08-24 10:13:55
目标是用vc实现一个接电话,然后播放录音给对方,监测对方按键,根据选择播放下一段录音。

遇到第一个问题是监测不到是否有电话打进来了。

设备:
window2000server, vc6.0, smart 56k voice modem。
modem的line上接普通电话线,是内线电话,不知道和这个是不是有关系。

代码
BOOL Initialize()
{
DWORD dwDevNum = 0;
LINEEXTENSIONID lineExt;

lErrorCode = ::lineInitialize(&m_hLineApp,
::AfxGetApp()->m_hInstance,
lineCallbackFunc, "TapiModem", &dwDevNum);
if (lErrorCode < 0)
{
GetErrorString(lErrorCode);
return FALSE;
}

if (dwDevNum == 0)
return FALSE;

for (m_dwModemID = 0; m_dwModemID < dwDevNum; m_dwModemID++)
{
lErrorCode = ::lineNegotiateAPIVersion(m_hLineApp, m_dwModemID, TAPI_LOW_VERSION,
TAPI_CURRENT_VERSION, &m_dwAPIVersion, &lineExt);
if (lErrorCode < 0)
{
GetErrorString(lErrorCode);
return FALSE;
}

if (CheckLineCap(m_dwModemID, m_dwAPIVersion))
break;
}

if (m_dwModemID == dwDevNum)
return FALSE;

lErrorCode = ::lineOpen(m_hLineApp, m_dwModemID, &m_hLine,
m_dwAPIVersion, 0, 0,
LINECALLPRIVILEGE_MONITOR + LINECALLPRIVILEGE_OWNER,
LINEMEDIAMODE_DATAMODEM | LINEMEDIAMODE_AUTOMATEDVOICE |
LINEMEDIAMODE_INTERACTIVEVOICE | LINEMEDIAMODE_UNKNOWN
, NULL);
if (lErrorCode < 0)
{
GetErrorString(lErrorCode);
return FALSE;
}

lErrorCode = ::lineSetNumRings(m_hLine, 0, 0);

if (lErrorCode < 0)
{
GetErrorString(lErrorCode);
return FALSE;
}

return TRUE;
}


void CALLBACK lineCallbackFunc( DWORD dwDevice,
DWORD dwMessage,
DWORD dwCallbackInstance,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwParam3 )
{
switch (dwMessage)
{
case LINE_CALLSTATE: // review the call state messages
{
m_hCall = (HCALL)dwDevice;
switch( dwParam1 )
{
case LINECALLSTATE_OFFERING:
{
//TapiStatus("新的呼叫...");
Answer();
}
break;
case LINECALLSTATE_IDLE:
{
TapiStatus("空闲...");
LONG lErrorCode = ::lineDeallocateCall(m_hCall);
if (lErrorCode < 0)
{
GetErrorString(lErrorCode);
}
m_hCall = NULL;
}
break;
case LINECALLSTATE_CONNECTED: // hey, we got through!
{
TapiStatus("Connected");
}
break;
case LINECALLSTATE_BUSY:
{
TapiStatus("线路正忙,关闭...");
HangupCall( );
}
break;

case LINECALLSTATE_DISCONNECTED:
{
TapiStatus("disconnected");
HangupCall( );
}
break;
}
break;
}
case LINE_MONITORDIGITS:
{
CString szDigit;
szDigit.Format("%c", dwParam1);
MessageBox(NULL, szDigit, "digit", MB_OK);
break;
}
} // switch
} // TapiCallBack()

如果收到offering消息, answer应该执行, 现在只写了一个messagebox在answer里边,提示来电话了。
我用别的电话拨这台电脑,可以听到电话接通,等待应答时的“嘟嘟"声。
开始modem的phone线接了电话,电话会响,后来把电话拔了。
不管怎样都可以听到电话接通,等待应答时的“嘟嘟"声,但是程序总是没有发现来电话了。

问题在哪里呀?监测不到电话,下边的工作就没有办法开始,帮忙呀, 分不够可以令开帖加
email: kittig@163.com
...全文
346 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluesen 2005-09-20
  • 打赏
  • 举报
回复
语音Modem放音必须是:单声道、16位线性PCM格式的语音。
但我好像试过8位的也可以。

参见我网站上的有关文档和转换工具:
http://www.bluespace.com.cn/koodoo
kittig 2005-09-20
  • 打赏
  • 举报
回复
奇怪了。揭帖了,分也给了,怎么这里没有显示?
难道csdn出问题了?
kittig 2005-09-20
  • 打赏
  • 举报
回复
揭帖。
sungengyu 2005-09-12
  • 打赏
  • 举报
回复
给你发了一个 codeproject 上的例子,也不知道是否用的上。

人情冷漠,做过的老大们都在卖东西。

我的帖子,唉

http://community.csdn.net/Expert/topic/4258/4258941.xml?temp=.1870844
kittig 2005-09-09
  • 打赏
  • 举报
回复
3ks。
可惜我没钱。而且我是个兼职的,有很多内部东西我都不知道。
不会由我来选择,我没钱。
零壹智慧 2005-09-09
  • 打赏
  • 举报
回复
语音卡,和modem我都作过,要是购买,我这里有产品,有意请与我联系:win_tapi@126.com
kittig 2005-09-08
  • 打赏
  • 举报
回复
最后结果可能是用户否决了语音猫的方案,改用成本高但性能好的语音卡。
这个我可不了解,更大的挑战。
kittig 2005-09-03
  • 打赏
  • 举报
回复
没人回答,自己一点一点解决。寒。
那就自己把过程写下来,供以后遇到同样问题的参考。
通过耳机和话筒通电话的问题解决了一半。
我用两个线程来通话,一个负责将声卡的声音发送出去给modem,一个负责将modem接受到了声音从(声卡)耳机播放出来。
不知道是不是因为modem是半双工的原因,如果我能听到对方说话,对方就听不到我说话,如果对方能听到我说话,我就听不到对方。而且两个线程只有第一个打开的才能正常运行。因为第一个打开了设备,第二个在打开设备的时候就打不开了。
samp_miao 2005-08-31
  • 打赏
  • 举报
回复
对modem不懂啊,顶一下。
kittig 2005-08-31
  • 打赏
  • 举报
回复
这个问题解决了。
新的问题出现了。

modem可以检测到来电话了,下一步要实现通过接在声卡上的麦克风和耳机来接听电话,与对方通话。
或者播放录音给对方。

是个语音modem,具体支持什么类型的wav格式还是个问题。
用waveOutGetCaps试了一下,8/16位,单/双声道,8/11.025/22.50/44.1KHz,
16种格式都不支持。真是邪门了。还有什么PCM格式吗?

还有关于耳机和麦通话的问题。
是不是先把麦克风的声音缓存下来,在从modem的声音设备中播放出去?
耳机中的声音就和上面的相反,把modem接收到的声音缓存下来,播放给声卡?
如果是这样, 好麻烦呐,如果modem不是全双工的,是不是还要考虑到多线程,同步的问题?


samp_miao 2005-08-30
  • 打赏
  • 举报
回复
没有用过modem编程,以前看帖子,好像有人讲有的modem不太一样。

我做的是PDA手机上的电话程序,可以检测到信号变化。
我觉得首先要确认你打开的线路要正确。
因为会有好几个line device.要确保打开的是那条线路。不知道你的函数 CheckLineCap 是不是这个
功能。
用这个
lineGetDevCaps (m_hLineApp,
dwLineID,
dwAPIVersion,
0,
lpLineDevCaps)函数测试一下你的modem是否支持语音。

dwLineID一定要选对。(lpLineDevCaps->dwMediaModes & LINEMEDIAMODE_INTERACTIVEVOICE)

我的是这样的:
lineOpen (
m_hLineApp,
m_CurrentLineInfo.dwLineID,
&m_CurrentLineInfo.hLine,
m_CurrentLineInfo.dwAPIVersion,
0,
0,
LINECALLPRIVILEGE_MONITOR +LINECALLPRIVILEGE_OWNER,
LINEMEDIAMODE_INTERACTIVEVOICE,//
NULL)
回调函数中:
case LINE_CALLSTATE:
{
hCall = (HCALL) dwDevice;
switch (dwParam1)
{
case LINECALLSTATE_OFFERING:
{
m_CurrentLineInfo.hIncomingCall = (HCALL)dwDevice;
lineSetCallPrivilege(m_CurrentLineInfo.hIncomingCall ,LINECALLPRIVILEGE_OWNER);
lineAnswer(m_CurrentLineInfo.hIncomingCall ,NULL,0);
if (m_hWnd)
SendMessage(m_hWnd,WM_TAPI_CALL_INCOMING,00);
}
break;



kittig 2005-08-30
  • 打赏
  • 举报
回复
去电脑城看了网上推荐的几款modem,几乎都绝迹了。
有几家有,很简单的那种tp-link的,看着差不多,都没写语音,没买。
一家有卖 全向的, 但是今天人家店忙,不想做小生意,没买到,说要我明天去看,就给打发了。
老板还说要电信的支持才行,他家的modem都没有这个功能。

刚才打电话问了电信的。
开始那个小姐不懂技术,记下电话,一会一个男的打过来了,说要用modem检测电话来电信号,他说普通modem没有这个功能,以前的isdn可以吧。

不会呀,网上的程序我到是找了不少,各种语言,版本的。人家也都没说要特别的modem支持,语音modem就可以呀,也没说要电信作什么业务。所以怀疑那个人的说法。

怎么办呀?

每天顶一次。。
kittig 2005-08-30
  • 打赏
  • 举报
回复
检查了,线路我选的没问题。
现在估计是modem的问题,现在的js,做的modem的功能不全。
按理说,150的modem应该功能比较全了吧?
用哪个at命令可以检测出modem是否支持 来电提示?

我看到说超级终端中打开modem,ats0=0,然后如果有电话来了,就会回显 RING,
我的modem没有回显,是不是说就不行?

谁推荐一些比较好的modem的吧,有没有成功的案例?用的什么样的modem?

kittig 2005-08-25
  • 打赏
  • 举报
回复
试过了,不能解决问题。
那个下载的程序有问题,而且我也不会vb,一点都不会。
也还不会用控件。

主要问题就是modem或者说程序监测不到线路的变化,这个是什么原因引起的?
用windows自带的dialer程序,打电话听不到声音。

那个奇怪的猫,makeCall时选DATAMODEM方式,可以听到对方说话。
但是 INTERACTIVIVOICE 就不行了。什么声音也没有。

lineOpen时到底应该选择什么类型呀?

这里是分机。

zhangyu80 2005-08-25
  • 打赏
  • 举报
回复
建议你下载一个开发包吧,好用:
http://www.compnp.com/ysph.zip

http://www.compnp.com/
kittig 2005-08-24
  • 打赏
  • 举报
回复
lineNegotiation得到的版本是什么意思?和 应用程序所用的tapi有什么关系?
如果我得到的是0x00010004,程序可以用TAPI3吗?
kittig 2005-08-24
  • 打赏
  • 举报
回复
另外,那个callback和lineOpen函数中的dwCallbackInstance是什么意思?
kittig 2005-08-24
  • 打赏
  • 举报
回复
一贯对csdn不抱什么希望,没办法,再问。
在一个房间内,我用另一个电话来测试,如果程序先
lineOpen(),就监测不到来电信号。
如果在来电话了,还没有接的时候,运行程序,就会检测到来电信号。

可是就好像鸡和蛋的问题,
如果我知道来了电话在运行程序,那就不需要程序来监测是不是有电话打进来了。这样的程序必须在特定的时候运行,肯定不行。
但是程序运行了以后,就监测不到来电的信号了。

试了几个版本的程序了,通过lineInitializeEx(),event和hiddenwindow方式都试过,结果是一样的。
怎么办呀?

如果有电话打进来,modem会不会知道?难道要通过串口通信才知道?
普通电话打进来,是属于什么mediaMode?

4,387

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧