Разработка функций для класса интерфейса между модулем УШ и модулем протокола RTP
Отчет по практике - Компьютеры, программирование
Другие отчеты по практике по предмету Компьютеры, программирование
t_UHInterface *pUHInterface[2];
// основная функция потока интерфейса УШ
void * main_UHInterface(void *arg)
{
unsigned char n=*(unsigned char*)arg;
pUHInterface[n]->run();
return NULL;
}main(int argc, char *argv[])
{
int ierr, i,n;
// t_UHInterface *pUHInterface[2];
t_thread *pUHInterfaceThread[2];
timespec sleeptimer;
// ========= параметры вывода ============
// биты 7 6 5 4 3 2 1 0
// -----------------------
// |di|do| | | | | | |
// -----------------------
// di - данные, принимаемые из DSP2 модуля УШ
// do - данные, передаваемые в DSP2 модуля УШ
//параметры вывода на консоль по умолчанию=0xc0;
// дополнительные параметры вывода
// для модуля УШ 0[DI]=0x00000001; // номеру бита установленному в 1 соответствует номер канала для вывода
ParamRtpPrint[DO]=0x00000001;
// для модуля УШ 1[DI+1]=0x00000001; // номеру бита установленному в 1 соответствует номер канала для вывода[DO+1]=0x00000001;
// это рекомендуется при использовании потоков реального времени
// locks all pages mapped into the address space of the calling
// process. This includes the pages of the code, data and stack segment,
// as well as shared libraries, user space kernel data, shared memory, and
// memory-mapped files. All mapped pages are guaranteed to be resident in
// RAM when the call returns successfully; the pages are guaranteed to
// stay in RAM until later unlocked.
if ((mlockall(MCL_CURRENT|MCL_FUTURE))==-1)
{ =errno;
fprintf(stderr,"mlockall() error! :\n %s errno=%i\n",strerror(ierr),ierr);
}
// создать объекты интерфейсов c УШ
for (n=0;n<1;n++)
{
// 32 - тип ИКМ тракта подведенного к модулю УШ (на 32 канальных интервала, м.б. на 64)
pUHInterface[n]= new t_UHInterface(n,32);(!pUHInterface[n])
{("t_RTPManager::Instance: Allocation memory error!\n");
exit(1);
}
}
// создать потоки интерфейсов c УШ
for (n=0;n<1;n++)
{
try
{ [n]->set_running(true);=n;[n] = new t_thread(main_UHInterface,
(void*)&i,SCHED_FIFO,49);
// SCHED_FIFO - тип планировщика, обслуживание по очереди, среди имеющих один приоритет
// 49 -приоритет, приоритеты должны быть < 50, т.к. таймер имеет приоритет 50
}
catch (int err)
{("!!UH Interface thread creating error, code = \n");
exit(1);
}
// сделать поток отсоединяемым.(он будет завершаться сам)[n]->detach();
// задержать перед созданием следующего потока, чтобы предыдущий успел запуститься
sleeptimer.tv_sec = 0;
sleeptimer.tv_nsec = 500000000; // 500ms(&sleeptimer, NULL);
}
pUHInterface[0]->StartDataAccumulation(0);bc[5]={0};
while (1)
{(bc, sizeof(bc), stdin);(bc[0]==*) break;
}[0]->StopDataAccumulation(0);(n=0;n<1;n++)
{[n]->stop();(pUHInterfaceThread[n]);(pUHInterface[n]);
} ();
return EXIT_SUCCESS;
}
Реализация класса для взаимодействия модуля протоколя RTP и модуля УШ
#include
#include
#include
#include "api_6713b.h"
#include "UH_interface.h"
#include "servis.h"
#ifdef ___PC
#include "pcdata.h"
#endifconst char cName[16]="/dev/drv6713b. ";* pcCodec []={"null","G.711","G.726-16","G729"};SLineCtrl t_UHInterface::m_vzeroLineCtrl[32] = { {{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},
{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},
{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},
{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},
{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},{{0},0,0,0},
{{0},0,0,0},{{0},0,0,0},};
/**НАЗНАЧЕНИЕ : конструктор
* ВХОДНЫЕ ПАРАМЕТРЫ : ucUHNum - порядковый номер УШ (0-3),
* ucCINum - количество КИ в ИКМ
* ВЫХОДНЫЕ ПАРАМЕТРЫ: нет
*/_UHInterface::t_UHInterface(unsigned char ucUHNum, unsigned char ucCINum)
{
//unsigned char i;
int i;
#ifdef ___PC
m_ucI=0;
#endif(m_cName, cName,sizeof(m_cName));
itoa(ucUHNum,(char*)(&m_cName[14]));_is_running=false;
m_bstop_running=false;_ucUHNum=ucUHNum;
m_ucCINum=ucCINum;_ucIndDI=DI+m_ucUHNum;
m_ucIndDO=DO+m_ucUHNum; _puiBaseAddress=(unsigned int*)(BASE_DATA_ADDRESS);
m_pvBaseDataCtrl=(SLineCtrl*)(m_puiBaseAddress+(CONF_SIZE>>2));
m_puiDumpNum=(unsigned int*)(m_pvBaseDataCtrl+64)+(sizeof(m_uiDumpNum)>>2);
m_puiBaseDataForRTP=m_puiDumpNum+(sizeof(m_uiDumpNum)>>2);
m_puiBaseDataForUH=m_puiBaseDataForRTP+(DUMP_SIZE*2>>2);
// глубина буфера воспроизведения
#ifdef ___PC
m_ucMaxPlayBackBufInd=JITTER_BUF_SIZE/10;
#else
m_ucMaxPlayBackBufInd=(JITTER_BUF_SIZE<<1)/10;// в два раза больше джиттер буфера
#endif
// буфер воспроизведения для записи
m_pvPlayBackBuf=new SData[m_ucMaxPlayBackBufInd<<5];// буфер для всех 32 каналов
m_pvTmpPlayBackBuf=new SData[32];
// буфер для чтения данных речевого трафика из УШ
m_puiDataFromUH=new unsigned int[DUMP_SIZE>>2];
// буфер накопления данных речевого трафика, прочитанных из УШ для 32 КИ
m_pvAccumulatedData=new SData [ACCBUFF_DEPTH<<5];( !m_pvPlayBackBuf || !m_pvAccumulatedData || !m_puiDataFromUH || !m_pvTmpPlayBackBuf )
{
printf("t_UHInterface::t_UHInterface: Allocation memory error!\n");
exit(1);
}
// проинициализировать буфер с управляющей информацией кодирования/декодирования
memset(m_vLineCtrl,0,sizeof(m_vLineCtrl));
// проинициализировать буфер с признаками изменения управляющей информации
// кодирования/декодирования
memset(m_uiChangeLineCtrl,0,sizeof(m_uiChangeLineCtrl));
// проинициализировать буфер с данными для УШ как отсутствие пакетов для всех КИ
// (тишина)
i=0;
while(i<=31)
{
ClearDataInPlayBackBuf(i++);
}
// обнулить буфер накопления данных речевого трафика
memset(m_pvAccumulatedData,0,ACCBUFF_DEPTH*32*sizeof(SData));(m_iAccGetInd,0,sizeof(m_iAccGetInd));
memset(m_iAccPutInd,0,sizeof(m_iAccPutInd));
memset(m_iAccIndDelta,0,sizeof(m_iAccIndDelta));
// обнулить массив с признаками необходимости накопления данных речевого трафика для 32 КИ
memset(m_IsAccumulating,0,sizeof(m_IsAccumulating));
#ifndef ___PC
// дескриптор устройства
m_devd=dsp6713b_open(m_cName);
if (m_devd <0)
{
printf("!!t_UHInterface::run %i DSP2_open error, Res=%i, name=%s\n", m_ucUHNum,m_devd,m_cName);
exit(1);
}
#endif
}
/**НАЗНАЧЕНИЕ : деструктор
* ВХОДНЫЕ ПАРАМЕТРЫ : нет
* ВЫХОДНЫЕ ПАРАМЕТРЫ: нет
*/_UHInterface::~t_UHInterface()
{
delete [] m_puiDataFromUH;
delete [] m_pvAccumulatedData;
delete [] m_pvPlayBackBuf;
delete [] m_pvTmpPlayBackBuf;
}
/**НАЗНАЧЕНИЕ : установить признак выполнения потока агента УШ
* ВХОДНЫЕ ПАРАМЕТРЫ : brunnung - значение признака выполнения потока
* ВЫХОДНЫЕ ПАРАМЕТРЫ: нет
*/t_UHInterface::set_running(bool brunning)
{
m_is_running=brunning;
}
/**НАЗНАЧЕНИЕ : остановить поток агента УШ
* ВХОДНЫЕ ПАРАМЕТРЫ : нет
* ВЫХОДНЫЕ ПАРАМЕТРЫ: нет
*/ t_UHInterface::stop(void)
{
timespec sleeptimer;
m_bstop_running=true;
while(m_is_runn