ื—ืงืจ ืžื ื•ืข ื”-VoIP Mediastreamer2. ื—ืœืง 11

ื”ื—ื•ืžืจ ืฉืœ ื”ืžืืžืจ ืœืงื•ื— ืžืžื ื™ ืขืจื•ืฅ ื–ืŸ.

ื—ืงืจ ืžื ื•ืข ื”-VoIP Mediastreamer2. ื—ืœืง 11

ืžื ื’ื ื•ืŸ ืชื ื•ืขืช ื ืชื•ื ื™ื

  • ื‘ืœื•ืง ื ืชื•ื ื™ื dblk_t
  • ื”ื•ื“ืขื” mblk_t
  • ืคื•ื ืงืฆื™ื•ืช ืœืขื‘ื•ื“ื” ืขื ื”ื•ื“ืขื•ืช mblk_t
  • ืชื•ืจ queue_t
  • ืคื•ื ืงืฆื™ื•ืช ืœืขื‘ื•ื“ื” ืขื ืชื•ืจื™ื queue_t
  • ื—ื™ื‘ื•ืจ ืžืกื ื ื™ื
  • ื’ืจืฃ ื ืงื•ื“ืช ื”ืื•ืช ืฉืœ ืขื™ื‘ื•ื“ ื ืชื•ื ื™ื
  • ืคืขื™ืœื•ืช ืžืื—ื•ืจื™ ื”ืงืœืขื™ื ืฉืœ ื”ื˜ื™ืงืจ
  • Bufferizer (MSBufferizer)
  • ืคื•ื ืงืฆื™ื•ืช ืœืขื‘ื•ื“ื” ืขื MSBufferizer

ื‘ืขื‘ืจ ัั‚ะฐั‚ัŒะต ืคื™ืชื—ื ื• ืžืกื ืŸ ืžืฉืœื ื•. ืžืืžืจ ื–ื” ื™ืชืžืงื“ ื‘ืžื ื’ื ื•ืŸ ื”ืคื ื™ืžื™ ืœื”ืขื‘ืจืช ื ืชื•ื ื™ื ื‘ื™ืŸ ืžืกื ื ื™ ืกื˜ืจื™ืžืจ ืžื“ื™ื”. ื–ื” ื™ืืคืฉืจ ืœืš ืœื›ืชื•ื‘ ืคื™ืœื˜ืจื™ื ืžืชื•ื—ื›ืžื™ื ืขื ืคื—ื•ืช ืžืืžืฅ ื‘ืขืชื™ื“.

ืžื ื’ื ื•ืŸ ืชื ื•ืขืช ื ืชื•ื ื™ื

ืชื ื•ืขืช ื”ื ืชื•ื ื™ื ื‘ืกื˜ืจื™ืžืจ ื”ืžื“ื™ื” ืžืชื‘ืฆืขืช ื‘ืืžืฆืขื•ืช ืชื•ืจื™ื ื”ืžืชื•ืืจื™ื ืขืœ ื™ื“ื™ ื”ืžื‘ื ื” queue_t. ืžื—ืจื•ื–ื•ืช ืฉืœ ื”ื•ื“ืขื•ืช ื›ืžื• mblk_t, ืฉื‘ืขืฆืžื ืื™ื ื ืžื›ื™ืœื™ื ื ืชื•ื ื™ ืื•ืช, ืืœื ืจืง ืงื™ืฉื•ืจื™ื ืœื”ื•ื“ืขื” ื”ืงื•ื“ืžืช, ื”ื‘ืื” ื•ืœื’ื•ืฉ ื”ื ืชื•ื ื™ื. ื‘ื ื•ืกืฃ, ืื ื™ ืจื•ืฆื” ืœื”ื“ื’ื™ืฉ ื‘ืžื™ื•ื—ื“ ืฉื™ืฉ ื’ื ืฉื“ื” ืœืงื™ืฉื•ืจ ืœื”ื•ื“ืขื” ืžืื•ืชื• ืกื•ื’, ื”ืžืืคืฉืจ ืœืืจื’ืŸ ืจืฉื™ืžืช ื”ื•ื“ืขื•ืช ืžืงื•ืฉืจืช ื‘ื•ื“ื“ืช. ืœืงื‘ื•ืฆืช ื”ื•ื“ืขื•ืช ื”ืžืื•ื—ื“ืช ื‘ืจืฉื™ืžื” ื›ื–ื• ื ืงืจื ื˜ื•ืคืœ. ืœืคื™ื›ืš, ื›ืœ ืจื›ื™ื‘ ื‘ืชื•ืจ ื™ื›ื•ืœ ืœื”ื™ื•ืช ื”ื•ื“ืขื” ื‘ื•ื“ื“ืช mblk_t, ื•ืื•ืœื™ ืจืืฉ ื˜ื•ืคืœืช ื”ื•ื“ืขื•ืช mblk_t. ืœื›ืœ ื”ื•ื“ืขืช ื˜ื•ืคืœ ื™ื›ื•ืœื” ืœื”ื™ื•ืช ื‘ืœื•ืง ื ืชื•ื ื™ ืžื—ืœืงื” ืžืฉืœื”. ื ื“ื•ืŸ ืžื“ื•ืข ื™ืฉ ืฆื•ืจืš ื‘ื˜ื•ืคืœื™ื ืžืขื˜ ืžืื•ื—ืจ ื™ื•ืชืจ.

ื›ืคื™ ืฉืฆื•ื™ืŸ ืœืขื™ืœ, ื”ื”ื•ื“ืขื” ืขืฆืžื” ืื™ื ื” ืžื›ื™ืœื” ื‘ืœื•ืง ื ืชื•ื ื™ื; ื‘ืžืงื•ื ื–ืืช, ื”ื™ื ืžื›ื™ืœื” ืจืง ืžืฆื‘ื™ืข ืœืื–ื•ืจ ื”ื–ื™ื›ืจื•ืŸ ืฉื‘ื• ื”ื‘ืœื•ืง ืžืื•ื—ืกืŸ. ื‘ื—ืœืง ื–ื”, ื”ืชืžื•ื ื” ื”ื›ื•ืœืœืช ืฉืœ ืขื‘ื•ื“ืชื• ืฉืœ ืกื˜ืจื™ืžืจ ื”ืžื“ื™ื” ืžื–ื›ื™ืจื” ืืช ืžื—ืกืŸ ื”ื“ืœืชื•ืช ื‘ืกืจื˜ ื”ืžืฆื•ื™ืจ "Monsters, Inc.", ืฉื‘ื• ื“ืœืชื•ืช (ืงื™ืฉื•ืจื™ื ืœื ืชื•ื ื™ื - ื—ื“ืจื™ื) ื ืขื•ืช ื‘ืžื”ื™ืจื•ืช ืžื˜ื•ืจืคืช ืœืื•ืจืš ืžืกื•ืขื™ื ืขื™ืœื™ื™ื, ื‘ืขื•ื“ ื”ื—ื“ืจื™ื ืขืฆืžื ืœื”ื™ืฉืืจ ืœืœื ืชื ื•ืขื”.

ื›ืขืช, ื ืข ืœืื•ืจืš ื”ื”ื™ืจืจื›ื™ื” ืžืœืžื˜ื” ืœืžืขืœื”, ื‘ื•ืื• ื ื‘ื—ืŸ ื‘ืคื™ืจื•ื˜ ืืช ื”ื™ืฉื•ื™ื•ืช ื”ืžืคื•ืจื˜ื•ืช ืฉืœ ืžื ื’ื ื•ืŸ ื”ืขื‘ืจืช ื”ื ืชื•ื ื™ื ื‘ืกื˜ืจื™ืžืจ ื”ืžื“ื™ื”.

ื‘ืœื•ืง ื ืชื•ื ื™ื 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_next, ื”ื ื—ื•ืฆื™ื ื›ื“ื™ ืœืืจื’ืŸ ืจืฉื™ืžื” ืžืงื•ืฉืจืช ื›ืคื•ืœื” (ืฉื”ื™ื ืชื•ืจ queue_t).

ื•ืื– ืžื’ื™ืข ื”ืžืฆื‘ื™ืข b_cont, ื”ืžืฉืžืฉ ืจืง ื›ืืฉืจ ื”ื”ื•ื“ืขื” ื”ื™ื ื—ืœืง ืž-tuple. ืขื‘ื•ืจ ื”ื”ื•ื“ืขื” ื”ืื—ืจื•ื ื” ื‘-tuple, ืžืฆื‘ื™ืข ื–ื” ื ืฉืืจ ืจื™ืง.

ืœืื—ืจ ืžื›ืŸ ืื ื• ืจื•ืื™ื ืžืฆื‘ื™ืข ืœื‘ืœื•ืง ื ืชื•ื ื™ื b_datap, ืฉืขื‘ื•ืจื• ืงื™ื™ืžืช ื”ื”ื•ื“ืขื”. ืื—ืจื™ื• ืžื•ืคื™ืขื™ื ืžืฆื‘ื™ืขื™ื ืœืื–ื•ืจ ื‘ืชื•ืš ืžืื’ืจ ื ืชื•ื ื™ ื”ื‘ืœื•ืง. ืฉื“ื” b_rptr ืžืฆื™ื™ืŸ ืืช ื”ืžื™ืงื•ื ืฉืžืžื ื• ื™ื™ืงืจืื• ื ืชื•ื ื™ื ืžื”ืžืื’ืจ. ืฉื“ื” b_wptr ืžืฆื™ื™ืŸ ืืช ื”ืžื™ืงื•ื ืฉืžืžื ื• ืชืชื‘ืฆืข ื›ืชื™ื‘ื” ืœืžืื’ืจ.

ืฉืืจ ื”ืฉื“ื•ืช ื”ื ื‘ืขืœื™ ืื•ืคื™ ืฉื™ืจื•ืช ื•ืื™ื ื ื ื•ื’ืขื™ื ืœื”ืคืขืœืช ืžื ื’ื ื•ืŸ ื”ืขื‘ืจืช ื”ื ืชื•ื ื™ื.

ืœื”ืœืŸ ื”ื•ื“ืขื” ื‘ื•ื“ื“ืช ืขื ื”ืฉื m1 ื•ื‘ืœื•ืง ื ืชื•ื ื™ื d1.
ื—ืงืจ ืžื ื•ืข ื”-VoIP Mediastreamer2. ื—ืœืง 11
ื”ืื™ื•ืจ ื”ื‘ื ืžืฆื™ื’ ืื•ืกืฃ ืฉืœ ืฉืœื•ืฉ ื”ื•ื“ืขื•ืช m1, m1_1, m1_2.
ื—ืงืจ ืžื ื•ืข ื”-VoIP Mediastreamer2. ื—ืœืง 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*)); 

ื”ืคื•ื ืงืฆื™ื”, ืœืื—ืจ ื™ืฆื™ืจืช ื”ื”ื•ื“ืขื” ื•ืžื‘ื ื” ื‘ืœื•ืง ื”ื ืชื•ื ื™ื, ืชื’ื“ื™ืจ ืืช ื”ืžืฆื‘ื™ืขื™ื ืฉืœื” ืœื ืชื•ื ื™ื ื‘ื›ืชื•ื‘ืช buf. ื”ึธื”ึตืŸ. ื‘ืžืงืจื” ื–ื”, ืžืื’ืจ ื”ื ืชื•ื ื™ื ืื™ื ื• ืžืžื•ืงื ืื—ืจื™ ืฉื“ื•ืช ื”ื›ื•ืชืจืช ืฉืœ ื‘ืœื•ืง ื”ื ืชื•ื ื™ื, ื›ืคื™ ืฉื”ื™ื” ื‘ืžืงืจื” ืฉืœ ื™ืฆื™ืจืช ื‘ืœื•ืง ื ืชื•ื ื™ื ืขื ื”ืคื•ื ืงืฆื™ื” datab_alloc(). ื”ืžืื’ืจ ืขื ื”ื ืชื•ื ื™ื ื”ืžื•ืขื‘ืจื™ื ืœืคื•ื ืงืฆื™ื” ื™ื™ืฉืืจ ื”ื™ื›ืŸ ืฉื”ื™ื”, ืื‘ืœ ื‘ืขื–ืจืช ืžืฆื‘ื™ืขื™ื ื”ื•ื ื™ืฆื•ืจืฃ ืœื›ื•ืชืจืช ื”ื—ื“ืฉื” ืฉื ื•ืฆืจื” ืฉืœ ื‘ืœื•ืง ื”ื ืชื•ื ื™ื, ื•ื–ื”, ื‘ื”ืชืื, ืœื”ื•ื“ืขื”.

ืœื”ื•ื“ืขื” ืื—ืช mblk_t ื ื™ืชืŸ ืœืฉืจืฉืจ ืžืกืคืจ ื‘ืœื•ืงื™ื ืฉืœ ื ืชื•ื ื™ื ื‘ืจืฆืฃ. ื–ื” ื ืขืฉื” ืขืœ ื™ื“ื™ ื”ืคื•ื ืงืฆื™ื”:

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

mp - ื”ื•ื“ืขื” ืฉืืœื™ื” ื™ืชื•ื•ืกืฃ ื‘ืœื•ืง ื ืชื•ื ื™ื ื ื•ืกืฃ;
ื ืชื•ื ื™ื - ืžืฆื‘ื™ืข ืœื‘ืœื•ืง, ืขื•ืชืง ืฉืœื• ื™ืชื•ื•ืกืฃ ืœื”ื•ื“ืขื”;
ื’ื•ื“ืœ - ื’ื•ื“ืœ ื ืชื•ื ื™ื;
ื ืชื™ื‘ - ื“ื’ืœ ืฉื’ื•ื“ืœ ื”ื–ื™ื›ืจื•ืŸ ื”ืžื•ืงืฆื” ื—ื™ื™ื‘ ืœื”ื™ื•ืช ืžื™ื•ืฉืจ ืœืื•ืจืš ื’ื‘ื•ืœ ืฉืœ 4 ื‘ืชื™ื (ืจื™ืคื•ื“ ื™ืขืฉื” ืขื ืืคืกื™ื).

ืื ื™ืฉ ืžืกืคื™ืง ืžืงื•ื ื‘ืžืื’ืจ ื ืชื•ื ื™ ื”ื”ื•ื“ืขื” ื”ืงื™ื™ื, ื”ื ืชื•ื ื™ื ื”ื—ื“ืฉื™ื ื™ื•ื“ื‘ืงื• ืžืื—ื•ืจื™ ื”ื ืชื•ื ื™ื ืฉื›ื‘ืจ ื ืžืฆืื™ื ืฉื. ืื ื™ืฉ ืคื—ื•ืช ืžืงื•ื ืคื ื•ื™ ื‘ืžืื’ืจ ื ืชื•ื ื™ ื”ื”ื•ื“ืขื” ืžืืฉืจ ื’ื•ื“ืœ, ืื– ื ื•ืฆืจืช ื”ื•ื“ืขื” ื—ื“ืฉื” ืขื ื’ื•ื“ืœ ืžืื’ืจ ืžืกืคื™ืง ื•ื”ื ืชื•ื ื™ื ืžื•ืขืชืงื™ื ืœืžืื’ืจ ืฉืœื•. ื–ื•ื”ื™ ื”ื•ื“ืขื” ื—ื“ืฉื”, ื”ืžืงื•ืฉืจืช ืœื”ื•ื“ืขื” ื”ืžืงื•ืจื™ืช ื‘ืืžืฆืขื•ืช ืžืฆื‘ื™ืข b_cont. ื‘ืžืงืจื” ื–ื”, ื”ื”ื•ื“ืขื” ื”ื•ืคื›ืช ืœื˜ื•ืคืœ.

ืื ืืชื” ืฆืจื™ืš ืœื”ื•ืกื™ืฃ ื’ื•ืฉ ื ืชื•ื ื™ื ื ื•ืกืฃ ืœ-tuple, ืื– ืืชื” ืฆืจื™ืš ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื”:

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

ื”ื™ื ืชืžืฆื ืืช ื”ื”ื•ื“ืขื” ื”ืื—ืจื•ื ื” ื‘ื˜ื•ืคืœื” (ื™ืฉ ืœื• b_cont ื™ื”ื™ื” null) ื•ื™ืงืจื ืœืคื•ื ืงืฆื™ื” ืขื‘ื•ืจ ื”ื•ื“ืขื” ื–ื• appendb().

ืืชื” ื™ื›ื•ืœ ืœื’ืœื•ืช ืืช ื’ื•ื“ืœ ื”ื ืชื•ื ื™ื ื‘ื”ื•ื“ืขื” ืื• ื˜ื•ืคืœื” ื‘ืืžืฆืขื•ืช ื”ืคื•ื ืงืฆื™ื”:

int msgdsize(const mblk_t *mp);

ื–ื” ื™ืขื‘ื•ืจ ื‘ืœื•ืœืื” ื“ืจืš ื›ืœ ื”ื”ื•ื“ืขื•ืช ื‘-tuple ื•ื™ื—ื–ื™ืจ ืืช ื›ืžื•ืช ื”ื ืชื•ื ื™ื ื”ื›ื•ืœืœืช ื‘ืžืื’ืจื™ ื”ื ืชื•ื ื™ื ืฉืœ ื”ื”ื•ื“ืขื•ืช ื”ืœืœื•. ืขื‘ื•ืจ ื›ืœ ื”ื•ื“ืขื”, ื›ืžื•ืช ื”ื ืชื•ื ื™ื ืžื—ื•ืฉื‘ืช ื‘ืื•ืคืŸ ื”ื‘ื:

 mp->b_wptr - mp->b_rptr

ื›ื“ื™ ืœืฉืœื‘ ืฉื ื™ tuples, ื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื”:

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

ื”ื™ื ืžืฆืจืฃ ืืช ื”ื˜ืคื•ืœ newm ืœื–ื ื‘ ืฉืœ tuple mp ื•ืžื—ื–ื™ืจ ืžืฆื‘ื™ืข ืœื”ื•ื“ืขื” ื”ืื—ืจื•ื ื” ืฉืœ ื”-tuple ืฉื”ืชืงื‘ืœ.

ื‘ืžื™ื“ืช ื”ืฆื•ืจืš, ื ื™ืชืŸ ืœื”ืคื•ืš tuple ืœื”ื•ื“ืขื” ืื—ืช ืขื ื‘ืœื•ืง ื ืชื•ื ื™ื ื‘ื•ื“ื“; ื–ื” ื ืขืฉื” ืขืœ ื™ื“ื™ ื”ืคื•ื ืงืฆื™ื”:

void msgpullup(mblk_t *mp,int len);

ืื ื˜ื™ืขื•ืŸ ืœืŸ ื”ื•ื -1, ื•ืื– ื’ื•ื“ืœ ื”ืžืื’ืจ ื”ืžื•ืงืฆื” ื ืงื‘ืข ืื•ื˜ื•ืžื˜ื™ืช. ืื ืœืŸ ื”ื•ื ืžืกืคืจ ื—ื™ื•ื‘ื™, ืžืื’ืจ ื‘ื’ื•ื“ืœ ื–ื” ื™ื™ื•ื•ืฆืจ ื•ื ืชื•ื ื™ ื”ื•ื“ืขืช ื”ื˜ืคื•ืœ ื™ื•ืขืชืงื• ืœืชื•ื›ื•. ืื ื”ืžืื’ืจ ื™ื’ืžืจ, ื”ื”ืขืชืงื” ืชื™ืขืฆืจ ืฉื. ื”ื”ื•ื“ืขื” ื”ืจืืฉื•ื ื” ืฉืœ ื”-tuple ืชืงื‘ืœ ืžืื’ืจ ื’ื•ื“ืœ ื—ื“ืฉ ืขื ื”ื ืชื•ื ื™ื ืฉื”ื•ืขืชืงื•. ืฉืืจ ื”ื”ื•ื“ืขื•ืช ื™ื™ืžื—ืงื• ื•ื”ื–ื™ื›ืจื•ืŸ ื™ื•ื—ื–ืจ ืœืขืจื™ืžื”.

ื‘ืขืช ืžื—ื™ืงืช ืžื‘ื ื” 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);

ื”ื•ื“ืขื” newm ื™ืฆื•ืจืฃ ืืœื™ื• mp.

ื™ืฆื™ืจืช ืขื•ืชืง ืฉืœ ื”ื•ื“ืขื” ื‘ื•ื“ื“ืช:

mblk_t *copyb(const mblk_t *mp);

ื”ืขืชืงื” ืžืœืื” ืฉืœ ื˜ื•ืคืœื” ืขื ื›ืœ ื‘ืœื•ืงื™ ื”ื ืชื•ื ื™ื:

mblk_t *copymsg(const mblk_t *mp);

ื”ืืœืžื ื˜ื™ื ืฉืœ ื”-tuple ืžื•ืขืชืงื™ื ืขืœ ื™ื“ื™ ื”ืคื•ื ืงืฆื™ื” 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);

ืื ื”ื˜ื™ืขื•ืŸ ืœืŸ ื”ื•ื -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);

ืชื•ืจ queue_t

ืชื•ืจ ื”ื”ื•ื“ืขื•ืช ื‘ืกื˜ืจื™ืžืจ ื”ืžื“ื™ื” ืžื™ื•ืฉื ื›ืจืฉื™ืžื” ืžืขื’ืœื™ืช ืžืงื•ืฉืจืช ื›ืคื•ืœื”. ื›ืœ ืจื›ื™ื‘ ืจืฉื™ืžื” ืžื›ื™ืœ ืžืฆื‘ื™ืข ืœื’ื•ืฉ ื ืชื•ื ื™ื ืขื ื“ื’ื™ืžื•ืช ืื•ืช. ืžืกืชื‘ืจ ืฉืจืง ืžืฆื‘ื™ืขื™ื ืœื‘ืœื•ืง ื”ื ืชื•ื ื™ื ื ืขื™ื ื‘ืชื•ืจื, ื‘ืขื•ื“ ืฉื”ื ืชื•ื ื™ื ืขืฆืžื ื ืฉืืจื™ื ืœืœื ืชื ื•ืขื”. ื”ึธื”ึตืŸ. ืจืง ืงื™ืฉื•ืจื™ื ืืœื™ื”ื ืžื•ืขื‘ืจื™ื.
ืžื‘ื ื” ื”ืžืชืืจ ืืช ื”ืชื•ืจ queue_t, ืžื•ืฆื’ ืœื”ืœืŸ:

typedef struct _queue
{
   mblk_t _q_stopper; /* "ะฅะพะปะพัั‚ะพะน" ัะปะตะผะตะฝั‚ ะพั‡ะตั€ะตะดะธ, ะฝะต ัƒะบะฐะทั‹ะฒะฐะตั‚ ะฝะฐ ะดะฐะฝะฝั‹ะต, ะธัะฟะพะปัŒะทัƒะตั‚ัั ั‚ะพะปัŒะบะพ ะดะปั ัƒะฟั€ะฐะฒะปะตะฝะธั ะพั‡ะตั€ะตะดัŒัŽ. ะŸั€ะธ ะธะฝะธั†ะธะฐะปะธะทะฐั†ะธะธ ะพั‡ะตั€ะตะดะธ (qinit()) ะตะณะพ ัƒะบะฐะทะฐั‚ะตะปะธ ะฝะฐัั‚ั€ะฐะธะฒะฐัŽั‚ัั ั‚ะฐะบ, ั‡ั‚ะพะฑั‹ ะพะฝะธ ัƒะบะฐะทั‹ะฒะฐะปะธ ะฝะฐ ะฝะตะณะพ ัะฐะผะพะณะพ. */
   int q_mcount;        // ะšะพะปะธั‡ะตัั‚ะฒะพ ัะปะตะผะตะฝั‚ะพะฒ ะฒ ะพั‡ะตั€ะตะดะธ.
} queue_t;

ื”ืžื‘ื ื” ืžื›ื™ืœ ืฉื“ื” - ืžืฆื‘ื™ืข _q_stopper ื”ืงืœื“ *mblk_t, ื–ื” ืžืฆื‘ื™ืข ืขืœ ื”ืืœืžื ื˜ ื”ืจืืฉื•ืŸ (ื”ื•ื“ืขื”) ื‘ืชื•ืจ. ื”ืฉื“ื” ื”ืฉื ื™ ืฉืœ ื”ืžื‘ื ื” ื”ื•ื ืžื•ื ื” ื”ื”ื•ื“ืขื•ืช ื‘ืชื•ืจ.
ื”ืื™ื•ืจ ืฉืœื”ืœืŸ ืžืฆื™ื’ ืชื•ืจ ื‘ืฉื q1 ื”ืžื›ื™ืœ 4 ื”ื•ื“ืขื•ืช m1, m2, m3, m4.
ื—ืงืจ ืžื ื•ืข ื”-VoIP Mediastreamer2. ื—ืœืง 11
ื”ืื™ื•ืจ ื”ื‘ื ืžืฆื™ื’ ืชื•ืจ ื‘ืฉื q1 ื”ืžื›ื™ืœ 4 ื”ื•ื“ืขื•ืช m1,m2,m3,m4. Message m2 ื”ื•ื ืจืืฉื• ืฉืœ tuple ืฉืžื›ื™ืœ ืขื•ื“ ืฉืชื™ ื”ื•ื“ืขื•ืช m2_1 ื•-m2_2.

ื—ืงืจ ืžื ื•ืข ื”-VoIP Mediastreamer2. ื—ืœืง 11

ืคื•ื ืงืฆื™ื•ืช ืœืขื‘ื•ื“ื” ืขื ืชื•ืจื™ื queue_t

ืืชื—ื•ืœ ื”ืชื•ืจ:

void qinit(queue_t *q);

ืฉื“ื” _q_stopper (ืœื”ืœืŸ ื ืงืจื ืœื–ื” "stopper") ืžืื•ืชื—ืœ ืขืœ ื™ื“ื™ ื”ืคื•ื ืงืฆื™ื” 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) ืขื ืžืฆื‘ื™ืข null ืœื”ื•ื“ืขื”, ื”ืคื•ื ืงืฆื™ื” ืขื•ื‘ืจืช ืœื•ืœืื”. ื”ืชื•ื›ื ื™ืช ืฉืœืš ืชืงืคื. ืžืชื ื”ื’ ื‘ืื•ืคืŸ ื“ื•ืžื” ms_queue_next(q, m).

ื—ื™ื‘ื•ืจ ืžืกื ื ื™ื

ื”ืชื•ืจ ื”ืžืชื•ืืจ ืœืขื™ืœ ืžืฉืžืฉ ืœื”ืขื‘ืจืช ื”ื•ื“ืขื•ืช ืžืžืกื ืŸ ืื—ื“ ืœืžืฉื ื”ื• ืื• ืžืžืกื ืŸ ืื—ื“ ืœืžืกืคืจ ืžืกื ื ื™ื. ืžืกื ื ื™ื ื•ื”ืงืฉืจื™ื ื‘ื™ื ื™ื”ื ื™ื•ืฆืจื™ื ื’ืจืฃ ืžื›ื•ื•ืŸ. ื”ืงืœื˜ ืื• ื”ืคืœื˜ ืฉืœ ื”ืžืกื ืŸ ื™ื™ืงืจื ื”ืžื™ืœื” ื”ื›ืœืœื™ืช "pin". ื›ื“ื™ ืœืชืืจ ืืช ื”ืกื“ืจ ืฉื‘ื• ืžืกื ื ื™ื ืžื—ื•ื‘ืจื™ื ื–ื” ืœื–ื”, ืกื˜ืจื™ืžืจ ื”ืžื“ื™ื” ืžืฉืชืžืฉ ื‘ืžื•ืฉื’ "ื ืงื•ื“ืช ืื•ืช". ื ืงื•ื“ืช ื”ืื•ืช ื”ื™ื ืžื‘ื ื” _MSCPoint, ื”ืžื›ื™ืœ ืžืฆื‘ื™ืข ืœืžืกื ืŸ ื•ืžืกืคืจ ืื—ื“ ืžื”ืคื™ื ื™ื ืฉืœื•; ื‘ื”ืชืื, ื”ื•ื ืžืชืืจ ืืช ื”ื—ื™ื‘ื•ืจ ืฉืœ ืื—ืช ืžื”ื›ื ื™ืกื•ืช ืื• ื”ื™ืฆื™ืื•ืช ืฉืœ ื”ืžืกื ืŸ.

ื’ืจืฃ ื ืงื•ื“ืช ื”ืื•ืช ืฉืœ ืขื™ื‘ื•ื“ ื ืชื•ื ื™ื

typedef struct _MSCPoint{
struct _MSFilter *filter; // ะฃะบะฐะทะฐั‚ะตะปัŒ ะฝะฐ ั„ะธะปัŒั‚ั€ ะผะตะดะธะฐัั‚ั€ะธะผะตั€ะฐ.
int pin;                        // ะะพะผะตั€ ะพะดะฝะพะณะพ ะธะท ะฒั…ะพะดะพะฒ ะธะปะธ ะฒั‹ั…ะพะดะพะฒ ั„ะธะปัŒั‚ั€ะฐ, ั‚.ะต. ะฟะธะฝ.
} MSCPoint;

ืคื™ื ื™ ื”ืกื™ื ื•ืŸ ืžืžื•ืกืคืจื™ื ื”ื—ืœ ืžืืคืก.

ื”ื—ื™ื‘ื•ืจ ืฉืœ ืฉื ื™ ืคื™ื ื™ื ืขืœ ื™ื“ื™ ืชื•ืจ ื”ื•ื“ืขื•ืช ืžืชื•ืืจ ืขืœ ื™ื“ื™ ื”ืžื‘ื ื” _MSQueue, ื”ืžื›ื™ืœ ืชื•ืจ ื”ื•ื“ืขื•ืช ื•ืžืฆื‘ื™ืขื™ื ืœืฉืชื™ ื ืงื•ื“ื•ืช ื”ืื•ืช ืฉื”ื•ื ืžื—ื‘ืจ:

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

ื ืงืจื ืœืžื‘ื ื” ื”ื–ื” ืงื™ืฉื•ืจ ืื•ืช. ื›ืœ ืžืกื ืŸ ืกื˜ืจื™ืžืจ ืžื“ื™ื” ืžื›ื™ืœ ื˜ื‘ืœื” ืฉืœ ืงื™ืฉื•ืจื™ ืงืœื˜ ื•ื˜ื‘ืœื” ืฉืœ ืงื™ืฉื•ืจื™ ืคืœื˜ (MSQueue). ื’ื•ื“ืœ ื”ื˜ื‘ืœืื•ืช ื ืงื‘ืข ื‘ืขืช ื™ืฆื™ืจืช ืžืกื ืŸ; ื›ื‘ืจ ืขืฉื™ื ื• ื–ืืช ื‘ืืžืฆืขื•ืช ืžืฉืชื ื” ืžื™ื•ืฆื ืžืกื•ื’ื• MSFilterDesc, ื›ืืฉืจ ืคื™ืชื—ื ื• ืคื™ืœื˜ืจ ืžืฉืœื ื•. ืœื”ืœืŸ ืžื‘ื ื” ื”ืžืชืืจ ื›ืœ ืžืกื ืŸ ื‘ืกื˜ืจื™ืžืจ ืžื“ื™ื”, ืžืกื ืŸ MS:


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;

ืœืื—ืจ ืฉื—ื™ื‘ืจื ื• ืืช ื”ืžืกื ื ื™ื ื‘ืชื•ื›ื ื™ืช C ื‘ื”ืชืื ืœืชื•ื›ื ื™ืช ืฉืœื ื• (ืืš ืœื ื—ื™ื‘ืจื ื• ืืช ื”ื˜ื™ืงืจ), ื™ืฆืจื ื• ื‘ื›ืš ื’ืจืฃ ืžื›ื•ื•ืŸ, ืฉื”ืฆืžืชื™ื ืฉืœื• ื”ื ืžื•ืคืขื™ื ืฉืœ ื”ืžื‘ื ื” ืžืกื ืŸ MS, ื•ืงืฆื•ื•ืช ื”ื ืžื•ืคืขื™ื ืฉืœ ืงื™ืฉื•ืจื™ื MSQueue.

ืคืขื™ืœื•ืช ืžืื—ื•ืจื™ ื”ืงืœืขื™ื ืฉืœ ื”ื˜ื™ืงืจ

ื›ืฉืืžืจืชื™ ืœืš ืฉื”ื˜ื™ืงืจ ื”ื•ื ืžืกื ืŸ ืœืžืงื•ืจ ื”ืงืจืฆื™ื•ืช, ื–ื• ืœื ื”ื™ื™ืชื” ื›ืœ ื”ืืžืช ืขืœ ื–ื”. ื˜ื™ืงืจ ื”ื•ื ืื•ื‘ื™ื™ืงื˜ ืฉืžืคืขื™ืœ ืคื•ื ืงืฆื™ื•ืช ืขืœ ื”ืฉืขื•ืŸ ืชื”ืœื™ืš() ื›ืœ ื”ืžืกื ื ื™ื ืฉืœ ื”ืžืขื’ืœ (ื’ืจืฃ) ืืœื™ื• ื”ื•ื ืžื—ื•ื‘ืจ. ื›ืืฉืจ ืื ื• ืžื—ื‘ืจื™ื ื˜ื™ืงืจ ืœืžืกื ืŸ ื’ืจืฃ ื‘ืชื•ื›ื ืช C, ืื ื• ืžืจืื™ื ืœื˜ื™ืงืจ ืืช ื”ื’ืจืฃ ืฉื”ื•ื ื™ืฉืœื•ื˜ ื‘ื• ืžืขืชื” ื•ืื™ืœืš ืขื“ ืฉื ื›ื‘ื” ืื•ืชื•. ืœืื—ืจ ื”ื—ื™ื‘ื•ืจ, ื”ื˜ื™ืงืจ ืžืชื—ื™ืœ ืœื‘ื—ื•ืŸ ืืช ื”ื’ืจืฃ ืฉื”ื•ืคืงื“ ืขืœ ื˜ื™ืคื•ืœื•, ื•ืžืจื›ื™ื‘ ืจืฉื™ืžื” ืฉืœ ืžืกื ื ื™ื ื”ื›ื•ืœืœื™ื ืื•ืชื•. ื›ื“ื™ ืœื "ืœืกืคื•ืจ" ืืช ืื•ืชื• ืžืกื ืŸ ืคืขืžื™ื™ื, ื”ื•ื ืžืกืžืŸ ืืช ื”ืžืกื ื ื™ื ืฉื–ื•ื”ื• ืขืœ ื™ื“ื™ ื”ืฆื‘ืช ืชื™ื‘ืช ืกื™ืžื•ืŸ ื‘ื”ื ืœืจืื•ืช. ื”ื—ื™ืคื•ืฉ ืžืชื‘ืฆืข ื‘ืืžืฆืขื•ืช ื˜ื‘ืœืื•ืช ื”ืงื™ืฉื•ืจื™ื ืฉื™ืฉ ืœื›ืœ ืคื™ืœื˜ืจ.

ื‘ืžื”ืœืš ืกื™ื•ืจ ื”ื”ื™ื›ืจื•ืช ืฉืœื• ื‘ื’ืจืฃ, ื”ื˜ื™ืงืจ ื‘ื•ื“ืง ืื ื‘ื™ืŸ ื”ืžืกื ื ื™ื ื™ืฉ ืœืคื—ื•ืช ืื—ื“ ืฉืคื•ืขืœ ื›ืžืงื•ืจ ืœื—ืกื™ืžื•ืช ื ืชื•ื ื™ื. ืื ืื™ืŸ ื›ืืœื”, ื”ื’ืจืฃ ื ื—ืฉื‘ ืœื ื ื›ื•ืŸ ื•ื”ื˜ื™ืงืจ ืงื•ืจืก.

ืื ื”ื’ืจืฃ ืžืชื‘ืจืจ ื›"ื ื›ื•ืŸ", ืขื‘ื•ืจ ื›ืœ ืžืกื ืŸ ืฉื ืžืฆื, ื”ืคื•ื ืงืฆื™ื” ื ืงืจืืช ืœืืชื—ื•ืœ preprocess(). ื‘ืจื’ืข ืฉืžื’ื™ืข ื”ืจื’ืข ืœืžื—ื–ื•ืจ ื”ืขื™ื‘ื•ื“ ื”ื‘ื (ื›ืœ 10 ืžื™ืœื™ืฉื ื™ื•ืช ื›ื‘ืจื™ืจืช ืžื—ื“ืœ), ื”ื˜ื™ืงืจ ืงื•ืจื ืœืคื•ื ืงืฆื™ื” ืชื”ืœื™ืš() ืขื‘ื•ืจ ื›ืœ ืžืกื ื ื™ ื”ืžืงื•ืจ ืฉื ืžืฆืื• ื‘ืขื‘ืจ, ื•ืœืื—ืจ ืžื›ืŸ ืขื‘ื•ืจ ื”ืžืกื ื ื™ื ื”ื ื•ืชืจื™ื ื‘ืจืฉื™ืžื”. ืื ืœืžืกื ืŸ ื™ืฉ ืงื™ืฉื•ืจื™ ืงืœื˜, ืื– ื”ืคืขืœ ืืช ื”ืคื•ื ืงืฆื™ื” ืชื”ืœื™ืš() ื—ื•ื–ืจ ืขื“ ืฉืชื•ืจื™ ืงื™ืฉื•ืจื™ ื”ืงืœื˜ ืจื™ืงื™ื. ืœืื—ืจ ืžื›ืŸ, ื”ื•ื ืขื•ื‘ืจ ืœืžืกื ืŸ ื”ื‘ื ื‘ืจืฉื™ืžื” ื•"ื’ื•ืœืœ" ืื•ืชื• ืขื“ ืฉืงื™ืฉื•ืจื™ ื”ืงืœื˜ ื™ื”ื™ื• ื ืงื™ื™ื ืžื”ื•ื“ืขื•ืช. ื”ื˜ื™ืงืจ ืขื•ื‘ืจ ืžืžืกื ืŸ ืœืžืกื ืŸ ืขื“ ืœืกื™ื•ื ื”ืจืฉื™ืžื”. ื–ื” ืžืฉืœื™ื ืืช ืขื™ื‘ื•ื“ ื”ืžื—ื–ื•ืจ.

ื›ืขืช ื ื—ื–ื•ืจ ืœ-tuples ื•ื ื“ื‘ืจ ืžื“ื•ืข ื ื•ืกืคื” ื™ืฉื•ืช ื›ื–ื• ืœืกื˜ืจื™ืžืจ ื”ืžื“ื™ื”. ื‘ืื•ืคืŸ ื›ืœืœื™, ื›ืžื•ืช ื”ื ืชื•ื ื™ื ื”ื ื“ืจืฉืช ืขืœ ื™ื“ื™ ื”ืืœื’ื•ืจื™ืชื ื”ืคื•ืขืœ ื‘ืชื•ืš ื”ืžืกื ืŸ ืื™ื ื” ืชื•ืืžืช ื•ืื™ื ื” ื›ืคื•ืœื” ืฉืœ ื’ื•ื“ืœ ืžืื’ืจื™ ื”ื ืชื•ื ื™ื ื”ืžืชืงื‘ืœื™ื ื‘ืงืœื˜. ืœื“ื•ื’ืžื”, ืื ื• ื›ื•ืชื‘ื™ื ืžืกื ืŸ ืฉืžื‘ืฆืข ื˜ืจื ืกืคื•ืจืžืฆื™ื” ืคื•ืจื™ื™ื” ืžื”ื™ืจื”, ืฉื‘ื”ื’ื“ืจื” ื™ื›ื•ืœ ืœืขื‘ื“ ืจืง ื‘ืœื•ืงื™ ื ืชื•ื ื™ื ืฉื’ื•ื“ืœื ื”ื•ื ื—ื–ืงืช ืฉืชื™ื™ื. ืชืŸ ืœื–ื” ืœื”ื™ื•ืช 512 ืกืคื™ืจื•ืช. ืื ื”ื ืชื•ื ื™ื ื ื•ืฆืจื™ื ืขืœ ื™ื“ื™ ืขืจื•ืฅ ื˜ืœืคื•ืŸ, ืื– ืžืื’ืจ ื”ื ืชื•ื ื™ื ืฉืœ ื›ืœ ื”ื•ื“ืขื” ื‘ื›ื ื™ืกื” ื™ื‘ื™ื ืœื ื• 160 ื“ื’ื™ืžื•ืช ืื•ืช. ืžืคืชื” ืœื ืœืืกื•ืฃ ื ืชื•ื ื™ื ืžื”ืงืœื˜ ืขื“ ืฉื›ืžื•ืช ื”ื ืชื•ื ื™ื ื”ื ื“ืจืฉืช ืชื”ื™ื” ืฉื. ืื‘ืœ ื‘ืžืงืจื” ื–ื”, ืชืชืจื—ืฉ ื”ืชื ื’ืฉื•ืช ืขื ื”ื˜ื™ืงืจ, ืืฉืจ ื™ื ืกื” ืœืœื ื”ืฆืœื—ื” ืœื’ืœื•ืœ ืืช ื”ืžืกื ืŸ ืขื“ ืฉืงื™ืฉื•ืจ ื”ืงืœื˜ ืจื™ืง. ื‘ืขื‘ืจ, ื”ื’ื“ืจื ื• ืืช ื”ื›ืœืœ ื”ื–ื” ื›ืขื™ืงืจื•ืŸ ื”ืฉืœื™ืฉื™ ืฉืœ ื”ืžืกื ืŸ. ืœืคื™ ืขื™ืงืจื•ืŸ ื–ื”, ื”ืคื•ื ืงืฆื™ื” process() ืฉืœ ื”ืžืกื ืŸ ื—ื™ื™ื‘ืช ืœืงื—ืช ืืช ื›ืœ ื”ื ืชื•ื ื™ื ืžืชื•ืจื™ ื”ืงืœื˜.

ื‘ื ื•ืกืฃ, ืœื ื ื™ืชืŸ ื™ื”ื™ื” ืœืงื—ืช ืจืง 512 ื“ื’ื™ืžื•ืช ืžื”ืงืœื˜, ืฉื›ืŸ ื ื™ืชืŸ ืœืงื—ืช ืจืง ื‘ืœื•ืงื™ื ืฉืœืžื™ื, ื›ืœื•ืžืจ. ื”ืžืกื ืŸ ื™ืฆื˜ืจืš ืœืงื—ืช 640 ื“ื’ื™ืžื•ืช ื•ืœื”ืฉืชืžืฉ ื‘-512 ืžื”ืŸ, ื”ืฉืืจ ืœืคื ื™ ืฆื‘ื™ืจืช ื—ืœืง ื—ื“ืฉ ืฉืœ ื ืชื•ื ื™ื. ืœืคื™ื›ืš, ื”ืžืกื ืŸ ืฉืœื ื•, ื‘ื ื•ืกืฃ ืœืขื‘ื•ื“ืชื• ื”ืขื™ืงืจื™ืช, ื—ื™ื™ื‘ ืœืกืคืง ืคืขื•ืœื•ืช ืขื–ืจ ืœืื—ืกื•ืŸ ื‘ื™ื ื™ื™ื ืฉืœ ื ืชื•ื ื™ ืงืœื˜. ืžืคืชื—ื™ ื”ืžื“ื™ื” ืกื˜ืจื™ืžืจ ื•ืคืชืจื•ืŸ ืœื‘ืขื™ื” ื›ืœืœื™ืช ื–ื• ืคื™ืชื—ื• ืื•ื‘ื™ื™ืงื˜ ืžื™ื•ื—ื“ - MSBufferizer (bufferer), ืืฉืจ ืคื•ืชืจ ื‘ืขื™ื” ื–ื• ื‘ืืžืฆืขื•ืช tuples.

Bufferizer (MSBufferizer)

ื–ื”ื• ืื•ื‘ื™ื™ืงื˜ ืฉื™ืฆื‘ื•ืจ ื ืชื•ื ื™ ืงืœื˜ ื‘ืชื•ืš ื”ืžืกื ืŸ ื•ื™ืชื—ื™ืœ ืœืฉืœื•ื— ืื•ืชื ืœืขื™ื‘ื•ื“ ื‘ืจื’ืข ืฉื›ืžื•ืช ื”ืžื™ื“ืข ืžืกืคื™ืงื” ืœื”ืคืขืœืช ืืœื’ื•ืจื™ืชื ื”ืžืกื ืŸ. ื‘ื–ืžืŸ ืฉื”ืžืื’ืจ ืฆื•ื‘ืจ ื ืชื•ื ื™ื, ื”ืžืกื ืŸ ื™ืคืขืœ ื‘ืžืฆื‘ ืกืจืง, ืžื‘ืœื™ ืœื ืฆืœ ืืช ื›ื•ื— ื”ืขื™ื‘ื•ื“ ืฉืœ ื”ืžืขื‘ื“. ืื‘ืœ ื‘ืจื’ืข ืฉืคื•ื ืงืฆื™ื™ืช ื”ืงืจื™ืื” ืžื”-buffer ืžื—ื–ื™ืจื” ืขืจืš ืฉื•ื ื” ืžืืคืก, ืคื•ื ืงืฆื™ื™ืช process() ืฉืœ ื”ืžืกื ืŸ ืžืชื—ื™ืœื” ืœืงื—ืช ื•ืœืขื‘ื“ ื ืชื•ื ื™ื ืžื”-buffer ื‘ืžื ื•ืช ื‘ื’ื•ื“ืœ ื”ื ื“ืจืฉ, ืขื“ ืœืžื™ืฆื•ื™.
ื ืชื•ื ื™ื ืฉืขื“ื™ื™ืŸ ืœื ื ื“ืจืฉื™ื ื ืฉืืจื™ื ื‘ืžืื’ืจ ื›ืืœืžื ื˜ ื”ืจืืฉื•ืŸ ืฉืœ ื”-tuple, ืฉืืœื™ื• ืžืฆื•ืจืคื™ื ื‘ืœื•ืงื™ื ืฉืœ ื ืชื•ื ื™ ืงืœื˜ ืขื•ืงื‘ื™ื.

ื”ืžื‘ื ื” ืฉืžืชืืจ ืืช ื”ืžืื’ืจ:

struct _MSBufferizer{
queue_t q; /* ะžั‡ะตั€ะตะดัŒ ัะพะพะฑั‰ะตะฝะธะน. */
int size; /* ะกัƒะผะผะฐั€ะฝั‹ะน ั€ะฐะทะผะตั€ ะดะฐะฝะฝั‹ั… ะฝะฐั…ะพะดัั‰ะธั…ัั ะฒ ะฑัƒั„ะตั€ะธะทะฐั‚ะพั€ะต ะฒ ะดะฐะฝะฝั‹ะน ะผะพะผะตะฝั‚. */
};
typedef struct _MSBufferizer MSBufferizer;

ืคื•ื ืงืฆื™ื•ืช ืœืขื‘ื•ื“ื” ืขื MSBufferizer

ื™ืฆื™ืจืช ืžื•ืคืข ื—ื™ืฅ ื—ื“ืฉ:

MSBufferizer * ms_bufferizer_new(void);

ื”ื–ื™ื›ืจื•ืŸ ืžื•ืงืฆื”, ืžืื•ืชื—ืœ ืคื ื™ืžื” ms_bufferizer_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_bufferizer_put().

ืงืจื™ืื” ืžื”ืžืื’ืจ:

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

ืื ื’ื•ื“ืœ ื”ื ืชื•ื ื™ื ืฉื ืฆื‘ืจ ื‘ืžืื’ืจ ืงื˜ืŸ ืžื”ืžื‘ื•ืงืฉ (ื“ืื˜ืœืŸ), ื•ืื– ื”ืคื•ื ืงืฆื™ื” ืžื—ื–ื™ืจื” ืืคืก, ื”ื ืชื•ื ื™ื ืœื ืžื•ืขืชืงื™ื ืœื ืชื•ื ื™ื. ืื—ืจืช, ืžืชื‘ืฆืขืช ื”ืขืชืงื” ืจืฆื™ืคื” ืฉืœ ื ืชื•ื ื™ื ืž-tuples ื”ืžืžื•ืงืžื™ื ื‘ืžืื’ืจ. ืœืื—ืจ ื”ื”ืขืชืงื”, ื”-tuple ื ืžื—ืง ื•ื”ื–ื™ื›ืจื•ืŸ ืžืชืคื ื”. ื”ื”ืขืชืงื” ืžืกืชื™ื™ืžืช ื‘ืจื’ืข ืฉื‘ื• ืžื•ืขืชืงื™ื ื‘ืชื™ื ืฉืœ dataalen. ืื ื”ืžืงื•ื ืื•ื–ืœ ื‘ืืžืฆืข ื‘ืœื•ืง ื ืชื•ื ื™ื, ืื– ื‘ื”ื•ื“ืขื” ื–ื•, ื‘ืœื•ืง ื”ื ืชื•ื ื™ื ื™ืฆื˜ืžืฆื ืœื—ืœืง ืฉื ื•ืชืจ ืฉืœื ื”ื•ืขืชืง. ื‘ืคืขื ื”ื‘ืื” ืฉืชืชืงืฉืจ, ื”ื”ืขืชืงื” ืชืžืฉื™ืš ืžื ืงื•ื“ื” ื–ื•.

ืงืจื™ืืช ื›ืžื•ืช ื”ื ืชื•ื ื™ื ื”ื–ืžื™ื ื” ื›ืขืช ื‘ืžืื’ืจ:

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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”