Mediastreamer2 VoIP рдЗрдВрдЬрд┐рди рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдд рдЖрд╣реЗ. рднрд╛рдЧ 11

рд▓реЗрдЦрд╛рдЪреЗ рд╕рд╛рд╣рд┐рддреНрдп рдорд╛рдЭреНрдпрд╛рдХрдбреВрди рдШреЗрддрд▓реЗ рдЖрд╣реЗ рдЭреЗрди рдЪреЕрдиреЗрд▓.

Mediastreamer2 VoIP рдЗрдВрдЬрд┐рди рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдд рдЖрд╣реЗ. рднрд╛рдЧ 11

рдбреЗрдЯрд╛ рд╣рд╛рд▓рдЪрд╛рд▓ рдпрдВрддреНрд░рдгрд╛

  • рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ dblk_t
  • рд╕рдВрджреЗрд╢ mblk_t
  • рд╕рдВрджреЗрд╢рд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдпреЗ mblk_t
  • рд░рд╛рдВрдЧ рд░рд╛рдВрдЧ_рдЯреА
  • quees queue_t рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдпреЗ
  • рдлрд┐рд▓реНрдЯрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдд рдЖрд╣реЗ
  • рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЖрд▓реЗрдЦрд╛рдЪрд╛ рд╕рд┐рдЧреНрдирд▓ рдкреЙрдЗрдВрдЯ
  • рдЯрд┐рдХрд░рдЪреНрдпрд╛ рдкрдбрджреНрдпрд╛рдорд╛рдЧреАрд▓ рдХреНрд░рд┐рдпрд╛рдХрд▓рд╛рдк
  • рдмрдлрд░рд╛рдпрдЭрд░ (MSBufferizer)
  • MSBufferizer рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдпреЗ

рд╢реЗрд╡рдЯреА рд▓реЗрдЦ рдЖрдореНрд╣реА рдЖрдордЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдлрд┐рд▓реНрдЯрд░ рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗ. рд╣рд╛ рд▓реЗрдЦ рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд░ рдлрд┐рд▓реНрдЯрд░ рджрд░рдореНрдпрд╛рди рдбреЗрдЯрд╛ рд╣рд▓рд╡рд┐рдгреНрдпрд╛рдЪреНрдпрд╛ рдЕрдВрддрд░реНрдЧрдд рдпрдВрддреНрд░рдгреЗрд╡рд░ рд▓рдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрд▓. рд╣реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рднрд╡рд┐рд╖реНрдпрд╛рдд рдХрдореА рдкреНрд░рдпрддреНрдирд╛рдд рдЕрддреНрдпрд╛рдзреБрдирд┐рдХ рдлрд┐рд▓реНрдЯрд░ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрдИрд▓.

рдбреЗрдЯрд╛ рд╣рд╛рд▓рдЪрд╛рд▓ рдпрдВрддреНрд░рдгрд╛

рд╕рдВрд░рдЪрдиреЗрджреНрд╡рд╛рд░реЗ рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рд░рд╛рдВрдЧрд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд░рдордзреАрд▓ рдбреЗрдЯрд╛ рд╣рд╛рд▓рдЪрд╛рд▓ рдХреЗрд▓реА рдЬрд╛рддреЗ рд░рд╛рдВрдЧ_рдЯреА. рд╕рд╛рд░рдЦреНрдпрд╛ рд╕рдВрджреЗрд╢рд╛рдВрдЪреА рд╕реНрдЯреНрд░рд┐рдВрдЧ mblk_t, рдЬреНрдпрд╛рдордзреНрдпреЗ рд╕реНрд╡рддрдГрдЪ рд╕рд┐рдЧреНрдирд▓ рдбреЗрдЯрд╛ рдирд╕рддреЛ, рдкрд░рдВрддреБ рдлрдХреНрдд рдорд╛рдЧреАрд▓, рдкреБрдвреАрд▓ рд╕рдВрджреЗрд╢ рдЖрдгрд┐ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХрд▓рд╛ рджреБрд╡реЗ рдЕрд╕рддрд╛рдд. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдореА рд╡рд┐рд╢реЗрд╖рдд: рд╡рд░ рдЬреЛрд░ рджреЗрдК рдЗрдЪреНрдЫрд┐рддреЛ рдХреА рддреНрдпрд╛рдЪ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рд╕рдВрджреЗрд╢рд╛рдЪреНрдпрд╛ рджреБрд╡реНрдпрд╛рд╕рд╛рдареА рдПрдХ рдлреАрд▓реНрдб рджреЗрдЦреАрд▓ рдЖрд╣реЗ, рдЬреЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╕рдВрджреЗрд╢рд╛рдВрдЪреА рдПрдХрд▓ рд▓рд┐рдВрдХ рдХреЗрд▓реЗрд▓реА рд╕реВрдЪреА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ. рдЕрд╢рд╛ рд╕реВрдЪреАрджреНрд╡рд╛рд░реЗ рдПрдХрддреНрд░рд┐рдд рд╕рдВрджреЗрд╢рд╛рдВрдЪреНрдпрд╛ рд╕рдореВрд╣рд╛рд▓рд╛ рдЖрдореНрд╣реА рдЯрдкрд▓ рдореНрд╣рдгреВ. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рд░рд╛рдВрдЧреЗрддреАрд▓ рдХреЛрдгрддрд╛рд╣реА рдШрдЯрдХ рдПрдХрдЪ рд╕рдВрджреЗрд╢ рдЕрд╕реВ рд╢рдХрддреЛ mblk_t, рдЖрдгрд┐ рдХрджрд╛рдЪрд┐рдд рдПрдХ рд╕рдВрджреЗрд╢ рдЯрдкрд▓ рдкреНрд░рдореБрдЦ mblk_t. рдкреНрд░рддреНрдпреЗрдХ рдЯреНрдпреВрдкрд▓ рд╕рдВрджреЗрд╢рд╛рдЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ рд╡реЙрд░реНрдб рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдЕрд╕реВ рд╢рдХрддреЛ. рдЯреНрдпреВрдкрд▓реНрд╕ рдХрд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗрдд рдпрд╛рд╡рд░ рдЖрдореНрд╣реА рдереЛрдбреНрдпрд╛ рд╡реЗрд│рд╛рдиреЗ рдЪрд░реНрдЪрд╛ рдХрд░реВ.

рд╡рд░ рдирдореВрдж рдХреЗрд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рд╕рдВрджреЗрд╢рд╛рдордзреНрдпреЗ рд╕реНрд╡рддрдГрдЪ рдбреЗрдЯрд╛рдЪрд╛ рдмреНрд▓реЙрдХ рдирд╕рддреЛ; рддреНрдпрд╛рдРрд╡рдЬреА, рддреНрдпрд╛рдордзреНрдпреЗ рдлрдХреНрдд рдореЗрдорд░реА рдХреНрд╖реЗрддреНрд░рд╛рд╕рд╛рдареА рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдЕрд╕рддреЛ рдЬреЗрдереЗ рдмреНрд▓реЙрдХ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ. рдпрд╛ рднрд╛рдЧрд╛рдд, рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд░рдЪреНрдпрд╛ рдХрд╛рдорд╛рдЪреЗ рдПрдХрдВрджрд░ рдЪрд┐рддреНрд░ "рдореЙрдиреНрд╕реНрдЯрд░реНрд╕, рдЗрдВрдХ." рдпрд╛ рдХрд╛рд░реНрдЯреВрдирдордзреАрд▓ рджрд░рд╡рд╛рдЬрд╛рдЪреНрдпрд╛ рдЧреЛрджрд╛рдорд╛рдЪреА рдЖрдард╡рдг рдХрд░реВрди рджреЗрдгрд╛рд░реЗ рдЖрд╣реЗ, рдЬреЗрдереЗ рджрд░рд╡рд╛рдЬреЗ (рдбреЗрдЯрд╛ - рд░реВрдордЪреЗ рд▓рд┐рдВрдХ) рдУрд╡реНрд╣рд░рд╣реЗрдб рдХрдиреНрд╡реНрд╣реЗрдпрд░реНрд╕рдЪреНрдпрд╛ рдмрд╛рдЬреВрдиреЗ рд╡реЗрдбреНрдпрд╛ рдЧрддреАрдиреЗ рдлрд┐рд░рддрд╛рдд, рддрд░ рдЦреЛрд▓реНрдпрд╛ рд╕реНрд╡рддрдГрдЪ рдЧрддрд┐рд╣реАрди рд░рд╛рд╣рдгреЗ.

рдЖрддрд╛, рддрд│рд╛рдкрд╛рд╕реВрди рд╡рд░рдкрд░реНрдпрдВрдд рдкрджрд╛рдиреБрдХреНрд░рдорд╛рд╕рд╣ рдкреБрдвреЗ рдЬрд╛рддрд╛рдирд╛, рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд░рдордзреНрдпреЗ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдиреНрд╕рдорд┐рд╢рди рдореЗрдХреЕрдирд┐рдЭрдордЪреНрдпрд╛ рд╕реВрдЪреАрдмрджреНрдз рдШрдЯрдХрд╛рдВрдЪрд╛ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдпрд╛.

рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ dblk_t

рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХрдордзреНрдпреЗ рд╣реЗрдбрд░ рдЖрдгрд┐ рдбреЗрдЯрд╛ рдмрдлрд░ рдЕрд╕рддрд╛рдд. рд╣реЗрдбрд░ рдЦрд╛рд▓реАрд▓ рд╕рдВрд░рдЪрдиреЗрджреНрд╡рд╛рд░реЗ рд╡рд░реНрдгрди рдХреЗрд▓реЗ рдЖрд╣реЗ,

typedef struct datab
{
unsigned char *db_base; // ╨г╨║╨░╨╖╨░╤В╨╡╨╗╤М ╨╜╨░ ╨╜╨░╤З╨░╨╗╨╛ ╨▒╤Г╤Д╨╡╤А ╨┤╨░╨╜╨╜╤Л╤Е.
unsigned char *db_lim;  // ╨г╨║╨░╨╖╨░╤В╨╡╨╗╤М ╨╜╨░ ╨║╨╛╨╜╨╡╤Ж ╨▒╤Г╤Д╨╡╤А ╨┤╨░╨╜╨╜╤Л╤Е.
void (*db_freefn)(void*); // ╨д╤Г╨╜╨║╤Ж╨╕╤П ╨╛╤Б╨▓╨╛╨▒╨╛╨╢╨┤╨╡╨╜╨╕╤П ╨┐╨░╨╝╤П╤В╨╕ ╨┐╤А╨╕ ╤Г╨┤╨░╨╗╨╡╨╜╨╕╨╕ ╨▒╨╗╨╛╨║╨░.
int db_ref; // ╨б╤З╨╡╤В╤З╨╕╨║ ╤Б╤Б╤Л╨╗╨╛╨║.
} dblk_t;

рд╕реНрдЯреНрд░рдХреНрдЪрд░рдЪреНрдпрд╛ рдлреАрд▓реНрдбрдордзреНрдпреЗ рдмрдлрд░рдЪреНрдпрд╛ рд╕реБрд░реВрд╡рд╛рддреАрд╕, рдмрдлрд░рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА рдЖрдгрд┐ рдбреЗрдЯрд╛ рдмрдлрд░ рд╣рдЯрд╡рд┐рдгреНрдпрд╛рдЪреЗ рдХрд╛рд░реНрдп рдкреЙрдЗрдВрдЯрд░ рдЕрд╕рддрд╛рдд. рд╣реЗрдбрд░рдордзреАрд▓ рд╢реЗрд╡рдЯрдЪрд╛ рдШрдЯрдХ db_ref тАФ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░, рдЬрд░ рддреЗ рд╢реВрдиреНрдпрд╛рд╡рд░ рдкреЛрд╣реЛрдЪрд▓реЗ, рддрд░ рд╣реЗ рдмреНрд▓реЙрдХ рдореЗрдорд░реАрдордзреВрди рд╣рдЯрд╡рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд┐рдЧреНрдирд▓ рдореНрд╣рдгреВрди рдХрд╛рдо рдХрд░рддреЗ. рдЬрд░ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдлрдВрдХреНрд╢рдирджреНрд╡рд╛рд░реЗ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЧреЗрд▓рд╛ рдЕрд╕реЗрд▓ datab_alloc() , рдирдВрддрд░ рдбреЗрдЯрд╛ рдмрдлрд░ рд╣реЗрдбрд░ рдирдВрддрд░ рд▓рдЧреЗрдЪ рдореЗрдорд░реАрдордзреНрдпреЗ рдареЗрд╡рд▓рд╛ рдЬрд╛рдИрд▓. рдЗрддрд░ рд╕рд░реНрд╡ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ, рдмрдлрд░ рдХреБрдареЗрддрд░реА рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рд╕реНрдерд┐рдд рдЕрд╕реВ рд╢рдХрддреЛ. рдбреЗрдЯрд╛ рдмрдлрд░рдордзреНрдпреЗ рд╕рд┐рдЧреНрдирд▓ рдирдореБрдиреЗ рдХрд┐рдВрд╡рд╛ рдЗрддрд░ рдбреЗрдЯрд╛ рдЕрд╕реЗрд▓ рдЬреНрдпрд╛рд╡рд░ рдЖрдореНрд╣реА рдлрд┐рд▓реНрдЯрд░рд╕рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ.

рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░реВрди рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХрдЪреЗ рдирд╡реАрди рдЙрджрд╛рд╣рд░рдг рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЖрд╣реЗ:

dblk_t *datab_alloc(int size);

рдЗрдирдкреБрдЯ рдкреЕрд░рд╛рдореАрдЯрд░ рдореНрд╣рдгреВрди, рдмреНрд▓реЙрдХ рд╕рдВрдЪрдпрд┐рдд рдХрд░реЗрд▓ рддреНрдпрд╛ рдбреЗрдЯрд╛рдЪрд╛ рдЖрдХрд╛рд░ рджрд┐рд▓рд╛ рдЬрд╛рддреЛ. рд╡рд╛рдЯрдк рдХреЗрд▓реЗрд▓реНрдпрд╛ рдореЗрдорд░реАрдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рд╢реАрд░реНрд╖рд▓реЗрдЦ - рд░рдЪрдирд╛ - рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдзрд┐рдХ рдореЗрдорд░реА рд╡рд╛рдЯрдк рдХреЗрд▓реА рдЬрд╛рддреЗ рдбреЗрдЯрд╛рдм. рдкрд░рдВрддреБ рдЗрддрд░ рдлрдВрдХреНрд╢рдиреНрд╕ рд╡рд╛рдкрд░рддрд╛рдирд╛, рд╣реЗ рдиреЗрд╣рдореАрдЪ рдШрдбрдд рдирд╛рд╣реА; рдХрд╛рд╣реА рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ, рдбреЗрдЯрд╛ рдмрдлрд░ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рд╢реАрд░реНрд╖рд▓реЗрдЦрд╛рдкрд╛рд╕реВрди рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рд╕реНрдерд┐рдд рдЕрд╕реВ рд╢рдХрддреЛ. рд░рдЪрдирд╛ рддрдпрд╛рд░ рдХрд░рддрд╛рдирд╛, рдлреАрд▓реНрдб рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд рдЬреЗрдгреЗрдХрд░реВрди рддреНрдпрд╛рдЪреЗ рдлреАрд▓реНрдб db_base рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░рд╛рдЪреНрдпрд╛ рд╕реБрд░реВрд╡рд╛рддреАрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХреЗрд▓реЗ, рдЖрдгрд┐ db_lim рддреНрдпрд╛рдЪреНрдпрд╛ рд╢реЗрд╡рдЯрдкрд░реНрдпрдВрдд. рд▓рд┐рдВрдХ рд╕рдВрдЦреНрдпрд╛ db_ref рдПрдХ рд╡рд░ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЖрд╣реЗ. рдбреЗрдЯрд╛ рдХреНрд▓рд┐рдЕрд░ рдлрдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рд╢реВрдиреНрдпрд╛рд╡рд░ рд╕реЗрдЯ рдХреЗрд▓рд╛ рдЖрд╣реЗ.

рд╕рдВрджреЗрд╢ mblk_t

рдореНрд╣рдЯрд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рд░рд╛рдВрдЧреЗрддреАрд▓ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рдЖрд╣реЗрдд mblk_t, рддреЗ рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗ:

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;

рд░рдЪрдирд╛ mblk_t рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗрдд b_prev, b_рдкреБрдвреАрд▓, рдЬреА рджреБрдкреНрдкрдЯ рд▓рд┐рдВрдХ рдХреЗрд▓реЗрд▓реА рдпрд╛рджреА рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ (рдЬреА рдПрдХ рд░рд╛рдВрдЧ рдЖрд╣реЗ рд░рд╛рдВрдЧ_рдЯреА).

рдордЧ рд╕реВрдЪрдХ рдпреЗрддреЛ b_cont, рдЬреНрдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдлрдХреНрдд рддреЗрд╡реНрд╣рд╛рдЪ рд╣реЛрддреЛ рдЬреЗрд╡реНрд╣рд╛ рд╕рдВрджреЗрд╢ рдЯреНрдпреБрдкрд▓рдЪрд╛ рднрд╛рдЧ рдЕрд╕рддреЛ. рдЯрдкрд▓рдордзреАрд▓ рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рд╕рдВрджреЗрд╢рд╛рд╕рд╛рдареА, рд╣рд╛ рдкреЙрдЗрдВрдЯрд░ рд╢реВрдиреНрдп рд░рд╛рд╣рддреЛ.

рдкреБрдвреЗ рдЖрдкрдг рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХрд╕рд╛рдареА рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╣рддреЛ b_datap, рдЬреНрдпрд╛рд╕рд╛рдареА рд╕рдВрджреЗрд╢ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗ. рддреНрдпрд╛рдирдВрддрд░ рдмреНрд▓реЙрдХ рдбреЗрдЯрд╛ рдмрдлрд░рдЪреНрдпрд╛ рдЖрддреАрд▓ рдХреНрд╖реЗрддреНрд░рд╛рд╕рд╛рдареА рдкреЙрдЗрдВрдЯрд░реНрд╕ рджрд┐рд▓реЗ рдЬрд╛рддрд╛рдд. рдлреАрд▓реНрдб b_rptr рдмрдлрд░рдордзреАрд▓ рдбреЗрдЯрд╛ рдЬрд┐рдереВрди рд╡рд╛рдЪрд▓рд╛ рдЬрд╛рдИрд▓ рддреЗ рд╕реНрдерд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ. рдлреАрд▓реНрдб b_wptr рддреЗ рдард┐рдХрд╛рдг рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рдЬрд┐рдереВрди рдмрдлрд░рд╡рд░ рд▓реЗрдЦрди рдХреЗрд▓реЗ рдЬрд╛рдИрд▓.

рдЙрд░реНрд╡рд░рд┐рдд рдлреАрд▓реНрдб рд╕реЗрд╡рд╛ рд╕реНрд╡рд░реВрдкрд╛рдЪреЗ рдЖрд╣реЗрдд рдЖрдгрд┐ рдбреЗрдЯрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдпрдВрддреНрд░рдгреЗрдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рдирд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдирд╛рд╣реАрдд.

рдЦрд╛рд▓реА рдирд╛рд╡рд╛рд╕рд╣ рдПрдХрдЪ рд╕рдВрджреЗрд╢ рдЖрд╣реЗ m1 рдЖрдгрд┐ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ d1.
Mediastreamer2 VoIP рдЗрдВрдЬрд┐рди рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдд рдЖрд╣реЗ. рднрд╛рдЧ 11
рдЦрд╛рд▓реАрд▓ рдЖрдХреГрддреА рддреАрди рд╕рдВрджреЗрд╢рд╛рдВрдЪрд╛ рдЯреНрдпреБрдкрд▓ рджрд░реНрд╢рд╡рддреЗ m1, m1_1, m1_2.
Mediastreamer2 VoIP рдЗрдВрдЬрд┐рди рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдд рдЖрд╣реЗ. рднрд╛рдЧ 11

рд╕рдВрджреЗрд╢рди рдХрд╛рд░реНрдпреЗ mblk_t

рдПрдХ рдирд╡реАрди рд╕рдВрджреЗрд╢ mblk_t рдлрдВрдХреНрд╢рдирджреНрд╡рд╛рд░реЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ:

mblk_t *allocb(int size, int pri); 

рддреА рдЖрдард╡рдгреАрдд рдПрдХ рдирд╡реАрди рд╕рдВрджреЗрд╢ рдареЗрд╡рддреЗ mblk_t рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрдХрд╛рд░рд╛рдЪреНрдпрд╛ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХрд╕рд╣ рдЖрдХрд╛рд░, рджреБрд╕рд░рд╛ рдпреБрдХреНрддрд┐рд╡рд╛рдж - рдкреНрд░рд╛ рд▓рд╛рдпрдмреНрд░рд░реАрдЪреНрдпрд╛ рдпрд╛ рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реЗрд▓реЗ рдирд╛рд╣реА. рддреЗ рд╢реВрдиреНрдпрдЪ рд░рд╛рд╣рд┐рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ. рдлрдВрдХреНрд╢рдирдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рди рджрд░рдореНрдпрд╛рди, рдирд╡реАрди рд╕рдВрджреЗрд╢рд╛рдЪреНрдпрд╛ рд╕рдВрд░рдЪрдиреЗрд╕рд╛рдареА рдореЗрдорд░реА рд╡рд╛рдЯрдк рдХреЗрд▓реА рдЬрд╛рдИрд▓ рдЖрдгрд┐ рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ mblk_init(), рдЬреЗ рд╕рдВрд░рдЪрдиреЗрдЪреНрдпрд╛ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдЪреЗ рд╕рд░реНрд╡ рдлреАрд▓реНрдб рд░реАрд╕реЗрдЯ рдХрд░реЗрд▓ рдЖрдгрд┐ рдирдВрддрд░, рд╡рд░ рдирдореВрдж рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд╛рдкрд░реВрди datab_alloc(), рдбреЗрдЯрд╛ рдмрдлрд░ рддрдпрд╛рд░ рдХрд░реЗрд▓. рдЬреНрдпрд╛рдирдВрддрд░ рд╕рдВрд░рдЪрдиреЗрддреАрд▓ рдлреАрд▓реНрдб рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗ рдЬрд╛рддреАрд▓:

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

рдЖрдКрдЯрдкреБрдЯрд╡рд░ рдЖрдореНтАНрд╣рд╛рд▓рд╛ рдЗрдирд┐рд╢рд┐рдПрд▓рд╛рдЗрдЬреНрдб рдлреАрд▓реНтАНрдб рдЖрдгрд┐ рд░рд┐рдХрд╛рдореНрдпрд╛ рдбреЗрдЯрд╛ рдмрдлрд░рд╕рд╣ рдПрдХ рдирд╡реАрди рдореЗрд╕реЗрдЬ рдорд┐рд│рддреЛ. рд╕рдВрджреЗрд╢рд╛рдордзреНрдпреЗ рдбреЗрдЯрд╛ рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рддреЛ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдмрдлрд░рдордзреНрдпреЗ рдХреЙрдкреА рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

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

рдЬреЗрдереЗ рдбреЗрдЯрд╛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрддрд╛рд╕рд╛рдареА рдПрдХ рд╕реВрдЪрдХ рдЖрд╣реЗ, рдЖрдгрд┐ рдЖрдХрд╛рд░ - рддреНрдпрд╛рдВрдЪрд╛ рдЖрдХрд╛рд░.
рдирдВрддрд░ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдкреЙрдЗрдВрдЯрд░рд▓рд╛ рд▓реЗрдЦрди рдмрд┐рдВрджреВрд╡рд░ рдЕрджреНрдпрддрдирд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреЗрдгреЗрдХрд░реВрди рддреЗ рдмрдлрд░рдордзреАрд▓ рдореБрдХреНрдд рдХреНрд╖реЗрддреНрд░рд╛рдЪреНрдпрд╛ рд╕реБрд░реВрд╡рд╛рддреАрд╕ рдкреБрдиреНрд╣рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрд▓:

msg->b_wptr = msg->b_wptr + size

рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рд╡рд┐рджреНрдпрдорд╛рди рдмрдлрд░рдордзреВрди рдХреЙрдкреА рди рдХрд░рддрд╛ рд╕рдВрджреЗрд╢ рддрдпрд╛рд░ рдХрд░рд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓ рддрд░ рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░рд╛:

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

рдлрдВрдХреНрд╢рди, рд╕рдВрджреЗрд╢ рдЖрдгрд┐ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХрдЪреА рд░рдЪрдирд╛ рддрдпрд╛рд░ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдкрддреНрддреНрдпрд╛рд╡рд░реАрд▓ рдбреЗрдЯрд╛рд╕рд╛рдареА рддреНрдпрд╛рдЪреЗ рдкреЙрдЗрдВрдЯрд░ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реЗрд▓. рдмреБрдл. рддреНрдпрд╛. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдбреЗрдЯрд╛ рдмрдлрд░ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХрдЪреНрдпрд╛ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдлреАрд▓реНрдбрдирдВрддрд░ рд╕реНрдерд┐рдд рдирд╛рд╣реА, рдЬрд╕реЗ рдлрдВрдХреНрд╢рдирд╕рд╣ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рддрдпрд╛рд░ рдХрд░рддрд╛рдирд╛ рд╣реЛрддреЗ. datab_alloc(). рдлрдВрдХреНрд╢рдирд▓рд╛ рдкрд╛рдард╡рд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рд╕рд╣ рдмрдлрд░ рддреЛ рдЬрд┐рдереЗ рд╣реЛрддрд╛ рддрд┐рдереЗрдЪ рд░рд╛рд╣реАрд▓, рдкрд░рдВрддреБ рдкреЙрдЗрдВрдЯрд░реНрд╕рдЪреНрдпрд╛ рдорджрддреАрдиреЗ рддреЗ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХрдЪреНрдпрд╛ рдирд╡реАрди рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╢реАрд░реНрд╖рд▓реЗрдЦрд╛рд╢реА рд╕рдВрд▓рдЧреНрди рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ рдЖрдгрд┐ рддреНрдпрд╛рдиреБрд╕рд╛рд░, рд╕рдВрджреЗрд╢рд╛рд╢реА.

рдПрдХрд╛ рд╕рдВрджреЗрд╢рд╛рд▓рд╛ mblk_t рдЕрдиреЗрдХ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХреНрд╕рдирд╛ рдЕрдиреБрдХреНрд░рдореЗ рдЬреЛрдбрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд. рд╣реЗ рдлрдВрдХреНрд╢рдирджреНрд╡рд╛рд░реЗ рдХреЗрд▓реЗ рдЬрд╛рддреЗ:

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

mp тАФ рдПрдХ рд╕рдВрджреЗрд╢ рдЬреНрдпрд╛рдордзреНрдпреЗ рджреБрд╕рд░рд╛ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдЬреЛрдбрд▓рд╛ рдЬрд╛рдИрд▓;
рдбреЗрдЯрд╛ - рдмреНрд▓реЙрдХрд▓рд╛ рдкреЙрдЗрдВрдЯрд░, рдЬреНрдпрд╛рдЪреА рдПрдХ рдкреНрд░рдд рд╕рдВрджреЗрд╢рд╛рдд рдЬреЛрдбрд▓реА рдЬрд╛рдИрд▓;
рдЖрдХрд╛рд░ - рдбреЗрдЯрд╛ рдЖрдХрд╛рд░;
рдкреЕрдб тАФ рдПрдХ рдзреНрд╡рдЬ рдЬреЛ рд╡рд╛рдЯрдк рдХреЗрд▓реЗрд▓реНрдпрд╛ рдореЗрдорд░реАрдЪрд╛ рдЖрдХрд╛рд░ 4-рдмрд╛рдЗрдЯ рд╕реАрдореЗрд╕рд╣ рд╕рдВрд░реЗрдЦрд┐рдд рдХреЗрд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ (рдкреЕрдбрд┐рдВрдЧ рд╢реВрдиреНрдпрд╛рд╕рд╣ рдХреЗрд▓реЗ рдЬрд╛рдИрд▓).

рд╡рд┐рджреНрдпрдорд╛рди рд╕рдВрджреЗрд╢ рдбреЗрдЯрд╛ рдмрдлрд░рдордзреНрдпреЗ рдкреБрд░реЗрд╢реА рдЬрд╛рдЧрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рдирд╡реАрди рдбреЗрдЯрд╛ рдЖрдзреАрдкрд╛рд╕реВрди рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рдЪреНрдпрд╛ рдорд╛рдЧреЗ рдкреЗрд╕реНрдЯ рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓. рдкреЗрдХреНрд╖рд╛ рд╕рдВрджреЗрд╢ рдбреЗрдЯрд╛ рдмрдлрд░рдордзреНрдпреЗ рдХрдореА рдореЛрдХрд│реА рдЬрд╛рдЧрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕ рдЖрдХрд╛рд░, рдирдВрддрд░ рдкреБрд░реЗрд╢рд╛ рдмрдлрд░ рдЖрдХрд╛рд░рд╛рд╕рд╣ рдПрдХ рдирд╡реАрди рд╕рдВрджреЗрд╢ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ рдбреЗрдЯрд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рдмрдлрд░рдордзреНрдпреЗ рдХреЙрдкреА рдХреЗрд▓рд╛ рдЬрд╛рддреЛ. рд╣рд╛ рдПрдХ рдирд╡реАрди рд╕рдВрджреЗрд╢ рдЖрд╣реЗ, рдЬреЛ рдкреЙрдЗрдВрдЯрд░ рд╡рд╛рдкрд░реВрди рдореВрд│ рд╕рдВрджреЗрд╢рд╛рд╢реА рдЬреЛрдбрд▓реЗрд▓рд╛ рдЖрд╣реЗ b_cont. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рд╕рдВрджреЗрд╢ рдЯреНрдпреВрдкрд▓рдордзреНрдпреЗ рдмрджрд▓рддреЛ.

рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдЯреНрдпреБрдкрд▓рдордзреНрдпреЗ рдбреЗрдЯрд╛рдЪрд╛ рджреБрд╕рд░рд╛ рдмреНрд▓реЙрдХ рдЬреЛрдбрд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓ рддрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓:

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

рддрд┐рд▓рд╛ рд╢реЗрд╡рдЯрдЪрд╛ рд╕рдВрджреЗрд╢ tuple рдордзреНрдпреЗ рд╕рд╛рдкрдбреЗрд▓ (рддреНрдпрд╛рдЪреНрдпрд╛рдХрдбреЗ рдЖрд╣реЗ b_cont рд╢реВрдиреНрдп рдЕрд╕реЗрд▓) рдЖрдгрд┐ рдпрд╛ рд╕рдВрджреЗрд╢рд╛рд╕рд╛рдареА рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░реЗрд▓ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ ().

рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░реВрди рддреБрдореНрд╣реА рдореЗрд╕реЗрдЬ рдХрд┐рдВрд╡рд╛ рдЯрдкрд▓рдордзреАрд▓ рдбреЗрдЯрд╛рдЪрд╛ рдЖрдХрд╛рд░ рд╢реЛрдзреВ рд╢рдХрддрд╛:

int msgdsize(const mblk_t *mp);

рддреЗ рдЯреНрдпреВрдкрд▓рдордзреАрд▓ рд╕рд░реНрд╡ рд╕рдВрджреЗрд╢рд╛рдВрдирд╛ рд▓реВрдк рдХрд░реЗрд▓ рдЖрдгрд┐ рддреНрдпрд╛ рд╕рдВрджреЗрд╢рд╛рдВрдЪреНрдпрд╛ рдбреЗрдЯрд╛ рдмрдлрд░рдордзреАрд▓ рдбреЗрдЯрд╛рдЪреА рдПрдХреВрдг рд░рдХреНрдХрдо рдкрд░рдд рдХрд░реЗрд▓. рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢рд╛рд╕рд╛рдареА, рдбреЗрдЯрд╛рдЪреА рд░рдХреНрдХрдо рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рдореЛрдЬрд▓реА рдЬрд╛рддреЗ:

 mp->b_wptr - mp->b_rptr

рджреЛрди рдЯрдкрд▓реНрд╕ рдПрдХрддреНрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░рд╛:

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

рддреА рдЯрдкрд▓ рдЬреЛрдбрддреЗ рдирд╡реАрди рдЯрдкрд▓рдЪреНрдпрд╛ рд╢реЗрдкрдЯреАрд▓рд╛ mp рдЖрдгрд┐ рдкрд░рд┐рдгрд╛рдореА рдЯрдкрд▓рдЪреНрдпрд╛ рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рд╕рдВрджреЗрд╢рд╛рдХрдбреЗ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд░рдд рдХрд░рддреЛ.

рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕, рдбреЗрдЯрд╛рдЪреНрдпрд╛ рдПрдХрд╛ рдмреНрд▓реЙрдХрд╕рд╣ рдЯреНрдпреВрдкрд▓ рдПрдХрд╛ рд╕рдВрджреЗрд╢рд╛рдд рдмрджрд▓рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ; рд╣реЗ рдлрдВрдХреНрд╢рдирджреНрд╡рд╛рд░реЗ рдХреЗрд▓реЗ рдЬрд╛рддреЗ:

void msgpullup(mblk_t *mp,int len);

рд╡рд╛рдж рдЕрд╕рд▓реНрдпрд╛рд╕ LEN -1 рдЖрд╣реЗ, рдирдВрддрд░ рд╡рд╛рдЯрдк рдХреЗрд▓реЗрд▓реНрдпрд╛ рдмрдлрд░рдЪрд╛ рдЖрдХрд╛рд░ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ. рддрд░ LEN рдзрди рд╕рдВрдЦреНрдпрд╛ рдЖрд╣реЗ, рдпрд╛ рдЖрдХрд╛рд░рд╛рдЪрд╛ рдмрдлрд░ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓ рдЖрдгрд┐ рдЯрдкрд▓ рд╕рдВрджреЗрд╢ рдбреЗрдЯрд╛ рддреНрдпрд╛рдд рдХреЙрдкреА рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓. рдмрдлрд░ рд╕рдВрдкрд▓реНрдпрд╛рд╕, рдХреЙрдкреА рдХрд░рдгреЗ рддрд┐рдереЗрдЪ рдерд╛рдВрдмреЗрд▓. рдЯреНрдпреБрдкрд▓рдЪрд╛ рдкрд╣рд┐рд▓рд╛ рд╕рдВрджреЗрд╢ рдХреЙрдкреА рдХреЗрд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рд╕рд╣ рдирд╡реАрди рдЖрдХрд╛рд░рд╛рдЪрд╛ рдмрдлрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрд▓. рдЙрд░реНрд╡рд░рд┐рдд рд╕рдВрджреЗрд╢ рд╣рдЯрд╡рд┐рд▓реЗ рдЬрд╛рддреАрд▓ рдЖрдгрд┐ рдореЗрдорд░реА рдвреАрдЧрдордзреНрдпреЗ рдкрд░рдд рдпреЗрдИрд▓.

рд░рдЪрдирд╛ рд╣рдЯрд╡рддрд╛рдирд╛ mblk_t рдХреЙрд▓ рдХрд░рддрд╛рдирд╛ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХрдЪреА рд╕рдВрджрд░реНрдн рд╕рдВрдЦреНрдпрд╛ рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрддрд▓реА рдЬрд╛рддреЗ freeb() рддреЗ рд╢реВрдиреНрдп рд╣реЛрддреЗ, рдирдВрддрд░ рдбреЗрдЯрд╛ рдмрдлрд░ рдЙрджрд╛рд╣рд░рдгрд╛рд╕рд╣ рд╣рдЯрд╡рд┐рд▓рд╛ рдЬрд╛рддреЛ mblk_t, рдЬреЗ рддреНрдпрд╛рд╕ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ.

рдирд╡реАрди рд╕рдВрджреЗрд╢рд╛рдЪреА рдлреАрд▓реНрдб рд╕реБрд░реВ рдХрд░рдгреЗ:

void mblk_init(mblk_t *mp);

рд╕рдВрджреЗрд╢рд╛рдордзреНрдпреЗ рдбреЗрдЯрд╛рдЪрд╛ рджреБрд╕рд░рд╛ рднрд╛рдЧ рдЬреЛрдбрдгреЗ:

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

рдЬрд░ рдирд╡реАрди рдбреЗрдЯрд╛ рд╕рдВрджреЗрд╢ рдбреЗрдЯрд╛ рдмрдлрд░рдЪреНрдпрд╛ рдореЛрдХрд│реНрдпрд╛ рдЬрд╛рдЧреЗрдд рдмрд╕рдд рдирд╕реЗрд▓, рддрд░ рдЖрд╡рд╢реНрдпрдХ рдЖрдХрд╛рд░рд╛рдЪреНрдпрд╛ рдмрдлрд░рд╕рд╣ рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓рд╛ рд╕рдВрджреЗрд╢ рд╕рдВрджреЗрд╢рд╛рд╢реА рд╕рдВрд▓рдЧреНрди рдХреЗрд▓рд╛ рдЬрд╛рддреЛ (рдЬреЛрдбрд▓реЗрд▓реНрдпрд╛ рд╕рдВрджреЗрд╢рд╛рдЪрд╛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╣рд┐рд▓реНрдпрд╛ рд╕рдВрджреЗрд╢рд╛рдд рд╕реЗрдЯ рдХреЗрд▓реЗрд▓рд╛ рдЖрд╣реЗ) рдЖрдгрд┐ рд╕рдВрджреЗрд╢ рдЯрдкрд▓рдордзреНрдпреЗ рдмрджрд▓рддреЛ.

рдЯреНрдпреВрдкрд▓рдордзреНрдпреЗ рдбреЗрдЯрд╛рдЪрд╛ рддреБрдХрдбрд╛ рдЬреЛрдбрдгреЗ:

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

рдлрдВрдХреНрд╢рди appendb() рд▓рд╛ рд▓реВрдкрдордзреНрдпреЗ рдХреЙрд▓ рдХрд░рддреЗ.

рджреЛрди рдЯреНрдпреВрдкрд▓реНрд╕ рдПрдХрд╛рдордзреНрдпреЗ рдПрдХрддреНрд░ рдХрд░рдгреЗ:

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

рд╕рдВрджреЗрд╢ рдирд╡реАрди рд╢реА рд╕рдВрд▓рдЧреНрди рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ mp.

рдПрдХрд╛ рд╕рдВрджреЗрд╢рд╛рдЪреА рдкреНрд░рдд рддрдпрд╛рд░ рдХрд░рдгреЗ:

mblk_t *copyb(const mblk_t *mp);

рд╕рд░реНрд╡ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХреНрд╕рд╕рд╣ рдЯреНрдпреВрдкрд▓рдЪреА рдкреВрд░реНрдг рдХреЙрдкреА рдХрд░рдгреЗ:

mblk_t *copymsg(const mblk_t *mp);

рдЯреНрдпреБрдкрд▓рдЪреЗ рдШрдЯрдХ рдлрдВрдХреНрд╢рдирджреНрд╡рд╛рд░реЗ рдХреЙрдкреА рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд copyb().

рд╕рдВрджреЗрд╢рд╛рдЪреА рд╕рд╣рдЬ рдкреНрд░рдд рддрдпрд╛рд░ рдХрд░рд╛ mblk_t. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЙрдкреА рдХреЗрд▓рд╛ рдЬрд╛рдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рддреНрдпрд╛рдЪрд╛ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рд╡рд╛рдврд╡рд┐рд▓рд╛ рдЬрд╛рддреЛ db_ref:

mblk_t *dupb(mblk_t *mp);

рдЯреНрдпреВрдкрд▓рдЪреА рд╣рд▓рдХреА рдкреНрд░рдд рдмрдирд╡рдгреЗ. рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЙрдкреА рдХреЗрд▓реЗрд▓реЗ рдирд╛рд╣реАрдд, рдлрдХреНрдд рддреНрдпрд╛рдВрдЪреЗ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рд╡рд╛рдврд╡рд▓реЗ тАЛтАЛрдЖрд╣реЗрдд db_ref:

mblk_t *dupmsg(mblk_t* m);

рдЯрдкрд▓рдЪреЗ рд╕рд░реНрд╡ рд╕рдВрджреЗрд╢ рдПрдХрд╛ рд╕рдВрджреЗрд╢рд╛рдд рдЪрд┐рдХрдЯрд╡рд┐рдгреЗ:

void msgpullup(mblk_t *mp,size_t len);

рд╡рд╛рдж рддрд░ LEN -1 рдЖрд╣реЗ, рдирдВрддрд░ рд╡рд╛рдЯрдк рдХреЗрд▓реЗрд▓реНрдпрд╛ рдмрдлрд░рдЪрд╛ рдЖрдХрд╛рд░ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ.

рд╕рдВрджреЗрд╢ рд╣рдЯрд╡рд┐рдд рдЖрд╣реЗ, рдЯрдкрд▓:

void freemsg(mblk_t *mp);

рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХрдЪреА рд╕рдВрджрд░реНрдн рд╕рдВрдЦреНрдпрд╛ рдПрдХрд╛рдиреЗ рдХрдореА рдХреЗрд▓реА рдЖрд╣реЗ. рдЬрд░ рддреЗ рд╢реВрдиреНрдпрд╛рд╡рд░ рдкреЛрд╣реЛрдЪрд▓реЗ, рддрд░ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рджреЗрдЦреАрд▓ рд╣рдЯрд╡рд┐рд▓рд╛ рдЬрд╛рдИрд▓.

рд╕рдВрджреЗрд╢ рдХрд┐рдВрд╡рд╛ рдЯрдкрд▓рдордзреАрд▓ рдбреЗрдЯрд╛рдЪреНрдпрд╛ рдПрдХреВрдг рд░рдХрдореЗрдЪреА рдЧрдгрдирд╛.

size_t msgdsize(const mblk_t *mp);

рд░рд╛рдВрдЧреЗрдЪреНрдпрд╛ рд╢реЗрдкрдЯрд╛рддреВрди рд╕рдВрджреЗрд╢ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдд рдЖрд╣реЗ:

mblk_t *ms_queue_peek_last (q);

рдПрдХрд╛ рд╕рдВрджреЗрд╢рд╛рдЪреНрдпрд╛ рдЖрд░рдХреНрд╖рд┐рдд рдлреАрд▓реНрдбрдЪреА рд╕рд╛рдордЧреНрд░реА рджреБрд╕рд░реНтАНрдпрд╛ рд╕рдВрджреЗрд╢рд╛рдд рдХреЙрдкреА рдХрд░рдгреЗ (рдЦрд░рдВ рддрд░, рдпрд╛ рдлреАрд▓реНрдбрдордзреНрдпреЗ рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд░рджреНрд╡рд╛рд░реЗ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд░реНтАНрдпрд╛ рдзреНрд╡рдЬрд╛рдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЖрд╣реЗ):

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

рд░рд╛рдВрдЧ рд░рд╛рдВрдЧ_рдЯреА

рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд░рдордзреАрд▓ рд╕рдВрджреЗрд╢ рд░рд╛рдВрдЧ рд╡рд░реНрддреБрд│рд╛рдХрд╛рд░ рджреБрдкреНрдкрдЯ рд▓рд┐рдВрдХ рдХреЗрд▓реЗрд▓реА рд╕реВрдЪреА рдореНрд╣рдгреВрди рд▓рд╛рдЧреВ рдХреЗрд▓реА рдЖрд╣реЗ. рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪреА рдШрдЯрдХрд╛рдордзреНрдпреЗ рд╕рд┐рдЧреНрдирд▓ рдирдореБрдиреНрдпрд╛рдВрд╕рд╣ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХрд╕рд╛рдареА рдкреЙрдЗрдВрдЯрд░ рдЕрд╕рддреЛ. рдЕрд╕реЗ рджрд┐рд╕реВрди рдЖрд▓реЗ рдХреА рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХрдХрдбреЗ рдлрдХреНрдд рдкреЙрдЗрдВрдЯрд░ рдмрджрд▓реВрди рд╣рд▓рддрд╛рдд, рддрд░ рдбреЗрдЯрд╛ рд╕реНрд╡рддрдГ рдЧрддрд┐рд╣реАрди рд░рд╛рд╣рддреЛ. рддреНрдпрд╛. рдлрдХреНрдд рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд▓рд┐рдВрдХ рд╣рд▓рд╡рд▓реНрдпрд╛ рдЖрд╣реЗрдд.
рд░рд╛рдВрдЧреЗрдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгрд╛рд░реА рд░рдЪрдирд╛ рд░рд╛рдВрдЧ_рдЯреА, рдЦрд╛рд▓реА рджрд╛рдЦрд╡рд┐рд▓реЗ рдЖрд╣реЗ:

typedef struct _queue
{
   mblk_t _q_stopper; /* "╨е╨╛╨╗╨╛╤Б╤В╨╛╨╣" ╤Н╨╗╨╡╨╝╨╡╨╜╤В ╨╛╤З╨╡╤А╨╡╨┤╨╕, ╨╜╨╡ ╤Г╨║╨░╨╖╤Л╨▓╨░╨╡╤В ╨╜╨░ ╨┤╨░╨╜╨╜╤Л╨╡, ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╨╡╤В╤Б╤П ╤В╨╛╨╗╤М╨║╨╛ ╨┤╨╗╤П ╤Г╨┐╤А╨░╨▓╨╗╨╡╨╜╨╕╤П ╨╛╤З╨╡╤А╨╡╨┤╤М╤О. ╨Я╤А╨╕ ╨╕╨╜╨╕╤Ж╨╕╨░╨╗╨╕╨╖╨░╤Ж╨╕╨╕ ╨╛╤З╨╡╤А╨╡╨┤╨╕ (qinit()) ╨╡╨│╨╛ ╤Г╨║╨░╨╖╨░╤В╨╡╨╗╨╕ ╨╜╨░╤Б╤В╤А╨░╨╕╨▓╨░╤О╤В╤Б╤П ╤В╨░╨║, ╤З╤В╨╛╨▒╤Л ╨╛╨╜╨╕ ╤Г╨║╨░╨╖╤Л╨▓╨░╨╗╨╕ ╨╜╨░ ╨╜╨╡╨│╨╛ ╤Б╨░╨╝╨╛╨│╨╛. */
   int q_mcount;        // ╨Ъ╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╤Н╨╗╨╡╨╝╨╡╨╜╤В╨╛╨▓ ╨▓ ╨╛╤З╨╡╤А╨╡╨┤╨╕.
} queue_t;

рд╕рдВрд░рдЪрдиреЗрдд рдлреАрд▓реНрдб рдЖрд╣реЗ - рдПрдХ рдкреЙрдЗрдВрдЯрд░ _q_рд╕реНрдЯреЙрдкрд░ *mblk_t рдЯрд╛рдЗрдк рдХрд░рд╛, рддреЗ рд░рд╛рдВрдЧреЗрддреАрд▓ рдкрд╣рд┐рд▓реНрдпрд╛ рдШрдЯрдХрд╛рдХрдбреЗ (рд╕рдВрджреЗрд╢) рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддреЗ. рд╕рдВрд░рдЪрдиреЗрдЪреЗ рджреБрд╕рд░реЗ рдлреАрд▓реНрдб рд░рд╛рдВрдЧреЗрддреАрд▓ рд╕рдВрджреЗрд╢рд╛рдВрдЪреЗ рдХрд╛рдЙрдВрдЯрд░ рдЖрд╣реЗ.
рдЦрд╛рд▓реАрд▓ рдЖрдХреГрддреА q1 рдирд╛рд╡рд╛рдЪреА рд░рд╛рдВрдЧ рджрд╛рдЦрд╡рддреЗ рдЬреНрдпрд╛рдордзреНрдпреЗ m4, m1, m2, m3 рдЕрд╕реЗ 4 рд╕рдВрджреЗрд╢ рдЖрд╣реЗрдд.
Mediastreamer2 VoIP рдЗрдВрдЬрд┐рди рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдд рдЖрд╣реЗ. рднрд╛рдЧ 11
рдЦрд╛рд▓реАрд▓ рдЖрдХреГрддреА q1 рдирд╛рд╡рд╛рдЪреА рд░рд╛рдВрдЧ рджрд░реНрд╢рд╡рддреЗ рдЬреНрдпрд╛рдордзреНрдпреЗ m4,m1,m2,m3 рдЕрд╕реЗ 4 рд╕рдВрджреЗрд╢ рдЖрд╣реЗрдд. рд╕рдВрджреЗрд╢ m2 рд╣реЗ рдЯрдкрд▓рдЪреЗ рдкреНрд░рдореБрдЦ рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдЖрдгрдЦреА рджреЛрди рд╕рдВрджреЗрд╢ m2_1 рдЖрдгрд┐ m2_2 рдЖрд╣реЗрдд.

Mediastreamer2 VoIP рдЗрдВрдЬрд┐рди рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдд рдЖрд╣реЗ. рднрд╛рдЧ 11

quees queue_t рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдпреЗ

рд░рд╛рдВрдЧ рдкреНрд░рд╛рд░рдВрдн:

void qinit(queue_t *q);

рдлреАрд▓реНрдб _q_рд╕реНрдЯреЙрдкрд░ (рдпрд╛рдкреБрдвреЗ рдЖрдкрдг рддреНрдпрд╛рд▓рд╛ тАЬрд╕реНрдЯреЙрдкрд░тАЭ рдореНрд╣рдгреВ) рдлрдВрдХреНрд╢рдирджреНрд╡рд╛рд░реЗ рдЖрд░рдВрдн рдХреЗрд▓рд╛ рдЬрд╛рддреЛ mblk_init(), рддреНрдпрд╛рдЪрд╛ рдорд╛рдЧреАрд▓ рдШрдЯрдХ рдЖрдгрд┐ рдкреБрдвреАрд▓ рдШрдЯрдХ рдкреЙрдЗрдВрдЯрд░ рд╕реНрд╡рддрдГрдХрдбреЗ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд. рд░рд╛рдВрдЧ рдШрдЯрдХ рдХрд╛рдЙрдВрдЯрд░ рд╢реВрдиреНрдпрд╛рд╡рд░ рд░реАрд╕реЗрдЯ рдХреЗрд▓реЗ рдЖрд╣реЗ.

рдирд╡реАрди рдШрдЯрдХ рдЬреЛрдбрдд рдЖрд╣реЗ (рд╕рдВрджреЗрд╢):

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

рдирд╡реАрди рдШрдЯрдХ m рд╕реВрдЪреАрдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА рдЬреЛрдбрд▓реЗ рдЬрд╛рддреЗ, рдШрдЯрдХ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд рдЬреЗрдгреЗрдХрд░реВрди рд╕реНрдЯреЙрдкрд░ рддреНрдпрд╛рдЪреНрдпрд╛рд╕рд╛рдареА рдкреБрдвреАрд▓ рдШрдЯрдХ рдмрдирддреЛ рдЖрдгрд┐ рддреЛ рд╕реНрдЯреЙрдкрд░рд╕рд╛рдареА рдорд╛рдЧреАрд▓ рдШрдЯрдХ рдмрдирддреЛ. рд░рд╛рдВрдЧ рдШрдЯрдХ рдХрд╛рдЙрдВрдЯрд░ рд╡рд╛рдврд╡рд▓реЗрд▓рд╛ рдЖрд╣реЗ.

рд░рд╛рдВрдЧреЗрддреВрди рдПрдХ рдШрдЯрдХ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдд рдЖрд╣реЗ:

mblk_t * getq(queue_t *q); 

рд╕реНрдЯреЙрдкрд░ рдирдВрддрд░ рдпреЗрдгрд╛рд░рд╛ рд╕рдВрджреЗрд╢ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ рдШрдЯрдХ рдХрд╛рдЙрдВрдЯрд░ рдХрдореА рд╣реЛрддреЛ. рд░рд╛рдВрдЧреЗрдд рд╕реНрдЯреЙрдкрд░рд╢рд┐рд╡рд╛рдп рдХреЛрдгрддреЗрд╣реА рдШрдЯрдХ рдирд╕рд▓реНрдпрд╛рд╕, 0 рдкрд░рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ.

рд░рд╛рдВрдЧреЗрдд рд╕рдВрджреЗрд╢ рдЯрд╛рдХрдд рдЖрд╣реЗ:

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

рдШрдЯрдХ mp рдШрдЯрдХрд╛рдкреВрд░реНрд╡реА рдШрд╛рддрд▓реЗ emp. рдЬрд░ emp=0, рдирдВрддрд░ рд╕рдВрджреЗрд╢ рд░рд╛рдВрдЧреЗрдЪреНрдпрд╛ рд╢реЗрдкрдЯреАрдд рдЬреЛрдбрд▓рд╛ рдЬрд╛рддреЛ.

рд░рд╛рдВрдЧреЗрдЪреНрдпрд╛ рдбреЛрдХреНрдпрд╛рд╡рд░реВрди рд╕рдВрджреЗрд╢ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдд рдЖрд╣реЗ:

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

рдШрдЯрдХ рдХрд╛рдЙрдВрдЯрд░ рдХрдореА рд╣реЛрдд рдЖрд╣реЗ.

рд░рд╛рдВрдЧреЗрддреАрд▓ рдкрд╣рд┐рд▓реНрдпрд╛ рдШрдЯрдХрд╛рд╕рд╛рдареА рдкреЙрдЗрдВрдЯрд░ рд╡рд╛рдЪрдгреЗ:

mblk_t * peekq(queue_t *q); 

рдШрдЯрдХ рд╕реНрд╡рддрдГ рд╣рдЯрд╡рддрд╛рдирд╛ рд░рд╛рдВрдЧреЗрддреВрди рд╕рд░реНрд╡ рдШрдЯрдХ рдХрд╛рдвреВрди рдЯрд╛рдХрдгреЗ:

void flushq(queue_t *q, int how);

рдпреБрдХреНрддрд┐рд╡рд╛рдж рдХрд╕реЗ рди рд╡рд╛рдкрд░рд▓реЗрд▓реЗ. рд░рд╛рдВрдЧ рдШрдЯрдХ рдХрд╛рдЙрдВрдЯрд░ рд╢реВрдиреНрдпрд╛рд╡рд░ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЖрд╣реЗ.

рд░рд╛рдВрдЧреЗрдЪреНрдпрд╛ рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рдШрдЯрдХрд╛рдХрдбреЗ рдкреЙрдЗрдВрдЯрд░ рд╡рд╛рдЪрдгреНрдпрд╛рд╕рд╛рдареА рдореЕрдХреНрд░реЛ:

mblk_t * qlast(queue_t *q);

рд╕рдВрджреЗрд╢ рд░рд╛рдВрдЧреЗрд╕рд╣ рдХрд╛рдо рдХрд░рддрд╛рдирд╛, рдЖрдкрдг рдХреЙрд▓ рдХрд░рддрд╛ рддреЗрд╡реНрд╣рд╛ рдпрд╛рдЪреА рдЬрд╛рдгреАрд╡ рдареЗрд╡рд╛ ms_queue_put(q, m) рд╕рдВрджреЗрд╢рд╛рд▓рд╛ рд╢реВрдиреНрдп рдкреЙрдЗрдВрдЯрд░рд╕рд╣, рдлрдВрдХреНрд╢рди рд▓реВрдк рд╣реЛрддреЗ. рддреБрдордЪрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлреНрд░реАрдЬ рд╣реЛрдИрд▓. рд╕рд╛рд░рдЦреЗ рд╡рд╛рдЧрддреЗ ms_queue_next(q, m).

рдлрд┐рд▓реНрдЯрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдд рдЖрд╣реЗ

рд╡рд░ рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реА рд░рд╛рдВрдЧ рдПрдХрд╛ рдлрд┐рд▓реНрдЯрд░рдордзреВрди рджреБрд╕рд▒реНрдпрд╛ рдлрд┐рд▓реНрдЯрд░рдордзреНрдпреЗ рдХрд┐рдВрд╡рд╛ рдПрдХрд╛ рдлрд┐рд▓реНрдЯрд░рдордзреВрди рдЕрдиреЗрдХ рдлрд┐рд▓реНрдЯрд░рдордзреНрдпреЗ рд╕рдВрджреЗрд╢ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ. рдлрд┐рд▓реНрдЯрд░ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреЗ рдХрдиреЗрдХреНрд╢рди рдирд┐рд░реНрджреЗрд╢рд┐рдд рдЖрд▓реЗрдЦ рддрдпрд╛рд░ рдХрд░рддрд╛рдд. рдлрд┐рд▓реНрдЯрд░рдЪреНрдпрд╛ рдЗрдирдкреБрдЯ рдХрд┐рдВрд╡рд╛ рдЖрдЙрдЯрдкреБрдЯрд▓рд╛ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрдж "рдкрд┐рди" рдореНрд╣рдЯрд▓реЗ рдЬрд╛рдИрд▓. рдлрд┐рд▓реНрдЯрд░ рдПрдХрдореЗрдХрд╛рдВрд╢реА рдЬреЛрдбрд▓реЗрд▓реНрдпрд╛ рдХреНрд░рдорд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд░ "рд╕рд┐рдЧреНрдирд▓ рдкреЙрдЗрдВрдЯ" рдЪреА рд╕рдВрдХрд▓реНрдкрдирд╛ рд╡рд╛рдкрд░рддреЛ. рд╕рд┐рдЧреНрдирд▓ рдкреЙрдЗрдВрдЯ рдореНрд╣рдгрдЬреЗ рд░рдЪрдирд╛ _MSCPpoint, рдЬреНрдпрд╛рдордзреНрдпреЗ рдлрд┐рд▓реНрдЯрд░рд╕рд╛рдареА рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рдПрдХрд╛ рдкрд┐рдирдЪреА рд╕рдВрдЦреНрдпрд╛ рдЕрд╕рддреЗ; рддреНрдпрд╛рдиреБрд╕рд╛рд░, рддреЗ рдлрд┐рд▓реНрдЯрд░рдЪреНрдпрд╛ рдЗрдирдкреБрдЯ рдХрд┐рдВрд╡рд╛ рдЖрдЙрдЯрдкреБрдЯрдкреИрдХреА рдПрдХрд╛рдЪреНрдпрд╛ рдХрдиреЗрдХреНрд╢рдирдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЗ.

рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЖрд▓реЗрдЦрд╛рдЪрд╛ рд╕рд┐рдЧреНрдирд▓ рдкреЙрдЗрдВрдЯ

typedef struct _MSCPoint{
struct _MSFilter *filter; // ╨г╨║╨░╨╖╨░╤В╨╡╨╗╤М ╨╜╨░ ╤Д╨╕╨╗╤М╤В╤А ╨╝╨╡╨┤╨╕╨░╤Б╤В╤А╨╕╨╝╨╡╤А╨░.
int pin;                        // ╨Э╨╛╨╝╨╡╤А ╨╛╨┤╨╜╨╛╨│╨╛ ╨╕╨╖ ╨▓╤Е╨╛╨┤╨╛╨▓ ╨╕╨╗╨╕ ╨▓╤Л╤Е╨╛╨┤╨╛╨▓ ╤Д╨╕╨╗╤М╤В╤А╨░, ╤В.╨╡. ╨┐╨╕╨╜.
} MSCPoint;

рдлрд┐рд▓реНрдЯрд░ рдкрд┐рди рд╢реВрдиреНрдп рдкрд╛рд╕реВрди рдкреНрд░рд╛рд░рдВрдн рдХрд░реВрди рдХреНрд░рдорд╛рдВрдХрд┐рдд рдЖрд╣реЗрдд.

рд╕рдВрджреЗрд╢рд╛рдЪреНрдпрд╛ рд░рд╛рдВрдЧреЗрджреНрд╡рд╛рд░реЗ рджреЛрди рдкрд┐рдирдЪреЗ рдХрдиреЗрдХреНрд╢рди рд╕рдВрд░рдЪрдиреЗрджреНрд╡рд╛рд░реЗ рд╡рд░реНрдгрди рдХреЗрд▓реЗ рдЖрд╣реЗ _MS рд░рд╛рдВрдЧ, рдЬреНрдпрд╛рдордзреНрдпреЗ рд╕рдВрджреЗрд╢рд╛рдЪреА рд░рд╛рдВрдЧ рдЕрд╕рддреЗ рдЖрдгрд┐ рддреЗ рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рджреЛрди рд╕рд┐рдЧреНрдирд▓ рдмрд┐рдВрджреВрдВрдХрдбреЗ рдкреЙрдЗрдВрдЯрд░ рдЕрд╕рддрд╛рдд:

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

рдпрд╛ рд╕рдВрд░рдЪрдиреЗрд▓рд╛ рдЖрдкрдг рд╕рд┐рдЧреНрдирд▓ рд▓рд┐рдВрдХ рдореНрд╣рдгреВ. рдкреНрд░рддреНрдпреЗрдХ рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд░ рдлрд┐рд▓реНрдЯрд░рдордзреНрдпреЗ рдЗрдирдкреБрдЯ рд▓рд┐рдВрдХреНрд╕рдЪреА рдЯреЗрдмрд▓ рдЖрдгрд┐ рдЖрдЙрдЯрдкреБрдЯ рд▓рд┐рдВрдХреНрд╕рдЪреА рдЯреЗрдмрд▓ рдЕрд╕рддреЗ (MSQueue). рдлрд┐рд▓реНрдЯрд░ рддрдпрд╛рд░ рдХрд░рддрд╛рдирд╛ рд╕рд╛рд░рдгреНрдпрд╛рдВрдЪрд╛ рдЖрдХрд╛рд░ рд╕реЗрдЯ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ; рдЖрдореНрд╣реА рд╣реЗ рдЖрдзреАрдЪ рдирд┐рд░реНрдпрд╛рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рдХрд╛рд░рд╛рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рдХреЗрд▓реЗ рдЖрд╣реЗ. MSFilterDesc, рдЬреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА рдЖрдордЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдлрд┐рд▓реНрдЯрд░ рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗ. рдЦрд╛рд▓реА рдПрдХ рд░рдЪрдирд╛ рдЖрд╣реЗ рдЬреА рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд░рдордзреАрд▓ рдХреЛрдгрддреНрдпрд╛рд╣реА рдлрд┐рд▓реНрдЯрд░рдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЗ, рдПрдордПрд╕рдлрд┐рд▓реНрдЯрд░:


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;

рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдпреЛрдЬрдиреЗрдиреБрд╕рд╛рд░ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдордордзреНрдпреЗ рдлрд┐рд▓реНрдЯрд░ рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ (рдкрд░рдВрддреБ рдЯрд┐рдХрд░ рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реЗ рдирд╛рд╣реА), рдЖрдореНрд╣реА рддреНрдпрд╛рджреНрд╡рд╛рд░реЗ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдЖрд▓реЗрдЦ рддрдпрд╛рд░ рдХреЗрд▓рд╛, рдЬреНрдпрд╛рдЪреЗ рдиреЛрдб рд╣реЗ рд╕рдВрд░рдЪрдиреЗрдЪреЗ рдЙрджрд╛рд╣рд░рдг рдЖрд╣реЗрдд. рдПрдордПрд╕рдлрд┐рд▓реНрдЯрд░, рдЖрдгрд┐ рдХрдбрд╛ рд╣реА рд▓рд┐рдВрдХреНрд╕рдЪреА рдЙрджрд╛рд╣рд░рдгреЗ рдЖрд╣реЗрдд MSQueue.

рдЯрд┐рдХрд░рдЪреНрдпрд╛ рдкрдбрджреНрдпрд╛рдорд╛рдЧреАрд▓ рдХреНрд░рд┐рдпрд╛рдХрд▓рд╛рдк

рдЬреЗрд╡реНрд╣рд╛ рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдХреА рдЯрд┐рдХрд░ рд╣реЗ рдЯрд┐рдХреНрд╕рдЪреНрдпрд╛ рд╕реНрддреНрд░реЛрддрд╛рд╕рд╛рдареА рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдЖрд╣реЗ, рддреЗрд╡реНрд╣рд╛ рддреНрдпрд╛рдмрджреНрджрд▓ рд╕рдВрдкреВрд░реНрдг рд╕рддреНрдп рдирд╡реНрд╣рддреЗ. рдЯрд┐рдХрд░ рд╣реА рдПрдХ рд╡рд╕реНрддреВ рдЖрд╣реЗ рдЬреА рдШрдбреНрдпрд╛рд│рд╛рд╡рд░ рдХрд╛рд░реНрдп рдХрд░рддреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛() рд╕рд░реНрдХрд┐рдЯрдЪреЗ рд╕рд░реНрд╡ рдлрд┐рд▓реНрдЯрд░ (рдЧреНрд░рд╛рдл) рдЬреНрдпрд╛рд╢реА рддреЗ рдЬреЛрдбрд▓реЗрд▓реЗ рдЖрд╣реЗ. рдЬреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА C рдкреНрд░реЛрдЧреНрд░рд╛рдордордзреНрдпреЗ рдЖрд▓реЗрдЦ рдлрд┐рд▓реНрдЯрд░рд╢реА рдЯрд┐рдХрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЛ, рддреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА рдЯрд┐рдХрд░рд▓рд╛ рддреЛ рдЖрд▓реЗрдЦ рджрд╛рдЦрд╡рддреЛ рдЬреЛ рддреЛ рдЖрддрд╛рдкрд╛рд╕реВрди рдмрдВрдж рдХрд░реЗрдкрд░реНрдпрдВрдд рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрд▓. рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЯрд┐рдХрд░ рддреНрдпрд╛рдЪреНрдпрд╛ рдХрд╛рд│рдЬреАрд╕рд╛рдареА рд╕реЛрдкрд╡рд▓реЗрд▓реНрдпрд╛ рдЖрд▓реЗрдЦрд╛рдЪреЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдгреНрдпрд╛рд╕ рд╕реБрд░рд╡рд╛рдд рдХрд░рддреЛ, рддреНрдпрд╛рдд рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдлрд┐рд▓реНрдЯрд░рдЪреА рд╕реВрдЪреА рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЛ. рдПрдХрдЪ рдлрд┐рд▓реНрдЯрд░ рджреЛрдирджрд╛ тАЬрдЧрдгрдирд╛тАЭ рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреЗ рд╕рд╛рдкрдбрд▓реЗрд▓реНрдпрд╛ рдлрд┐рд▓реНрдЯрд░реНрд╕рдордзреНрдпреЗ рдЪреЗрдХрдмреЙрдХреНрд╕ рдареЗрд╡реВрди рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдХрд░рддреЗ рдкрд╛рд╣рд┐рд▓реЗ. рд╢реЛрдз рдкреНрд░рддреНрдпреЗрдХ рдлрд┐рд▓реНрдЯрд░рдордзреНрдпреЗ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд▓рд┐рдВрдХ рдЯреЗрдмрд▓реНрд╕рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рдХреЗрд▓рд╛ рдЬрд╛рддреЛ.

рдЖрд▓реЗрдЦрд╛рдЪреНрдпрд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рд╛рд╕реНрддрд╛рд╡рд┐рдХ рджреМрд░реНтАНрдпрд╛рджрд░рдореНрдпрд╛рди, рдЯрд┐рдХрд░ рдлрд┐рд▓реНрдЯрд░рдордзреНрдпреЗ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХреНрд╕рдЪрд╛ рд╕реНрд░реЛрдд рдореНрд╣рдгреВрди рдХрд╛рдо рдХрд░рдгрд╛рд░рд╛ рдХрд┐рдорд╛рди рдПрдХ рддрд░реА рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рд╣реЗ рддрдкрд╛рд╕рддреЛ. рдЬрд░ рддреЗрдереЗ рдХрд╛рд╣реАрд╣реА рдирд╕реЗрд▓, рддрд░ рдЖрд▓реЗрдЦ рдЪреБрдХреАрдЪрд╛ рдорд╛рдирд▓рд╛ рдЬрд╛рдИрд▓ рдЖрдгрд┐ рдЯрд┐рдХрд░ рдХреНрд░реЕрд╢ рд╣реЛрдИрд▓.

рдЖрд▓реЗрдЦ "рдмрд░реЛрдмрд░" рдЕрд╕рд▓реНрдпрд╛рдЪреЗ рдЖрдврд│рд▓реНрдпрд╛рд╕, рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдкрдбрд▓реЗрд▓реНрдпрд╛ рдлрд┐рд▓реНрдЯрд░рд╕рд╛рдареА, рдлрдВрдХреНрд╢рдирд▓рд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрд▓ рдХреЗрд▓реЗ рдЬрд╛рддреЗ. рдкреВрд░реНрд╡рдкреНрд░рдХреНрд░рд┐рдпрд╛(). рдкреБрдвреАрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрдХреНрд░рд╛рдЪрд╛ рдХреНрд╖рдг рдпреЗрддрд╛рдЪ (рдкреНрд░рддреНрдпреЗрдХ 10 рдорд┐рд▓рд┐рд╕реЗрдХрдВрджрд╛рдВрдиреА рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░), рдЯрд┐рдХрд░ рдлрдВрдХреНрд╢рдирд▓рд╛ рдХреЙрд▓ рдХрд░рддреЛ. рдкреНрд░рдХреНрд░рд┐рдпрд╛() рдкреВрд░реНрд╡реА рд╕рд╛рдкрдбрд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рд╕реНрд░реЛрдд рдлрд┐рд▓реНрдЯрд░рд╕рд╛рдареА рдЖрдгрд┐ рдирдВрддрд░ рд╕реВрдЪреАрддреАрд▓ рдЙрд░реНрд╡рд░рд┐рдд рдлрд┐рд▓реНрдЯрд░рд╕рд╛рдареА. рдЬрд░ рдлрд┐рд▓реНрдЯрд░рдордзреНрдпреЗ рдЗрдирдкреБрдЯ рд▓рд┐рдВрдХреНрд╕ рдЕрд╕рддреАрд▓ рддрд░ рдлрдВрдХреНрд╢рди рдЪрд╛рд▓реВ рдХрд░рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛() рдЗрдирдкреБрдЯ рд▓рд┐рдВрдХ рд░рд╛рдВрдЧрд╛ рд░рд┐рдХреНрдд рд╣реЛрдИрдкрд░реНрдпрдВрдд рдкреБрдирд░рд╛рд╡реГрддреНрддреА рд╣реЛрддреЗ. рдпрд╛рдирдВрддрд░, рддреЗ рд╕реВрдЪреАрддреАрд▓ рдкреБрдвреАрд▓ рдлрд┐рд▓реНрдЯрд░рд╡рд░ рдЬрд╛рддреЗ рдЖрдгрд┐ рдЗрдирдкреБрдЯ рд▓рд┐рдВрдХ рд╕рдВрджреЗрд╢рд╛рдВрдкрд╛рд╕реВрди рдореБрдХреНрдд рд╣реЛрдИрдкрд░реНрдпрдВрдд рддреЗ "рд╕реНрдХреНрд░реЛрд▓" рдХрд░рддреЗ. рдпрд╛рджреА рд╕рдВрдкреЗрдкрд░реНрдпрдВрдд рдЯрд┐рдХрд░ рдлрд┐рд▓реНрдЯрд░рдордзреВрди рдлрд┐рд▓реНрдЯрд░рд╡рд░ рдлрд┐рд░рддреЛ. рд╣реЗ рд╕рд╛рдпрдХрд▓рдЪреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реНрдг рдХрд░рддреЗ.

рдЖрддрд╛ рдЖрдореНрд╣реА рдЯреНрдпреВрдкрд▓реНрд╕рд╡рд░ рдкрд░рдд рдпреЗрдК рдЖрдгрд┐ рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд░рдордзреНрдпреЗ рдЕрд╢реА рд╕рдВрд╕реНрдерд╛ рдХрд╛ рдЬреЛрдбрд▓реА рдЧреЗрд▓реА рдпрд╛рдмрджреНрджрд▓ рдмреЛрд▓реВ. рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рдлрд┐рд▓реНрдЯрд░рдордзреНрдпреЗ рдХрд╛рд░реНрдпрд░рдд рдЕрд▓реНрдЧреЛрд░рд┐рджрдорджреНрд╡рд╛рд░реЗ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛рдЪреЗ рдкреНрд░рдорд╛рдг рдПрдХрд░реВрдк рд╣реЛрдд рдирд╛рд╣реА рдЖрдгрд┐ рдЗрдирдкреБрдЯрд╡рд░ рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛ рдмрдлрд░рдЪреНрдпрд╛ рдЖрдХрд╛рд░рд╛рдЪреНрдпрд╛ рдЧреБрдгрд╛рдХрд╛рд░ рдирд╛рд╣реА. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдореНрд╣реА рдПрдХ рдлрд┐рд▓реНрдЯрд░ рд▓рд┐рд╣рд┐рдд рдЖрд╣реЛрдд рдЬреЗ рдПрдХ рдЬрд▓рдж рдлреВрд░рд┐рдпрд░ рдЯреНрд░рд╛рдиреНрд╕рдлреЙрд░реНрдо рдХрд░рддреЗ, рдЬреЗ рдкрд░рд┐рднрд╛рд╖рд╛рдиреБрд╕рд╛рд░ рдлрдХреНрдд рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХреНрд╕рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реВ рд╢рдХрддреЗ рдЬреНрдпрд╛рдВрдЪрд╛ рдЖрдХрд╛рд░ рджреЛрдирдЪрд╛ рдЖрд╣реЗ. рддреНрдпрд╛рдЪреА рд╕рдВрдЦреНрдпрд╛ релрезреи рдЕрд╕реВ рджреНрдпрд╛. рдЬрд░ рдбреЗрдЯрд╛ рдЯреЗрд▓рд┐рдлреЛрди рдЪреЕрдиреЗрд▓рджреНрд╡рд╛рд░реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓рд╛ рдЧреЗрд▓рд╛ рдЕрд╕реЗрд▓, рддрд░ рдЗрдирдкреБрдЯрд╡рд░реАрд▓ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢рд╛рдЪрд╛ рдбреЗрдЯрд╛ рдмрдлрд░ рдЖрдореНрд╣рд╛рд▓рд╛ 512 рд╕рд┐рдЧреНрдирд▓ рдирдореБрдиреЗ рдЖрдгреЗрд▓. рдЬреЛрдкрд░реНрдпрдВрдд рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдорд╛рдгрд╛рдд рдбреЗрдЯрд╛ рдорд┐рд│рдд рдирд╛рд╣реА рддреЛрдкрд░реНрдпрдВрдд рдЗрдирдкреБрдЯрдордзреВрди рдбреЗрдЯрд╛ рд╕рдВрдХрд▓рд┐рдд рди рдХрд░рдгреНрдпрд╛рдЪрд╛ рдореЛрд╣ рд╣реЛрддреЛ. рдкрд░рдВрддреБ рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдЯрд┐рдХрд░рд╢реА рдЯрдХреНрдХрд░ рд╣реЛрдИрд▓, рдЬреЛ рдЗрдирдкреБрдЯ рд▓рд┐рдВрдХ рд░рд┐рдХреНрдд рд╣реЛрдИрдкрд░реНрдпрдВрдд рдлрд┐рд▓реНрдЯрд░ рд╕реНрдХреНрд░реЛрд▓ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдЕрдпрд╢рд╕реНрд╡реА рдкреНрд░рдпрддреНрди рдХрд░реЗрд▓. рдкреВрд░реНрд╡реА, рдЖрдореНрд╣реА рд╣рд╛ рдирд┐рдпрдо рдлрд┐рд▓реНрдЯрд░рдЪрд╛ рддрд┐рд╕рд░рд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдореНрд╣рдгреВрди рдирд┐рдпреБрдХреНрдд рдХреЗрд▓рд╛ рд╣реЛрддрд╛. рдпрд╛ рддрддреНрддреНрд╡рд╛рдиреБрд╕рд╛рд░, рдлрд┐рд▓реНрдЯрд░рдЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛() рдлрдВрдХреНрд╢рдирдиреЗ рдЗрдирдкреБрдЯ рд░рд╛рдВрдЧрд╛рдВрдордзреВрди рд╕рд░реНрд╡ рдбреЗрдЯрд╛ рдШреЗрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдЗрдирдкреБрдЯрдордзреВрди рдХреЗрд╡рд│ 512 рдирдореБрдиреЗ рдШреЗрдгреЗ рд╢рдХреНрдп рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА, рдХрд╛рд░рдг рдЖрдкрдг рдлрдХреНрдд рд╕рдВрдкреВрд░реНрдг рдмреНрд▓реЙрдХ рдШреЗрдК рд╢рдХрддрд╛, рдореНрд╣рдгрдЬреЗ. рдлрд┐рд▓реНрдЯрд░рд▓рд╛ 640 рдирдореБрдиреЗ рдШреНрдпрд╛рд╡реЗ рд▓рд╛рдЧрддреАрд▓ рдЖрдгрд┐ рддреНрдпрд╛рддреАрд▓ 512 рд╡рд╛рдкрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреАрд▓, рдЙрд░реНрд╡рд░рд┐рдд рдбреЗрдЯрд╛рдЪрд╛ рдирд╡реАрди рднрд╛рдЧ рдЬрдорд╛ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЖрдордЪреЗ рдлрд┐рд▓реНрдЯрд░, рддреНрдпрд╛рдЪреНрдпрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛рдЪреНрдпрд╛ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рд╕реНрдЯреЛрд░реЗрдЬрд╕рд╛рдареА рд╕рд╣рд╛рдпреНрдпрдХ рдХреНрд░рд┐рдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд░рдЪреНрдпрд╛ рд╡рд┐рдХрд╕рдХрд╛рдВрдиреА рдЖрдгрд┐ рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓рд╛ рдЖрд╣реЗ - MSBufferizer (рдмрдлрд░рд░), рдЬреЛ tuples рд╡рд╛рдкрд░реВрди рд╣реА рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рддреЗ.

рдмрдлрд░рд╛рдпрдЭрд░ (MSBufferizer)

рд╣рд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрд╣реЗ рдЬреЛ рдлрд┐рд▓реНрдЯрд░рдордзреНрдпреЗ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдЬрдорд╛ рдХрд░реЗрд▓ рдЖрдгрд┐ рдлрд┐рд▓реНрдЯрд░ рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рдЪрд╛рд▓рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдорд╛рд╣рд┐рддреАрдЪреА рдорд╛рддреНрд░рд╛ рдкреБрд░реЗрд╢реА рд╣реЛрддрд╛рдЪ рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕рд╛рдареА рд╕рдмрдорд┐рдЯ рдХрд░рдгреЗ рд╕реБрд░реВ рдХрд░реЗрд▓. рдмрдлрд░ рдбреЗрдЯрд╛ рдЬрдорд╛ рдХрд░рдд рдЕрд╕рддрд╛рдирд╛, рдкреНрд░реЛрд╕реЗрд╕рд░рдЪреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреЙрд╡рд░ рди рд╡рд╛рдкрд░рддрд╛ рдлрд┐рд▓реНрдЯрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдореЛрдбрдордзреНрдпреЗ рдХрд╛рдо рдХрд░реЗрд▓. рдкрдг рдмрдлрд░рд░рдХрдбреВрди рд╡рд╛рдЪрди рдлрдВрдХреНрд╢рди рд╢реВрдиреНрдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд рдЗрддрд░ рдореВрд▓реНрдп рдкрд░рддрд╡рддрд╛рдЪ, рдлрд┐рд▓реНрдЯрд░рдЪреЗ process() рдлрдВрдХреНрд╢рди рдЖрд╡рд╢реНрдпрдХ рдЖрдХрд╛рд░рд╛рдЪреНрдпрд╛ рднрд╛рдЧрд╛рдВрдордзреНрдпреЗ рдмрдлрд░рд░рдХрдбреВрди рдбреЗрдЯрд╛ рдШреЗрдгреЗ рдЖрдгрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреЗ рд╕реБрд░реВ рдХрд░рддреЗ, рдЬреЛрдкрд░реНрдпрдВрдд рддреЗ рд╕рдВрдкрдд рдирд╛рд╣реА.
рдЕрджреНрдпрд╛рдк рдЖрд╡рд╢реНрдпрдХ рдирд╕рд▓реЗрд▓рд╛ рдбреЗрдЯрд╛ рдЯреНрдпреБрдкрд▓рдЪрд╛ рдкрд╣рд┐рд▓рд╛ рдШрдЯрдХ рдореНрд╣рдгреВрди рдмрдлрд░рдордзреНрдпреЗ рд░рд╛рд╣рддреЛ, рдЬреНрдпрд╛рд▓рд╛ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛рдЪреЗ рддреНрдпрд╛рдирдВрддрд░рдЪреЗ рдмреНрд▓реЙрдХреНрд╕ рд╕рдВрд▓рдЧреНрди рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд.

рдмрдлрд░рдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгрд╛рд░реА рд░рдЪрдирд╛:

struct _MSBufferizer{
queue_t q; /* ╨Ю╤З╨╡╤А╨╡╨┤╤М ╤Б╨╛╨╛╨▒╤Й╨╡╨╜╨╕╨╣. */
int size; /* ╨б╤Г╨╝╨╝╨░╤А╨╜╤Л╨╣ ╤А╨░╨╖╨╝╨╡╤А ╨┤╨░╨╜╨╜╤Л╤Е ╨╜╨░╤Е╨╛╨┤╤П╤Й╨╕╤Е╤Б╤П ╨▓ ╨▒╤Г╤Д╨╡╤А╨╕╨╖╨░╤В╨╛╤А╨╡ ╨▓ ╨┤╨░╨╜╨╜╤Л╨╣ ╨╝╨╛╨╝╨╡╨╜╤В. */
};
typedef struct _MSBufferizer MSBufferizer;

MSBufferizer рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдпреЗ

рдирд╡реАрди рдмрдлрд░ рдЙрджрд╛рд╣рд░рдг рддрдпрд╛рд░ рдХрд░рдгреЗ:

MSBufferizer * ms_bufferizer_new(void);

рдореЗрдорд░реА рд╡рд╛рдЯрдк рдХреЗрд▓реА рдЬрд╛рддреЗ, рдордзреНрдпреЗ рдЖрд░рдВрдн рдХреЗрд▓реА рдЬрд╛рддреЗ ms_buferizer_init() рдЖрдгрд┐ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд░рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ.

рдЖрд░рдВрдн рдХрд╛рд░реНрдп:

void ms_bufferizer_init(MSBufferizer *obj); 

рд░рд╛рдВрдЧ рд╕реБрд░реВ рд╣реЛрдд рдЖрд╣реЗ q, рдлреАрд▓реНрдб рдЖрдХрд╛рд░ рд╢реВрдиреНрдпрд╛рд╡рд░ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЖрд╣реЗ.

рд╕рдВрджреЗрд╢ рдЬреЛрдбрдгреЗ:

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

рд╕рдВрджреЗрд╢ m рд░рд╛рдВрдЧреЗрдд рдЬреЛрдбрд▓рд╛ рдЖрд╣реЗ. рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХреНрд╕рдЪрд╛ рдЧрдгрдирд╛ рдХреЗрд▓реЗрд▓рд╛ рдЖрдХрд╛рд░ рдпрд╛рдордзреНрдпреЗ рдЬреЛрдбрд▓рд╛ рдЬрд╛рддреЛ рдЖрдХрд╛рд░.

рд▓рд┐рдВрдХ рдбреЗрдЯрд╛ рд░рд╛рдВрдЧреЗрддреАрд▓ рд╕рд░реНрд╡ рд╕рдВрджреЗрд╢ рдмрдлрд░рдордзреНрдпреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдд рдЖрд╣реЗ q:

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

рджреБрд╡реНрдпрд╛рд╡рд░реВрди рд╕рдВрджреЗрд╢ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреЗ q рдмрдлрд░ рдордзреНрдпреЗ рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░реВрди рдХреЗрд▓реЗ рдЬрд╛рддреЗ ms_buferizer_put().

рдмрдлрд░рдордзреВрди рд╡рд╛рдЪрди:

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

рдмрдлрд░рдордзреНрдпреЗ рдЬрдорд╛ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рдЪрд╛ рдЖрдХрд╛рд░ рд╡рд┐рдирдВрддреА рдХреЗрд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рдкреЗрдХреНрд╖рд╛ рдХрдореА рдЕрд╕рд▓реНрдпрд╛рд╕ (datalen), рдирдВрддрд░ рдлрдВрдХреНрд╢рди рд╢реВрдиреНрдп рдорд┐рд│рд╡рддреЗ, рдбреЗрдЯрд╛ рдбреЗрдЯрд╛рд╡рд░ рдХреЙрдкреА рдХреЗрд▓рд╛ рдЬрд╛рдд рдирд╛рд╣реА. рдЕрдиреНрдпрдерд╛, рдмрдлрд░рдордзреНрдпреЗ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЯреНрдпреВрдкрд▓реНрд╕рдордзреВрди рдбреЗрдЯрд╛рдЪреА рдЕрдиреБрдХреНрд░рдорд┐рдХ рдХреЙрдкреА рдХреЗрд▓реА рдЬрд╛рддреЗ. рдХреЙрдкреА рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЯреНрдпреВрдкрд▓ рд╣рдЯрд╡рд┐рд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рдореЗрдорд░реА рдореБрдХреНрдд рдХреЗрд▓реА рдЬрд╛рддреЗ. рдЬреЗрд╡реНрд╣рд╛ рдбреЗрдЯрд╛рд▓реЗрди рдмрд╛рдЗрдЯреНрд╕ рдХреЙрдкреА рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рддреНрдпрд╛ рдХреНрд╖рдгреА рдХреЙрдкреА рдХрд░рдгреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ. рдЬрд░ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХрдЪреНрдпрд╛ рдордзреНрдпрднрд╛рдЧреА рдЬрд╛рдЧрд╛ рд╕рдВрдкрд▓реА, рддрд░ рдпрд╛ рд╕рдВрджреЗрд╢рд╛рдд, рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдЙрд░реНрд╡рд░рд┐рдд рди рдХреЗрд▓реЗрд▓реНрдпрд╛ рднрд╛рдЧрд╛рдкрд░реНрдпрдВрдд рдХрдореА рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓. рдкреБрдврдЪреНрдпрд╛ рд╡реЗрд│реА рддреБрдореНрд╣реА рдХреЙрд▓ рдХрд░рд╛рд▓, рддреЗрд╡реНрд╣рд╛рдкрд╛рд╕реВрди рдХреЙрдкреА рдХрд░рдгреЗ рд╕реБрд░реВ рд░рд╛рд╣реАрд▓.

рдмрдлрд░рдордзреНрдпреЗ рд╕рдзреНрдпрд╛ рдЙрдкрд▓рдмреНрдз рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рдЪреЗ рдкреНрд░рдорд╛рдг рд╡рд╛рдЪрдгреЗ:

int ms_bufferizer_get_avail(MSBufferizer *obj); 

рдлреАрд▓реНрдб рдкрд░рдд рдХрд░рддреЛ рдЖрдХрд╛рд░ рдмрдлрд░рд░

рдмрдлрд░рдордзреАрд▓ рдбреЗрдЯрд╛рдЪрд╛ рднрд╛рдЧ рдЯрд╛рдХреВрди рджреЗрдгреЗ:

void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);

рдбреЗрдЯрд╛рдЪреНрдпрд╛ рдмрд╛рдЗрдЯреНрд╕рдЪреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реА рдЬрд╛рддреЗ рдЖрдгрд┐ рдЯрд╛рдХреВрди рджрд┐рд▓реА рдЬрд╛рддреЗ. рд╕рд░реНрд╡рд╛рдд рдЬреБрдирд╛ рдбреЗрдЯрд╛ рдЯрд╛рдХреВрди рджрд┐рд▓рд╛ рдЖрд╣реЗ.

рдмрдлрд░рдордзреАрд▓ рд╕рд░реНрд╡ рд╕рдВрджреЗрд╢ рд╣рдЯрд╡рд┐рдд рдЖрд╣реЗ:

void ms_bufferizer_flush(MSBufferizer *obj); 

рдбреЗрдЯрд╛ рдХрд╛рдЙрдВрдЯрд░ рд╢реВрдиреНрдпрд╛рд╡рд░ рд░реАрд╕реЗрдЯ рдХреЗрд▓рд╛ рдЖрд╣реЗ.

рдмрдлрд░рдордзреАрд▓ рд╕рд░реНрд╡ рд╕рдВрджреЗрд╢ рд╣рдЯрд╡рд┐рдд рдЖрд╣реЗ:

void ms_bufferizer_uninit(MSBufferizer *obj); 

рдХрд╛рдЙрдВрдЯрд░ рд░реАрд╕реЗрдЯ рдХреЗрд▓реЗрд▓реЗ рдирд╛рд╣реА.

рдмрдлрд░ рдХрд╛рдвреВрди рдЯрд╛рдХрдгреЗ рдЖрдгрд┐ рдореЗрдорд░реА рдореБрдХреНрдд рдХрд░рдгреЗ:

void ms_bufferizer_destroy(MSBufferizer *obj);  

рдмрдлрд░рд░ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдЙрджрд╛рд╣рд░рдгреЗ рдЕрдиреЗрдХ рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд░ рдлрд┐рд▓реНрдЯрд░реНрд╕рдЪреНрдпрд╛ рд╕реНрддреНрд░реЛрдд рдХреЛрдбрдордзреНрдпреЗ рдЖрдврд│реВ рд╢рдХрддрд╛рдд. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, MS_L16_ENC рдлрд┐рд▓реНрдЯрд░рдордзреНрдпреЗ, рдЬреЗ рдиреЗрдЯрд╡рд░реНрдХ рдСрд░реНрдбрд░рдкрд╛рд╕реВрди рд╣реЛрд╕реНрдЯ рдСрд░реНрдбрд░рдордзреНрдпреЗ рдирдореБрдиреНрдпрд╛рдВрдордзреАрд▓ рдмрд╛рдЗрдЯреНрд╕рдЪреА рдкреБрдирд░реНрд░рдЪрдирд╛ рдХрд░рддреЗ: l16.c

рдкреБрдвреАрд▓ рд▓реЗрдЦрд╛рдд, рдЖрдкрдг рдЯрд┐рдХрд░ рд▓реЛрдбрдЪреНрдпрд╛ рдЕрдВрджрд╛рдЬрд╛рдЪреА рд╕рдорд╕реНрдпрд╛ рдЖрдгрд┐ рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдорд░рдордзреНрдпреЗ рдЬрд╛рд╕реНрдд рд╕рдВрдЧрдгрдХреАрдп рд▓реЛрдб рдХрд╕реЗ рд╣рд╛рддрд╛рд│рд╛рдпрдЪреЗ рддреЗ рдкрд╛рд╣реВ.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛