我想用Tapi实现通话功能,在回调函数返回LINECALLSTATE_OFFERING后,执行lineAnswer,一到lineanser就自动挂机了。呼叫方和被呼叫方都没有到达返回LINECALLSTATE_CONNECTED,这一步。请问一下,这是什么原因啊?我的初始化函数跟回调函数是这样写的:
初始化:
with CallParams do
begin
dwTotalSize := sizeof(CallParams);
dwBearerMode := LINEBEARERMODE_VOICE;
// dwMediaMode := LINEMEDIAMODE_INTERACTIVEVOICE; //不知道该用哪个,用哪个都是一样的结果
dwMediaMode := LINEMEDIAMODE_DATAMODEM;
{ if you don't want the dialing dialog use LINEMEDIAMODE_DATAMODEM }
end;
if lineInitialize(lineApp, HInstance,
lineCallback, nil, nDevs) < 0 then { < 0 is an error }
lineApp := 0
else if nDevs = 0 then { no TAPI devices?? }
begin
lineShutDown(lineApp);
lineApp := 0;
end
else if lineNegotiateAPIVersion(lineApp, 1, $00010000, $10000000,
tapiVersion, extid) < 0 then { Check for version (copied from a TAPI sample) }
begin
lineShutDown(lineApp);
lineApp := 0;
end
else if lineOpen( lineApp , 1 , line , tapiVersion , 0 , 0 ,
LINECALLPRIVILEGE_MONITOR+LINECALLPRIVILEGE_OWNER,
LINEMEDIAMODE_DATAMODEM, @CallParams)<0 then
begin
lineShutDown(lineApp);
lineApp := 0;
line := 0;
end;
if lineApp <> 0 then
Memo1.Lines.Add( 'Monitoring calls...')
else
Memo1.Lines.Add( 'Error!');
回调函数:
if dwMsg = LINE_REPLY then { result of LineMakeCall }
if dwParam2 < 0 then
frmTAPICall.Memo1.Lines.Add('Reply error')
else
frmTAPICall.Memo1.Lines.Add('LINE_REPLY ok')
else if dwMsg = LINE_CALLSTATE then { change in line state }
begin
hCall := THCall(hDevice);
case dwParam1 of
LINECALLSTATE_IDLE: { call terminated }
if hcall <> 0 then
begin
lineDeallocateCall(hCall); { you must deallocate the call }
frmTAPICall.Memo1.Lines.Add('Idle - call deallocated');
frmTAPICall.btnCall.Enabled := True;
//frmTAPICall.btnDropCall.Enabled := False;
end;
LINECALLSTATE_CONNECTED: { Service connected }
if hCall <> 0 then
begin
s := 'Connected: ';
callinfo.dwTotalSize := 1024;
if lineGetCallInfo(hCall, callinfo) = 0 then
if callinfo.dwAppNameSize > 0 then
{$IFDEF WIN32}
s := s + (buf + callinfo.dwAppNameOffset); { this is more C-ish... }
{$ELSE}
s := s + StrPas((buf + callinfo.dwAppNameOffset)); { this is more C-ish... }
{$ENDIF}
frmTAPICall.Memo1.Lines.Add(s);
lineMonitorDigits(hCall,dwdigitmodes);
end;
LINECALLSTATE_PROCEEDING: { call proceeding (dialing) }
frmTAPICall.Memo1.Lines.Add('Proceeding');
LINECALLSTATE_DIALING: { dialing }
frmTAPICall.Memo1.Lines.Add('Dialing');
LINECALLSTATE_DISCONNECTED: { disconnected }
begin
s := 'Disconnected: ';
if dwParam2 = LINEDISCONNECTMODE_NORMAL then
s := s + 'normal'
else if dwParam2 = LINEDISCONNECTMODE_BUSY then
s := s + 'busy';
frmTAPICall.Memo1.Lines.Add(s);
frmTAPICall.btnDropCall.Click;
end;
LINECALLSTATE_BUSY: { busy }
frmTAPICall.Memo1.Lines.Add('Busy');
LINECALLSTATE_OFFERING:
begin
frmTAPICall.Memo1.Lines.Add('ring...');
hCall := THCall(hDevice);
nReturn :=lineAnswer( hCall , nil , 0 );
if nReturn > $80000000 then
frmTAPICall.Memo1.Lines.Add('Error in lineanswer')
else
frmTAPICall.Memo1.Lines.Add('lineanswer:'
+ IntToSt(lineAnswer(hCall, nil, 0)))
end; end;
end;
不知道有没有设置错误,请大虾们救命啊!
初始化:
with CallParams do
begin
dwTotalSize := sizeof(CallParams);
dwBearerMode := LINEBEARERMODE_VOICE;
// dwMediaMode := LINEMEDIAMODE_INTERACTIVEVOICE; //不知道该用哪个,用哪个都是一样的结果
dwMediaMode := LINEMEDIAMODE_DATAMODEM;
{ if you don't want the dialing dialog use LINEMEDIAMODE_DATAMODEM }
end;
if lineInitialize(lineApp, HInstance,
lineCallback, nil, nDevs) < 0 then { < 0 is an error }
lineApp := 0
else if nDevs = 0 then { no TAPI devices?? }
begin
lineShutDown(lineApp);
lineApp := 0;
end
else if lineNegotiateAPIVersion(lineApp, 1, $00010000, $10000000,
tapiVersion, extid) < 0 then { Check for version (copied from a TAPI sample) }
begin
lineShutDown(lineApp);
lineApp := 0;
end
else if lineOpen( lineApp , 1 , line , tapiVersion , 0 , 0 ,
LINECALLPRIVILEGE_MONITOR+LINECALLPRIVILEGE_OWNER,
LINEMEDIAMODE_DATAMODEM, @CallParams)<0 then
begin
lineShutDown(lineApp);
lineApp := 0;
line := 0;
end;
if lineApp <> 0 then
Memo1.Lines.Add( 'Monitoring calls...')
else
Memo1.Lines.Add( 'Error!');
回调函数:
if dwMsg = LINE_REPLY then { result of LineMakeCall }
if dwParam2 < 0 then
frmTAPICall.Memo1.Lines.Add('Reply error')
else
frmTAPICall.Memo1.Lines.Add('LINE_REPLY ok')
else if dwMsg = LINE_CALLSTATE then { change in line state }
begin
hCall := THCall(hDevice);
case dwParam1 of
LINECALLSTATE_IDLE: { call terminated }
if hcall <> 0 then
begin
lineDeallocateCall(hCall); { you must deallocate the call }
frmTAPICall.Memo1.Lines.Add('Idle - call deallocated');
frmTAPICall.btnCall.Enabled := True;
//frmTAPICall.btnDropCall.Enabled := False;
end;
LINECALLSTATE_CONNECTED: { Service connected }
if hCall <> 0 then
begin
s := 'Connected: ';
callinfo.dwTotalSize := 1024;
if lineGetCallInfo(hCall, callinfo) = 0 then
if callinfo.dwAppNameSize > 0 then
{$IFDEF WIN32}
s := s + (buf + callinfo.dwAppNameOffset); { this is more C-ish... }
{$ELSE}
s := s + StrPas((buf + callinfo.dwAppNameOffset)); { this is more C-ish... }
{$ENDIF}
frmTAPICall.Memo1.Lines.Add(s);
lineMonitorDigits(hCall,dwdigitmodes);
end;
LINECALLSTATE_PROCEEDING: { call proceeding (dialing) }
frmTAPICall.Memo1.Lines.Add('Proceeding');
LINECALLSTATE_DIALING: { dialing }
frmTAPICall.Memo1.Lines.Add('Dialing');
LINECALLSTATE_DISCONNECTED: { disconnected }
begin
s := 'Disconnected: ';
if dwParam2 = LINEDISCONNECTMODE_NORMAL then
s := s + 'normal'
else if dwParam2 = LINEDISCONNECTMODE_BUSY then
s := s + 'busy';
frmTAPICall.Memo1.Lines.Add(s);
frmTAPICall.btnDropCall.Click;
end;
LINECALLSTATE_BUSY: { busy }
frmTAPICall.Memo1.Lines.Add('Busy');
LINECALLSTATE_OFFERING:
begin
frmTAPICall.Memo1.Lines.Add('ring...');
hCall := THCall(hDevice);
nReturn :=lineAnswer( hCall , nil , 0 );
if nReturn > $80000000 then
frmTAPICall.Memo1.Lines.Add('Error in lineanswer')
else
frmTAPICall.Memo1.Lines.Add('lineanswer:'
+ IntToSt(lineAnswer(hCall, nil, 0)))
end; end;
end;
不知道有没有设置错误,请大虾们救命啊!
lineInitialize(lineApp, HInstance, lineCallback, nil, nDevs)
TAPI版本:
lineNegotiateAPIVersion(lineApp, 1, $00010000, $10000000, tapiVersion, extid)
线路打开:
lineOpen(lineApp, 1, line, tapiVersion, 0, 0,
LINECALLPRIVILEGE_MONITOR+LINECALLPRIVILEGE_OWNER,
LINEMEDIAMODE_DATAMODEM, @CallParams) 接听:
case LINE_CALLSTATE of
LINECALLSTATE_OFFERING:
lineAnswer( hCall , nil , 0 )不知道这样的过程有没有错,或者少了什么,参数设置有没有错啊?