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