Разработка функций для класса интерфейса между модулем УШ и модулем протокола RTP
Отчет по практике - Компьютеры, программирование
Другие отчеты по практике по предмету Компьютеры, программирование
if (ParamRtpPrint[m_ucIndDO] & k)
m_vSDataCtrl.SpeachSize;=(m_pvTmpPlayBackBuf+i)->m_ucData;">{=(m_pvTmpPlayBackBuf+i)->m_vSDataCtrl.SpeachSize;=(m_pvTmpPlayBackBuf+i)->m_ucData;(" [%i] : CN-x, tone-x, size-%i, newCtrl-%i\n",i,
m_vSDataCtrl.CN,">(m_pvTmpPlayBackBuf+i)->m_vSDataCtrl.CN,
m_vSDataCtrl.Tone,uiSize,(m_pvTmpPlayBackBuf+i)->m_vSDataCtrl.NewLineCtrl);(uiSize)">(m_pvTmpPlayBackBuf+i)->m_vSDataCtrl.Tone, uiSize,(m_pvTmpPlayBackBuf+i)->m_vSDataCtrl.NewLineCtrl);(uiSize)
{[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;}
}(buf1);
}
}>>=1;
}
}
return (true);
}
/**НАЗНАЧЕНИЕ : поместить данные КИ в буфер воспроизведения
* ВХОДНЫЕ ПАРАМЕТРЫ : ucCI - номер канального интервала [0-31],
* vSData - данные,
* ВЫХОДНЫЕ ПАРАМЕТРЫ: sizeof(Sdata) - успешное выполнение,
* 0 - данные не помещенны, т.к. буфер воспроизведения пустой
*-1 - номер КИ > 31
*/t_UHInterface::PutDataToPlayBackBuf(unsigned char ucCI, SData &vSData)
{
int n;
31) return (-1);_PlayBackBuf.lock();">// printf("===RTP: PutDataToPlayBackBuf\n");(ucCI >31) return (-1);_PlayBackBuf.lock();
n=m_iPlayBackPutInd[ucCI]<<5;
// помещаем данные в буфер накопления
m_pvPlayBackBuf[ucCI+n]= vSData;
m_iPlayBackPutInd[ucCI]++; // увеличиваем значение индекса для следующего помещения данных(m_iPlayBackPutInd[ucCI]==m_ucMaxPlayBackBufInd) m_iPlayBackPutInd[ucCI]=0; // циклический переход в начало_iPlayBackIndDelta[ucCI]++; // увеличиваем расстояние по отношению к индексу для извлечения
if (m_iPlayBackIndDelta[ucCI] > m_ucMaxPlayBackBufInd)
{
// фиксируем состояние переполнения буфера воспроизведения
printf("PlayBack buf overflow for %i \n",ucCI);
}_PlayBackBuf.unlock();(sizeof(SData));
}
/**НАЗНАЧЕНИЕ : очистить буфер воспроизведения для КИ
* ВХОДНЫЕ ПАРАМЕТРЫ : ucCI - номер канального интервала [0-31],
* ВЫХОДНЫЕ ПАРАМЕТРЫ: true - успешно
* false - ошибка: номер КИ > 31
*/t_UHInterface::ClearDataInPlayBackBuf(unsigned char ucCI)
31)return(false);_PlayBackBuf.lock();_pvTmpPlayBackBuf[ucCI].m_vSDataCtrl.SpeachSize=0;">{(ucCI >31) return (false);_PlayBackBuf.lock();_pvTmpPlayBackBuf[ucCI].m_vSDataCtrl.SpeachSize=0;_pvTmpPlayBackBuf[ucCI].m_vSDataCtrl.Tone=0;_pvTmpPlayBackBuf[ucCI].m_vSDataCtrl.CN=1;_pvTmpPlayBackBuf[ucCI].m_vSDataCtrl.NewLineCtrl=0;_iPlayBackGetInd[ucCI]=0;_iPlayBackPutInd[ucCI]=0;_iPlayBackIndDelta[ucCI]=0;_PlayBackBuf.unlock();
return (true);
}
/**НАЗНАЧЕНИЕ : получить порцию данных из буфера накопления
* ВХОДНЫЕ ПАРАМЕТРЫ : ucCI - номер канального интервала,
* vSData - структура для помещения данных,
* ВЫХОДНЫЕ ПАРАМЕТРЫ: true - данные извлечены из буфера накопления,
* false - в буфере накопления нет данных
*/t_UHInterface::GetAccumulatedData(unsigned char ucCI, SData &vSdata)
{
ACCBUFF_DEPTH)//">int n;_AccumulatedData.lock();(m_iAccIndDelta[ucCI] > ACCBUFF_DEPTH) // переполнение
{
while (m_iAccGetInd[ucCI] != m_iAccPutInd[ucCI])
{_iAccGetInd[ucCI]++;_iAccIndDelta[ucCI]--;
// циклический переход в начало буфера
if (m_iAccGetInd[ucCI] == ACCBUFF_DEPTH) m_iAccGetInd[ucCI]=0;
}
}
else // нет данных
if (m_iAccIndDelta[ucCI] == 0)
{
mtx_AccumulatedData.unlock();
return (false);
}
n=m_iAccGetInd[ucCI]<<5;
vSdata=m_pvAccumulatedData[ucCI+n];
m_iAccGetInd[ucCI]++;
m_iAccIndDelta[ucCI]--;
// циклический переход в начало буфера
if (m_iAccGetInd[ucCI] == ACCBUFF_DEPTH) m_iAccGetInd[ucCI]=0;_AccumulatedData.unlock();(true);
}
/**НАЗНАЧЕНИЕ : записать управляющую информацию кодирования/декодирования во
* внутреннюю память модуля УШ для тех КИ, у которых она изменилась
* ВХОДНЫЕ ПАРАМЕТРЫ : нет
* ВЫХОДНЫЕ ПАРАМЕТРЫ: нет
*/ t_UHInterface::WriteLineCtrlToUH(void)
{
//unsigned char i;
int i;
unsigned int k;
#ifndef ___PC
int ires;
#endif
SLineCtrl *pvDataCtrl;
// прочитать из внутренней памяти УШ номер области памяти для
// считывания и записи данных модулем протокола RTP
#ifdef ___PC
m_uiDumpNum=1;
#else
// прочитать номер области памяти
if ((ires=(dsp6713b_read(m_devd,(unsigned int)m_puiDumpNum, &m_uiDumpNum))))
{
dsp6713b_reset(m_devd);b_close(m_devd);("\n!!t_UHInterface::GetDumpNum %i: DSP2_read error!\n Addr=x Res=%i \n", m_ucUHNum,
(unsigned int)m_puiDumpNum,ires);(1);
}
#endif
// printf("%i\n",m_uiDumpNum);
if (!(m_uiDumpNum&0x03))
{
printf("\n!!>>UH %i: DumpNum x > x\n",m_ucUHNum, (unsigned int)m_puiDumpNum,m_uiDumpNum);
return;
}
// выполнить запись управляющей информации (не взодит в задание)
}
/**НАЗНАЧЕНИЕ : очистить управляющую информацию всех КИ во внутренней памяти
* модуля УШ
* ВХОДНЫЕ ПАРАМЕТРЫ :
* ВЫХОДНЫЕ ПАРАМЕТРЫ: нет
*/ t_UHInterface::ClearLineCtrlInUH(void)
{
unsigned int uiAddress1, uiAddress2;
#ifndef ___PC
int ires;
#endif=uiAddress2=(unsigned int)m_pvBaseDataCtrl;// адрес области памяти #1
uiAddress2+=sizeof(m_vLineCtrl); // адрес области памяти #1_LineCtrl.lock();(m_vLineCtrl,0,sizeof(m_vLineCtrl));_LineCtrl.unlock();
#ifndef ___PC
// m_vzeroLineCtrl используем, чтобы не задерживать блокировку m_vLineCtrl на время записи в DSP
if ((ires=(dsp6713b_write_IS(m_devd,uiAddress1, (void*)m_vzeroLineCtrl, sizeof(m_vzeroLineCtrl)))) ||
(ires=(dsp6713b_write_IS(m_devd,uiAddress2, (void*)m_vzeroLineCtrl, sizeof(m_vzeroLineCtrl)))) )
{
dsp6713b_reset(m_devd);
dsp6713b_close(m_devd);
printf("\n!!t_UHInterface::ClearLineCtrlInUH %i: DSP2_write_IS error!\n Addr=x Res=%i \n", m_ucUHNum,uiAddress1,ires);
exit(1);
}
#endif
}
/**НАЗНАЧЕНИЕ : запуск модуля УШ (инициализация модуля УШ и запуск программы в DSP)
* ВХОДНЫЕ ПАРАМЕТРЫ : нет
* ВЫХОДНЫЕ ПАРАМЕТРЫ: нет
*/t_UHInterface::StartWorkDSP2(void)
{
unsigned int uiConf;
unsigned int ii;
int i,ires;
timespec SleepTime;
#ifndef ___PC
// сбросить DSP модуля УШ
if((ires=(dsp6713b_reset(m_devd))))
{b_close(m_devd);("!!t_UHInterface::StartWorkDSP2 %i DSP2_reset error, Res=%i\n", m_ucUHNum,ires);
exit(1);
}
// записать в УШ данные конфигурации (m_ucCINum);(); // обнулить управляющую информацию в памяти модуля УШ по всем КИ
// проинициализировать в УШ области памяти для данных
m_uiDumpNum=1;();_uiDumpNum=2;();((ires=(dsp6713b_start(m_devd))))
{b_close(m_devd);("!!t_UHInterface::StartWorkDSP2 %i DSP2_start error, Res=%i\n", m_ucUHNum,ires);(1);
}
//! ждать готовность УШ
for (i=MAX_WAIT_READY; i>0; i--) // 10 раз = 100 ms
{
if((ires=(dsp6713b_read(m_devd,(unsigned int)m_puiBaseAddress, &uiConf))))
{b_reset(m_devd);b_close(m_devd);("!!t_UHInterface::StartWorkDSP2 %i: DSP2_read error!\n Addr=x Res=%i \n",_ucUHNum,(unsigned int)m_puiBaseAddress,ires);(1);
}((uiConf & 0xC0) == 0xC0)
{("UH %i is READY!\n",m_ucUHNum);;
}
} (i<=0)
{("UH %i is NOT READY!\n", m_ucUHNum);b_reset(m_devd);b_close(m_devd);(1);
}
#else("UH %i is READY!\n",m_ucUHNum);
#endif
}
/**НАЗНАЧЕ