Разработка функций для класса интерфейса между модулем УШ и модулем протокола 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--)
{