Kuwunika injini ya Mediastreamer2 VoIP. Gawo 11

Zomwe zili m'nkhaniyi zatengedwa kuchokera ku wanga zene channel.

Kuwunika injini ya Mediastreamer2 VoIP. Gawo 11

Njira yoyendetsera deta

  • Tsamba la deta dblk_t
  • Uthenga mblk_t
  • Ntchito zogwirira ntchito ndi mauthenga mblk_t
  • Mzere_t
  • Ntchito zogwirira ntchito ndi queue queue_t
  • Kulumikiza zosefera
  • Chizindikiro cha graph yokonza data
  • Kumbuyo kwa zochitika za ticker
  • Bufferizer (MSBufferizer)
  • Ntchito zogwirira ntchito ndi MSBufferizer

Pomaliza nkhani tapanga fyuluta yathuyathu. Nkhaniyi ifotokoza za njira yamkati yosunthira deta pakati pa zosefera za media media. Izi zikuthandizani kuti mulembe zosefera zapamwamba popanda khama lochepa m'tsogolomu.

Njira yoyendetsera deta

Kusuntha kwa data mu media streamer kumachitika pogwiritsa ntchito mizere yofotokozedwa ndi kapangidwe kake mzere_t. Zitsanzo za mauthenga ngati mblk_t, zomwe sizikhala ndi chidziwitso chazidziwitso, koma zimangolumikizana ndi zam'mbuyomu, uthenga wotsatira ndi block block. Kuphatikiza apo, ndikufuna kutsindika makamaka kuti palinso gawo lolumikizirana ndi uthenga wamtundu womwewo, womwe umakulolani kuti mukonzekere mndandanda wa mauthenga omwe amalumikizidwa okha. Tidzatcha gulu la mauthenga ogwirizana ndi mndandanda woterewu kukhala tuple. Chifukwa chake, gawo lililonse pamzere litha kukhala uthenga umodzi mblk_t, ndipo mwina mutu wa uthenga tuple mblk_t. Uthenga uliwonse wa tuple ukhoza kukhala ndi chipika chake cha ward data. Tidzakambirana chifukwa chake ma tuples amafunikira pambuyo pake.

Monga tafotokozera pamwambapa, uthengawo ulibe chipika cha data; m'malo mwake, umangokhala ndi cholozera kumalo okumbukira komwe chipikacho chimasungidwa. Mu gawo ili, chithunzi chonse cha ntchito ya media streamer chikukumbutsa za nyumba yosungiramo khomo muzojambula "Monsters, Inc.," pomwe zitseko (zolumikizana ndi zipinda za data) zimayenda pa liwiro lamisala motsata ma conveyors apamwamba, pomwe zipinda zomwezo. khalani osasuntha.

Tsopano, tikuyenda motsatira utsogoleri kuchokera pansi kupita pamwamba, tiyeni tikambirane mwatsatanetsatane mabungwe omwe alembedwa pamakina otumizirana ma data mu media streamer.

Data block dblk_t

Chotchinga cha data chimakhala ndi mutu ndi buffer ya data. Mutuwo ukufotokozedwa ndi dongosolo ili:

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

Magawo a kapangidwe kake ali ndi zolozera koyambira kwa buffer, kumapeto kwa buffer, ndi ntchito yochotsa data. Chomaliza pamutu db_ref - counter counter, ngati ifika zero, izi zimakhala ngati chizindikiro chochotsa chipikachi pamtima. Ngati chipika cha data chidapangidwa ndi ntchitoyi datab_alloc() , ndiye buffer ya data idzayikidwa mu kukumbukira mwamsanga pambuyo pa mutu. Muzochitika zina zonse, buffer imatha kupezeka kwinakwake padera. Zosungira za data zizikhala ndi zitsanzo kapena zina zomwe tikufuna kukonza ndi zosefera.

Chitsanzo chatsopano cha chipika cha data chimapangidwa pogwiritsa ntchito ntchitoyi:

dblk_t *datab_alloc(int size);

Monga gawo lothandizira, limapatsidwa kukula kwa deta yomwe chipikacho chidzasungira. Kukumbukira kwina kumaperekedwa kuti kuyika mutu - kapangidwe - kumayambiriro kwa kukumbukira komwe adapatsidwa detab. Koma mukamagwiritsa ntchito zina, izi sizichitika nthawi zonse; nthawi zina, buffer ya data imatha kupezeka mosiyana ndi mutu wa block block. Popanga dongosolo, minda imakonzedwa kuti munda wake db_basi adaloza ku chiyambi cha dera la deta, ndi db_lim mpaka mapeto ake. Chiwerengero cha maulalo db_ref yakhazikitsidwa kumodzi. Cholozera chowoneka bwino cha data chimayikidwa paziro.

uthenga mblk_t

Monga tafotokozera, zinthu za pamzere ndizofanana mblk_t, akufotokozedwa motere:

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;

kapangidwe mblk_t lili ndi zolozera poyambira b_prev, b_potsatira, zomwe ndizofunikira kupanga mndandanda wolumikizidwa kawiri (omwe ndi mzere mzere_t).

Kenako pamabwera cholozera b_kupitiriza, yomwe imagwiritsidwa ntchito pokhapokha ngati uthenga uli gawo la tuple. Kwa uthenga womaliza mu tuple, cholozera ichi chimakhalabe chopanda pake.

Kenako tikuwona cholozera ku chipika cha data b_datap, amene uthengawo ulipo. Imatsatiridwa ndi zolozera kudera lomwe lili mkati mwa block data buffer. Munda b_rptr imatchula malo omwe deta yochokera ku buffer idzawerengedwa. Munda b_wptr ikuwonetsa malo omwe zolembera ku buffer zidzachitikira.

Minda yotsalayi ndi yamtundu wautumiki ndipo sizikukhudzana ndi kayendetsedwe ka njira yotumizira deta.

Pansipa pali uthenga umodzi wokhala ndi dzina m1 ndi data block d1.
Kuwunika injini ya Mediastreamer2 VoIP. Gawo 11
Chithunzi chotsatira chikuwonetsa mauthenga atatu m1, m1_1, m1_2.
Kuwunika injini ya Mediastreamer2 VoIP. Gawo 11

Ntchito zotumizira mauthenga mblk_t

Uthenga watsopano mblk_t zopangidwa ndi ntchito:

mblk_t *allocb(int size, int pri); 

amaika uthenga watsopano m'mtima mblk_t ndi chipika cha data cha kukula kwake komwe kwafotokozedwa kukula, mkangano wachiwiri - zach osagwiritsidwa ntchito mulaibulale iyi. Iyenera kukhala zero. Panthawi yogwira ntchito, kukumbukira kudzaperekedwa kwa dongosolo la uthenga watsopano ndipo ntchitoyo idzatchedwa mblk_init(), yomwe idzakhazikitsenso madera onse a mawonekedwe omwe adapangidwawo kenako, pogwiritsa ntchito zomwe tatchulazi datab_alloc(), idzapanga buffer ya data. Pambuyo pake, magawo omwe ali mumpangidwewo adzasinthidwa:

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

Pazotulutsa timalandila uthenga watsopano wokhala ndi magawo oyambira komanso buffer yopanda kanthu. Kuti muwonjezere deta ku uthenga, muyenera kuyikopera ku buffer ya data block:

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

kumene deta ndi cholozera ku gwero la data, ndi kukula - kukula kwawo.
ndiye muyenera kusinthira pointer pamalo olembera kuti ilozenso koyambira kwa malo aulere mu buffer:

msg->b_wptr = msg->b_wptr + size

Ngati mukufuna kupanga uthenga kuchokera ku buffer yomwe ilipo, osakopera, gwiritsani ntchito ntchitoyi:

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

Ntchitoyo, itatha kupanga uthenga ndi kapangidwe ka block data, idzakonza zolozera zake ku data pa adilesi. buff. Iwo. Pankhaniyi, buffer ya data sichipezeka pambuyo pa minda yamutu wa block block, monga zinalili popanga chipika cha data ndi ntchitoyo. datab_alloc(). Chosungiracho chokhala ndi deta yoperekedwa ku ntchitoyi chidzakhalabe chomwe chinali, koma mothandizidwa ndi zolozera chidzalumikizidwa kumutu womwe wangopangidwa kumene wa chipika cha data, ndipo, molingana ndi uthengawo.

Ku uthenga umodzi mblk_t Ma block angapo a data amatha kulumikizidwa motsatizana. Izi zimachitika ndi ntchito:

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

mp - uthenga womwe chipika china cha data chidzawonjezedwa;
deta - cholozera ku chipika, kope lomwe lidzawonjezedwa ku uthenga;
kukula - kukula kwa data;
pedi - mbendera yomwe kukula kwa kukumbukira komwe kunaperekedwa kuyenera kulumikizidwa pamalire a 4-byte (padding idzachitidwa ndi zero).

Ngati pali malo okwanira mu buffer ya data yomwe ilipo, ndiye kuti deta yatsopano idzayikidwa kumbuyo kwa deta yomwe ilipo kale. Ngati pali zochepa ufulu danga mu uthenga deta bafa kuposa kukula, ndiye uthenga watsopano umapangidwa ndi kukula kokwanira kwa bafa ndipo deta imakopera ku buffer yake. Uwu ndi uthenga watsopano, wolumikizidwa ndi woyambayo pogwiritsa ntchito cholozera b_kupitiriza. Pankhaniyi, uthengawo umasanduka tuple.

Ngati mukufuna kuwonjezera chipika china cha data ku tuple, ndiye kuti muyenera kugwiritsa ntchito ntchitoyi:

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

apeza uthenga womaliza m'bukuli (ali b_kupitiriza adzakhala null) ndipo adzayitana ntchito ya uthengawu appendb ().

Mutha kudziwa kukula kwa data mu uthenga kapena tuple pogwiritsa ntchito ntchitoyi:

int msgdsize(const mblk_t *mp);

izo kuzungulira mauthenga onse mu tuple ndi kubwerera okwana kuchuluka kwa deta mu buffers deta mauthenga amenewo. Pa uthenga uliwonse, kuchuluka kwa data kumawerengedwa motere:

 mp->b_wptr - mp->b_rptr

Kuti muphatikize ma tuple awiri, gwiritsani ntchito ntchitoyi:

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

amawonjezera tuple newm ku mchira wa tuple mp ndikubwezera cholozera ku uthenga womaliza wa zotsatira zake.

Ngati ndi kotheka, tuple ikhoza kusinthidwa kukhala uthenga umodzi wokhala ndi chipika chimodzi cha data; izi zimachitika ndi ntchitoyi:

void msgpullup(mblk_t *mp,int len);

ngati mkangano pe ndi -1, ndiye kukula kwa buffer yomwe idaperekedwa imatsimikiziridwa yokha. Ngati pe ndi nambala yabwino, buffer ya kukula uku idzapangidwa ndipo deta ya uthenga wa tuple idzakoperamo. Ngati buffer itatha, kukopera kuyima pamenepo. Uthenga woyamba wa tuple udzalandira bafa yatsopano ndi data yomwe yakopedwa. Mauthenga otsalawo adzachotsedwa ndipo kukumbukira kubwezeredwa muluwu.

Pochotsa dongosolo mblk_t chiwerengero chowerengera cha chipika cha data chimaganiziridwa ngati, poyimba kwaulere () zimakhala ziro, ndiye buffer ya data imachotsedwa pamodzi ndi chitsanzo mblk_t, zomwe zimasonyeza.

Kuyambitsa magawo a uthenga watsopano:

void mblk_init(mblk_t *mp);

Kuwonjezera data ina ku uthenga:

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

Ngati chidziwitso chatsopanocho sichikugwirizana ndi malo aulere a buffer ya data ya uthenga, ndiye kuti uthenga wopangidwa padera wokhala ndi buffer ya kukula kofunikira umalumikizidwa ku uthengawo (cholozera ku uthenga wowonjezera chimayikidwa mu uthenga woyamba) uthenga ukusanduka tuple.

Kuwonjezera chidutswa cha deta ku tuple:

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

Ntchitoyi imayitanitsa appendb () mu loop.

Kuphatikiza ma tuples awiri kukhala amodzi:

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

uthenga newm adzalumikizidwa ku mp.

Kupanga kopi ya uthenga umodzi:

mblk_t *copyb(const mblk_t *mp);

Malizitsani kukopera tuple ndi midadada yonse:

mblk_t *copymsg(const mblk_t *mp);

Zinthu za tuple zimakopedwa ndi ntchitoyo kope ().

Pangani uthenga wosavuta mblk_t. Pankhaniyi, chipika cha data sichimakopera, koma chowerengera chake chikuwonjezeka db_ref:

mblk_t *dupb(mblk_t *mp);

Kupanga kope lopepuka la tuple. Zolemba za data sizinakopedwe, zowerengera zawo zokha ndizowonjezera db_ref:

mblk_t *dupmsg(mblk_t* m);

Kuyika mauthenga onse a tuple mu uthenga umodzi:

void msgpullup(mblk_t *mp,size_t len);

Ngati mkangano pe ndi -1, ndiye kukula kwa buffer yomwe idaperekedwa imatsimikiziridwa yokha.

Kuchotsa uthenga, tuple:

void freemsg(mblk_t *mp);

Kuwerengera kwa data block kumachepetsedwa ndi chimodzi. Ngati ifika zero, chipika cha data chimachotsedwanso.

Kuwerengera kuchuluka kwa data mu meseji kapena tuple.

size_t msgdsize(const mblk_t *mp);

Kubweza uthenga kuchokera pamzere wa mzere:

mblk_t *ms_queue_peek_last (q);

Kukopera zomwe zili m'magawo osungidwa a uthenga wina kupita ku uthenga wina (makamaka, minda iyi ili ndi mbendera zomwe zimagwiritsidwa ntchito ndi media streamer):

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

Mzere mzere_t

Mzere wa uthenga mu media streamer umakhazikitsidwa ngati mndandanda wolumikizidwa kawiri. Chigawo chilichonse chamndandanda chimakhala ndi cholozera ku chipika cha data chokhala ndi zitsanzo zamasigino. Zikuoneka kuti zolozera ku chipika cha data zimasuntha motsatana, pomwe deta yokhayo imakhala yosasunthika. Iwo. maulalo okha kwa iwo amasunthidwa.
Mapangidwe ofotokozera pamzere mzere_t, akuwonetsedwa pansipa:

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

Kapangidwe kamakhala ndi gawo - cholozera _q_choyimitsa lembani *mblk_t, imaloza ku chinthu choyamba (uthenga) pamzere. Gawo lachiwiri la kapangidwe kake ndikuwerengera mauthenga omwe ali pamzere.
Chithunzi chomwe chili pansipa chikuwonetsa mzere wotchulidwa q1 wokhala ndi mauthenga 4 m1, m2, m3, m4.
Kuwunika injini ya Mediastreamer2 VoIP. Gawo 11
Chithunzi chotsatirachi chikuwonetsa mzere wotchulidwa q1 wokhala ndi mauthenga 4 m1,m2,m3,m4. Message m2 ndiye mutu wa tuple womwe uli ndi mauthenga ena awiri m2_1 ndi m2_2.

Kuwunika injini ya Mediastreamer2 VoIP. Gawo 11

Ntchito zogwirira ntchito ndi queue queue_t

Kuyambitsa mzere:

void qinit(queue_t *q);

m'munda _q_choyimitsa (pambuyo pake tidzayitcha "choyimitsa") imayambitsidwa ndi ntchitoyi mblk_init(), chinthu chake cham'mbuyo ndi cholozera chotsatira chimasinthidwa kuti chiziloze. Kauntala ya queue element yasinthidwa kukhala ziro.

Kuwonjezera chinthu chatsopano (mauthenga):

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

Chinthu chatsopano m imawonjezedwa kumapeto kwa mndandanda, zolozera zazinthu zimasinthidwa kuti choyimitsa chikhale chotsatira chake, ndipo chimakhala chinthu choyambirira cha choyimitsa. Kauntala ya queue element yawonjezeredwa.

Kubweza chinthu kuchokera pamzere:

mblk_t * getq(queue_t *q); 

Uthenga womwe umabwera choyimitsa chikabwezedwa, ndipo kauntala yazinthu imachepetsedwa. Ngati palibe zinthu pamzere kupatula choyimitsa, ndiye kuti 0 amabwezedwa.

Kuyika uthenga pamzere:

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

Kanthu mp anayikidwa patsogolo pa chinthucho emp. ngati emp= 0, ndiye uthengawo umawonjezedwa kumchira wa mzere.

Kubweza uthenga kuchokera kumutu wa pamzere:

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

The element counter ndi decreated.

Kuwerenga cholozera ku chinthu choyamba pamzere:

mblk_t * peekq(queue_t *q); 

Kuchotsa zinthu zonse pamzere ndikuzichotsa zokha:

void flushq(queue_t *q, int how);

Kukangana momwe osagwiritsidwa ntchito. Kauntala ya queue element yayikidwa pa ziro.

Macro powerenga cholozera ku gawo lomaliza pamzere:

mblk_t * qlast(queue_t *q);

Pogwira ntchito ndi mizere ya mauthenga, dziwani kuti mukamayimba foni ms_queue_put(q, m) ndi cholozera chachabechabe ku uthenga, ntchitoyo imazungulira. Pulogalamu yanu idzazizira. amachita chimodzimodzi ms_queue_next(q, m).

Kulumikiza zosefera

Mzere womwe tafotokozawu umagwiritsidwa ntchito popereka mauthenga kuchokera ku fyuluta imodzi kupita ku ina kapena kuchokera ku zosefera zingapo. Zosefera ndi malumikizidwe awo zimapanga graph yolunjika. Kulowetsa kapena kutulutsa kwa fyuluta kudzatchedwa liwu loti "pin". Kuti afotokoze dongosolo lomwe zosefera zimalumikizidwa wina ndi mzake, wofalitsa nkhani amagwiritsa ntchito lingaliro la "signal point". Chizindikiro ndi kapangidwe _MSCPoint, yomwe ili ndi cholozera ku fyuluta ndi nambala ya imodzi mwa zikhomo zake; motero, imalongosola kugwirizana kwa chimodzi mwazolowera kapena zotuluka mu fyuluta.

Chizindikiro cha graph yokonza data

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

Zikhomo zosefera zimawerengedwa kuyambira ziro.

Kulumikizana kwa zikhomo ziwiri ndi mzere wa uthenga kumafotokozedwa ndi dongosolo _MSQueue, yomwe ili ndi mzere wa mauthenga ndi zolozera ku zizindikiro ziwiri zomwe zimagwirizanitsa:

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

Tidzatcha dongosololi ngati ulalo wazizindikiro. Fyuluta iliyonse ya media streamer imakhala ndi tebulo la maulalo olowera ndi tebulo la maulalo otulutsa (MQueue). Kukula kwa matebulo kumayikidwa popanga fyuluta; tachita kale izi pogwiritsa ntchito mtundu wotumizidwa kunja MSFilterDesc, pamene tinapanga fyuluta yathuyathu. Pansipa pali kapangidwe kamene kamafotokozera fyuluta iliyonse mu media streamer, 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;

Titalumikiza zosefera mu pulogalamu ya C molingana ndi dongosolo lathu (koma sitinalumikizane ndi ticker), potero tidapanga graph yowongoleredwa, ma node omwe ndi zitsanzo zamapangidwewo. MSFilter, ndipo m'mphepete ndi zitsanzo za maulalo MQueue.

Kumbuyo kwa zochitika za ticker

Nditakuuzani kuti ticker ndi fyuluta ya gwero la nkhupakupa, sizinali zoona zenizeni za izo. Ticker ndi chinthu chomwe chimagwira ntchito pa wotchi ndondomeko () Zosefera zonse za dera (graph) komwe zimalumikizidwa. Tikalumikiza ticker ku fyuluta ya graph mu pulogalamu ya C, timawonetsa ticker graph yomwe idzawongolera kuyambira pano mpaka titayimitsa. Pambuyo polumikiza, ticker imayamba kuyang'ana graph yomwe yapatsidwa chisamaliro chake, ndikulemba mndandanda wazosefera zomwe zikuphatikiza. Kuti "musawerenge" fyuluta yomweyo kawiri, imayika zosefera zomwe zapezeka poyika bokosi mkati mwake. tawona. Kusakaku kumachitika pogwiritsa ntchito matebulo olumikizira omwe fyuluta iliyonse ili nayo.

Paulendo wake woyamba wa graph, ticker imayang'ana ngati pakati pa zosefera pali imodzi yomwe imakhala ngati gwero la midadada ya data. Ngati palibe, ndiye kuti graph imatengedwa kuti ndi yolakwika ndipo chizindikirocho chikuwonongeka.

Ngati graph ikhala "yolondola", pa fyuluta iliyonse yomwe yapezeka, ntchitoyi imatchedwa kuyambitsa ndondomeko (). Ikangofika mphindi yosinthira kotsatira (ma milliseconds 10 aliwonse mwachisawawa), ticker imayimbira ntchitoyi. ndondomeko () pa zosefera zonse zomwe zidapezeka kale, ndiyeno zosefera zotsalira pamndandanda. Ngati fyuluta ili ndi maulalo olowera, ndiye kuti mugwiritse ntchito ndondomeko () imabwereza mpaka mizere yolowetsamo mulibe. Zitatha izi, zimapita ku fyuluta yotsatira pamndandanda ndi "kupukuta" mpaka maulalo olowera asakhale ndi mauthenga. Ticker imachoka pa fyuluta kupita ku sefa mpaka mndandanda utatha. Izi zimamaliza kukonza kuzungulira.

Tsopano tibwereranso ku ma tuples ndikukambirana chifukwa chake gulu lotere lidawonjezedwa ku media streamer. Nthawi zambiri, kuchuluka kwa data komwe kumafunikira ndi aligorivimu yomwe ikugwira ntchito mkati mwa fyulutayo sikufanana ndipo sikuchulukitsa kukula kwa ma buffers a data omwe alandilidwa polowetsamo. Mwachitsanzo, tikulemba fyuluta yomwe imapanga kusintha kwa Fourier mwachangu, komwe mwakutanthawuza kungathe kukonza midadada ya data yomwe kukula kwake ndi mphamvu ziwiri. Zikhale 512 zowerengera. Ngati deta imapangidwa ndi njira ya telefoni, ndiye kuti buffer ya uthenga uliwonse pakulowetsa idzatibweretsera zitsanzo za 160. Ndiko kuyesa kuti musasonkhanitse deta kuchokera pazolowetsazo mpaka kuchuluka kwa deta komwe kukufunika kulipo. Koma pamenepa, kugunda kudzachitika ndi ticker, yomwe idzayesa kusuntha fyulutayo molephera mpaka ulalo wolowetsa ulibe kanthu. M'mbuyomu, tidasankha lamuloli ngati mfundo yachitatu ya fyuluta. Malinga ndi mfundo iyi, ntchito ya fyuluta () iyenera kutenga zonse kuchokera pamizere yolowera.

Kuphatikiza apo, sikutheka kutenga zitsanzo za 512 zokha kuchokera pazowonjezera, popeza mutha kungotenga midadada yonse, i.e. fyulutayo iyenera kutenga zitsanzo za 640 ndikugwiritsa ntchito 512 mwa izo, zotsalazo zisanayambe kusonkhanitsa gawo latsopano la deta. Chifukwa chake, fyuluta yathu, kuwonjezera pa ntchito yake yayikulu, iyenera kupereka zinthu zothandizira pakusungirako kwapakatikati kwa data yolowera. Madivelopa a media streamer ndi njira yothetsera vutoli wapanga chinthu chapadera - MSBufferizer (bufferer), yomwe imathetsa vutoli pogwiritsa ntchito ma tuples.

Bufferizer (MSBufferizer)

Ichi ndi chinthu chomwe chidzaunjike zambiri zolowera mkati mwa fyuluta ndikuyamba kuzitumiza kuti zisinthidwe mwamsanga kuchuluka kwa chidziwitso kukwanira kuyendetsa algorithm yosefera. Pomwe buffer ikusonkhanitsa deta, fyulutayo idzagwira ntchito mopanda pake, osagwiritsa ntchito mphamvu yokonza purosesa. Koma ntchito yowerengera kuchokera ku bufferer ikangobweretsa mtengo wina osati ziro, ntchito ya process() ya fyuluta imayamba kutenga ndikukonza deta kuchokera ku bufferer mu magawo a kukula kofunikira, mpaka itatheratu.
Deta yomwe sinafunikirebe imakhalabe mu buffer ngati chinthu choyamba cha tuple, pomwe midadada ya data yolowera imalumikizidwa.

Kapangidwe kamene kamafotokoza buffer:

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

Ntchito zogwirira ntchito ndi MSBufferizer

Kupanga chitsanzo chatsopano cha buffer:

MSBufferizer * ms_bufferizer_new(void);

Memory imaperekedwa, kuyambika mkati ms_bufferizer_init() ndipo cholozera chabwezedwa.

Ntchito yoyambira:

void ms_bufferizer_init(MSBufferizer *obj); 

Mzere ukuyamba q, munda kukula idakhazikitsidwa ku zero.

Kuwonjezera uthenga:

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

Message m yawonjezeredwa pamzere. Kuwerengera kukula kwa midadada ya data kumawonjezeredwa kukula.

Kusamutsa mauthenga onse kuchokera pamzere wa data ya ulalo kupita ku buffer q:

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

Kusamutsa mauthenga kuchokera ku ulalo q mu buffer ikuchitika pogwiritsa ntchito ntchitoyi ms_bufferizer_put().

Kuwerenga kuchokera ku buffer:

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

Ngati kukula kwa deta yomwe yasonkhanitsidwa mu buffer ndi yocheperapo yomwe yafunsidwa (datalen), ndiye ntchitoyo imabwerera zero, deta siinakopedwe ku deta. Kupanda kutero, kukopera motsatizana kwa data kuchokera ku ma tuple omwe ali mu buffer kumachitika. Pambuyo kukopera, tuple imachotsedwa ndipo kukumbukira kumamasulidwa. Kukopera kumatha panthawi yomwe datalen byte imakopera. Ngati danga likutha pakati pa chipika cha deta, ndiye mu uthenga uwu, chipika cha deta chidzachepetsedwa kukhala gawo lotsala losasindikizidwa. Nthawi ina mukadzabweranso, kukopera kudzapitirira kuchokera pamenepa.

Kuwerenga kuchuluka kwa data yomwe ikupezeka mu buffer:

int ms_bufferizer_get_avail(MSBufferizer *obj); 

Kubweza munda kukula chosungira.

Kutaya gawo la data mu buffer:

void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);

Nambala yotchulidwa ya data imatengedwa ndikutayidwa. Deta yakale kwambiri imatayidwa.

Kuchotsa mauthenga onse mu buffer:

void ms_bufferizer_flush(MSBufferizer *obj); 

Deta ya data yasinthidwa kukhala ziro.

Kuchotsa mauthenga onse mu buffer:

void ms_bufferizer_uninit(MSBufferizer *obj); 

Kauntala sinakhazikitsidwenso.

Kuchotsa buffer ndikumasula kukumbukira:

void ms_bufferizer_destroy(MSBufferizer *obj);  

Zitsanzo za kugwiritsa ntchito bufferer zitha kupezeka mu code code ya zosefera zingapo za media media. Mwachitsanzo, mu MS_L16_ENC fyuluta, yomwe imakonzanso ma byte mu zitsanzo kuchokera pa dongosolo la netiweki kupita ku dongosolo la alendo: l16.c

M'nkhani yotsatira, tiwona nkhani ya kuyerekeza katundu pa ticker ndi njira zothana ndi kuchuluka kwa makompyuta mu media streamer.

Source: www.habr.com

Kuwonjezera ndemanga