Автор: Deeptown12
Дата сообщения: 22.06.2006 14:06
ValeryInfo
В этом случае вам поможет TAPI API
там есть функции воспроизведения звука в устройство линии
т.е на телефон работают с wawe
Добавлено:
ValeryInfo
Вот простой код дозвона
[more]
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, TAPI;
const
// Взято из TAPI.H
LoVer = $00010000; // Низшая приминимая версия TAPI
HiVer = $10000000; // Высшая приминимая версия TAPI
type
TFormMain = class(TForm)
Label1: TLabel;
EditPhone: TEdit;
Label2: TLabel;
ComboBox: TComboBox;
Label3: TLabel;
MemoLog: TMemo;
BitBtnCalling: TBitBtn;
BitBtnDropCall: TBitBtn;
procedure BitBtnCallingClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure BitBtnDropCallClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
lineApp: THLineApp; // Линия
line: THLine; // Дескриптор
call: THCall; // Вызов
CallParams: TlineCallParams; // Параметры вызова
end;
var
FormMain: TFormMain;
buf : array[0..1023] of char; // Буфер - информация о вызове
callinfo: TLineCallInfo absolute buf;
implementation
{$R *.dfm}
// Обработка сообщений TAPI
procedure lineCallback(hDevice, dwMsg, dwCallbackInstance,
dwParam1, dwParam2, dwParam3: LongInt);
{$IFDEF WIN32}
stdcall;
{$ELSE}
export;
{$ENDIF}
var
Str : string;
hCall: THCall; // Дескриптор вызова
begin
with FormMain do
begin
// Ответ ЛИНИИ
if dwMsg = LINE_REPLY then
begin
// Если произошла ошибка - то код ошибки - отрицательное число
IF dwParam2 < 0 then
MemoLog.Lines.Add('Ошибка TAPI (LINE_REPLY)' + IntToStr(dwParam2))
else
MemoLog.Lines.Add('Ответ линии - ok')
end
else
// ГРУППА СООБЩЕНИЙ LINE_CALLSTATE
if dwMsg = LINE_CALLSTATE then { Изменено что то на линии }
begin
hCall := THCall(hDevice); // Дескриптор
case dwParam1 of
// Вызов в режиме ожидания или прекращен
LINECALLSTATE_IDLE : Begin
// Проверим дескриптор
IF hcall <> 0 then
begin
// Уничтожаем вызов и освобождаем память
lineDeallocateCall(hCall);
MemoLog.Lines.Add('Вызов завершен.');
BitBtnCalling.Enabled := True;
BitBtnDropCall.Enabled := False;
end;
end;
// Приложение установило успешное соединение и готово посылать
// данные
LINECALLSTATE_CONNECTED: Begin
IF hcall <> 0 then
begin
Str := 'Соединение установлено...';
// Определяем параметро соединения
Callinfo.dwTotalSize := 1024;
// Получаем инфу
if lineGetCallInfo(hCall, callinfo) = 0 then
if callinfo.dwAppNameSize > 0 then
{$IFDEF WIN32}
Str := Str + ' ( ' + (buf + callinfo.dwAppNameOffset) + ' )';
{$ELSE}
Str := Str + ' ( ' + StrPas((buf + callinfo.dwAppNameOffset)) + ' )';
{$ENDIF}
MemoLog.Lines.Add(Str);
end;
end;
// Идет процесс вызова
LINECALLSTATE_PROCEEDING: MemoLog.Lines.Add('Идет процесс вызова');
// Дозвон
LINECALLSTATE_DIALING : MemoLog.Lines.Add('Дозвон');
// Разъединение
LINECALLSTATE_DISCONNECTED:
begin
Str := 'Разъединение : ';
// Причина ?
if dwParam2 = LINEDISCONNECTMODE_NORMAL then
Str := Str + '(штатное)'
else
if dwParam2 = LINEDISCONNECTMODE_BUSY then
Str := Str + '(занято)';
MemoLog.Lines.Add(Str);
// Запустим функцию разъединение
BitBtnDropCall.Click;
end;
// Занято
LINECALLSTATE_BUSY : MemoLog.Lines.Add('Занято');
end;
end;
end; // with
end;
//------------------------------------------------------------------------------
// Инициализация TAPI и открытие устройства линии
//------------------------------------------------------------------------------
procedure TFormMain.FormCreate(Sender: TObject);
var
nDevs, tapiVersion: Longint;
extid: TLineExtensionID;
begin
// Инициализация TAPI }
FillChar(CallParams, sizeof(CallParams), 0);
with CallParams do
begin
dwTotalSize := sizeof(CallParams);
dwBearerMode := LINEBEARERMODE_VOICE; // Тип вызова
dwMediaMode := LINEMEDIAMODE_INTERACTIVEVOICE; // Режим носителей
end;
// Инициализация устройства линии
if lineInitialize(lineApp, HInstance, lineCallback, nil, nDevs) < 0 then
lineApp := 0 // Ошибка - ничего не делаем
else
begin
// Кол-во устройств линии
if nDevs = 0 then // Нет устройтв линии - закрываем TAPI
begin
lineShutDown(lineApp);
lineApp := 0;
end
else
begin
// Договариваемся о версиях TAPI
if lineNegotiateAPIVersion(lineApp, 0, LoVer, HiVer, tapiVersion, extid) < 0 then
begin
// Недоговорились
lineShutDown(lineApp);
lineApp := 0;
end
else
begin
// Открываем устройство линии для исходящих вызовов
// в примере - используется ПЕРВОЕ УСТРОЙСТВО - ОБЫЧНО ЭТО МОДЕМ
if lineOpen(lineApp, LINEMAPPER, line, tapiVersion, 0, 0,
LINECALLPRIVILEGE_NONE, 0, @CallParams) < 0 then
begin
// Открыто неудачно
lineShutDown(lineApp);
lineApp := 0;
line := 0;
end;
if line = 0 then
MemoLog.Lines.Add('Ошибка при открытии устройства линии.');
end;
end;
end;
end;
//------------------------------------------------------------------------------
// Закрываем линию и TAPI (если они открыты)
//------------------------------------------------------------------------------
procedure TFormMain.FormDestroy(Sender: TObject);
begin
if line <> 0 then
lineClose(line);
if lineApp <> 0 then
lineShutDown(lineApp);
end;
//------------------------------------------------------------------------------
// Размещение исходящего вызова
//------------------------------------------------------------------------------
procedure TFormMain.BitBtnCallingClick(Sender: TObject);
var
BuffPhone : array[0..30] of char;
begin
if Length(EditPhone.Text) > 0 then
begin
MemoLog.Lines.Clear;
StrPCopy(BuffPhone, EditPhone.Text);
// режим носителей
if ComboBox.ItemIndex = 0 then
CallParams.dwMediaMode := LINEMEDIAMODE_INTERACTIVEVOICE
else
CallParams.dwMediaMode := LINEMEDIAMODE_DATAMODEM;
// Размещение исходящего вызова
if lineMakeCall(line, call, BuffPhone, 0, @CallParams) < 0 then
MemoLog.Lines.Add('Ошибка в lineMakeCall')
else
begin
BitBtnCalling.Enabled := False;
BitBtnDropCall.Enabled := True;
end;
end
else
ShowMessage('Не выбран номер');
end;
procedure TFormMain.BitBtnDropCallClick(Sender: TObject);
begin
// Разрываем соединени е
if LineDrop(call, nil, 0) < 0 then
MemoLog.Lines.Add('Ошибка в lineDrop');
BitBtnCalling.Enabled := true;
end;
end.
[/more]