Su'esu'e le afi Mediastreamer2 VoIP. Vaega 11

O mea o le tusiga e maua mai i laʻu zen alavai.

Su'esu'e le afi Mediastreamer2 VoIP. Vaega 11

Fa'atonuga o fa'amatalaga

  • poloka fa'amaumauga dblk_t
  • Savali mblk_t
  • Galuega mo le galue ma fe'au mblk_t
  • Tuli laina_t
  • Galuega mo le galue ma queues queue_t
  • Feso'ota'i filiga
  • Fa'ailoga fa'ailoga o le fa'asologa o fa'amatalaga kalafi
  • I tua atu o vaaiga gaioiga a le ticker
  • Taofi (MSBufferizer)
  • Galuega mo le galulue faatasi ma MSBufferizer

I le mulimuli tusiga ua matou atiina ae a matou lava faamama. O lenei tusiga o le a taulaʻi i le faʻaogaina o totonu mo le faʻanofoina o faʻamatalaga i le va o faʻasalalauga streamer filiga. Ole mea lea ole a fa'atagaina oe e tusi ni filiga fa'apitoa ma le itiiti o taumafaiga i le lumana'i.

Fa'atonuga o fa'amatalaga

O faʻamatalaga faʻamatalaga i totonu o le aufaasālalau faʻasalalau e faʻatinoina e faʻaaoga ai laina faʻamatalaina e le fausaga laina_t. Uiga o fe'au pei o mblk_t, ia latou lava e le o iai faʻamatalaga faʻailoga, ae naʻo fesoʻotaʻiga i le muamua, savali e sosoo ai ma le poloka faʻamatalaga. E le gata i lea, ou te manaʻo e faʻamamafa faapitoa o loʻo i ai foi se fanua mo se fesoʻotaʻiga i se feʻau o le ituaiga tutusa, lea e mafai ai ona e faʻatulagaina se lisi fesoʻotaʻi tasi o feʻau. O le a matou ta'ua se vaega o savali ua tuufaatasia e se lisi faapena o se tuple. O le mea lea, soʻo se elemene o le laina e mafai ona avea ma se feʻau e tasi mblk_t, ma atonu o le ulu o se savali tuple mblk_t. E mafai ona i ai i savali ta'itasi lana lava poloka fa'amaumauga a le uarota. O le a tatou talanoaina pe aisea e manaʻomia ai tuple i se taimi mulimuli ane.

E pei ona taʻua i luga, o le feʻau lava ia e le o iai se poloka o faʻamatalaga; nai lo lena, o loʻo i ai naʻo se faʻailoga i le nofoaga manatua o loʻo teuina ai le poloka. I lenei vaega, o le ata atoa o le galuega a le aufaasālalau o loʻo faʻamanatuina le fale teu oloa i totonu o le kata "Monsters, Inc.," lea e alu ai faitotoa (soʻotaga i faʻamatalaga - potu) i se saoasaoa faʻavalevalea i luga o faʻasalalauga, ae o potu lava ia. tumau le gaioi.

I le taimi nei, agai i luga o le faʻasologa mai le pito i lalo i le pito i luga, seʻi o tatou iloiloina auiliili vaega o loʻo lisiina o le faʻaogaina o faʻamatalaga i totonu o le aufaasālalau.

poloka fa'amaumauga dblk_t

O le poloka faʻamaumauga e aofia ai se ulutala ma se faʻamaumauga faʻamaumauga. O le ulutala o loʻo faʻamatalaina i le fausaga o loʻo i lalo,

typedef struct datab
{
unsigned char *db_base; // Указатель на начало буфер данных.
unsigned char *db_lim;  // Указатель на конец буфер данных.
void (*db_freefn)(void*); // Функция освобождения памяти при удалении блока.
int db_ref; // Счетчик ссылок.
} dblk_t;

O fanua o le fausaga o loʻo i ai faʻailoga i le amataga o le paʻu, le pito o le paʻu, ma le galuega mo le tapeina o le faʻamaumauga o faʻamaumauga. Elemene mulimuli i le ulutala db_ref - reference counter, afai e oʻo i le zero, e avea lea ma faʻailoga e tape ai lenei poloka mai le manatua. Afai o le poloka faʻamatalaga na faia e le galuega datab_alloc() , ona tu'u loa lea o le fa'amaumauga o fa'amaumauga i le manatua pe a uma le ulutala. I isi tulaga uma, e mafai ona tu'u ese le pa'u i se mea. O le faʻamaumauga faʻamaumauga o le a iai faʻataʻitaʻiga faʻailoga poʻo isi faʻamatalaga matou te manaʻo e faʻaogaina i filiga.

O se faʻataʻitaʻiga fou o se poloka faʻamatalaga ua faia e faʻaaoga ai le galuega:

dblk_t *datab_alloc(int size);

I le avea ai o se faʻailoga faʻaoga, e tuʻuina atu le tele o faʻamaumauga o le a teuina e le poloka. E tele mea e manatua e tu'uina ina ia mafai ai ona tu'u se ulutala - fausaga - i le amataga o le manatua ua tu'uina atu fa'amatalagab. Ae pe a faʻaaogaina isi galuega, e le tupu i taimi uma; i nisi tulaga, o le faʻamaumauga faʻamaumauga e mafai ona tuʻu ese mai le ulutala poloka faʻamaumauga. Pe a fatuina se fausaga, o fanua e faʻatulagaina ina ia mafai ai ona faʻaogaina lona fanua db_base faasino i le amataga o le vaega o faamatalaga, ma db_lim i lona iuga. Su'ega numera db_ref ua seti i le tasi. O le fa'asinoga fa'amatalaga manino galuega ua seti i le zero.

feʻau mblk_t

E pei ona taʻua, o elemene laina o le ituaiga mblk_t, ua faauigaina e faapea:

typedef struct msgb
{
  struct msgb *b_prev;   // Указатель на предыдущий элемент списка.
  struct msgb *b_next;   // Указатель на следующий элемент списка.
  struct msgb *b_cont;   // Указатель для подклейки к сообщению других сообщений, для создания кортежа сообщений.
  struct datab *b_datap; // Указатель на структуру блока данных.
  unsigned char *b_rptr; // Указатель на начало области данных для чтения данных буфера b_datap.
  unsigned char *b_wptr; // Указатель на начало области данных для записи данных буфера b_datap.
  uint32_t reserved1;    // Зарезервированное поле1, медиастример помещает туда служебную информацию. 
  uint32_t reserved2;    // Зарезервированное поле2, медиастример помещает туда служебную информацию.
  #if defined(ORTP_TIMESTAMP)
  struct timeval timestamp;
  #endif
  ortp_recv_addr_t recv_addr;
} mblk_t;

Faʻavae mblk_t o lo'o iai fa'ailoga i le amataga b_prev, b_next, lea e mana'omia e fa'atulaga ai se lisi e fa'aluaina feso'ota'iga (o se fa'asologa laina_t).

Ona sau ai lea o le faasinoala b_faaauau, lea e naʻo le faʻaaogaina pe a avea le savali o se vaega o se tuple. Mo le fe'au mulimuli i le tuple, o lenei fa'ailo e tumau pea le null.

Le isi matou va'ai se fa'asino i se poloka fa'amaumauga b_datap, lea e iai le fe'au. E soso'o ai ma fa'asino ile vaega o lo'o i totonu ole poloka poloka fa'amaumauga. fanua b_rptr fa'ailoa mai le nofoaga e faitau ai fa'amaumauga mai le pa'u. fanua b_wptr o lo'o fa'ailoa mai ai le nofoaga e fa'atino ai le tusi i le pa'u.

O vaega o lo'o totoe o se uiga tautua ma e le feso'ota'i ma le fa'agaioiga o le fa'aogaina o fa'amatalaga.

Lalo o se savali e tasi ma le igoa m1 ma fa'amaumauga poloka d1.
Su'esu'e le afi Mediastreamer2 VoIP. Vaega 11
O le ata o loʻo i lalo o loʻo faʻaalia ai se tuple o savali e tolu m1, m1_1, m1_2.
Su'esu'e le afi Mediastreamer2 VoIP. Vaega 11

Galuega fe'au mblk_t

Se savali fou mblk_t faia e le galuega:

mblk_t *allocb(int size, int pri); 

na te tuuina se savali fou i le manatua mblk_t fa'atasi ai ma se poloka fa'amatalaga o le tele fa'apitoa fua, finauga lona lua - tulaga tasi e le'o fa'aogaina i lenei lomiga o le faletusi. E tatau ona tumau le leai. I le taimi o le galuega, o le a tuʻuina atu le manatua mo le fausaga o le feʻau fou ma o le a valaʻau le galuega mblk_init(), lea o le a toe setiina uma fanua o le faʻataʻitaʻiga na faia o le fausaga ona faʻaaogaina lea o loʻo taʻua i luga datab_alloc(), o le a fatuina se faʻamaumauga faʻamaumauga. A maeʻa lea o le a faʻapipiʻiina fanua i totonu o le fausaga:

mp->b_datap=datab;
mp->b_rptr=mp->b_wptr=datab->db_base;
mp->b_next=mp->b_prev=mp->b_cont=NULL;

I le fa'atinoga matou te maua ai se fe'au fou fa'atasi ai ma fa'ato'aga amata ma se fa'amaumauga gaogao. Ina ia fa'aopoopo fa'amatalaga i se fe'au, e tatau ona e kopiina i le poloka poloka fa'amaumauga:

memcpy(msg->b_rptr, data, size);

le mea faʻamatalaga o se faasinoala i le puna o faamatalaga, ma fua - lo latou tele.
ona e manaʻomia lea ona faʻafouina le faʻailoga i le tusi tusi ina ia toe faʻasino i le amataga o le avanoa avanoa i le paʻu:

msg->b_wptr = msg->b_wptr + size

Afai e te manaʻomia le fatuina o se feʻau mai se paʻu o loʻo iai, e aunoa ma le kopiina, ona faʻaaoga lea o le galuega:

mblk_t *esballoc(uint8_t *buf, int size, int pri, void (*freefn)(void*)); 

O le galuega, pe a uma ona fatuina le feʻau ma le fausaga o le poloka faʻamaumauga, o le a faʻapipiʻi ona faʻailoga i faʻamatalaga i le tuatusi faleoloa. O na. i lenei tulaga, o le faʻamaufaʻailoga faʻamaumauga e le o iai pe a maeʻa faʻauluulu fanua o le poloka faʻamaumauga, e pei o le tulaga i le fatuina o se poloka faʻamaumauga ma le galuega. datab_alloc(). O le paʻu faʻatasi ma faʻamaumauga na pasia i le galuega o le a tumau pea i le mea sa i ai, ae faʻatasi ai ma le fesoasoani a faʻamatalaga o le a faʻapipiʻi i le ulutala fou fou o le poloka faʻamaumauga, ma e tusa ai, i le feʻau.

I le tasi savali mblk_t E mafai ona tu'ufa'atasia fa'asologa fa'asolosolo nisi poloka fa'amaumauga. E faia lenei mea i le galuega:

mblk_t * appendb(mblk_t *mp, const char *data, int size, bool_t pad); 

mp - o se fe'au e fa'aopoopo i ai se isi poloka fa'amaumauga;
faʻamatalaga — faasino i le poloka, o se kopi o le a faaopoopo i le savali;
fua - tele fa'amaumauga;
papa - o se fuʻa e tatau ona faʻaogaina le tele o le manatua na tuʻuina atu i luga o se tuaoi 4-byte (o le a faia le padding i zeros).

Afai e lava le avanoa i le faʻamaumauga o faʻamatalaga o loʻo i ai nei, ona faʻapipiʻi lea o faʻamatalaga fou i tua o faʻamatalaga ua uma ona iai. Afai e itiiti le avanoa avanoa i le fe'au fa'amaumauga fa'apolopolo nai lo fua, ona faia lea o se fe'au fou ma se lapo'a fa'apipi'i lava ma kopi fa'amaumauga i lona pa'u. O se fe'au fou lea, e feso'ota'i i le ulua'i fe'au e fa'aoga ai le fa'asino b_faaauau. I lenei tulaga, o le savali e liliu i se tuple.

Afai e te manaʻomia le faʻaopoopoina o se isi poloka o faʻamaumauga i le tuple, ona e manaʻomia lea ona faʻaogaina le galuega:

void msgappend(mblk_t *mp, const char *data, int size, bool_t pad);

o le a ia mauaina le savali mulimuli i le tuple (na te maua b_faaauau o le a null) ma o le a valaau le galuega mo lenei savali appendb().

E mafai ona e mauaina le tele o faʻamatalaga i se feʻau poʻo se tuple e faʻaaoga ai le galuega:

int msgdsize(const mblk_t *mp);

o le a fa'afeso'ota'i uma fe'au i totonu o le tuple ma toe fa'afo'i le aofa'i o fa'amaumauga i totonu o fa'amaumauga o na fe'au. Mo fe'au ta'itasi, o le aofa'i o fa'amaumauga e fa'atatau e pei ona ta'ua i lalo:

 mp->b_wptr - mp->b_rptr

Ina ia tuʻufaʻatasia tuple se lua, faʻaaoga le galuega:

mblk_t *concatb(mblk_t *mp, mblk_t *newm);

na te fa'aopoopoina le tuple newm i le si'usi'u o le tuple mp ma toe faafoi se faasinoala i le savali mulimuli o le tuple e maua.

Afai e manaʻomia, e mafai ona liua se tuple i se feʻau se tasi ma se poloka e tasi o faʻamaumauga; e faia lea e le galuega:

void msgpullup(mblk_t *mp,int len);

pe a finau la o le -1, ona fuafua ai lea o le tele o le paʻu tuʻufaʻatasia. Afai la o se numera lelei, o le a faia se paʻu o lenei lapopoa ma o le tuple faʻamatalaga savali o le a kopiina i totonu. Afai e uma le pa'u, o le kopiina o le a taofi iina. O le fe'au muamua o le tuple o le a maua se lapo'a fou fa'atasi ma fa'amaumauga kopi. O fe'au o lo'o totoe o le a tapeina ma toe fa'afo'i le manatua i le fa'aputuga.

Pe a tapeina se fausaga mblk_t o le numera o faʻamatalaga o le poloka faʻamatalaga e amanaia pe afai, pe a valaʻau freeb() e foliga mai e leai, ona tapeina lea o le faʻamaumauga faʻatasi ma le faʻataʻitaʻiga mblk_t, lea e faasino i ai.

Amataina fanua o se fe'au fou:

void mblk_init(mblk_t *mp);

Fa'aopoopoina se isi vaega o fa'amatalaga i le fe'au:

mblk_t * appendb(mblk_t *mp, const char *data, size_t size, bool_t pad);

Afai o faʻamatalaga fou e le fetaui i le avanoa avanoa o le faʻamaumauga o faʻamatalaga feʻau, ona faʻapipiʻiina lea o se feʻau tuʻufaʻatasia ma se paʻu o le lapoʻa manaʻomia i le feʻau (o se faʻailoga i le feʻau faaopoopo o loʻo seti i le savali muamua) ma le fe'au liliu i se tuple.

Fa'aopoopoina o se fasi fa'amatalaga i se tuple:

void msgappend(mblk_t *mp, const char *data, size_t size, bool_t pad); 

O le galuega e valaau appendb() i se matasele.

Tuʻufaʻatasia tuple e lua i le tasi:

mblk_t *concatb(mblk_t *mp, mblk_t *newm);

feʻau newm o le a fa'apipi'i i mp.

Faia o se kopi o se savali e tasi:

mblk_t *copyb(const mblk_t *mp);

Fa'ato'a kopiina o se tuple ma poloka fa'amaumauga uma:

mblk_t *copymsg(const mblk_t *mp);

O elemene o le tuple e kopiina e le galuega kopib().

Fausia se kopi faigofie o se savali mblk_t. I lenei tulaga, e le o kopiina le poloka faʻamaumauga, ae ua faʻateleina lona faʻamaufaʻailoga db_ref:

mblk_t *dupb(mblk_t *mp);

Faia o se kopi mama o se tuple. E le kopiina poloka fa'amaumauga, na'o latou fa'amaumauga e fa'aopoopo db_ref:

mblk_t *dupmsg(mblk_t* m);

Fa'apipi'i uma fe'au o se tuple i le fe'au e tasi:

void msgpullup(mblk_t *mp,size_t len);

Afai o le finauga la o le -1, ona fuafua ai lea o le tele o le paʻu tuʻufaʻatasia.

Aveese se fe'au, tuple:

void freemsg(mblk_t *mp);

Ole numera ole fa'amatalaga ole poloka fa'amatalaga e fa'aititia ile tasi. Afai e oʻo i le zero, o le poloka faʻamaumauga e tape foi.

Fuafuaga o le aofaʻi o faʻamatalaga i totonu o se feʻau poʻo se tuple.

size_t msgdsize(const mblk_t *mp);

Toe aumai se fe'au mai le si'usi'u o le laina:

mblk_t *ms_queue_peek_last (q);

O le kopiina o mea o lo'o i totonu o fanua fa'apolopolo o le tasi fe'au i se isi fe'au (o le mea moni, o nei fanua o lo'o i ai fu'a o lo'o fa'aogaina e le fa'asalalauga fa'asalalau):

mblk_meta_copy(const mblk_t *source, mblk *dest);

Liliu laina_t

O le fa'asologa o fe'au i le fa'asalalauga fa'asalalau o lo'o fa'atinoina o se lisi fa'alua fa'alua. Lisi elemene ta'itasi o lo'o iai se fa'asino ile poloka fa'amatalaga ma fa'ata'ita'iga fa'ailo. E aliali mai e na'o fa'asino ile poloka fa'amatalaga e fealua'i, a'o fa'amaumauga lava ia e le gaioi. O na. e na'o so'oga e fa'agaoioi.
Fa'atulagaina o lo'o fa'amatala ai le laina laina_t, fa'aalia i lalo:

typedef struct _queue
{
   mblk_t _q_stopper; /* "Холостой" элемент очереди, не указывает на данные, используется только для управления очередью. При инициализации очереди (qinit()) его указатели настраиваются так, чтобы они указывали на него самого. */
   int q_mcount;        // Количество элементов в очереди.
} queue_t;

O le fausaga o loʻo i ai se fanua - o se faʻailoga _q_ taofi type *mblk_t, e faasino i le elemene muamua (fe'au) i le laina. O le fanua lona lua o le fausaga o le fa'ailoga o fe'au i le laina.
O le ata o lo'o i lalo o lo'o fa'aalia ai se laina e ta'ua o le q1 o lo'o iai fe'au e 4 m1, m2, m3, m4.
Su'esu'e le afi Mediastreamer2 VoIP. Vaega 11
O le ata o lo'o i lalo o lo'o fa'aalia ai se laina e ta'ua o le q1 o lo'o iai fe'au e 4 m1,m2,m3,m4. O le fe'au m2 o le ulu lea o se tuple o lo'o iai isi fe'au e lua m2_1 ma le m2_2.

Su'esu'e le afi Mediastreamer2 VoIP. Vaega 11

Galuega mo le galue ma queues queue_t

Fa'amataina laina:

void qinit(queue_t *q);

laufanua _q_ taofi (o le a tatou taʻua mulimuli ane o le "stopper") e amataina e le galuega mblk_init(), o lona elemene muamua ma le isi faʻailoga elemene e fetuutuunai e faʻasino ia te ia lava. O le fa'ailoga elemene o le laina e toe setiina i le zero.

Fa'aopoopoina se elemene fou (fe'au):

void putq(queue_t *q, mblk_t *m);

Elemene fou m e fa'aopoopo i le pito o le lisi, o fa'ailoga elemene e fetu'una'i ina ia avea le taofi ma isi elemene mo ia, ma avea ma elemene muamua mo le taofi. O lo'o fa'aopoopoina le fa'asologa o elemene laina.

Toe aumai se elemene mai le laina:

mblk_t * getq(queue_t *q); 

O le fe'au e sau pe a uma le taofi e toe maua mai, ma fa'aititia le fata elemene. Afai e leai ni elemene i le laina sei vagana ai le taofi, ona toe foʻi mai lea o le 0.

Fa'aofiina o se fe'au i totonu o le laina:

void insq(queue_t *q, mblk_t *emp, mblk_t *mp); 

Elemene mp fa'aofi i luma o le elemene emp. Afai emp=0, ona faaopoopo lea o le fe'au i le si'usi'u o le laina.

Toe aumai se savali mai le ulu o le laina:

void remq(queue_t *q, mblk_t *mp); 

O lo'o fa'aitiitia le fa'ailoga elemene.

Faitauina o se faasinoala i le elemene muamua i le laina:

mblk_t * peekq(queue_t *q); 

Ave'ese elemene uma mai le laina a'o tape elemene lava latou:

void flushq(queue_t *q, int how);

Manatu finau auala le faaaogaina. O le fa'ailoga elemene o lo'o fa'atulaga i le zero.

Macro mo le faitauina o se faasinoala i le elemene mulimuli o le laina:

mblk_t * qlast(queue_t *q);

A e galue i laina savali, ia nofouta pe a e valaʻau ms_queue_put(q, m) fa'atasi ai ma se fa'ailoga null i le fe'au, o le fa'agaoioiga e fa'aoga. O le a malo lau polokalame. amio fa'apea ms_queue_next(q, m).

Feso'ota'i filiga

O le fa'asologa o lo'o fa'amatalaina i luga o lo'o fa'aaogaina e pasi ai fe'au mai le tasi faamama i le isi po'o le tasi i le tele o filiga. O filiga ma latou feso'ota'iga e fai ai se kalafi fa'atonu. O le faʻaogaina poʻo le gaioiga o le faamama o le a taʻua o le upu lautele "pin". Ina ia faʻamatalaina le faʻasologa e fesoʻotaʻi ai filiga i le tasi ma le isi, e faʻaaogaina e le aufaasālalau le manatu o se "faailoga faʻailoga". O le fa'ailoga o le fausaga _MSCPpoint, lea o loʻo i ai se faʻailoga i le faamama ma le numera o se tasi o ona pine; e tusa ai, o loʻo faʻamatalaina ai le fesoʻotaʻiga o se tasi o mea faʻapipiʻi poʻo gaioiga o le faamama.

Fa'ailoga fa'ailoga o le fa'asologa o fa'amatalaga kalafi

typedef struct _MSCPoint{
struct _MSFilter *filter; // Указатель на фильтр медиастримера.
int pin;                        // Номер одного из входов или выходов фильтра, т.е. пин.
} MSCPoint;

E faanumera pine faamama e amata mai le leai.

O le fesoʻotaʻiga o pine e lua e ala i se laina feʻau o loʻo faʻamatalaina e le fausaga _MSQueue, o loʻo i ai se laina savali ma faʻailoga i faʻailoga e lua e fesoʻotaʻi ai:

typedef struct _MSQueue
{
queue_t q;
MSCPoint prev;
MSCPoint next;
}MSQueue;

O le a matou taʻua lenei fausaga o se fesoʻotaʻiga faailo. O fa'amama fa'asalalauga ta'itasi o lo'o i ai se laulau o so'otaga fa'aoga ma se laulau o so'oga fa'atino (MSQueue). Ole tele ole laulau e fa'atulaga pe a faia se faamama; ua uma ona matou faia lenei mea e fa'aaoga ai se fesuiaiga o le ituaiga MSFilterDesc, ina ua tatou atiina ae a tatou lava faamama. O lo'o i lalo se fausaga e fa'amatala ai so'o se faamama i totonu o se fa'asalalauga fa'asalalau, MSFilter:


struct _MSFilter{
    MSFilterDesc *desc;    /* Указатель на дескриптор фильтра. */
    /* Защищенные атрибуты, их нельзя сдвигать или убирать иначе будет нарушена работа с плагинами. */
    ms_mutex_t lock;      /* Семафор. */
    MSQueue **inputs;     /* Таблица входных линков. */
    MSQueue **outputs;    /* Таблица выходных линков. */
    struct _MSFactory *factory; /* Указатель на фабрику, которая создала данный экземпляр фильтра. */
    void *padding;              /* Не используется, будет задействован если добавятся защищенные поля. */
    void *data;                 /* Указатель на произвольную структуру для хранения данных внутреннего состояния фильтра и промежуточных вычислений. */
    struct _MSTicker *ticker;   /* Указатель на объект тикера, который не должен быть нулевым когда вызывается функция process(). */
    /*private attributes, they can be moved and changed at any time*/
    MSList *notify_callbacks; /* Список обратных вызовов, используемых для обработки событий фильтра. */
    uint32_t last_tick;       /* Номер последнего такта, когда выполнялся вызов process(). */ 
    MSFilterStats *stats;     /* Статистика работы фильтра.*/
    int postponed_task; /*Количество отложенных задач. Некоторые фильтры могут откладывать обработку данных (вызов process()) на несколько тактов.*/
    bool_t seen;  /* Флаг, который использует тикер, чтобы помечать что этот экземпляр фильтра он уже обслужил на данном такте.*/
};
typedef struct _MSFilter MSFilter;

A maeʻa ona matou faʻafesoʻotaʻi filiga i le polokalame C e tusa ai ma la matou fuafuaga (ae leʻi faʻafesoʻotaʻi le ticker), na matou faia ai se kalafi faʻatonu, o ona pona o ni faʻataʻitaʻiga o le fausaga. MSFilter, ma pito o fa'ata'ita'iga o so'oga MSQueue.

I tua atu o vaaiga gaioiga a le ticker

Ina ua ou fai atu ia te oe o le ticker o se faamama mo le puna o siaki, e le o le mea moni atoa e uiga i ai. O le ticker o se mea e fa'atino galuega i luga o le uati faiga() filiga uma o le ta'amilosaga (kalafa) o lo'o feso'ota'i ai. A matou fa'afeso'ota'i se fa'ailoga i se fa'amama kalafi i se polokalame C, matou te fa'aali atu i le fa'ailoga le kalafi o le a pulea mai le taimi nei se'ia matou tapeina. A maeʻa ona faʻafesoʻotaʻi, e amata ona suʻesuʻe e le ticker le kalafi ua tuʻuina atu i lana tausiga, faʻapipiʻi se lisi o filiga e aofia ai. Ina ia aua nei "faitau" le faamama tutusa faalua, e faailogaina le filiga ua iloa e ala i le tuʻuina o se pusa siaki i totonu. vaaia. O le su'esu'ega o lo'o fa'atinoina i le fa'aogaina o laulau feso'ota'iga o lo'o i ai i fa'amama ta'itasi.

I le taimi o lana fa'atomuaga ta'amilosaga o le kalafi, e siaki e le fa'ailoga pe i totonu o fa'amama e iai se tasi e fai ma puna o poloka fa'amaumauga. Afai e leai, o lona uiga e le sa'o le kalafi ma pa'u le ticker.

Afai o le kalafi e foliga mai e "saʻo", mo filiga taʻitasi e maua, e valaʻauina le galuega mo le amataina mua'i faiga(). O le taimi lava e oʻo mai ai le taimi mo le isi faʻasologa o gaioiga (taʻi 10 milliseconds uma e le mafai), o le ticker e valaʻau le galuega. faiga() mo filiga uma na maua muamua, ona sosoo ai lea ma isi filiga i le lisi. Afai o lo'o iai so'otaga fa'aoga ole faamama, ona fa'atino lea o le galuega faiga() toe fai se'ia gaogao laina o feso'ota'iga. A maeʻa lenei, e alu i le isi faamama i le lisi ma "taʻai" seia oʻo ina leai ni feʻau o fesoʻotaʻiga. E alu le fa'ailoga mai le faamama i le fa'amama seia mae'a le lisi. E fa'amae'a ai le faagasologa o le taamilosaga.

O lea o le a tatou toe foʻi i tuples ma talanoa e uiga i le mafuaʻaga na faʻaopoopoina ai sea faʻalapotopotoga i le faʻasalalauga faʻasalalau. I se tulaga lautele, o le aofaʻi o faʻamatalaga e manaʻomia e le algorithm o loʻo galue i totonu o le faamama e le fetaui ma e le o se tele o le tele o faʻamaumauga faʻamaumauga na maua i le faʻaoga. Mo se faʻataʻitaʻiga, o loʻo matou tusia se faamama e faʻatino ai se suiga vave Fourier, lea e faʻamatalaina e naʻo le faʻaogaina o poloka faʻamaumauga o lona tele o le malosi o le lua. Ia 512 faitau. Afai o faʻamatalaga e faʻatupuina e se telefoni, o le faʻamaumauga o faʻamaumauga o feʻau taʻitasi i totonu o le a aumaia ia i matou 160 faʻataʻitaʻiga faʻailoga. E fa'aosoosoina le aua ne'i aoina fa'amaumauga mai le fa'aoga se'i vagana ua i ai le aofa'i o fa'amatalaga mana'omia. Ae i lenei tulaga, o le a tupu se faʻalavelave faʻatasi ma le ticker, lea o le a le manuia ai le taumafai e taʻavale le faamama seia oʻo ina gaogao le fesoʻotaʻiga. I le taimi muamua, na matou filifilia lenei tulafono e avea ma mataupu faavae lona tolu o le faamama. E tusa ai ma lenei taʻiala, o le faʻagasologa o le faamama () e tatau ona ave uma faʻamatalaga mai laina faʻaoga.

E le gata i lea, o le a le mafai ona ave naʻo 512 faʻataʻitaʻiga mai le faʻaoga, talu ai e mafai ona e ave atoa poloka, i.e. o le faamama e tatau ona ave 640 faʻataʻitaʻiga ma faʻaoga 512 o latou, o le vaega o totoe aʻo leʻi faʻaputuina se vaega fou o faʻamaumauga. O le mea lea, o la tatou faamama, i le faaopoopo atu i lana galuega autu, e tatau ona tuʻuina atu ni gaioiga fesoasoani mo le teuina o faʻamatalaga faʻapipiʻi. O le au atiaʻe o le alalaupapa faʻasalalau ma fofo i lenei faʻafitauli lautele ua atiaʻe se mea faʻapitoa - MSBufferizer (bufferer), lea e foia ai lenei faʻafitauli e faʻaaoga ai tuples.

Taofi (MSBufferizer)

O se mea lea o le a faʻaputuina faʻamatalaga faʻapipiʻi i totonu o le faamama ma amata ona tuʻuina atu mo le gaioiga i le taimi lava e lava ai le aofaʻi o faʻamatalaga e faʻatautaia ai le algorithm filter. A'o fa'aputuina e le pa'u fa'amaumauga, o le faamama o le a fa'agaoioia i le fa'agasolo tulaga, e aunoa ma le fa'aogaina o le malosi o le gaosiga. Ae o le taimi lava e toe faafoi mai ai e le galuega faitau mai le bufferer se tau e ese mai i le zero, o le faagasologa () galuega a le faamama e amata ona ave ma faʻagasolo faʻamaumauga mai le paʻu i vaega o le tele manaʻomia, seia maeʻa.
O fa'amaumauga e le'i mana'omia o lo'o tumau pea i totonu o le pa'u e fai ma elemene muamua o le tuple, lea e fa'apipi'i atu i ai poloka o fa'amatalaga tu'uina.

Le fausaga o loʻo faʻamatalaina le paʻu:

struct _MSBufferizer{
queue_t q; /* Очередь сообщений. */
int size; /* Суммарный размер данных находящихся в буферизаторе в данный момент. */
};
typedef struct _MSBufferizer MSBufferizer;

Galuega mo le galulue faatasi ma MSBufferizer

Fausia se fa'ata'ita'iga fa'apolopolo fou:

MSBufferizer * ms_bufferizer_new(void);

Ua vaevae le manatua, amata i totonu ms_bufferizer_init() ma ua toe faafoi mai se faasinoala.

Galuega amata:

void ms_bufferizer_init(MSBufferizer *obj); 

Ua amatalia le laina q, fanua fua ua seti i le zero.

Fa'aopoopoina se fe'au:

void ms_bufferizer_put(MSBufferizer *obj, mblk_t *m); 

Ua faaopoopo le savali m i le laina. Ua fa'aopoopoina le aofa'i fuafuaina o poloka fa'amaumauga fua.

Fa'aliliuina fe'au uma mai le laina fa'amaumauga o feso'ota'iga i le pa'u q:

void ms_bufferizer_put_from_queue(MSBufferizer *obj, MSQueue *q);   

Fa'aliliuina o fe'au mai se so'oga q i totonu o le paʻu o loʻo faia e faʻaaoga ai le galuega ms_bufferizer_put().

Faitau mai le fa'apolopolo:

int ms_bufferizer_read(MSBufferizer *obj, uint8_t *data, int datalen); 

Afai o le tele o faʻamaumauga o loʻo faʻaputuina i totonu o le paʻu e laʻititi nai lo le mea na talosagaina (datalen), ona toe foʻi lea o le galuega i le zero, e le kopiina faʻamaumauga i faʻamaumauga. A leai, o le kopi fa'asolosolo o fa'amaumauga mai tuples o lo'o i totonu o le pa'u e faia. A maeʻa ona kopi, e tape le tuple ma faʻasaʻoloto le manatua. E muta le kopi ile taimi e kopi ai datalen bytes. Afai e alu le avanoa i le ogatotonu o se poloka faʻamatalaga, ona i ai lea i lenei savali, o le poloka faʻamaumauga o le a faʻaititia i le vaega o loʻo totoe e leʻi kopiina. O le isi taimi e te valaʻau ai, o le a faʻaauau le kopiina mai lea tulaga.

Faitau le aofaʻi o faʻamatalaga o loʻo avanoa nei i le paʻu:

int ms_bufferizer_get_avail(MSBufferizer *obj); 

Toe faafoi le fanua fua puipui.

La'esea o se vaega o fa'amaumauga i totonu o le pa'u:

void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);

Ole numera fa'amaonia o paita o fa'amaumauga e toe maua ma lafoa'i. Ua lafoa'i fa'amaumauga tuai.

Aveese uma fe'au i totonu o le pa'u:

void ms_bufferizer_flush(MSBufferizer *obj); 

O le fa'amaumauga fa'amaumauga ua toe setiina ile zero.

Aveese uma fe'au i totonu o le pa'u:

void ms_bufferizer_uninit(MSBufferizer *obj); 

E le toe setiina le fata.

Ave'ese le pa'u ma fa'asa'oloto le manatua:

void ms_bufferizer_destroy(MSBufferizer *obj);  

O faʻataʻitaʻiga o le faʻaogaina o le paʻu e mafai ona maua i le faʻailoga puna o le tele o faʻasalalauga streamer filiga. Mo se faʻataʻitaʻiga, i le MS_L16_ENC faamama, lea e toe faʻatulagaina paita i faʻataʻitaʻiga mai le faʻatonuga fesoʻotaʻiga i le faʻatonuga talimalo: l16.c

I le isi tala, o le a tatou vaʻavaʻai i le mataupu o le fua faʻatatau o uta ma pe faʻafefea ona faʻafetaui le tele o uta komepiuta i totonu o le aufaasālalau.

puna: www.habr.com

Faaopoopo i ai se faamatalaga