АТС 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;
}
Обработку ошибок, из кода, убрал.
Файл создается, даже проигрывается, но он пуст, т.е. тишина, нет звуков
