Te tirotiro i te miihini Mediastreamer2 VoIP. Wāhanga 11

Ko nga rauemi o te tuhinga i tangohia mai i taku zen teihana.

Te tirotiro i te miihini Mediastreamer2 VoIP. Wāhanga 11

Tikanga nekehanga raraunga

  • Paraka raraunga dblk_t
  • Karere mblk_t
  • Nga mahi mo te mahi me nga karere mblk_t
  • Tūtira tūtira_t
  • Nga mahi mo te mahi me nga rarangi queue_t
  • Hononga tātari
  • Tohu tohu o te kauwhata tukatuka raraunga
  • Kei muri i nga mahi a te tohu
  • Kaipupuri (MSBufferizer)
  • Nga mahi mo te mahi me MSBufferizer

I nga ra o mua Tuhinga kua whakawhanakehia e matou ta matou ake tātari. Ka arotahi tenei tuhinga ki te tikanga o roto mo te nuku raraunga i waenga i nga whiriwhiringa riipene pāpāho. Ma tenei ka taea e koe te tuhi i nga whiriwhiringa maamaa me te iti o te kaha a muri ake nei.

Tikanga nekehanga raraunga

Ko te nekehanga o nga raraunga i roto i te riipene pāpāho ka mahia ma te whakamahi i nga rarangi e whakaahuatia ana e te hanganga tūtira_t. Nga aho o nga karere penei mblk_t, karekau he raraunga tohu, engari ka hono noa ki te karere o mua, o muri mai me te poraka raraunga. I tua atu, e hiahia ana ahau ki te whakanui ake he waahi ano mo te hono ki tetahi karere o taua momo, ka taea e koe te whakarite i tetahi rarangi hono takitahi o nga karere. Ka karangahia e matou he roopu o nga karere kua whakakotahihia e taua rarangi he tuple. No reira, ko tetahi huānga o te tūtira he karere kotahi mblk_t, me te upoko pea o te tuple karere mblk_t. Ka taea e ia karere tuple tana ake paraka raraunga paroita. Ka matapakihia he aha i hiahiatia ai nga tuple i muri tata nei.

Ka rite ki te korero i runga ake nei, ko te karere ake kaore he poraka o nga raraunga kei roto, engari, he tohu tohu ki te waahi mahara kei te rongoa te poraka. I tenei wahanga, ko te pikitia whanui o nga mahi a te kaikawe panui he maumahara ki te whare putunga kuaha i te pakiwaituhi "Monsters, Inc.," kei reira nga tatau (hono ki nga raraunga - ruma) e neke tere ana i runga i nga kaikawe o runga, ko nga ruma tonu. noho kore korikori.

Inaianei, e neke haere ana i te hierarchy mai i raro ki runga, kia ata tirohia nga hinonga kua whakarārangihia o te tikanga tuku raraunga i roto i te riipene pāpāho.

Paraka raraunga dblk_t

Kei roto i te paraka raraunga he pane me te parepare raraunga. Ko te pane e whakaahuatia ana e te hanganga e whai ake nei,

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

Kei roto i nga mara o te hanganga nga tohu tohu ki te timatanga o te kaitarai, te mutunga o te kaapiri, me te mahi mo te whakakore i te parapara raraunga. Huānga whakamutunga i te pane db_ref — porotiti tohutoro, mena ka eke ki te kore, he tohu tenei ki te whakakore i tenei poraka mai i te mahara. Mena i hangaia te poraka raraunga e te mahi raraungab_alloc() , katahi ka tuuhia te putunga raraunga ki te mahara i muri tonu i te pane. I etahi atu take katoa, ka taea te noho motuhake te kaitarai. Kei roto i te papaa raraunga he tauira tohu, etahi atu raraunga ranei e hiahia ana matou ki te tukatuka me nga whiriwhiringa.

Ka hangaia he tauira hou o te paraka raraunga ma te whakamahi i te mahi:

dblk_t *datab_alloc(int size);

Hei tawhā whakauru, ka tukuna te rahi o nga raraunga ka penapenahia e te poraka. He maha ake nga mahara ka tohatohahia hei whakanoho i tetahi pane - hanganga - ki te timatanga o te mahara kua tohatohahia raraungab. Engari i te wa e whakamahi ana i etahi atu mahi kaore tenei e puta i nga wa katoa; i etahi wa, ka wehe ke te papaa raraunga mai i te pane paraka raraunga. I te wa e hanga ana he hanganga, ka whirihorahia nga mara kia pai ai tana mara db_base tohu ki te timatanga o te rohe raraunga, a db_lim ki tona mutunga. Tatau hono db_ref kua whakaritea ki te kotahi. Kua tautuhia te atatohu mahi maamaa raraunga ki te kore.

Karere mblk_t

E ai ki te korero, he momo momo huānga tūtira mblk_t, kua tautuhia e whai ake nei:

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;

hanganga mblk_t he tohu tohu kei te timatanga b_mua, b_muri, e tika ana hei whakarite rarangi hono-rua (he rarangi tūtira_t).

Na ka tae mai te tohu b_cont, ka whakamahia noa ina he wahanga te karere o te tuple. Mo te karere whakamutunga i roto i te tuple, ka noho kore tenei tohutohu.

I muri mai ka kite tatou i tetahi tohu tohu ki tetahi poraka raraunga b_raraunga, mo reira te karere. Ka whaia e nga tohutoro ki te waahi kei roto i te parapara raraunga parepare. Mara b_rptr ka tohu i te waahi ka panuihia nga raraunga mai i te kaitarai. Mara b_wptr e tohu ana i te waahi ka mahia te tuhi ki te papaa.

Ko nga mara e toe ana he ahua ratonga me te kore e pa ki te mahi o te tikanga whakawhiti raraunga.

Kei raro nei he karere kotahi me te ingoa m1 me te poraka raraunga d1.
Te tirotiro i te miihini Mediastreamer2 VoIP. Wāhanga 11
Ko te ahua e whai ake nei e whakaatu ana i tetahi tuple o nga karere e toru m1, m1_1, m1_2.
Te tirotiro i te miihini Mediastreamer2 VoIP. Wāhanga 11

Nga mahi Karere mblk_t

He karere hou mblk_t i hangaia e te mahi:

mblk_t *allocb(int size, int pri); 

ka waiho e ia he karere hou ki te mahara mblk_t me te poraka raraunga o te rahi kua tohua rahi, tohenga tuarua - Tuhinga kaore i whakamahia ki tenei putanga o te whare pukapuka. Me noho kore. I te wa e mahi ana te mahi, ka tohatohahia te mahara mo te hanganga o te karere hou ka karangahia te mahi mblk_init(), ka tautuhi ano i nga mara katoa o te tauira hanga o te hanganga, katahi ka, ma te whakamahi i nga korero i runga ake nei raraungab_alloc(), ka waihangahia he parepare raraunga. Muri iho ka whirihorahia nga mara o te hanganga:

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

I te putanga ka tae mai he karere hou me nga mara kua arawhitia me te putunga raraunga kau. Hei tāpiri raraunga ki tētahi karere, me tārua e koe ki te pūreirei paraka raraunga:

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

te wahi raraunga he tohutohu ki te puna raraunga, a rahi - to ratou rahi.
katahi ka hiahia koe ki te whakahōu i te atatohu ki te tohu tuhi kia tohu ano ki te timatanga o te waahi koreutu i roto i te papaaru:

msg->b_wptr = msg->b_wptr + size

Mena ka hiahia koe ki te hanga i tetahi karere mai i tetahi kaitarai o mua, me te kore e kape, whakamahia te mahi:

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

Ko te mahi, i muri i te hanga i te karere me te hanganga o te poraka raraunga, ka whirihora i ona tohu ki nga raraunga i te wahitau bu. Ko era. i roto i tenei take, kaore i te waahi te papaa raraunga i muri i nga waahi pane o te paraka raraunga, penei i te wa i hangaia ai he poraka raraunga me te mahi. raraungab_alloc(). Ko te papaa me nga raraunga kua tukuna ki te mahi ka noho tonu ki te waahi, engari ma te awhina o nga tohu ka piri ki te pane hou o te poraka raraunga, a, na reira, ki te karere.

Ki tetahi karere mblk_t He maha nga poraka raraunga ka taea te whakakotahi i te raupapa. Ka mahia tenei e te mahi:

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

mp — he karere ka taapirihia tetahi atu poraka raraunga;
raraunga — tohutoro ki te poraka, ka taapirihia he kape ki te panui;
rahi — rahi raraunga;
papa — he haki e tika ana kia whakatiarohia te rahi o te mahara kua tohaina ki te rohenga 4-paita (ka mahia te paera me nga kore).

Mēnā he nui te mokowā i roto i te pūrei raraunga karere o nāianei, kātahi ka whakapirihia ngā raraunga hōu ki muri i ngā raraunga kei reira kē. Mēnā he iti ake te mokowā wātea i roto i te pūreire raraunga karere rahi, katahi ka hangaia he karere hou me te rahi o te paatete ka kapea te raraunga ki tona papaa. He karere hou tenei, e hono ana ki te mea taketake ma te whakamahi i te atatohu b_cont. I tenei take, ka huri te karere ki te tuple.

Mena ka hiahia koe ki te taapiri i tetahi atu poraka raraunga ki te tuple, me whakamahi koe i te mahi:

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

ka kitea e ia te karere whakamutunga i roto i te tuple (kei a ia b_cont ka kore) ka karangahia te mahi mo tenei karere tāpirib().

Ka kitea e koe te rahi o nga raraunga i roto i tetahi karere, tuple ranei ma te whakamahi i te mahi:

int msgdsize(const mblk_t *mp);

ka huri ki roto i nga karere katoa i roto i te tuple ka whakahoki i te tapeke o nga raraunga kei roto i nga papaa raraunga o aua karere. Mo ia karere, ka tatauhia te nui o nga raraunga e whai ake nei:

 mp->b_wptr - mp->b_rptr

Hei whakakotahi i nga tuple e rua, whakamahia te mahi:

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

ka apitihia e ia te tuple hou ki te hiku o te tuple mp ka whakahoki i te atatohu ki te karere whakamutunga o te tuple ka puta.

Mena e tika ana, ka taea te huri i te tuple hei karere kotahi me te poraka raraunga kotahi; ka mahia tenei ma te mahi:

void msgpullup(mblk_t *mp,int len);

ki te tautohe len ko te -1, katahi ka whakatau aunoa i te rahi o te parapara kua tohaina. Mehemea len he tau pai, ka hangaia he parepare penei te rahi, ka kapehia nga raraunga karere tuple ki roto. Ki te pau te parepare, ka mutu te kape ki reira. Ko te karere tuatahi o te tuple ka whiwhi i tetahi papaa rahi hou me nga raraunga kua kapea. Ka mukua nga toenga o nga karere ka whakahokia te mahara ki te puranga.

I te wa e whakakore ana i tetahi hanganga mblk_t ko te kaute tohutoro o te poraka raraunga ka whakaarohia mena, i te wa e waea ana freeb() ka puta ko te kore, katahi ka mukua te kaipara raraunga me te tauira mblk_t, e tohu ana ki a ia.

Te arataki i nga mara o te karere hou:

void mblk_init(mblk_t *mp);

Te taapiri i tetahi atu waahanga raraunga ki te karere:

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

Mena karekau nga raraunga hou e uru ki roto i te waahi waatea o te kaipara raraunga karere, katahi ka honoa he karere i hanga motuhake me te paanui o te rahi e hiahiatia ana ki te karere (he tohu tohu ki te karere taapiri kua tohua ki te karere tuatahi) me te ka huri te karere ki te tuple.

Te taapiri i tetahi waahanga raraunga ki te tuple:

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

Ka karanga te mahi ki te appendb() i roto i te kopikopiko.

Te whakakotahi i nga tuple e rua ki te kotahi:

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

Karere hou ka piri ki mp.

Te hanga kape o te karere kotahi:

mblk_t *copyb(const mblk_t *mp);

Whakaotia te kape o te tuple me nga paraka raraunga katoa:

mblk_t *copymsg(const mblk_t *mp);

Ko nga huānga o te tuple ka kapehia e te mahi kapeb().

Waihangatia he kape ngawari o te karere mblk_t. I tenei keehi, kaore i te kapehia te paraka raraunga, engari ka piki ake tana kaute tohutoro db_ref:

mblk_t *dupb(mblk_t *mp);

Te hanga kape mama o te tuple. Ko nga poraka raraunga kaore i te kapehia, ko o raatau tohutoro anake ka piki ake db_ref:

mblk_t *dupmsg(mblk_t* m);

Te whakapiri i nga karere katoa o te tuple ki te karere kotahi:

void msgpullup(mblk_t *mp,size_t len);

Mena te tautohe len ko te -1, katahi ka whakatau aunoa i te rahi o te parapara kua tohaina.

Te muku i te karere, tuple:

void freemsg(mblk_t *mp);

Ko te kaute tohutoro o te poraka raraunga ka whakahekehia e te kotahi. Mena ka eke ki te kore, ka mukua ano te paraka raraunga.

Te tātaitanga o te tapeke o nga raraunga i roto i te karere, te tuple ranei.

size_t msgdsize(const mblk_t *mp);

Te tiki karere mai i te hiku o te tūtira:

mblk_t *ms_queue_peek_last (q);

Te tārua i ngā ihirangi o ngā āpure kua rāhuitia o tētahi karere ki tētahi atu karere (mehemea, kei roto i ēnei āpure ngā haki e whakamahia ana e te kairere pāpāho):

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

Koinei tūtira_t

Ko te rarangi karere i roto i te riipene pāpāho ka whakatinanahia hei rarangi hono-rua porohita. Kei ia huānga rārangi he atatohu ki te paraka raraunga me nga tauira tohu. Ko te ahua ko nga tohu tohu ki te paraka raraunga ka huri haere, ko te raraunga tonu ka noho kore. Ko era. Ko nga hononga anake ki a raatau ka nekehia.
Hanganga e whakaahua ana i te rarangi tūtira_t, e whakaatuhia ana i raro nei:

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

Kei roto i te hanganga he mara - he atatohu _q_tupare momo *mblk_t, ka tohu ki te huānga tuatahi (karere) i te rarangi. Ko te mara tuarua o te hanganga ko te porotiti o nga karere i te rarangi.
Ko te ahua i raro nei e whakaatu ana i te rarangi ingoa q1 e 4 nga karere m1, m2, m3, m4.
Te tirotiro i te miihini Mediastreamer2 VoIP. Wāhanga 11
Ko te ahua e whai ake nei e whakaatu ana i te rarangi ingoa q1 e 4 nga karere m1,m2,m3,m4. Ko te karere m2 te upoko o te tuple e rua ano nga karere m2_1 me te m2_2.

Te tirotiro i te miihini Mediastreamer2 VoIP. Wāhanga 11

Nga mahi mo te mahi me nga rarangi queue_t

Arawhitinga tūtira:

void qinit(queue_t *q);

mara _q_tupare (i muri nei ka kiia e matou ko te "topper") kua arawhitihia e te mahi mblk_init(), ko tana huānga o mua me te atatohu huānga e whai ake nei ka whakatikahia kia tohu ki a ia ano. Kua tautuhia te porotiti huānga tūtira ki te kore.

Tāpiri huānga hōu (karere):

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

Huānga hou m ka tapirihia ki te mutunga o te rarangi, ka whakatikahia nga tohu tohu huānga kia noho ai te aukati hei huānga e whai ake nei, ka noho hei huānga o mua mo te aukati. Ka piki ake te porotiti huānga tūtira.

Te tiki huānga mai i te tūtira:

mblk_t * getq(queue_t *q); 

Ko te karere ka puta mai i muri i te tikinga o te kaarai, ka whakahekehia te porotiti huānga. Mena karekau he huānga kei roto i te rarangi engari ko te kati, ka whakahokia te 0.

Te kōkuhu karere ki te tūtira:

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

Tuhinga mp ka whakauruhia ki mua i te huānga EMP. Mena EMP=0, kātahi ka tāpirihia te karere ki te hiku o te tūtira.

Te tiki karere mai i te upoko o te rarangi:

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

Kua whakahekehia te porotiti huānga.

Te panui i te atatohu ki te huānga tuatahi o te rarangi:

mblk_t * peekq(queue_t *q); 

Te tango i nga huānga katoa mai i te rarangi i te wa e mukua ana nga huānga ake:

void flushq(queue_t *q, int how);

tautohe pehea kaore i whakamahia. Kua tautuhia te porotiti huānga tūtira ki te kore.

Tonotono mo te panui tohutohu ki te huānga whakamutunga o te tūtira:

mblk_t * qlast(queue_t *q);

I te wa e mahi ana me nga rarangi karere, kia mohio koe ina waea ana koe ms_queue_put(q, m) me te tohu tohu kore ki te karere, ka huri te mahi. Ka whakatio to hotaka. he rite te ahua ms_queue_next(q, m).

Hononga tātari

Ko te rarangi kua whakaahuatia i runga ake nei ka whakamahia hei whakawhiti karere mai i tetahi tātari ki tetahi atu, mai i tetahi ki etahi whiriwhiringa. Ko nga whiriwhiringa me o raatau hononga he kauwhata whai. Ko te whakauru, te putanga ranei o te tātari ka kiia ko te kupu whanui "pin". Hei whakaahua i te raupapa e hono ana nga whiriwhiringa ki a raua ano, ka whakamahia e te kaikawe panui te kaupapa o te "tohu tohu". Ko te tohu tohu he hanganga _MSCPoint, kei roto he atatohu ki te tātari me te maha o tetahi o ona titi; na reira, ka whakaahuahia te hononga o tetahi o nga whakaurunga, nga putanga ranei o te tātari.

Tohu tohu o te kauwhata tukatuka raraunga

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

Ka tatauhia nga titi tātari mai i te kore.

Ko te hononga o nga titi e rua ma te rarangi karere e whakaahuatia ana e te hanganga _MSQueue, kei roto he rarangi karere me nga tohutohu ki nga tohu tohu e rua e hono ana:

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

Ka kiia tenei hanganga he hononga tohu. Kei ia tātari roma pāpāho he ripanga hononga whakauru me tetahi ripanga hononga whakaputa (MSQueue). Kua whakaritea te rahi o nga ripanga i te wa e hanga ana i te tātari; kua mahia e matou ma te whakamahi i te momo taurangi kaweake MSFilterDesc, i te wa i whakawhanakehia e matou ta matou ake tātari. Kei raro nei he hanganga e whakaahua ana i tetahi tātari i roto i te riipene pāpāho, 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;

Whai muri i te hono i nga whiriwhiringa i roto i te kaupapa C i runga i ta maatau mahere (engari kaore i honoa te tohu tohu), na reira i hanga e matou he kauwhata whai, ko nga pona he tauira o te hanganga. MSFilter, ko nga tapa he tauira o nga hononga MSQueue.

Kei muri i nga mahi a te tohu

I taku korero ki a koe ko te tohu he tātari mo te puna o nga tohu, ehara i te mea pono katoa. Ko te tohu tohu he ahanoa e whakahaere ana i nga mahi i runga i te karaka tukanga() nga whiriwhiringa katoa o te iahiko (kauwhata) e hono ana. Ina hono tatou i te tohu ki te tātari kauwhata i roto i te papatono C, ka whakaatuhia e tatou te tohu ki te kauwhata ka whakahaeretia mai i naianei tae noa ki te whakaweto. Whai muri i te hono, ka timata te tohu ki te tirotiro i te kauwhata i tukua ki a ia hei tiaki, ka whakahiato i te rarangi o nga whiriwhiringa kei roto. Kia kore ai e "tatau" taua tātari kia rua nga wa, ka tohuhia nga whiriwhiringa kua kitea ma te whakanoho pouakataki ki roto. kite. Ka mahia te rapu ma te whakamahi i nga ripanga hono kei ia tātari.

I roto i tana haerenga whakataki o te kauwhata, ka tirohia e te tohu mena kei roto i nga whiriwhiringa he kotahi te mea hei puna mo nga poraka raraunga. Mena karekau, ka kiia he he te kauwhata, ka pakaru te tohu.

Mena ka puta he "tika" te kauwhata, mo ia tātari i kitea, ka karangahia te mahi mo te arawhiti tukanga mua(). Ka tae mai te wa mo te huringa tukatuka e whai ake nei (ia 10 milliseconds ma te taunoa), ka karangahia e te tohu te mahi. tukanga() mo nga whiriwhiringa puna katoa i kitea i mua, katahi mo nga toenga whiriwhiringa kei te rarangi. Mena he hononga whakauru te tātari, katahi ka whakahaere i te mahi tukanga() ka tukurua kia kore ra ano nga rarangi hono whakaurunga. I muri i tenei, ka neke atu ki te tātari i muri mai i te rarangi ka "panuku" kia kore noa nga karere whakaurunga. Ka neke te tohu mai i te tātari ki te tātari tae noa ki te mutunga o te raarangi. Ka oti i tenei te tukatuka o te huringa.

Inaianei ka hoki ano tatou ki nga tuple me te korero mo te take i taapirihia ai taua hinonga ki te riipene panui. I te nuinga o te waa, ko te nui o nga raraunga e hiahiatia ana e te algorithm e mahi ana i roto i te tātari karekau i te riterite, ehara hoki i te maha o te rahi o nga papaa raraunga i riro mai i te whakaurunga. Hei tauira, kei te tuhi matou i te tātari e mahi ana i te huringa Fourier tere, ma te whakamaramatanga ka taea anake te tukatuka poraka raraunga ko tona rahi he mana o te rua. Kia 512 tatau. Mena ka hangaia nga raraunga e te hongere waea, katahi ka kawea mai e te kaitao raraunga o ia karere i te whakaurunga 160 nga tauira tohu. He mea whakamatautau kia kaua e kohi raraunga mai i te whakaurunga kia tae ra ano te nui o nga raraunga e hiahiatia ana. Engari i tenei keehi, ka puta he tukinga ki te tohu, karekau e ngana ki te panuku i te tātari tae noa ki te watea o te hono whakauru. I mua, i tohua e matou tenei ture hei maapono tuatoru o te tātari. E ai ki tenei maataapono, me tango e te mahinga a te tātari() nga raraunga katoa mai i nga rarangi whakauru.

I tua atu, kaore e taea te tango i nga tauira 512 anake mai i te whakauru, na te mea ka taea e koe anake te tango i nga poraka katoa, i.e. me tango e te tātari nga tauira 640 me te whakamahi i te 512 o era, ko te toenga i mua i te whakaemi i tetahi waahanga raraunga hou. Na, ko ta maatau tātari, hei taapiri i ana mahi matua, me whakarato nga mahi awhina mo te rokiroki takawaenga o nga raraunga whakauru. Ko nga kaiwhakawhanake o te riipene pāpāho me te otinga ki tenei raru whanui kua whakawhanakehia he ahanoa motuhake - MSBufferizer (bufferer), e whakaoti ana i tenei raru ma te whakamahi i nga tuple.

Kaipupuri (MSBufferizer)

He ahanoa tenei ka kohia nga raraunga whakauru ki roto i te tātari ka tiimata ki te tuku mo te tukatuka ina ranea te nui o nga korero hei whakahaere i te algorithm tātari. I te wa e kohi raraunga ana te kaipara, ka mahi te tātari i roto i te aratau mangere, me te kore e whakamahi i te mana tukatuka o te tukatuka. Engari i te wa ka whakahokia mai e te mahi panui mai i te kaitarai he uara ke atu i te kore, ka timata te mahinga () o te tātari ki te tango me te tukatuka raraunga mai i te kaitarai i roto i nga waahanga o te rahi e hiahiatia ana, kia pau ra ano.
Ko nga raraunga kaore ano kia hiahiatia ka noho tonu ki roto i te kaitarai hei huānga tuatahi o te tuple, ka honoa atu nga poraka o muri o nga raraunga whakauru.

Ko te hanganga e whakaatu ana i te parapara:

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

Nga mahi mo te mahi me MSBufferizer

Kei te hanga i tetahi tauira putunga hou:

MSBufferizer * ms_bufferizer_new(void);

Kua tohaina te mahara, kua arawhitia ki roto ms_bufferizer_init() ka whakahokia mai he atatohu.

Taumahi arawhiti:

void ms_bufferizer_init(MSBufferizer *obj); 

Kei te arawhiti te rarangi q, mara rahi kua whakaritea ki te kore.

Te taapiri karere:

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

Ka tāpirihia te karere m ki te tūtira. Ka taapirihia te rahinga tatau o nga poraka raraunga ki rahi.

Te whakawhiti i nga karere katoa mai i te rarangi raraunga hono ki te parepare q:

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

Te whakawhiti karere mai i te hono q i roto i te buffer ka mahia ma te whakamahi i te mahi ms_bufferizer_put().

Te panui mai i te kaitarai:

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

Mēnā he iti ake te rahi o ngā raraunga kua whakaemihia i roto i te parepare i te mea i tonoa (raraungalen), ka hoki te mahi kore, karekau nga raraunga e kape ki te raraunga. Ki te kore, ka mahia te kape raupapatanga o nga raraunga mai i nga tuple kei roto i te parapara. I muri i te kape, ka mukua te tuple ka wetekina te mahara. Ka mutu te kape i te wa ka kapehia nga paita raraunga. Mena ka pau te mokowhiti i waenganui o te poraka raraunga, na i tenei karere, ka whakahekehia te poraka raraunga ki te toenga kaore i kapehia. Ina waea atu koe, ka haere tonu te kape mai i tenei waahi.

Te panui i te nui o nga raraunga e waatea ana i roto i te papaaru:

int ms_bufferizer_get_avail(MSBufferizer *obj); 

Ka whakahokia te mara rahi whakapuru.

Te whakakore i tetahi waahanga o nga raraunga i roto i te parapara:

void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);

Ko te maha o nga paita o nga raraunga ka tangohia, ka makahia. Ka makahia nga raraunga tawhito.

Muku ana i nga karere katoa i roto i te parapara:

void ms_bufferizer_flush(MSBufferizer *obj); 

Ka tautuhia te kaute raraunga ki te kore.

Muku ana i nga karere katoa i roto i te parapara:

void ms_bufferizer_uninit(MSBufferizer *obj); 

Kāore te porotiti i te tautuhi anō.

Te tango i te parapara me te whakawātea pūmahara:

void ms_bufferizer_destroy(MSBufferizer *obj);  

Ka kitea nga tauira o te whakamahi i te kaitarai i roto i te waehere puna o te maha o nga whiriwhiringa roma pāpāho. Hei tauira, i roto i te tātari MS_L16_ENC, e whakaraupapa ana i nga paita i roto i nga tauira mai i te raupapa whatunga ki te ota kaihautu: l16.c

I roto i te tuhinga e whai ake nei, ka titiro tatou ki te take o te whakatau tata kawenga tohu me pehea te mahi ki te nui o te utaina rorohiko i roto i te riipene pāpāho.

Source: will.com

Tāpiri i te kōrero