Ịchọgharị igwe Mediastreamer2 VoIP. Nkeji 11

A na-ewepụta ihe nke isiokwu ahụ site na nke m zen ọwa.

Ịchọgharị igwe Mediastreamer2 VoIP. Nkeji 11

Usoro mmegharị data

  • Mgbochi data dblk_t
  • Ozi mblk_t
  • Ọrụ maka iji ozi arụ ọrụ mblk_t
  • kwụ n'ahịrị_t
  • Ọrụ maka iji kwụ n'ahịrị arụ ọrụ queue_t
  • Na-ejikọta ihe nzacha
  • Ebe mgbaàmà nke eserese nhazi data
  • N'azụ ihe ngosi ihe omume nke akara
  • Bufferizer (MSBufferizer)
  • Ọrụ maka ịrụ ọrụ na MSBufferizer

Na nke ikpeazu ederede anyị emepụtala nzacha nke anyị. Edemede a ga-elekwasị anya na usoro dị n'ime maka ịkwaga data n'etiti nzacha mgbasa ozi. Nke a ga-enye gị ohere ide ihe nzacha ọkaibe na obere mbọ n'ọdịnihu.

Usoro mmegharị data

A na-eme mmegharị data na mgbasa ozi mgbasa ozi site na iji kwụ n'ahịrị nke usoro ahụ kọwara kwụ n'ahịrị_t. Ụdọ ozi dị ka mblk_t, nke n'onwe ha enweghị data mgbaàmà, ma ọ bụ naanị njikọ nke gara aga, ozi na-esote na ngọngọ data. Na mgbakwunye, achọrọ m imesi ike karịsịa na enwerekwa ubi maka njikọ na ozi nke otu ụdị, nke na-enye gị ohere ịhazi ndepụta ozi jikọtara otu. Anyị ga-akpọ otu ozi jikọtara ụdị ndepụta dị otu a tuple. Ya mere, ihe ọ bụla nke kwụ n'ahịrị nwere ike ịbụ otu ozi mblk_t, ma eleghị anya, isi nke ozi tuple mblk_t. Ozi tuple ọ bụla nwere ike ịnwe ngọngọ data ward nke ya. Anyị ga-atụle ihe mere e ji chọ tuples obere oge ka e mesịrị.

Dịka e kwuru n'elu, ozi ahụ n'onwe ya enweghị ngọngọ data kama ọ nwere naanị ihe nrịbama na ebe nchekwa ebe echekwara ngọngọ. N'akụkụ a, foto zuru ezu nke ọrụ mgbasa ozi mgbasa ozi na-echetara ụlọ nkwakọba ihe ọnụ ụzọ dị na cartoon "Monsters, Inc.," ebe ọnụ ụzọ (njikọ data - ọnụ ụlọ) na-aga n'ike n'ike n'akụkụ ndị na-ebufe elu, ebe ọnụ ụlọ n'onwe ha. nọgidesie ike.

Ugbu a, na-aga n'ihu na ndị isi site na ala ruo n'elu, ka anyị tụlee n'ụzọ zuru ezu ụlọ ọrụ ndị edepụtara nke usoro nnyefe data na mgbasa ozi mgbasa ozi.

ngọngọ data dblk_t

Ihe ngọngọ data nwere nkụnye eji isi mee na nchekwa data. A na-akọwa nkụnye eji isi mee ya site na nhazi a,

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

Ala nke ihe owuwu ahụ nwere ihe nrịbama na mmalite nke ihe nchekwa, njedebe nke ihe nchekwa, na ọrụ maka ihichapụ ihe nchekwa data. Ihe ikpeazụ dị na nkụnye eji isi mee db_ref - akwụkwọ ntụaka, ọ bụrụ na ọ ruru efu, nke a na-eje ozi dị ka mgbama ihichapụ ngọngọ a na ebe nchekwa. Ọ bụrụ na e mepụtara ngọngọ data site na ọrụ ahụ datab_alloc() , mgbe ahụ, a ga-edobe nchekwa data na ebe nchekwa ozugbo emechara nkụnye eji isi mee. N'ọnọdụ ndị ọzọ niile, nchekwa nwere ike ịnọ ebe dị iche iche. Ihe nchekwa data ga-enwe ihe nlele mgbaàmà ma ọ bụ data ndị ọzọ anyị chọrọ iji nzacha hazie.

A na-emepụta ihe atụ ọhụrụ nke ngọngọ data site na iji ọrụ:

dblk_t *datab_alloc(int size);

Dị ka ihe ntinye ntinye, a na-enye ya nha data nke ngọngọ ga-echekwa. A na-ekenye ebe nchekwa karịa ka idowe nkụnye eji isi mee - nhazi - na mmalite nke ebe nchekwa ekenyela datab. Mana mgbe ị na-eji ọrụ ndị ọzọ, nke a anaghị eme mgbe niile; n'ọnọdụ ụfọdụ, nchekwa data nwere ike ịdị iche na isi ihe mgbochi data. Mgbe ị na-emepụta ihe owuwu, a na-ahazi mpaghara ka ubi ya db_base rụtụrụ aka na mmalite nke mpaghara data, na db_lim ruo ọgwụgwụ ya. Ọnụ njikọ db_ref atọrọ na otu. Adokwa nrịbama ọrụ doro anya na efu.

Ozi mblk_t

Dị ka ekwuru, ihe ndị kwụ n'ahịrị bụ ụdị mblk_t, akowara ya dika ndia:

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;

Ọdịdị mblk_t nwere ntụnye na mbido b_buburu, b_ọzọ, nke dị mkpa iji hazie ndepụta ejikọtara okpukpu abụọ (nke bụ kwụ n'ahịrị kwụ n'ahịrị_t).

Mgbe ahụ pointer na-abịa b_cont, nke a na-eji naanị mgbe ozi bụ akụkụ nke tuple. Maka ozi ikpeazụ dị na tuple, nrịbama a ka bụ ihe efu.

Ọzọ anyị na-ahụ pointer na ngọngọ data b_data, nke ozi dị maka ya. A na-esote ya na ntụnye aka na mpaghara n'ime ihe nchekwa data ngọngọ. Ubi b_rptr na-akọwapụta ebe a ga-agụta data sitere na nchekwa. Ubi b_wpr na-egosi ebe a ga-esi na ya dee ihe nchekwa.

Ogige ndị fọdụrụ bụ nke ụdị ọrụ na anaghị emetụta ọrụ nke usoro ịnyefe data.

N'okpuru bụ otu ozi nwere aha m1 na ngọngọ data d1.
Ịchọgharị igwe Mediastreamer2 VoIP. Nkeji 11
Onu ogugu a na-egosi otutu ozi ato m1, m1_1, m1_2.
Ịchọgharị igwe Mediastreamer2 VoIP. Nkeji 11

Ọrụ izi ozi mblk_t

Ozi ọhụrụ mblk_t kere site na ọrụ:

mblk_t *allocb(int size, int pri); 

ọ na-etinye ozi ọhụrụ na ebe nchekwa mblk_t na ngọngọ data nke kpọmkwem nha size, arụmụka nke abụọ - pri ejighi ya na ụdị ọba akwụkwọ a. O kwesịrị ịdị efu. N'oge ọrụ ahụ, a ga-ekenye ebe nchekwa maka nhazi nke ozi ọhụrụ ahụ ma kpọọ ọrụ ahụ mblk_init(), nke ga-emegharị mpaghara niile nke ihe atụ emepụtara nke usoro ahụ wee jiri nke a kpọtụrụ aha n'elu datab_alloc(), ga-emepụta ihe nchekwa data. Mgbe nke ahụ gasịrị, a ga-ahazi mpaghara ndị dị na nhazi ahụ:

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

Na mmepụta anyị na-enweta ozi ọhụrụ nwere oghere ebidobere yana nchekwa data efu. Iji tinye data na ozi, ịkwesịrị idetu ya na ebe nchekwa data:

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

ebe data bụ ihe ntụnye aka na isi iyi data, na size - nha ha.
mgbe ahụ ịkwesịrị imelite ihe nrịbama na ebe ederede ka o wee tụọ aka ọzọ na mmalite nke ebe efu na nchekwa:

msg->b_wptr = msg->b_wptr + size

Ọ bụrụ na ịchọrọ ịmepụta ozi site na nchekwa dị adị, na-enweghị iṅomi, wee jiri ọrụ a:

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

Ọrụ ahụ, mgbe ịmepụtara ozi na nhazi nke ngọngọ data, ga-ahazi ihe ntinye ya na data na adreesị akuru. Ndị ahụ. N'okwu a, nchekwa data adịghị adị mgbe mpaghara nkụnye eji isi mee nke ngọngọ data, dị ka ọ dị mgbe ị na-emepụta ngọngọ data na ọrụ ahụ. datab_alloc(). Ihe nchekwa na data gafere na ọrụ ahụ ga-anọgide n'ebe ọ dị, ma site n'enyemaka nke ndị na-egosi ya, a ga-ejikọta ya na isi ihe ọhụrụ emepụtara nke ngọngọ data, na, ya mere, na ozi ahụ.

Na otu ozi mblk_t Enwere ike jikọta ọtụtụ ngọngọ data n'usoro. A na-eme nke a site na ọrụ:

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

mp - ozi nke a ga-agbakwunye ngọngọ data ọzọ;
data - pointer na ngọngọ, otu nke a ga-agbakwunye na ozi;
size - data size;
akwa - ọkọlọtọ na nha nke ebe nchekwa ekenyela ga-ahazi n'akụkụ oke 4-byte (a ga-eji ihe efu mee padding).

Ọ bụrụ na enwere ohere zuru oke na nchekwa data ozi dị, mgbe ahụ, a ga-edobe data ọhụrụ ahụ n'azụ data ahụ ugbua. Ọ bụrụ na enwere obere ohere na nchekwa data ozi karịa size, mgbe ahụ, a ga-emepụta ozi ọhụrụ nwere oke nchekwa zuru oke ma depụtaghachi data ahụ na nchekwa ya. Nke a bụ ozi ọhụrụ, jikọtara ya na nke mbụ na-eji ntụ ntụ b_cont. N'okwu a, ozi ahụ na-atụgharị na tuple.

Ọ bụrụ na ịchọrọ ịgbakwunye ngọngọ data ọzọ na tuple, mgbe ahụ ịkwesịrị iji ọrụ ahụ:

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

ọ ga-ahụ ozi ikpeazụ na tuple (o nwere b_cont ga-abụ efu) ma kpọọ ọrụ maka ozi a appendb().

Ị nwere ike chọpụta nha data dị na ozi ma ọ bụ tuple site na iji ọrụ:

int msgdsize(const mblk_t *mp);

ọ ga-apụ site na ozi niile dị na tuple wee weghachi mkpokọta data na nchekwa data nke ozi ndị ahụ. Maka ozi ọ bụla, a na-agbakọ ọnụọgụ data dị ka ndị a:

 mp->b_wptr - mp->b_rptr

Iji jikọta tuples abụọ, jiri ọrụ a:

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

ọ na-etinye tuple ahụ ọhụrụ na ọdụ nke tuple mp ma weghachite ntụnye aka na ozi ikpeazụ nke tuple dapụtara.

Ọ bụrụ na ọ dị mkpa, enwere ike ịtụgharị tuple ka ọ bụrụ otu ozi nwere otu ngọngọ data; a na-eme nke a site na ọrụ:

void msgpullup(mblk_t *mp,int len);

ọ bụrụ na arụmụka len bụ -1, mgbe ahụ, a na-ekpebi nha nke ihe nchekwa ekenyela na-akpaghị aka. Ọ bụrụ len bụ nọmba dị mma, a ga-emepụta ihe nchekwa nke nha a, a ga-e copyomi data ozi tuple n'ime ya. Ọ bụrụ na ihe nchekwa ahụ agwụ, nṅomi ga-akwụsị ebe ahụ. Ozi mbụ nke tuple ga-enweta ihe nchekwa nha ọhụrụ yana data e depụtaghachiri. A ga-ehichapụ ozi ndị fọdụrụ ma weghachite ebe nchekwa ahụ na ikpo.

Mgbe ị na-ehichapụ ihe owuwu mblk_t A na-eburu n'uche ọnụ ọgụgụ ntụaka nke ngọngọ data ma ọ bụrụ na, mgbe ị na-akpọ freeb() ọ tụgharịrị bụrụ efu, mgbe ahụ, a na-ehichapụ ihe nchekwa data yana ihe atụ mblk_t, nke na-arụtụ aka na ya.

Ịmalite mpaghara ozi ọhụrụ:

void mblk_init(mblk_t *mp);

Ịgbakwunye ibe data ọzọ na ozi ahụ:

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

Ọ bụrụ na data ọhụrụ ahụ adabaghị na ohere efu nke nchekwa data ozi, mgbe ahụ, a na-agbakwunye ozi nke emepụtara iche nke nwere ihe nchekwa nke nha achọrọ na ozi ahụ (a na-edobe nrịbama na ozi agbakwunyere na ozi mbụ) na ozi na-atụgharị ghọọ tuple.

Ịgbakwunye ibe data na tuple:

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

Ọrụ a na-akpọ appendb() na akaghị.

Na-ejikọta tuples abụọ n'ime otu:

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

Ozi ọhụrụ ga-agbakwunyere mp.

Ime otu ozi otu:

mblk_t *copyb(const mblk_t *mp);

Mpempe akwụkwọ tuple zuru ezu nwere ngọngọ data niile:

mblk_t *copymsg(const mblk_t *mp);

A na-eṅomi ihe ndị dị na tuple site na ọrụ ahụ copyb().

Mepụta nnomi ozi dị mfe mblk_t. N'okwu a, a naghị edegharị ngọngọ data ahụ, mana ọnụọgụ ntụaka ya na-abawanye db_ref:

mblk_t *dupb(mblk_t *mp);

Ime nnomi nke tuple dị fechaa. A naghị emepụtaghachi ngọngọ data, naanị ọnụ ọgụgụ ntụaka ha ka a na-abawanye db_ref:

mblk_t *dupmsg(mblk_t* m);

Na-ejikọta ozi niile nke tuple n'ime otu ozi:

void msgpullup(mblk_t *mp,size_t len);

Ọ bụrụ na arụmụka len bụ -1, mgbe ahụ, a na-ekpebi nha nke ihe nchekwa ekenyela na-akpaghị aka.

Na-ehichapụ ozi, tuple:

void freemsg(mblk_t *mp);

A na-eji otu belata ọnụ ọgụgụ ntụaka ngọngọ data. Ọ bụrụ na ọ ruru efu, a na-ehichapụkwa ngọngọ data.

Mgbakọ nke ngụkọta ego nke data na ozi ma ọ bụ tuple.

size_t msgdsize(const mblk_t *mp);

Iweghachite ozi site na ọdụ nke kwụ n'ahịrị:

mblk_t *ms_queue_peek_last (q);

Detuo ọdịnaya nke mpaghara echekwabara nke otu ozi n'ime ozi ọzọ (n'ezie, mpaghara ndị a nwere ọkọlọtọ nke igwe mgbasa ozi na-eji):

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

Kwuru kwụ n'ahịrị_t

A na-emejuputa kwụ n'ahịrị ozi dị na mgbasa ozi mgbasa ozi dịka ndepụta nwere njikọ okirikiri okirikiri. Ihe ndepụta nke ọ bụla nwere ihe ntụnye aka na ngọngọ data nwere ihe nlele mgbama. Ọ na-apụta na ọ bụ naanị ndị na-atụ aka na ngọngọ data na-aga n'otu n'otu, ebe data n'onwe ya na-anọgide na-enweghị isi. Ndị ahụ. naanị njikọ ha ka a na-ebugharị.
Nhazi na-akọwa kwụ n'ahịrị kwụ n'ahịrị_t, egosiri n'okpuru:

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

Ihe owuwu ahụ nwere ubi - pointer _q_nkwụsị ụdị *mblk_t, ọ na-atụ aka na nke mbụ element (ozi) na kwụ n'ahịrị. Akụkụ nke abụọ nke ihe owuwu ahụ bụ counter ozi na kwụ n'ahịrị.
Ọnụ ọgụgụ dị n'okpuru na-egosi kwụ n'ahịrị aha ya bụ q1 nwere ozi 4 m1, m2, m3, m4.
Ịchọgharị igwe Mediastreamer2 VoIP. Nkeji 11
Ọgụgụ na-egosi kwụ n'ahịrị aha ya bụ q1 nwere ozi 4 m1,m2,m3,m4. Ozi m2 bụ isi nke tuple nwere ozi abụọ ọzọ m2_1 na m2_2.

Ịchọgharị igwe Mediastreamer2 VoIP. Nkeji 11

Ọrụ maka iji kwụ n'ahịrị arụ ọrụ queue_t

Mmalite kwụ n'ahịrị:

void qinit(queue_t *q);

ubi _q_nkwụsị (nke a anyị ga-akpọ ya "nkwụsị") na-amalite site na ọrụ ahụ mblk_init(), a na-edozi ihe mbụ ya na ihe nrịbama na-esote ka ọ na-arụtụ aka n'onwe ya. A tọgharịrị counter element na kwụ n'ahịrị ka ọ bụrụ efu.

Na-agbakwụnye ihe ọhụrụ (ozi):

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

Ihe ọhụrụ m na-agbakwunyere na njedebe nke ndepụta ahụ, a na-edozi ihe nrịbama ihe ka onye nkwụsị ahụ wee bụrụ ihe na-esote maka ya, ọ na-aghọkwa ihe mbụ maka nkwụsị. A na-abawanye counter element na kwụ n'ahịrị.

Iweghachite mmewere na kwụ n'ahịrị:

mblk_t * getq(queue_t *q); 

Eweghachite ozi na-abịa mgbe ihe nkwụsịtụ gasịrị, a na-ebelatakwa counter element. Ọ bụrụ na enweghị ihe dị na kwụ n'ahịrị ma e wezụga ihe nkwụsị, mgbe ahụ 0 ga-eweghachite.

Ịtinye ozi n'ahịrị:

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

Mmewere mp etinyere tupu mmewere emp. Ọ bụrụ emp=0, wee tinye ozi na ọdụ nke kwụ n'ahịrị.

Iweghachite ozi n'isi ndị kwụ n'ahịrị:

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

A na-ebelata ọnụ ọgụgụ elementrị.

Ịgụ ntụnye aka na mmewere nke mbụ na kwụ n'ahịrị:

mblk_t * peekq(queue_t *q); 

Wepụ ihe niile na kwụ n'ahịrị ka ị na-ehichapụ ihe ndị ahụ n'onwe ha:

void flushq(queue_t *q, int how);

Arụmụka otú ejighi ya. Atọọla counter element na kwụ n'ahịrị ka ọ bụrụ efu.

Macro maka ịgụ ihe ntụnye aka na akụkụ ikpeazụ nke kwụ n'ahịrị:

mblk_t * qlast(queue_t *q);

Mgbe ị na-eji ahịrị ozi na-arụ ọrụ, mara na mgbe ị na-akpọ ms_queue_put(q, m) jiri akara efu na ozi ahụ, loops ọrụ. Mmemme gị ga-ajụ oyi. na-akpa àgwà otú ahụ ms_queue_esote(q, m).

Na-ejikọta ihe nzacha

A na-eji kwụ n'ahịrị akọwara n'elu bufee ozi site n'otu nzacha gaa na nke ọzọ ma ọ bụ site na otu gaa n'ọtụtụ nzacha. Ihe nzacha na njikọ ha na-etolite eserese eduzi. Ntinye ma ọ bụ mmepụta nke nzacha ka a ga-akpọ okwu izugbe "pin". Iji kọwaa usoro nke nzacha na-ejikọta ibe ha, mgbasa ozi mgbasa ozi na-eji echiche nke "ihe mgbaàmà". Ebe mgbaàmà bụ nhazi _MSCP ọnụ, nke nwere ihe nrịbama na nzacha na ọnụ ọgụgụ nke otu ntụtụ ya; ya mere, ọ na-akọwa njikọ nke otu ntinye ma ọ bụ ntinye nke nzacha.

Ebe mgbaàmà nke eserese nhazi data

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

Agụnyere ntụtụ nzacha malite na efu.

A na-akọwa njikọ nke ntụtụ abụọ site na kwụ n'ahịrị ozi site na nhazi ahụ _MSQueue, nke nwere kwụ n'ahịrị ozi na ntụnye aka n'ebe mgbama abụọ ọ jikọtara:

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

Anyị ga-akpọ ihe owuwu a njikọ mgbama. Ihe nzacha mgbasa ozi ọ bụla nwere okpokoro njikọ ntinye na tebụl nke njikọ mmepụta (MSQueue). A na-edobe nha nke tebụl mgbe ị na-emepụta nzacha; anyị emeela nke a site na iji ụdị mgbanwe mbupụ MSFilterDesc, mgbe anyị mepụtara nzacha nke anyị. N'okpuru bụ nhazi nke na-akọwa nzacha ọ bụla dị na mgbasa ozi mgbasa ozi, 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;

Mgbe anyị jikọtara ihe nzacha na mmemme C dị ka atụmatụ anyị si dị (mana ejikọtaghị akara), anyị si otú ahụ mepụta eserese eduzi, ọnụ nke ọnụ ya bụ ihe atụ nke nhazi ahụ. MSFilter, na akụkụ bụ ihe atụ nke njikọ MSQueue.

N'azụ ihe ngosi ihe omume nke akara

Mgbe m gwara gị na akara bụ ihe nzacha maka isi iyi akọrọ, ọ bụghị eziokwu niile gbasara ya. Akara bụ ihe na-arụ ọrụ na elekere usoro () ihe nzacha niile nke sekit (graph) nke ejikọtara ya. Mgbe anyị jikọtara akara na nzacha eserese na mmemme C, anyị na-egosi akara ngosi eserese nke ọ ga-ejikwa ugbu a ruo mgbe anyị gbanyụọ ya. Mgbe njikọ ahụ gasịrị, akara na-amalite inyocha eserese e nyere n'aka ya, na-achịkọta ndepụta nzacha gụnyere ya. Ka ị ghara “gụọ” otu nzacha ugboro abụọ, ọ na-aka ihe nzacha achọpụtara site n'itinye igbe nbanye n'ime ha. hụrụ. A na-eme nyocha ahụ site na iji tebụl njikọ nke nzacha ọ bụla nwere.

N'oge nlegharị anya mmalite nke eserese ahụ, akara akara na-enyocha ma n'ime nzacha ahụ enwere opekata mpe nke na-eme dị ka isi iyi nke ngọngọ data. Ọ bụrụ na enweghị nke ọ bụla, mgbe ahụ a na-ahụta eserese ahụ ezighi ezi ma akara akara ahụ daa.

Ọ bụrụ na eserese ahụ bụrụ “ziri ezi”, maka nzacha ọ bụla achọtara, a na-akpọ ọrụ ahụ maka ibido ya nhazi usoro(). Ozugbo oge ruru maka usoro nhazi ọzọ (ihe ọ bụla milliseconds 10 na ndabara), akara na-akpọ ọrụ ahụ. usoro () maka ihe nzacha isi mmalite niile achọtara na mbụ, yana maka nzacha ndị fọdụrụ na listi ahụ. Ọ bụrụ nzacha nwere njikọ ntinye, wee na-arụ ọrụ ahụ usoro () na-emeghachi ruo mgbe ahịrị njikọ ntinye tọgbọrọ chakoo. Mgbe nke a gasịrị, ọ na-aga n'ihu na nzacha ọzọ na listi ahụ wee "pịgharịa" ya ruo mgbe njikọ ntinye enweghị ozi. Akara ngosi na-esi na nzacha gaa nzacha ruo mgbe ndepụta ga-agwụ. Nke a na-emecha nhazi nke okirikiri.

Ugbu a, anyị ga-alaghachi na tuples ma kwuo maka ihe kpatara eji gbakwunye ihe dị otú ahụ na mgbasa ozi mgbasa ozi. N'ozuzu, ọnụọgụ data achọrọ site na algọridim na-arụ ọrụ n'ime nzacha adịghị adabara ma ọ bụghị otutu nke nha nke nchekwa data enwetara na ntinye. Dịka ọmụmaatụ, anyị na-ede nzacha nke na-eme mgbanwe ngwa ngwa Fourier, nke site na nkọwa nwere ike ịhazi naanị ngọngọ data nke nha ya bụ ike nke abụọ. Ka ọ bụrụ ọnụ ọgụgụ 512. Ọ bụrụ na ọwa ekwentị mepụtara data ahụ, mgbe ahụ, nchekwa data nke ozi ọ bụla na ntinye ga-ewetara anyị akara ngosi 160. Ọ na-achọsi ike ịghara ịnakọta data site na ntinye ruo mgbe ọnụọgụ data achọrọ dị. Mana n'okwu a, nkukota ga-eme na akara akara, nke ga-eme nke ọma ịnwa ịpịgharịa nzacha ahụ ruo mgbe njikọ ntinye tọgbọ chakoo. Na mbụ, anyị họpụtara iwu a dị ka ụkpụrụ nke atọ nke nzacha. Dịka ụkpụrụ a siri dị, ọrụ () nke nzacha ga-enwerịrị data niile sitere na ahịrị ntinye.

Na mgbakwunye, ọ gaghị ekwe omume iwere naanị ihe nlele 512 site na ntinye, ebe ọ bụ na ị nwere ike were naanị ngọngọ dum, ya bụ. nzacha ga-ewere 640 samples na-eji 512 n'ime ha, nke fọdụrụ tupu achịkọta ọhụrụ akụkụ nke data. Ya mere, nzacha anyị, na mgbakwunye na ọrụ ya bụ isi, ga-enyerịrị ihe enyemaka maka nchekwa etiti nke data ntinye. Ndị mmepe nke mgbasa ozi mgbasa ozi na ngwọta maka nsogbu a n'ozuzu emepụtala ihe pụrụ iche - MSBufferizer (bufferer), nke na-edozi nsogbu a site na iji tuples.

Bufferizer (MSBufferizer)

Nke a bụ ihe ga-akwakọba data ntinye n'ime nzacha wee malite ịnye ya maka nhazi ozugbo ọnụọgụ ozi zuru ezu iji mee algọridim nzacha. Mgbe ihe nchekwa ahụ na-achịkọta data, nzacha ahụ ga-arụ ọrụ na ọnọdụ efu, na-ejighi ike nhazi nke ihe nrụpụta. Ma ozugbo ọrụ agụ sitere na onye na-ebu ihe laghachiri uru na-abụghị efu, ọrụ () nke nzacha na-amalite iwere na nhazi data sitere na onye na-echekwa ihe na akụkụ nke nha achọrọ, ruo mgbe ike gwụrụ ya.
Data nke a na-achọbeghị na-anọgide na nchekwa dị ka ihe mbụ nke tuple, nke etinyere ihe mgbochi data ntinye na-esote.

Nhazi nke na-akọwa ihe nchekwa:

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

Ọrụ maka ịrụ ọrụ na MSBufferizer

Ịmepụta ihe nchekwa ọhụrụ:

MSBufferizer * ms_bufferizer_new(void);

Edebere ebe nchekwa, bido ya ms_bufferizer_init() a na-eweghachikwa pointer.

Ọrụ mmalite:

void ms_bufferizer_init(MSBufferizer *obj); 

kwụ n'ahịrị na-amalite q, ubi size atọrọ ka ọ bụrụ efu.

Na-agbakwụnye ozi:

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

A na-agbakwunye ozi m na kwụ n'ahịrị. A na-agbakwunye nha nke ngọngọ data gbakọrọ na size.

Na-ebufe ozi niile site na kwụ n'ahịrị data njikọ gaa na nchekwa q:

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

Na-ebufe ozi site na njikọ q na nchekwa a na-eme site na iji ọrụ ahụ ms_bufferizer_put().

Ọgụgụ sitere na nchekwa:

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

Ọ bụrụ na nha data achịkọbara na nchekwa erughị nke achọrọ (datalen), mgbe ahụ, ọrụ ahụ na-eweghachi efu, anaghị emepụtaghachi data na data. Ma ọ bụghị ya, a na-eme nnomi data n'usoro site na tuples dị na nchekwa. Mgbe emechara, a ga-ehichapụ tuple ma hapụ ebe nchekwa ahụ. Iṅomi na-agwụ n'oge a na-eṅomi datalen bytes. Ọ bụrụ na ohere na-agbapụ n'etiti ngọngọ data, mgbe ahụ na ozi a, a ga-ebelata ngọngọ data ahụ na akụkụ nke fọdụrụ na-enweghị mbipụta. Oge ọzọ ị ga-akpọ, nnomi ga-aga n'ihu site na ebe a.

Ịgụ ọnụọgụ data dị ugbu a na nchekwa:

int ms_bufferizer_get_avail(MSBufferizer *obj); 

Na-eweghachi ubi ahụ size ihe nchekwa.

Na-atụfu akụkụ nke data na nchekwa:

void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);

A na-eweghachite ma tụfuo ọnụọgụ bytes nke data akọwapụtara. A na-atụfu data kacha ochie.

Ihichapụ ozi niile dị na nchekwa:

void ms_bufferizer_flush(MSBufferizer *obj); 

Atọgharịrị counter data ka ọ bụrụ efu.

Ihichapụ ozi niile dị na nchekwa:

void ms_bufferizer_uninit(MSBufferizer *obj); 

Atọgharịghị counter.

Iwepu ihe nchekwa na ebe nchekwa na-atọhapụ:

void ms_bufferizer_destroy(MSBufferizer *obj);  

Enwere ike ịhụ ọmụmaatụ nke iji ihe nchekwa na koodu isi mmalite nke ọtụtụ nzacha mgbasa ozi. Dịka ọmụmaatụ, na nzacha MS_L16_ENC, nke na-ahazigharị bytes dị na nlele site na usoro netwọkụ na usoro nnabata: l16.c

N'isiokwu na-esonụ, anyị ga-eleba anya n'okwu gbasara ịkọ ibu dị na akara akara yana ụzọ a ga-esi lụso ibu ịgbakọ oke na mgbasa ozi mgbasa ozi.

isi: www.habr.com

Tinye a comment