Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TAPI. Запись разговоров.
АРТКОМ Форум > Форумы для специалистов > Техническая поддержка ipLDK
from_mars
Здравствуйте.
АТС ipLDK 300.
Использую библиотеку ATAPI для работы через TAPI с АТС. Получается отвечать на звоноки, есть мониторинг звонков, но записать разговор (звонки) не получается.

Вот кусок, кода, это измененный TCMon, функция . Если кто делал что-нить подобное, подскажите где косяк.
CODE

void CMonitorDlg::OnAnswer()
{
ClearErrors();

CTapiCall* pCall = GetSelectedCall();
if (pCall)
{
// Make sure we are owner.
LONG lResult = pCall->SetPrivilege(LINECALLPRIVILEGE_OWNER);
if (lResult != 0)
ErrorMsg ("lineSetCallPrivilege failed, rc=0x%lx", lResult);
else
{
lResult = GetTAPIConnection()->WaitForReply(pCall->Answer());
if (lResult != 0)
ErrorMsg("lineAnswer failed, rc=0x%lx", lResult);
else {
CString sLog, s;
HWAVEIN hWaveIn;
DWORD dwWaveInID = pCall->GetWaveInDeviceID(); // получаю wave/in
// всегда получаю равный 0, это нормально?
WAVEFORMATEX wf = {};
WAVEHDR *pWH;
MMRESULT dwRes;

wf.wFormatTag = WAVE_FORMAT_PCM;
wf.nChannels = 1;
wf.nSamplesPerSec = 22050L;
wf.wBitsPerSample = 8;
wf.nBlockAlign = 1;
wf.nAvgBytesPerSec = 22050L;
wf.cbSize = 0;

dwRes = waveInOpen(&hWaveIn, dwWaveInID, &wf, (DWORD_PTR)this->m_hWnd, 0, CALLBACK_WINDOW);
if (dwRes != MMSYSERR_NOERROR)
{
switch (dwRes) {
case MMSYSERR_ALLOCATED: {
s.Format("Error: waveInOpen result: MMSYSERR_ALLOCATEDrn");
break; }
case MMSYSERR_BADDEVICEID:{
s.Format("Error: waveInOpen result: MMSYSERR_BADDEVICEIDrn");
break; }
case MMSYSERR_NODRIVER:{
s.Format("Error: waveInOpen result: MMSYSERR_NODRIVERrn");
break; }
case MMSYSERR_NOMEM:{
s.Format("Error: waveInOpen result: MMSYSERR_NOMEMrn");
break; }
case WAVERR_BADFORMAT:{
s.Format("Error: waveInOpen result: WAVERR_BADFORMATrn");
break; }
default:
s = "Error: waveInOpen result: Неизвестаня ошибкаrn";
}
m_cEdit.GetWindowText(sLog);
sLog += s;
m_cEdit.SetWindowText(sLog);

AfxMessageBox(s, MB_OK |MB_ICONEXCLAMATION);
return;
}

pWH = new WAVEHDR;
memset(pWH, 0, sizeof(WAVEHDR));
pWH->lpData = m_pbWaveBuffer;
pWH->dwBufferLength = BUFFLEN;
pWH->dwUser = NULL;
pWH->dwFlags = 0;
pWH->dwLoops = 0;

if (waveInPrepareHeader(hWaveIn, pWH, sizeof(WAVEHDR)) != MMSYSERR_NOERROR) {
AfxMessageBox("Error: waveInPrepareHeader", MB_OK |MB_ICONEXCLAMATION);
waveInClose(hWaveIn);
delete pWH;
return;
}

if (waveInAddBuffer(hWaveIn, pWH, sizeof(WAVEHDR)) != MMSYSERR_NOERROR) {
AfxMessageBox("Error: waveInAddBuffer", MB_OK |MB_ICONEXCLAMATION);
waveInUnprepareHeader(hWaveIn, pWH, sizeof(WAVEHDR));
waveInClose(hWaveIn);
delete pWH;
return;
}

if (waveInStart(hWaveIn) != MMSYSERR_NOERROR) {
AfxMessageBox("Error: waveInStart", MB_OK |MB_ICONEXCLAMATION);
waveInUnprepareHeader(hWaveIn, pWH, sizeof(WAVEHDR));
waveInClose(hWaveIn);
delete pWH;
return;
}
else {
m_hFile = ::mmioOpen("record.wav", NULL,
MMIO_CREATE|MMIO_WRITE|MMIO_EXCLUSIVE | MMIO_ALLOCBUF);

ZeroMemory(&m_MMCKInfoParent, sizeof(MMCKINFO));
m_MMCKInfoParent.fccType = mmioFOURCC('W','A','V','E');
MMRESULT mmResult = ::mmioCreateChunk(m_hFile, &m_MMCKInfoParent, MMIO_CREATERIFF);
ZeroMemory(&m_MMCKInfoChild, sizeof(MMCKINFO));
m_MMCKInfoChild.ckid = mmioFOURCC('f','m','t',' ');
m_MMCKInfoChild.cksize = sizeof(WAVEFORMATEX) + wf.cbSize;
mmResult = ::mmioCreateChunk(m_hFile, &m_MMCKInfoChild, 0);
mmResult = ::mmioWrite(m_hFile, (char*)&wf, sizeof(WAVEFORMATEX) + wf.cbSize);
mmResult = ::mmioAscend(m_hFile, &m_MMCKInfoChild, 0);
m_MMCKInfoChild.ckid = mmioFOURCC('d', 'a', 't', 'a');
mmResult = ::mmioCreateChunk(m_hFile, &m_MMCKInfoChild, 0);
}

}
}
}
}


функция, которая обрабатывает MM_WM_DATA
CODE

LRESULT CMonitorDlg::OnWIMDATA(WPARAM wp, LPARAM lp)
{
MMRESULT Error = MMSYSERR_NOERROR;
HWAVEIN hWaveIn = (HWAVEIN)wp;
WAVEHDR *pWH = (WAVEHDR*)lp;
CString sLog, s;

// продолжаем получение данных с линии
MMRESULT mmRes = waveInUnprepareHeader(hWaveIn, pWH, sizeof(WAVEHDR));
if(mmRes == MMSYSERR_NOERROR) {

if (NULL != m_hFile) {
mmioWrite(m_hFile, pWH->lpData, pWH->dwBytesRecorded);
}

pWH->dwFlags = 0;

mmRes = waveInPrepareHeader(hWaveIn, pWH, sizeof(WAVEHDR));
if(mmRes == MMSYSERR_NOERROR) {
mmRes = waveInAddBuffer(hWaveIn, pWH, sizeof(WAVEHDR));
}
}

return 0; //mmRes;
}


Обработку ошибок, из кода, убрал.
Файл создается, даже проигрывается, но он пуст, т.е. тишина, нет звуков sad.gif
vldmr
Вопрос- на какой девайс Вы хотите записать разговор?
Дело в том что TAPI позволяет управлять станцией но для записи надо подключать какой либо голосовой девайс на внутренний порт станции и делать ,видимо что то типа конференции на него. Я так понимаю, а как у Вас?
from_mars
Компьютер подключен, к АТС (на этом компе крутится TSP). На него и хочу записывать.
Как я понимаю, через TAPI получаю "wave/in" id девайса, ассоциированного с выбранной линией, с помощью этого id, считываю данные с линии, для записи. И уже пишу стандартным способом.
Таким же способом можно записывать данные с микрофона. Все нормально пишеться. Кстати, когда пишу с микрофона, то использую "wave/in" id равный 0. Когда получаю "wave/in" id у линии, id тоже 0. Может здесь затуп? )
vldmr
TAPI только управляет станцией через драйвер TSP и проключать голосовой тракт может только между портами АТС. Ваш комп не может не может никоим образом получить голос через TSP драйвер. Для этого нужно дополнительное подключение к какому либо внутреннему порту станции. Один из вариантов ставите на аналоговый порт устройство записи и делаете 3-х стороннюю конференцию.

Ну а если стоит вопрос в записи только своих разговоров то проще иметь Систмный аппарат с модулем USB.
Подключаете Комп к этому USB модулю, на компе запускаете программу http://www.artcom.ru/_files/Download/Programs/LGCRS.zip и записываете на свой комп.
Ник Ратибор
с модулем USB пишется на комп махом, вся служба безопасности одного банка смотрит на меня с обожанием smile.gif только не забудьте, что на LKD-30 модуль USB не ставится, только на новые системники, а у них 24 кнопки максимум - тут у меня некое недовольство от абонентов было, пока консоли не расставил.
from_mars
Цитата(Ник Ратибор @ 23.10.2008, 14:02) *
с модулем USB пишется на комп махом ... на LKD-30 модуль USB не ставится...


А можно по подробней?
LKD-30 - это опечатка? Имелось ввиду LDK300 ?


Dimka
LKD-30 это цифровой телефон предыдущей линейки. Сейчас идет линейка LDP-70XX.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.