ARTCOM LOGO

Здравствуйте, гость ( Вход | Регистрация )

> TAPI. Запись разговоров., Запись разговоров использую TAPI.
from_mars
сообщение 14.10.2008, 10:14
Сообщение #1


Частый гость
***

Группа: Участники
Сообщений: 42
Регистрация: 11.8.2008
Пользователь №: 11688



Здравствуйте.
АТС 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
Перейти в начало страницы
 
+Цитировать сообщение

Сообщений в этой теме


Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 18.7.2025, 7:31