Разработка функций для класса интерфейса между модулем УШ и модулем протокола RTP

Отчет по практике - Компьютеры, программирование

Другие отчеты по практике по предмету Компьютеры, программирование

ing)

{

sleeptimer.tv_sec = 0;

sleeptimer.tv_nsec = 10000000; // 10 мс

nanosleep(&sleeptimer, NULL);

}

}

/**НАЗНАЧЕНИЕ: записать во внутреннюю память УШ данные конфигурации

* ВХОДНЫЕ ПАРАМЕТРЫ : ucCINum - количество КИ в ИКМ

* ВЫХОДНЫЕ ПАРАМЕТРЫ: нет

*/t_UHInterface::WriteConfToUH(unsigned char ucCINum)

{

unsigned int uiConf;

#ifndef ___PC

int ires;

#endif=ucCINum;

uiConf<<=8;

uiConf|=m_ucUHNum;(p_DOUT)

{("\n<<ConfToUH %i\n x < x\n\n",_ucUHNum, (unsigned int)m_puiBaseAddress,uiConf);

}

#ifndef ___PC

// записать данные в память УШ при помощи интерфейса HPI

if ((ires=(dsp6713b_write(m_devd,(unsigned int)m_puiBaseAddress, uiConf))))

{

dsp6713b_reset(m_devd);b_close(m_devd);("\n!!t_UHInterface::WriteConfToUH %i: DSP2_write error!\n Addr=x Res=%i \n", m_ucUHNum,

(unsigned int)m_puiBaseAddress,ires);

exit(1);

}

#endif

}

/**НАЗНАЧЕНИЕ: задать накопление данных речевого трафика для КИ в буфере накопления

* ВХОДНЫЕ ПАРАМЕТРЫ : ucCI - номер канального интервала [0-31],

* ВЫХОДНЫЕ ПАРАМЕТРЫ: true - успешно

* false - ошибка: номер КИ > 31

*/t_UHInterface::StartDataAccumulation(unsigned char ucCI)

31)return(false);_AccumulatedData.lock();_IsAccumulating[ucCI]=true;_AccumulatedData.unlock();(true);">{(ucCI >31) return (false);_AccumulatedData.lock();_IsAccumulating[ucCI]=true;_AccumulatedData.unlock();(true);

}

/**НАЗНАЧЕНИЕ : прекратить накопление данных речевого трафика для КИ в буфере

* накопления

* ВХОДНЫЕ ПАРАМЕТРЫ : ucCI - номер канального интервала [0-31],

* ВЫХОДНЫЕ ПАРАМЕТРЫ: true - успешно

* false - ошибка: номер КИ > 31

*/t_UHInterface::StopDataAccumulation(unsigned char ucCI)

31)return(false);_AccumulatedData.lock();_IsAccumulating[ucCI]=false;">{(ucCI >31) return (false);_AccumulatedData.lock();_IsAccumulating[ucCI]=false;

// обнулить все индексы для циклических буферов

m_iAccGetInd[ucCI]=m_iAccPutInd[ucCI]=m_iAccIndDelta[ucCI]=_iPlayBackGetInd[ucCI]=m_iPlayBackPutInd[ucCI]=m_iPlayBackIndDelta[ucCI] = 0;_AccumulatedData.unlock();(true);

}

/**НАЗНАЧЕНИЕ: прочитать данные из внутренней памяти УШ и при необходимости

* поместить их в буфер накопления

* ВХОДНЫЕ ПАРАМЕТРЫ : нет

* ВЫХОДНЫЕ ПАРАМЕТРЫ: true - данные прочитаны,

* false - данные не прочитаны (в случае, если значение m_uiDumpNum

* некорректно)

*/t_UHInterface::GetDataFromUH(void)

{

unsigned int *puiAddress;

unsigned int uiSize,k;

#ifndef ___PC

int ires;

#endif

int i,j,n,ii;

unsigned char * pucData;buf1 [400];(!(m_uiDumpNum&0x03)) return (false);=m_puiBaseDataForRTP;

if (m_uiDumpNum==2) puiAddress+=DUMP_SIZE>>2;

#ifdef ___PC

// имитируем прием данных

i=0;

j=4;

while(i<32)

{

if (m_IsAccumulating[i])

{

//CN-0,size-80

ucfromPCM0[j-4]=0x50;//20;

ucfromPCM0[j-1]=0;=0;

while (k<80)

{

ucfromPCM0[j+k++]= m_ucI;

}

}

j=(++i)*84+4;

}

if (m_ucI<255) m_ucI++; else m_ucI=0;(m_puiDataFromUH,(unsigned int*)ucfromPCM0,DUMP_SIZE);

#else

// прочитать данные при помощи интерфейса HPI

if((ires=(dsp6713b_read_IS(m_devd, (unsigned int)puiAddress, m_puiDataFromUH, DUMP_SIZE))))

{

dsp6713b_reset(m_devd);

dsp6713b_close(m_devd);

printf("\n!!t_UHInterface::GetDataFromUH %i: DSP2_read_IS error!\n Addr=x Res=%i \n", m_ucUHNum,

(unsigned int)puiAddress,ires);

exit(1);

}

#endif

for(i=31; i>=0; i--)

{

mtx_AccumulatedData.lock();(m_IsAccumulating[i])

{

n=m_iAccPutInd[i]<<5;

// помещаем данные в буфер накопления

m_pvAccumulatedData[i+n]= *((SData*)(m_puiDataFromUH)+i);

m_iAccPutInd[i]++; // увеличиваем значение индекса для следующего помещения данных(m_iAccPutInd[i]==ACCBUFF_DEPTH) m_iAccPutInd[i]=0; // циклический переход в начало_iAccIndDelta[i]++; // увеличиваем расстояние по отношению к индексу для извлечения

if (m_iAccIndDelta[i] > ACCBUFF_DEPTH)

{

// фиксируем состояние переполнения буфера накопления

printf("Acc buf overflow for %i \n",i);

}

 

}

mtx_AccumulatedData.unlock();

}((p_DIN) && (ParamRtpPrint[m_ucIndDI]))

{

 

snprintf(buf1,400,">>UH %i: x (%i)\n",m_ucUHNum,(unsigned int)puiAddress, m_uiDumpNum);

k=0x80000000;

for(i=31; i>=0; i--)

{

if (ParamRtpPrint[m_ucIndDI] & k)

{

m_vSDataCtrl.SpeachSize;"> uiSize=((SData*)(m_puiDataFromUH)+i)->m_vSDataCtrl.SpeachSize;

pucData=((SData*)(m_puiDataFromUH)+i)->m_ucData;(buf1,400," [%i] : CN-x, tone-x, size-%i\n",i,

m_vSDataCtrl.CN,">((SData*)(m_puiDataFromUH)+i)->m_vSDataCtrl.CN,

m_vSDataCtrl.Tone,uiSize);">((SData*)(m_puiDataFromUH)+i)->m_vSDataCtrl.Tone, uiSize);

printf(buf1);(uiSize)

{

buf1[0]=\0;(ii=0,j=0, n=0; (j<MAX_SPEECH_SIZE) && (j<uiSize); j++,n++) //!!

{(&buf1[ii],400," X", pucData[j]);+=3;((ii<399) && (n==30)) {n=0; buf1[ii++]=\n;}

}

printf(buf1);

}

}

k>>=1;

}

}

return(true);

}

/**НАЗНАЧЕНИЕ : поместить данные из буфера воспроизведения во внутреннюю память УШ

* ВХОДНЫЕ ПАРАМЕТРЫ : нет

* ВЫХОДНЫЕ ПАРАМЕТРЫ: true - данные записаны,

* false - данные не записаны (в случае, если значение m_uiDumpNum

* некорректно )

*/t_UHInterface::PutDataToUH(void)

{

unsigned int *puiAddress;

#ifndef ___PC

int ires;

#endif

int i, ii, j, n;

unsigned int uiSize,k;

unsigned char * pucData;

#ifdef ___PCInterval;MyTimeBegin, MyTimeEnd, MyDurTime;

#endif

char buf1 [400];

//printf("===RTP: PutDataToUH\n");(!(m_uiDumpNum&0x03)) return(false);

puiAddress=m_puiBaseDataForUH;

if (m_uiDumpNum==2) puiAddress+=DUMP_SIZE>>2; (i=31; i>=0; i--)

{

m_ucMaxPlayBackBufInd)//">mtx_PlayBackBuf.lock();(m_iPlayBackIndDelta[i] > m_ucMaxPlayBackBufInd) // переполнение

{

while (m_iPlayBackGetInd[i] != m_iPlayBackPutInd[i])

{=m_iPlayBackGetInd[i]<<5;_iPlayBackGetInd[i]++;

m_iPlayBackIndDelta[i]--;

// циклический переход в начало буфера

if (m_iPlayBackGetInd[i] == m_ucMaxPlayBackBufInd) m_iPlayBackGetInd[i]=0;

}

}

else // нет данных

if (m_iPlayBackIndDelta[i] == 0)

{

m_pvTmpPlayBackBuf[i].m_vSDataCtrl.SpeachSize=0;

m_pvTmpPlayBackBuf[i].m_vSDataCtrl.Tone=0;

m_pvTmpPlayBackBuf[i].m_vSDataCtrl.CN=1;_PlayBackBuf.unlock();

continue;

}

n=m_iPlayBackGetInd[i]<<5;

m_pvTmpPlayBackBuf[i]=m_pvPlayBackBuf[i+n];

m_iPlayBackGetInd[i]++;

m_iPlayBackIndDelta[i]--;

// циклический переход в начало буфера

if (m_iPlayBackGetInd[i] == m_ucMaxPlayBackBufInd) m_iPlayBackGetInd[i]=0;_PlayBackBuf.unlock();

}

#ifndef ___PC

// записать данные при помощи интерфейса HPI

// пишем при помощи промежуточного буфера, чтобы не задерживать блокировку m_pvPlayBackBuf на время записи в DSP

if ((ires=(dsp6713b_write_IS(m_devd,(unsigned int)puiAddress, m_pvTmpPlayBackBuf, DUMP_SIZE))))

{

dsp6713b_reset(m_devd);b_close(m_devd);("\n!!t_UHInterface::PutDataToUH %i: DSP2_write_IS error!\n Addr=x Res=%i \n", m_ucUHNum,

(unsigned int)puiAddress,ires);

exit(1);

}

#endif ((p_DOUT) && (ParamRtpPrint[m_ucIndDO]))

{

printf("<<toUH %i: x(%i)\n",m_ucUHNum, (unsigned int)puiAddress,m_uiDumpNum);

//k=1;=0x80000000;(i=31;i>=0; i--)

{