เบเบฒเบ™เบชเบณเบซเบผเบงเบ”เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ Mediastreamer2 VoIP. เบžเบฒเบเบ—เบต 11

เป€เบญเบเบฐเบชเบฒเบ™เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเปเบกเปˆเบ™เป€เบญเบปเบฒเบกเบฒเบˆเบฒเบเบ‚เบญเบ‡เบ‚เป‰เบญเบ เบŠเปˆเบญเบ‡ zen.

เบเบฒเบ™เบชเบณเบซเบผเบงเบ”เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ Mediastreamer2 VoIP. เบžเบฒเบเบ—เบต 11

เบเบปเบ™เป„เบเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ‚เปเป‰เบกเบนเบ™

  • เบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™ dblk_t
  • เบ‚เปเป‰เบ„เบงเบฒเบก mblk_t
  • เบŸเบฑเบ‡เบŠเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบก mblk_t
  • เบ„เบดเบง queue_t
  • เบŸเบฑเบ‡เบŠเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเปเบ–เบง queue_t
  • เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ•เบปเบงเบเบญเบ‡
  • เบˆเบธเบ”เบชเบฑเบ™เบเบฒเบ™เบ‚เบญเบ‡เบเบฒเบŸเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบกเบนเบ™
  • เบเบดเบ”เบˆเบฐเบเปเบฒเบ—เบฒเบ‡เบซเบฅเบฑเบ‡เบ‚เบญเบ‡ ticker เป„เบ”เป‰
  • Bufferizer (MSBufferizer)
  • เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš MSBufferizer

เปƒเบ™เบ—เบตเปˆเบชเบธเบ” เบšเบปเบ”เบ„เบงเบฒเบก เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ•เบปเบงเบเบญเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบ‡. เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบˆเบฐเป€เบ™เบฑเป‰เบ™เปƒเบชเปˆเบเบปเบ™เป„เบเบžเบฒเบเปƒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเบ‚เปเป‰เบกเบนเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบ•เบปเบงเบเบญเบ‡ media streamer. เบ™เบตเป‰เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบ‚เบฝเบ™เบ•เบปเบงเบเบญเบ‡เบ—เบตเปˆเบŠเบฑเบšเบŠเป‰เบญเบ™เบ”เป‰เบงเบเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบซเบ™เป‰เบญเบเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”.

เบเบปเบ™เป„เบเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ‚เปเป‰เบกเบนเบ™

เบเบฒเบ™โ€‹เป€เบ„เบทเปˆเบญเบ™โ€‹เป„เบซเบงโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เปƒเบ™โ€‹เบชเบทเปˆโ€‹เบกเบงเบ™โ€‹เบŠเบปเบ™ streamer เปเบกเปˆเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เปเบ–เบงโ€‹เบญเบฐโ€‹เบ—เบดโ€‹เบšเบฒเบโ€‹เป‚เบ”เบโ€‹เป‚เบ„เบ‡โ€‹เบ›เบฐโ€‹เบเบญเบšโ€‹เบเบฒเบ™โ€‹ เบ„เบดเบง_เบ—. เบชเบฒเบเบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเป€เบŠเบฑเปˆเบ™ mblk_t, เป€เบŠเบดเปˆเบ‡เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบšเปเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบชเบฑเบ™เบเบฒเบ™, เปเบ•เปˆเบžเบฝเบ‡เปเบ•เปˆเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เบ•เปเปˆเป„เบ›เปเบฅเบฐเบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบ™เบฑเป‰เบ™เบซเบ™เบฑเบเป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบงเปˆเบฒเบเบฑเบ‡เบกเบตเบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบ‚เบญเบ‡เบ›เบฐเป€เบžเบ”เบ”เบฝเบงเบเบฑเบ™, เป€เบŠเบดเปˆเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบฅเปเบฒเบ”เบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เปเบšเบšเบ”เปˆเบฝเบง. เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเบฐโ€‹เป€เบญเบตเป‰เบ™โ€‹เบเบธเปˆเบกโ€‹เบ‚เบญเบ‡โ€‹เบ‚เปเป‰โ€‹เบ„เบงเบฒเบกโ€‹เบ—เบตเปˆโ€‹เป‚เบฎเบกโ€‹เบเบฑเบ™โ€‹เป‚เบ”เบโ€‹เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบฅเบฒเบโ€‹เบเบฒเบ™โ€‹เบ”เบฑเปˆเบ‡โ€‹เบเปˆเบฒเบงโ€‹เป€เบ›เบฑเบ™ tuple. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบ”เป†เบ‚เบญเบ‡เปเบ–เบงเบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ”เบฝเบง mblk_t, เปเบฅเบฐเบšเบฒเบ‡เบ—เบตเบซเบปเบงเบ‚เบญเบ‡ tuple เบ‚เปเป‰เบ„เบงเบฒเบก mblk_t. เปเบ•เปˆเบฅเบฐเบ‚เปเป‰เบ„เบงเบฒเบก tuple เบชเบฒเบกเบฒเบ”เบกเบตเบ•เบฑเบ™เบ‚เปเป‰เบกเบนเบ™เบญเบธเบ›เบฐเบ–เปเบฒเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡ tuples เปเบกเปˆเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เป€เบฅเบฑเบเบ™เป‰เบญเบเบ•เปเปˆเบกเบฒ.

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเบกเบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบ‚เปเป‰เบ„เบงเบฒเบกเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เบšเปเปˆเบกเบตเบšเบฅเบฑเบญเบเบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™; เปเบ—เบ™เบ—เบตเปˆเบˆเบฐ, เบกเบฑเบ™เบกเบตเบžเบฝเบ‡เปเบ•เปˆเบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเบžเบทเป‰เบ™เบ—เบตเปˆเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเบšเบฅเบฑเบญเบเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰. เปƒเบ™เบชเปˆเบงเบ™เบ™เบตเป‰, เบฎเบนเบšเบžเบฒเบšเบฅเบงเบกเบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบœเบนเป‰เบชเบทเปˆเบ‚เปˆเบฒเบงเปเบกเปˆเบ™ reminiscent เบ‚เบญเบ‡เบชเบฒเบ‡เบ›เบฐเบ•เบนเปƒเบ™เบเบฒเบ•เบนเบ™ "Monsters, Inc.," เบšเปˆเบญเบ™เบ—เบตเปˆเบ›เบฐเบ•เบน (เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ‚เปเป‰เบกเบนเบ™ - เบซเป‰เบญเบ‡) เป€เบ„เบทเปˆเบญเบ™เบ—เบตเปˆเบ”เป‰เบงเบเบ„เบงเบฒเบกเป„เบง insane เบ•เบฒเบก conveyors overhead, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบซเป‰เบญเบ‡เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡. เบเบฑเบ‡เบšเปเปˆเบกเบตเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเป„เบ›เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบšเบŠเบฑเป‰เบ™เบˆเบฒเบเบฅเบธเปˆเบกเบซเบฒเป€เบ—เบดเบ‡, เปƒเบซเป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบขเปˆเบฒเบ‡เบฅเบฐเบญเบฝเบ”เบเปˆเบฝเบงเบเบฑเบšเบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ—เบตเปˆเบกเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบเบปเบ™เป„เบเบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบชเบทเปˆ streamer.

เบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™ dblk_t

เบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™เบ›เบฐเบเบญเบšเบ”เป‰เบงเบ header เปเบฅเบฐ buffer เบ‚เปเป‰เบกเบนเบ™. เบชเปˆเบงเบ™เบซเบปเบงเปเบกเปˆเบ™เบญเบฐเบ—เบดเบšเบฒเบเป‚เบ”เบเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰,

typedef struct datab
{
unsigned char *db_base; // ะฃะบะฐะทะฐั‚ะตะปัŒ ะฝะฐ ะฝะฐั‡ะฐะปะพ ะฑัƒั„ะตั€ ะดะฐะฝะฝั‹ั….
unsigned char *db_lim;  // ะฃะบะฐะทะฐั‚ะตะปัŒ ะฝะฐ ะบะพะฝะตั† ะฑัƒั„ะตั€ ะดะฐะฝะฝั‹ั….
void (*db_freefn)(void*); // ะคัƒะฝะบั†ะธั ะพัะฒะพะฑะพะถะดะตะฝะธั ะฟะฐะผัั‚ะธ ะฟั€ะธ ัƒะดะฐะปะตะฝะธะธ ะฑะปะพะบะฐ.
int db_ref; // ะกั‡ะตั‚ั‡ะธะบ ััั‹ะปะพะบ.
} dblk_t;

เบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบกเบตเบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบšเบฑเบŸเป€เบŸเบต, เบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เบšเบฑเบŸเป€เบŸเบต, เปเบฅเบฐเบŸเบฑเบ‡เบŠเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบถเบšเปเบšเบฑเบเบญเบฑเบšเบ‚เปเป‰เบกเบนเบ™. เบญเบปเบ‡เบ›เบฐเบเบญเบšเบชเบธเบ”เบ—เป‰เบฒเบเปƒเบ™เบชเปˆเบงเบ™เบซเบปเบง db_ref โ€” เบ•เบปเบงโ€‹เบŠเบตเป‰โ€‹เบงเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบญเป‰เบฒเบ‡โ€‹เบญเบตเบ‡โ€‹, เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบกเบฑเบ™โ€‹เป„เบ›โ€‹เบฎเบญเบ”โ€‹เบชเบนเบ™โ€‹, เบ™เบตเป‰โ€‹เป€เบฎเบฑเบ”โ€‹เบซเบ™เป‰เบฒโ€‹เบ—เบตเปˆโ€‹เป€เบ›เบฑเบ™โ€‹เบชเบฑเบ™โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบฅเบปเบš block เบ™เบตเป‰โ€‹เบˆเบฒเบโ€‹เบ„เบงเบฒเบกโ€‹เบŠเบปเบ‡โ€‹เบˆเปเบฒโ€‹. เบ–เป‰เบฒเบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เป‚เบ”เบเบŸเบฑเบ‡เบŠเบฑเบ™ datab_alloc() , เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ buffer เบ‚เปเป‰เบกเบนเบ™เบˆเบฐเบ–เบทเบเบงเบฒเบ‡เป„เบงเป‰เปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบฑเบ™เบ—เบตเบซเบผเบฑเบ‡เบˆเบฒเบ header. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบญเบทเปˆเบ™เป†เบ—เบฑเบ‡เบซเบกเบปเบ”, buffer เบชเบฒเบกเบฒเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเบšเปˆเบญเบ™เปƒเบ”เบšเปˆเบญเบ™เบซเบ™เบถเปˆเบ‡เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ. เบ‚เปเป‰เบกเบนเบ™ buffer เบˆเบฐเบกเบตเบ•เบปเบงเบขเปˆเบฒเบ‡เบชเบฑเบ™เบเบฒเบ™เบซเบผเบทเบ‚เปเป‰เบกเบนเบ™เบญเบทเปˆเบ™เป†เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเบฑเบšเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡.

เบ•เบปเบงเบขเปˆเบฒเบ‡เปƒเปเปˆเบ‚เบญเบ‡เบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™:

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, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบžเบฝเบ‡เปเบ•เปˆเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ‚เปเป‰เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡ tuple. เบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบชเบธเบ”เบ—เป‰เบฒเบเปƒเบ™ tuple, เบ•เบปเบงเบŠเบตเป‰เบ™เบตเป‰เบเบฑเบ‡เบ„เบปเบ‡เป€เบ›เบฑเบ™ null.

เบ•เปเปˆเป„เบ›เบžเบงเบเป€เบฎเบปเบฒเป€เบซเบฑเบ™เบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™ b_datap, เบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบกเบตเบขเบนเปˆ. เบกเบฑเบ™เบ•เบดเบ”เบ•เบฒเบกเบ”เป‰เบงเบเบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเบžเบทเป‰เบ™เบ—เบตเปˆเบžเบฒเบเปƒเบ™ buffer เบ‚เปเป‰เบกเบนเบ™เบšเบฅเบฑเบญเบ. เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก b_rptr เบฅเบฐเบšเบธเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบตเปˆเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบ buffer เบˆเบฐเบ–เบทเบเบญเปˆเบฒเบ™. เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก b_wptr เบŠเบตเป‰เบšเบญเบเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบตเปˆเบ‚เบฝเบ™เปƒเบชเปˆ buffer เบˆเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”.

เบ—เบปเปˆเบ‡เบ™เบฒเบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเปเบกเปˆเบ™เบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบฅเบฐเบšเปเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เบเบปเบ™เป„เบเบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™.

เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ”เบฝเบงเบ—เบตเปˆเบกเบตเบŠเบทเปˆ m1 เปเบฅเบฐเบ•เบฑเบ™เบ‚เปเป‰เบกเบนเบ™ d1.
เบเบฒเบ™เบชเบณเบซเบผเบงเบ”เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ Mediastreamer2 VoIP. เบžเบฒเบเบ—เบต 11
เบ•เบปเบงเป€เบฅเบเบ•เปเปˆเป„เบ›เบ™เบตเป‰เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡ tuple เบ‚เบญเบ‡เบชเบฒเบกเบ‚เปเป‰เบ„เบงเบฒเบก m1, m1_1, m1_2.
เบเบฒเบ™เบชเบณเบซเบผเบงเบ”เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ Mediastreamer2 VoIP. เบžเบฒเบเบ—เบต 11

เบŸเบฑเบ‡เบŠเบฑเบ™เบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก mblk_t

เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเปเปˆ mblk_t เบชเป‰เบฒเบ‡โ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบ—เปเบฒโ€‹เบ‡เบฒเบ™โ€‹:

mblk_t *allocb(int size, int pri); 

เบ™เบฒเบ‡เบงเบฒเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบซเบกเปˆเปƒเบ™เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒ mblk_t เบเบฑเบšเบ•เบฑเบ™เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰ เบ‚เบฐเบซเบ™เบฒเบ”, เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ—เบตเบชเบญเบ‡ - pri เบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เปƒเบ™เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เบชเบฐเบšเบฑเบšเบ™เบตเป‰. เบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเป€เบ›เบฑเบ™เบชเบนเบ™. เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™, เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเบ–เบทเบเบˆเบฑเบ”เบชเบฑเบ™เบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบซเบกเปˆเปเบฅเบฐเบซเบ™เป‰เบฒเบ—เบตเปˆเบˆเบฐเบ–เบทเบเป€เบญเบตเป‰เบ™ mblk_init(), เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ›เบฑเบšเบ—เบธเบเบ‚เบปเบ‡เป€เบ‚เบ”เบ‚เบญเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเบกเบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡ datab_alloc(), เบˆเบฐเบชเป‰เบฒเบ‡ buffer เบ‚เปเป‰เบกเบนเบ™. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบˆเบฐเบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒ:

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

เบขเบนเปˆเบ—เบตเปˆเบœเบปเบ™เบœเบฐเบฅเบดเบ”เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบซเบกเปˆเบ—เบตเปˆเบกเบตเบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เปเบฅเบฐ buffer เบ‚เปเป‰เบกเบนเบ™เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ. เป€เบžเบทเปˆเบญโ€‹เป€เบžเบตเปˆเบกโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เปƒเบชเปˆโ€‹เบ‚เปเป‰โ€‹เบ„เบงเบฒเบกโ€‹เปƒเบ”โ€‹เบซเบ™เบถเปˆเบ‡โ€‹, เบ—เปˆเบฒเบ™โ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เบชเปเบฒโ€‹เป€เบ™เบปเบฒโ€‹เป€เบญเบปเบฒโ€‹เบกเบฑเบ™โ€‹เป„เบ›โ€‹เบ—เบตเปˆโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™ block bufferโ€‹:

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

เบšเปˆเบญเบ™เบ—เบตเปˆ เบ‚เปเป‰เบกเบนเบ™ เป€เบ›เบฑเบ™เบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™, เปเบฅเบฐ เบ‚เบฐเบซเบ™เบฒเบ” - เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบ‚เบญเบ‡โ€‹เป€เบ‚เบปเบฒโ€‹เป€เบˆเบปเป‰เบฒโ€‹.
เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ›เบฑเบšเบ›เบธเบ‡เบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเบˆเบธเบ”เบ‚เบฝเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เบกเบฑเบ™เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบžเบทเป‰เบ™เบ—เบตเปˆเบซเบงเปˆเบฒเบ‡เปƒเบ™ buffer:

msg->b_wptr = msg->b_wptr + size

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบˆเบฒเบ buffer เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง, เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ„เบฑเบ”เบฅเบญเบ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™:

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

เบŸเบฑเบ‡เบŠเบฑเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบชเป‰เบฒเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเปเบฅเบฐเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เบ•เบฑเบ™เบ‚เปเป‰เบกเบนเบ™, เบˆเบฐ configure เบ•เบปเบงเบŠเบตเป‰เบ‚เบญเบ‡เบกเบฑเบ™เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบขเบนเปˆเปƒเบ™เบ—เบตเปˆเบขเบนเปˆ. buff. เป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™. เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ™เบตเป‰, buffer เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบ•เบฑเป‰เบ‡โ€‹เบขเบนเปˆโ€‹เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบžเบฒเบโ€‹เบชเบฐโ€‹เบซเบ™เบฒเบก header เบ‚เบญเบ‡ block เบ‚เปเป‰โ€‹เบกเบนเบ™, เป€เบŠเบฑเปˆเบ™โ€‹เบ”เบฝเบงโ€‹เบเบฑเบ™โ€‹เบเบฑเบšโ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบชเป‰เบฒเบ‡ block เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบซเบ™เป‰เบฒโ€‹เบ—เบตเปˆ datab_alloc(). buffer เบ—เบตเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡เบเบฑเบšเบŸเบฑเบ‡เบŠเบฑเบ™เบˆเบฐเบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆ, เปเบ•เปˆเบ”เป‰เบงเบเบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเบ‚เบญเบ‡ pointers เบกเบฑเบ™เบˆเบฐเบ•เบดเบ”เบเบฑเบš header เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบซเบกเปˆเบ‚เบญเบ‡ block เบ‚เปเป‰เบกเบนเบ™, เปเบฅเบฐเบงเปˆเบฒ, เบ•เบฒเบกเบ„เบงเบฒเบกเป€เบซเบกเบฒเบฐเบชเบปเบก, เบ‚เปเป‰เบ„เบงเบฒเบก.

เบ•เปเปˆเบเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบ”เบฝเบง mblk_t เบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™เบซเบผเบฒเบเบญเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบ•เบฒเบกเบฅเบณเบ”เบฑเบš. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเบซเบ™เป‰เบฒเบ—เบตเปˆ:

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

mp โ€” เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™เบญเบทเปˆเบ™เบˆเบฐเบ–เบทเบเป€เบžเบตเปˆเบก;
เบ‚เปเป‰เบกเบนเบ™ โ€” เบŠเบตเป‰เป„เบ›เบ—เบตเปˆเบšเบฅเบฑเบญเบ, เบชเบณเป€เบ™เบปเบฒเบ—เบตเปˆเบˆเบฐเบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ‚เปเป‰เบ„เบงเบฒเบก;
เบ‚เบฐเบซเบ™เบฒเบ” - เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹;
pad โ€” เบ—เบธเบ‡เบงเปˆเบฒเบ‚เบฐเปœเบฒเบ”เบ‚เบญเบ‡เปœเปˆเบงเบเบ„เบงเบฒเบกเบˆเบณเบ—เบตเปˆเบˆเบฑเบ”เบชเบฑเบ™เบ•เป‰เบญเบ‡เบ–เบทเบเบˆเบฑเบ”เบฅเบฝเบ‡เบ•เบฒเบกเบ‚เบญเบšเป€เบ‚เบ” 4-byte (padding เบˆเบฐเป€เบฎเบฑเบ”เบ”เป‰เบงเบเบชเบนเบ™).

เบ–เป‰เบฒเบกเบตเบžเบทเป‰เบ™เบ—เบตเปˆเบžเบฝเบ‡เบžเปเปƒเบ™ buffer เบ‚เปเป‰เบกเบนเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง, เบ‚เปเป‰เบกเบนเบ™เปƒเบซเบกเปˆเบˆเบฐเบ–เบทเบเบงเบฒเบ‡เป„เบงเป‰เบ—เบฒเบ‡เบซเบฅเบฑเบ‡เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง. เบ–เป‰เบฒเบกเบตเบžเบทเป‰เบ™เบ—เบตเปˆเบซเบงเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบฅเบปเบ‡เปƒเบ™เบ‚เปเป‰เบ„เบงเบฒเบก buffer เบ‚เปเป‰เบกเบนเบ™ เบ‚เบฐเบซเบ™เบฒเบ”, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบซเบกเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบ”เป‰เบงเบเบ‚เบฐเบซเบ™เบฒเบ” buffer เบ—เบตเปˆเบžเบฝเบ‡เบžเปเปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เบˆเบฐเบ–เบทเบเบ„เบฑเบ”เบฅเบญเบเป„เบ›เบ—เบตเปˆ buffer เบ‚เบญเบ‡เบกเบฑเบ™. เบ™เบตเป‰เปเบกเปˆเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเปเปˆ, เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบŠเบตเป‰ b_cont. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบ‚เปเป‰เบ„เบงเบฒเบกเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™ tuple.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ‚เปเป‰เบกเบนเบ™เบšเบฅเบฑเบญเบเบญเบทเปˆเบ™เปƒเบชเปˆ tuple, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™:

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

เบ™เบฒเบ‡เบˆเบฐเบžเบปเบšเป€เบซเบฑเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบชเบธเบ”เบ—เป‰เบฒเบเปƒเบ™ tuple (เบฅเบฒเบงเบกเบต b_cont เบˆเบฐเป€เบ›เบฑเบ™ null) เปเบฅเบฐเบˆเบฐเป‚เบ—เบซเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบ™เบตเป‰ เป€เบญเบเบฐเบชเบฒเบ™เบŠเป‰เบญเบ™เบ—เป‰เบฒเบ().

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบซเบผเบท tuple เป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™:

int msgdsize(const mblk_t *mp);

เบกเบฑเบ™เบˆเบฐ loop เบœเปˆเบฒเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™ tuple เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบˆเปเบฒเบ™เบงเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™ buffers เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™. เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบ‚เปเป‰เบ„เบงเบฒเบก, เบˆเปเบฒเบ™เบงเบ™เบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™เบ„เบดเบ”เป„เบฅเปˆเบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

 mp->b_wptr - mp->b_rptr

เป€เบžเบทเปˆเบญเบชเบปเบกเบ—เบปเบšเบชเบญเบ‡ tuple, เปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™:

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

เบ™เบฒเบ‡เบ•เบทเปˆเบก tuple เป„เบ”เป‰ เปƒเปเปˆ เบเบฑเบšเบซเบฒเบ‡เบ‚เบญเบ‡ tuple เป„เบ”เป‰ mp เปเบฅเบฐเบชเบปเปˆเบ‡เบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเบ‚เปเป‰เบ„เบงเบฒเบกเบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡ tuple เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš.

เบ–เป‰เบฒเบˆเปเบฒเป€เบ›เบฑเบ™, tuple เบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ”เบฝเบงเบ—เบตเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบ”เบฝเบง; เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเบซเบ™เป‰เบฒเบ—เบตเปˆ:

void msgpullup(mblk_t *mp,int len);

เบ–เป‰เบฒเบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡ len เปเบกเปˆเบ™ -1, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡ buffer เบ—เบตเปˆเบ–เบทเบเบˆเบฑเบ”เบชเบฑเบ™เปเบกเปˆเบ™เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. เบ–เป‰เบฒ len เป€เบ›เบฑเบ™เบ•เบปเบงเป€เบฅเบเบšเบงเบ, buffer เบ‚เบฐเบซเบ™เบฒเบ”เบ™เบตเป‰เบˆเบฐเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เบ‚เปเป‰เบ„เบงเบฒเบก tuple เบˆเบฐเบ–เบทเบเบ„เบฑเบ”เบฅเบญเบเปƒเบชเปˆเบกเบฑเบ™. เบ–เป‰เบฒเบšเบฑเบŸเป€เบŸเบตเปเบปเบ”, เบเบฒเบ™เบชเบณเป€เบ™เบปเบฒเบˆเบฐเบขเบธเบ”เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™. เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡ tuple เบˆเบฐเป„เบ”เป‰เบฎเบฑเบš buffer เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบกเปˆเบ—เบตเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ„เบฑเบ”เบฅเบญเบ. เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเบˆเบฐเบ–เบทเบเบฅเบถเบšเบญเบญเบเปเบฅเบฐเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเป„เบ”เป‰เบเบฑเบšเบ„เบทเบ™เบชเบนเปˆ heap.

เป€เบกเบทเปˆเบญเบฅเบถเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡ mblk_t เบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบดเบ‡เบ‚เบญเบ‡เบ•เบฑเบ™เบ‚เปเป‰เบกเบนเบ™เป„เบ”เป‰เบ–เบทเบเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒ, เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป‚เบ—เบซเบฒ freeb() เบกเบฑเบ™เบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™เบชเบนเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ buffer เบ‚เปเป‰เบกเบนเบ™เบ–เบทเบเบฅเบถเบšเบžเป‰เบญเบกเบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡ mblk_t, เป€เบŠเบดเปˆเบ‡เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เบกเบฑเบ™.

เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเปเปˆ:

void mblk_init(mblk_t *mp);

เบเบฒเบ™เป€เบžเบตเปˆเบกเบ‚เปเป‰เบกเบนเบ™เบญเบทเปˆเบ™เปƒเบชเปˆเบ‚เปเป‰เบ„เบงเบฒเบก:

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

เบ–เป‰เบฒเบ‚เปเป‰เบกเบนเบ™เปƒเบซเบกเปˆเบšเปเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบžเบทเป‰เบ™เบ—เบตเปˆเบซเบงเปˆเบฒเบ‡เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ‚เปเป‰เบ„เบงเบฒเบก, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ—เบตเปˆเบกเบต buffer เบ‚เบญเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เปเบกเปˆเบ™เบ•เบดเบ”เบเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบก (เบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเป€เบžเบตเปˆเบกเปเบกเปˆเบ™เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เปƒเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เปเบฒเบญเบดเบ”) เปเบฅเบฐ เบ‚เปเป‰เบ„เบงเบฒเบกเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™ tuple.

เบเบฒเบ™เป€เบžเบตเปˆเบกเบŠเบดเป‰เบ™เบชเปˆเบงเบ™เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆ tuple:

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

เบŸเบฑเบ‡เบŠเบฑเบ™เป€เบญเบตเป‰เบ™ appendb() เปƒเบ™ loop.

เบชเบปเบกเบ—เบปเบšเบชเบญเบ‡ tuple เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบซเบ™เบถเปˆเบ‡:

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

เบ‚เปเป‰โ€‹เบ„เบงเบฒเบก เปƒเปเปˆ เบˆเบฐโ€‹เบ•เบดเบ”โ€‹เบเบฑเบš mp.

เบชเป‰เบฒเบ‡เบชเบณเป€เบ™เบปเบฒเบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ”เบฝเบง:

mblk_t *copyb(const mblk_t *mp);

เบชเปเบฒโ€‹เป€เบฅเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบชเปเบฒโ€‹เป€เบ™เบปเบฒโ€‹เบ‚เบญเบ‡ tuple เบเบฑเบšโ€‹เบ•เบฑเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹:

mblk_t *copymsg(const mblk_t *mp);

เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡ tuple เบ–เบทเบเบ„เบฑเบ”เบฅเบญเบเป‚เบ”เบเบŸเบฑเบ‡เบŠเบฑเบ™ copyb().

เบชเป‰เบฒเบ‡เบชเปเบฒเป€เบ™เบปเบฒเบ‡เปˆเบฒเบเบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก mblk_t. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ„เบฑเบ”เบฅเบญเบ, เปเบ•เปˆเบ•เบปเบงเบŠเบตเป‰เบญเป‰เบฒเบ‡เบญเบตเบ‡เบ‚เบญเบ‡เบกเบฑเบ™เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™ db_ref:

mblk_t *dupb(mblk_t *mp);

เบเบฒเบ™เป€เบฎเบฑเบ”เบชเปเบฒเป€เบ™เบปเบฒเบ—เบตเปˆเบกเบตเบ™เป‰เปเบฒเบซเบ™เบฑเบเป€เบšเบปเบฒเบ‚เบญเบ‡ tuple. เบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ„เบฑเบ”เบฅเบญเบ, เบžเบฝเบ‡เปเบ•เปˆเบ•เบปเบงเบ™เบฑเบšเบญเป‰เบฒเบ‡เบญเบตเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบ–เบทเบเป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™ db_ref:

mblk_t *dupmsg(mblk_t* m);

เบเบฒเบ™เบ•เบดเบ”เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡ tuple เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ”เบฝเบง:

void msgpullup(mblk_t *mp,size_t len);

เบ–เป‰เบฒเบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡ len เปเบกเปˆเบ™ -1, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡ buffer เบ—เบตเปˆเบ–เบทเบเบˆเบฑเบ”เบชเบฑเบ™เปเบกเปˆเบ™เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”.

เบเบฒเบ™เบฅเบถเบšเบ‚เปเป‰เบ„เบงเบฒเบก, tuple:

void freemsg(mblk_t *mp);

เบˆเบณเบ™เบงเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡เบ‚เบญเบ‡เบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™เบซเบผเบธเบ”เบฅเบปเบ‡เป€เบ—เบทเปˆเบญเบฅเบฐเบญเบฑเบ™. เบ–เป‰เบฒเบกเบฑเบ™เบฎเบญเบ”เบชเบนเบ™, เบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™เบเปเปˆเบˆเบฐเบ–เบทเบเบฅเบถเบšเบ–เบดเป‰เบก.

เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบˆเปเบฒเบ™เบงเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบซเบผเบท tuple.

size_t msgdsize(const mblk_t *mp);

เบ”เบถเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบˆเบฒเบเบซเบฒเบ‡เบ‚เบญเบ‡เบ„เบดเบง:

mblk_t *ms_queue_peek_last (q);

เบเบฒเบ™เบ„เบฑเบ”เบฅเบญเบเป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเบฐเบซเบ‡เบงเบ™เป„เบงเป‰เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบซเบ™เบถเปˆเบ‡เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบญเบทเปˆเบ™ (เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบกเบตเบ—เบธเบ‡เบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบ media streamer):

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

เบ„เบดเบง เบ„เบดเบง_เบ—

เปเบ–เบงเบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบ™เบ•เบปเบงเบ–เปˆเบฒเบเบ—เบญเบ”เบชเบทเปˆเปเบกเปˆเบ™เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ›เบฑเบ™เบฅเบฒเบเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบชเบญเบ‡เป€เบ—เบปเปˆเบฒเบงเบปเบ‡เบงเบฝเบ™. เปเบ•เปˆเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบšเบฅเบฒเบเบŠเบทเปˆเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบ•เบปเบงเบขเปˆเบฒเบ‡เบชเบฑเบ™เบเบฒเบ™. เบกเบฑเบ™ turns เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡ block เบ‚เปเป‰เบกเบนเบ™เบเป‰เบฒเบเปƒเบ™ turns, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบ‚เปเป‰เบกเบนเบ™เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เบเบฑเบ‡ motionless. เป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™. เบžเบฝเบ‡เปเบ•เปˆเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบžเบงเบเบกเบฑเบ™เบ–เบทเบเบเป‰เบฒเบ.
เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบญเบฐเบ—เบดเบšเบฒเบเปเบ–เบง เบ„เบดเบง_เบ—, เบชเบฐโ€‹เปเบ”เบ‡โ€‹เปƒเบซเป‰โ€‹เป€เบซเบฑเบ™โ€‹เบ‚เป‰เบฒเบ‡โ€‹เบฅเบธเปˆเบกโ€‹เบ™เบตเป‰โ€‹:

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

เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบžเบฒเบเบชเบฐเบซเบ™เบฒเบก - เบ•เบปเบงเบŠเบตเป‰ _q_เบขเบธเบ” เบžเบดเบก *mblk_t, เบกเบฑเบ™เบŠเบตเป‰เป„เบ›เบซเบฒเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เปเบฒเบญเบดเบ” (เบ‚เปเป‰เบ„เบงเบฒเบก) เปƒเบ™เปเบ–เบง. เบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเบ—เบตเบชเบญเบ‡เบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เปเบกเปˆเบ™ counter เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบ™เปเบ–เบง.
เบฎเบนเบšเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เปเบ–เบงเบŠเบทเปˆ q1 เบ—เบตเปˆเบกเบต 4 เบ‚เปเป‰เบ„เบงเบฒเบก m1, m2, m3, m4.
เบเบฒเบ™เบชเบณเบซเบผเบงเบ”เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ Mediastreamer2 VoIP. เบžเบฒเบเบ—เบต 11
เบฎเบนเบšเบ•เปเปˆเป„เบ›เบ™เบตเป‰เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เปเบ–เบงเบŠเบทเปˆ q1 เบ—เบตเปˆเบกเบต 4 เบ‚เปเป‰เบ„เบงเบฒเบก m1,m2,m3,m4. เบ‚เปเป‰เบ„เบงเบฒเบก m2 เปเบกเปˆเบ™เบซเบปเบงเบ‚เบญเบ‡ tuple เบ—เบตเปˆเบกเบตเบชเบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเป€เบžเบตเปˆเบกเป€เบ•เบตเบก m2_1 เปเบฅเบฐ m2_2.

เบเบฒเบ™เบชเบณเบซเบผเบงเบ”เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ Mediastreamer2 VoIP. เบžเบฒเบเบ—เบต 11

เบŸเบฑเบ‡เบŠเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเปเบ–เบง queue_t

เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบ–เบง:

void qinit(queue_t *q);

เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก _q_เบขเบธเบ” (เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเบฐโ€‹เป€เบญเบตเป‰เบ™โ€‹เบกเบฑเบ™โ€‹เบงเปˆเบฒ "stopperโ€‹"โ€‹) เปเบกเปˆเบ™โ€‹เป€เบฅเบตเปˆเบกโ€‹เบ•เบปเป‰เบ™โ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบ—เปเบฒโ€‹เบ‡เบฒเบ™โ€‹ mblk_init(), เบญเบปเบ‡เบ›เบฐเบเบญเบšเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ‚เบญเบ‡เบกเบฑเบ™เปเบฅเบฐเบ•เบปเบงเบŠเบตเป‰เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ•เปเปˆเป„เบ›เปเบกเปˆเบ™เบ–เบทเบเบ›เบฑเบšเปƒเบซเป‰เบŠเบตเป‰เป„เบ›เบซเบฒเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡. เบ•เบปเบงเบ™เบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเปเบ–เบงเบ–เบทเบเบฃเบตเป€เบŠเบฑเบ”เป€เบ›เบฑเบ™เบชเบนเบ™.

เป€เบžเบตเปˆเบกเบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบซเบกเปˆ (เบ‚เปเป‰เบ„เบงเบฒเบก):

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

เบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบซเบกเปˆ m เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ, เบ•เบปเบงเบŠเบตเป‰เบญเบปเบ‡เบ›เบฐเบเบญเบšเป„เบ”เป‰เบ–เบทเบเบ›เบฑเบšเป€เบžเบทเปˆเบญเปƒเบซเป‰ stopper เบเบฒเบเป€เบ›เบฑเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ•เปเปˆเป„เบ›เบชเปเบฒเบฅเบฑเบšเบกเบฑเบ™, เปเบฅเบฐเบกเบฑเบ™เบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบชเปเบฒเบฅเบฑเบš stopper. เบ•เบปเบงเบ™เบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเปเบ–เบงเปเบกเปˆเบ™เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™.

เบ”เบถเบ‡เบ‚เปเป‰เบกเบนเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบˆเบฒเบเบ„เบดเบง:

mblk_t * getq(queue_t *q); 

เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบกเบฒเบซเบผเบฑเบ‡เบˆเบฒเบ stopper เป„เบ”เป‰เบ–เบทเบเบ”เบถเบ‡เบกเบฒ, เปเบฅเบฐเบ•เบปเบงเบ™เบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเปเบกเปˆเบ™ decremented. เบ–เป‰เบฒเบšเปเปˆเบกเบตเบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบ™เปเบ–เบงเบเบปเบเป€เบงเบฑเป‰เบ™ stopper, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ 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);

เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡ เบงเบดเบ—เบตเบเบฒเบ™ เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰. เบ•เบปเบงเบ™เบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเปเบ–เบงเบ–เบทเบเบ•เบฑเป‰เบ‡เป€เบ›เบฑเบ™เบชเบนเบ™.

Macro เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเปˆเบฒเบ™เบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเบญเบปเบ‡เบ›เบฐเบเบญเบšเบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เปเบ–เบง:

mblk_t * qlast(queue_t *q);

เป€เบกเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ„เบดเบงเบ‚เปเป‰เบ„เบงเบฒเบก, เบˆเบปเปˆเบ‡เบฎเบนเป‰เบงเปˆเบฒเป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เป‚เบ—เบซเบฒ ms_queue_put(q, m) เบ”เป‰เบงเบเบ•เบปเบงเบŠเบตเป‰ null เป„เบ›เบซเบฒเบ‚เปเป‰เบ„เบงเบฒเบก, เบŸเบฑเบ‡เบŠเบฑเบ™ loops. เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹เบˆเบฐ freezeโ€‹. เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™ ms_queue_next(q, m).

เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ•เบปเบงเบเบญเบ‡

เปเบ–เบงเบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เปเบกเปˆเบ™เปƒเบŠเป‰เป€เบžเบทเปˆเบญเบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบˆเบฒเบเบ•เบปเบงเบเบญเบ‡เปœเบถเปˆเบ‡เป„เบ›เบซเบฒเบญเบตเบเบ•เบปเบงเบเบญเบ‡เปœเบถเปˆเบ‡ เบซเบผเบทเบˆเบฒเบเปœเบถเปˆเบ‡เป„เบ›เบซเบฒเบซเบผเบฒเบเบ•เบปเบงเบเบญเบ‡. เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เปเบฅเบฐเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบ›เบฐเบเบญเบšเป€เบ›เบฑเบ™เป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เบเบฒเบ™เบŠเบตเป‰เบ™เปเบฒ. เบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบซเบผเบทเบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ‚เบญเบ‡เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบˆเบฐเบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒ "pin". เป€เบžเบทเปˆเบญเบญเบฐเบ—เบดเบšเบฒเบเบฅเปเบฒเบ”เบฑเบšเบ—เบตเปˆเบ•เบปเบงเบเบญเบ‡เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบ™, เบœเบนเป‰เบชเบทเปˆเป‚เบ„เบชเบฐเบ™เบฒเปƒเบŠเป‰เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡ "เบˆเบธเบ”เบชเบฑเบ™เบเบฒเบ™". เบˆเบธเบ”เบชเบฑเบ™เบเบฒเบ™เปเบกเปˆเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡ _MSCPPoint, เป€เบŠเบดเปˆเบ‡เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเบ•เบปเบงเบเบญเบ‡เปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡ pins เบ‚เบญเบ‡เบกเบฑเบ™; เบ•เบฒเบกเบ™เบฑเป‰เบ™, เบกเบฑเบ™เบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบญเบ‡เบซเบ™เบถเปˆเบ‡เปƒเบ™ inputs เบซเบผเบท outputs เบ‚เบญเบ‡เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡.

เบˆเบธเบ”เบชเบฑเบ™เบเบฒเบ™เบ‚เบญเบ‡เบเบฒเบŸเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบกเบนเบ™

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

pins เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เปเบกเปˆเบ™เบ•เบปเบงเป€เบฅเบเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบˆเบฒเบเบชเบนเบ™.

เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบญเบ‡เบชเบญเบ‡ pins เป‚เบ”เบเปเบ–เบงเบ‚เปเป‰เบ„เบงเบฒเบกเปเบกเปˆเบ™เบญเบฐเบ—เบดเบšเบฒเบเป‚เบ”เบเป‚เบ„เบ‡เบชเป‰เบฒเบ‡ _MSQueue, เป€เบŠเบดเปˆเบ‡เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเปเบ–เบงเบ‚เปเป‰เบ„เบงเบฒเบกเปเบฅเบฐเบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเบชเบญเบ‡เบˆเบธเบ”เบชเบฑเบ™เบเบฒเบ™เบ—เบตเปˆเบกเบฑเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ:

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

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบญเบตเป‰เบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ™เบตเป‰เบงเปˆเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบชเบฑเบ™เบเบฒเบ™. เปเบ•เปˆเบฅเบฐเบ•เบปเบงเบเบญเบ‡เบชเบทเปˆ streamer เบกเบตเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเป€เบ‚เบปเป‰เบฒเปเบฅเบฐเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบœเบปเบ™เบœเบฐเบฅเบดเบ” (MSQueue). เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบ‚เบญเบ‡โ€‹เบ•เบฒโ€‹เบ•เบฐโ€‹เบฅเบฒเบ‡โ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆโ€‹เบเบฒเบ™โ€‹เบชเป‰เบฒเบ‡โ€‹เบ•เบปเบงโ€‹เบเบฑเปˆเบ™โ€‹เบ•เบญเบ‡โ€‹; เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป„เบ”เป‰โ€‹เป€เบฎเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบ™เบตเป‰โ€‹เปเบฅเป‰เบงโ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบ•เบปเบงโ€‹เปเบ›โ€‹เบ—เบตเปˆโ€‹เบชเบปเปˆเบ‡โ€‹เบญเบญเบโ€‹เบ‚เบญเบ‡โ€‹เบ›เบฐโ€‹เป€เบžเบ”โ€‹ MSFilterDesc, เป€เบกเบทเปˆเบญเบžเบงเบเป€เบฎเบปเบฒเบžเบฑเบ”เบ—เบฐเบ™เบฒเบ•เบปเบงเบเบญเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบ‡. เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เปƒเบ”เป†เปƒเบ™เบชเบทเปˆ 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;

เบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ•เบปเบงเบเบญเบ‡เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™ C เบ•เบฒเบกเปเบœเบ™เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ (เปเบ•เปˆเบšเปเปˆเป„เบ”เป‰เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ ticker), เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบถเปˆเบ‡เบชเป‰เบฒเบ‡เป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เบเบฒเบ™เบŠเบตเป‰เบ™เปเบฒ, เป€เบชเบฑเป‰เบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡. MSFilter, เปเบฅเบฐเบ‚เบญเบšเปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ MSQueue.

เบเบดเบ”เบˆเบฐเบเปเบฒเบ—เบฒเบ‡เบซเบฅเบฑเบ‡เบ‚เบญเบ‡ ticker เป„เบ”เป‰

เป€เบกเบทเปˆเบญเบ‚เป‰เบญเบเบšเบญเบเป€เบˆเบปเป‰เบฒเบงเปˆเบฒ ticker เปเบกเปˆเบ™เบ•เบปเบงเบเบญเบ‡เบชเปเบฒเบฅเบฑเบšเปเบซเบผเปˆเบ‡เบ‚เบญเบ‡เบซเบกเบฒเบเบ•เบดเบ, เบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบเปˆเบฝเบงเบเบฑเบšเบกเบฑเบ™. เป€เบ„เบทเปˆเบญเบ‡เปเบฒเบเบ•เบดเบเปเบกเปˆเบ™เบงเบฑเบ”เบ–เบธเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เป‚เบกเบ‡ เบ‚เบฐเบšเบงเบ™เบเบฒเบ™() เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบงเบปเบ‡เบˆเบญเบ™ (เบเบฒเบŸ) เบ—เบตเปˆเบกเบฑเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ. เป€เบกเบทเปˆเบญเบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ ticker เบเบฑเบšเบ•เบปเบงเบเบญเบ‡เบเบฒเบŸเปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™ C, เบžเบงเบเป€เบฎเบปเบฒเบชเบฐเปเบ”เบ‡ ticker เป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เบ—เบตเปˆเบกเบฑเบ™เบˆเบฐเบ„เบงเบšเบ„เบธเบกเบˆเบฒเบเบ™เบตเป‰เบˆเบปเบ™เบเปˆเบงเบฒเบžเบงเบเป€เบฎเบปเบฒเบ›เบดเบ”เบกเบฑเบ™. เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, ticker เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบงเบ”เป€เบšเบดเปˆเบ‡เบเบฒเบŸเบ—เบตเปˆเบกเบญเบšเปƒเบซเป‰เบเบฒเบ™เบ”เบนเปเบฅเบ‚เบญเบ‡เบกเบฑเบ™, เบฅเบงเบšเบฅเบงเบกเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบ—เบตเปˆเบ›เบฐเบเบญเบšเบกเบตเบกเบฑเบ™. เป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰ "เบ™เบฑเบš" เบ•เบปเบงเบเบญเบ‡เบ”เบฝเบงเบเบฑเบ™เบชเบญเบ‡เบ„เบฑเป‰เบ‡, เบกเบฑเบ™เบซเบกเบฒเบเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบ—เบตเปˆเบเบงเบ”เบžเบปเบšเป‚เบ”เบเบเบฒเบ™เบงเบฒเบ‡เบเปˆเบญเบ‡เบเบฒเป€เบ„เบทเปˆเบญเบ‡เบซเบกเบฒเบเปƒเบชเปˆเบžเบงเบเบกเบฑเบ™. เป€เบซเบฑเบ™. เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป‚เบ”เบเปƒเบŠเป‰เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเปเบ•เปˆเบฅเบฐเบ•เบปเบงเบเบญเบ‡เบกเบต.

เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ™เปเบฒเบ—เปˆเบฝเบงเบ‚เบญเบ‡เบเบฒเบŸเบ‚เบญเบ‡เบกเบฑเบ™, ticker เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเปƒเบ™เบšเบฑเบ™เบ”เบฒเบ•เบปเบงเบเบญเบ‡เบกเบตเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเป€เบฎเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เปเบซเบผเปˆเบ‡เบ‚เบญเบ‡เบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™. เบ–เป‰เบฒเบšเปเปˆเบกเบต, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เปเบกเปˆเบ™เบ–เบทเบงเปˆเบฒเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเบฐ ticker crashes.

เบ–เป‰เบฒเป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เบเบฒเบเป€เบ›เบฑเบ™ "เบ–เบทเบเบ•เป‰เบญเบ‡", เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบ•เบปเบงเบเบญเบ‡เบ—เบตเปˆเบžเบปเบšเป€เบซเบฑเบ™, เบซเบ™เป‰เบฒเบ—เบตเปˆเบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบเปˆเบญเบ™ (). เบ—เบฑเบ™เบ—เบตเบ—เบตเปˆเบกเบฒเบฎเบญเบ”เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบฎเบญเบšเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ•เปเปˆเป„เบ› (เบ—เบธเบเป† 10 milliseconds เบ•เบฒเบกเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™), ticker เป‚เบ—เบซเบฒเบŸเบฑเบ‡เบŠเบฑเบ™. เบ‚เบฐเบšเบงเบ™เบเบฒเบ™() เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เปเบซเบผเปˆเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบžเบปเบšเปƒเบ™เป€เบกเบทเปˆเบญเบเปˆเบญเบ™, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเบขเบนเปˆเปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ. เบ–เป‰เบฒเบ•เบปเบงเบเบญเบ‡เบกเบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเป€เบ‚เบปเป‰เบฒ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบŸเบฑเบ‡เบŠเบฑเบ™ เบ‚เบฐเบšเบงเบ™เบเบฒเบ™() เป€เบฎเบฑเบ”เป€เบฅเบทเป‰เบกเบ„เบทเบ™เบˆเบปเบ™เบเปˆเบงเบฒเบ„เบดเบงเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเป€เบ‚เบปเป‰เบฒเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบตเป‰, เบกเบฑเบ™เบเป‰เบฒเบเป„เบ›เบ•เบปเบงเบเบญเบ‡เบ•เปเปˆเป„เบ›เปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเปเบฅเบฐ "เป€เบฅเบทเปˆเบญเบ™" เบกเบฑเบ™เบˆเบปเบ™เบเปˆเบงเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเป€เบ‚เบปเป‰เบฒเบšเปเปˆเบกเบตเบ‚เปเป‰เบ„เบงเบฒเบก. ticker เบเป‰เบฒเบเบˆเบฒเบเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เป„เบ›เบซเบฒเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบˆเบปเบ™เบเปˆเบงเบฒเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบชเบดเป‰เบ™เบชเบธเบ”เบฅเบปเบ‡. เบ™เบตเป‰เบชเปเบฒเป€เบฅเบฑเบ”เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบ‚เบญเบ‡เบงเบปเบ‡เบˆเบญเบ™.

เบ•เบญเบ™เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบเบฑเบšเบ„เบทเบ™เบชเบนเปˆ tuples เปเบฅเบฐเบชเบปเบ™เบ—เบฐเบ™เบฒเบเปˆเบฝเบงเบเบฑเบšเบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™ media streamer. เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบง, เบˆเปเบฒเบ™เบงเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป‚เบ”เบ algorithm เบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบžเบฒเบเปƒเบ™เบ•เบปเบงเบเบญเบ‡เบšเปเปˆเบเบปเบ‡เบเบฑเบ™เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™เบ„เบงเบฒเบกเบซเบผเบฒเบเบซเบผเบฒเบเบ‚เบญเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡ buffers เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบขเบนเปˆเปƒเบ™เบงเบฑเบ”เบชเบฐเบ”เบธเบ›เป‰เบญเบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบ‚เบฝเบ™เบ•เบปเบงเบเบญเบ‡เบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™ Fourier เป„เบง, เป€เบŠเบดเปˆเบ‡เบ•เบฒเบกเบ„เปเบฒเบ™เบดเบเบฒเบกเบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบกเบฒเบ”เบ›เบธเบ‡เปเบ•เปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบชเบญเบ‡. เปƒเบซเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™ 512 เบ™เบฑเบš. เบ–เป‰เบฒเบ‚เปเป‰เบกเบนเบ™เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เป‚เบ”เบเบŠเปˆเบญเบ‡เบ—เบฒเบ‡เป‚เบ—เบฅเบฐเบชเบฑเบš, เบ‚เปเป‰เบกเบนเบ™ buffer เบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบ‚เปเป‰เบ„เบงเบฒเบกเบขเบนเปˆเบ—เบตเปˆเบงเบฑเบ”เบชเบฐเบ”เบธเบ›เป‰เบญเบ™เบˆเบฐเบ™เปเบฒเบžเบงเบเป€เบฎเบปเบฒ 160 เบ•เบปเบงเบขเปˆเบฒเบ‡เบชเบฑเบ™เบเบฒเบ™. เบกเบฑเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เบฅเปเป‰เบฅเบงเบ‡เบ—เบตเปˆเบˆเบฐเบšเปเปˆเป€เบเบฑเบšเบเปเบฒเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบˆเบปเบ™เบเปˆเบงเบฒเบˆเปเบฒเบ™เบงเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™. เปเบ•เปˆเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบเบฒเบ™เบ‚เบฑเบ”เบเบฑเบ™เบˆเบฐเป€เบเบตเบ”เบ‚เบทเป‰เบ™เบเบฑเบš ticker, เป€เบŠเบดเปˆเบ‡เบšเปเปˆเบชเปเบฒเป€เบฅเบฑเบ”เบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเป€เบฅเบทเปˆเบญเบ™เบ•เบปเบงเบเบญเบ‡เบˆเบปเบ™เบเปˆเบงเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเป€เบ‚เบปเป‰เบฒเบˆเบฐเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ. เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ™เบตเป‰เป€เบ›เบฑเบ™เบซเบผเบฑเบเบเบฒเบ™เบ—เบตเบชเบฒเบกเบ‚เบญเบ‡เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡. เบญเบตเบ‡เบ•เบฒเบกเบซเบผเบฑเบเบเบฒเบ™เบ™เบตเป‰, เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ‚เบญเบ‡เบ•เบปเบงเบเบญเบ‡เบ•เป‰เบญเบ‡เป€เบญเบปเบฒเบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฒเบเปเบ–เบงเบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™.

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบฑเบ™เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบญเบปเบฒเบžเบฝเบ‡เปเบ•เปˆ 512 เบ•เบปเบงเบขเปˆเบฒเบ‡เบˆเบฒเบเบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™, เป€เบžเบฒเบฐเบงเปˆเบฒเบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบกเบฒเบ”เป€เบญเบปเบฒเบ—เปˆเบญเบ™เป„เบกเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”, i.e. เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบˆเบฐเบ•เป‰เบญเบ‡เป€เบญเบปเบฒ 640 เบ•เบปเบงเบขเปˆเบฒเบ‡เปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰ 512 เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ, เบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบชเบฐเบชเบปเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบซเบกเปˆ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบกเบฑเบ™, เบ•เป‰เบญเบ‡เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบฅเบฐเบ”เบฑเบšเบ›เบฒเบ™เบเบฒเบ‡. เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบ‚เบญเบ‡ media streamer เปเบฅเบฐเบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ—เบปเปˆเบงเป„เบ›เบ™เบตเป‰เป„เบ”เป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเบงเบฑเบ”เบ–เบธเบžเบดเป€เบชเบ” - MSBufferizer (buffer), เป€เบŠเบดเปˆเบ‡เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰เป‚เบ”เบเปƒเบŠเป‰ tuples.

Bufferizer (MSBufferizer)

เบ™เบตเป‰เปเบกเปˆเบ™เบงเบฑเบ”เบ–เบธเบ—เบตเปˆเบˆเบฐเบชเบฐเบชเบปเบกเบ‚เปเป‰เบกเบนเบ™เบ›เป‰เบญเบ™เป€เบ‚เบปเป‰เบฒเบžเบฒเบเปƒเบ™เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เปเบฅเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบชเบปเปˆเบ‡เบกเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ—เบฑเบ™เบ—เบตเบ—เบตเปˆเบˆเปเบฒเบ™เบงเบ™เบ‚เปเป‰เบกเบนเบ™เบžเบฝเบ‡เบžเปเป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ algorithm เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡. เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆ buffer เบเบณ เบฅเบฑเบ‡เบชเบฐเบชเบปเบกเบ‚เปเป‰เบกเบนเบ™, เบ•เบปเบงเบเบญเบ‡เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เป‚เปเบ”เบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบ, เป‚เบ”เบเบšเปเปˆเบ•เป‰เบญเบ‡เปƒเบŠเป‰เบžเบฐเบฅเบฑเบ‡เบ‡เบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เบญเบ‡เป‚เบ›เป€เบŠเบ”เป€เบŠเบต. เปเบ•เปˆเบ—เบฑเบ™เบ—เบตเบ—เบตเปˆเบŸเบฑเบ‡เบŠเบฑเบ™เบเบฒเบ™เบญเปˆเบฒเบ™เบˆเบฒเบ bufferer เบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เปˆเบฒเบญเบทเปˆเบ™เบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™เบชเบนเบ™, เบŸเบฑเบ‡เบŠเบฑเบ™ process() เบ‚เบญเบ‡เบ•เบปเบงเบเบญเบ‡เบˆเบฐเป€เบฅเบตเปˆเบกเป€เบญเบปเบฒเปเบฅเบฐเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบ bufferer เปƒเบ™เบชเปˆเบงเบ™เบ‚เบญเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™, เบˆเบปเบ™เบเปˆเบงเบฒเบกเบฑเบ™เบซเบกเบปเบ”เป„เบ›.
เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เป„เบ”เป‰เบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆเปƒเบ™ buffer เป€เบ›เบฑเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡ tuple, เป€เบŠเบดเปˆเบ‡ blocks เบ•เปเปˆเป„เบ›เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ›เป‰เบญเบ™เป€เบ‚เบปเป‰เบฒ.

เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเป€เบ–เบดเบ‡ buffer:

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

เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš MSBufferizer

เบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡ buffer เปƒเปเปˆ:

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 เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ„เบดเบง. เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ„เบดเบ”โ€‹เป„เบฅเปˆโ€‹เบ‚เบญเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เป€เบžเบตเปˆเบกโ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป„เบ›โ€‹เปƒเบ™โ€‹ เบ‚เบฐเบซเบ™เบฒเบ”.

เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบฑเบ‡เปเบปเบ”เบˆเบฒเบเปเบ–เบงเบ‚เปเป‰เบกเบนเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป„เบ›เบซเบฒ buffer q:

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

เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบˆเบฒเบเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ q เปƒเบ™ buffer เปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ ms_bufferizer_put().

เบญเปˆเบฒเบ™เบˆเบฒเบ buffer:

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

เบ–เป‰เบฒเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเบฐเบชเบปเบกเบขเบนเปˆเปƒเบ™ buffer เบซเบ™เป‰เบญเบเบเบงเปˆเบฒเบ—เบตเปˆเบฎเป‰เบญเบ‡เบ‚เป (เบ‚เปเป‰เบกเบนเบ™เป€เบฅเบ™), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบŸเบฑเบ‡เบŠเบฑเบ™เบเบฑเบšเบ„เบทเบ™เบชเบนเบ™, เบ‚เปเป‰เบกเบนเบ™เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ„เบฑเบ”เบฅเบญเบเป„เบ›เบซเบฒเบ‚เปเป‰เบกเบนเบ™. เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบ„เบฑเบ”เบฅเบญเบเบ‚เปเป‰เบกเบนเบ™เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบšเบˆเบฒเบ tuples เบ—เบตเปˆเบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™ buffer เปเบกเปˆเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”. เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบชเปเบฒโ€‹เป€เบ™เบปเบฒโ€‹, tuple เบˆเบฐโ€‹เบ–เบทเบโ€‹เบฅเบปเบšโ€‹เปเบฅเบฐโ€‹เบ„เบงเบฒเบกโ€‹เบŠเบปเบ‡โ€‹เบˆเปเบฒโ€‹เปเบกเปˆเบ™โ€‹เป„เบ”เป‰โ€‹เบ›เปˆเบญเบโ€‹เบญเบญเบโ€‹เบกเบฒโ€‹. เบเบฒเบ™เบ„เบฑเบ”เบฅเบญเบเบˆเบฐเบชเบดเป‰เบ™เบชเบธเบ”เปƒเบ™เบ‚เบฐเบ™เบฐเบ™เบตเป‰เป€เบกเบทเปˆเบญ datalen bytes เบ–เบทเบเบชเบณเป€เบ™เบปเบฒ. เบ–เป‰เบฒเบžเบทเป‰เบ™เบ—เบตเปˆเบซเบงเปˆเบฒเบ‡เบขเบนเปˆเปƒเบ™เบเบฒเบ‡เบ‚เบญเบ‡เบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปƒเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ™เบตเป‰, เบšเบฅเบฑเบญเบเบ‚เปเป‰เบกเบนเบ™เบˆเบฐเบ–เบทเบเบซเบผเบธเบ”เบฅเบปเบ‡เป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบ—เบตเปˆเบเบฑเบ‡เบšเปเปˆเป„เบ”เป‰เบ„เบฑเบ”เบฅเบญเบ. เปƒเบ™เบ„เบฑเป‰เบ‡เบ•เปเปˆเป„เบ›เบ—เบตเปˆเบ—เปˆเบฒเบ™เป‚เบ—เบซเบฒ, เบเบฒเบ™เบ„เบฑเบ”เบฅเบญเบเบˆเบฐเบชเบทเบšเบ•เปเปˆเบˆเบฒเบเบˆเบธเบ”เบ™เบตเป‰.

เบเบฒเบ™เบญเปˆเบฒเบ™เบˆเปเบฒเบ™เบงเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™ buffer:

int ms_bufferizer_get_avail(MSBufferizer *obj); 

เบชเบปเปˆเบ‡เบ„เบทเบ™เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก เบ‚เบฐเบซเบ™เบฒเบ” buffer.

เบเบฒเบ™เบเบปเบเป€เบฅเบตเบเบšเบฒเบ‡เบชเปˆเบงเบ™เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™ buffer:

void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);

เบˆเปเบฒเบ™เบงเบ™เป„เบšเบ•เปŒเบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เบˆเบฐเบ–เบทเบเบ”เบถเบ‡ เปเบฅเบฐเบเบปเบเป€เบฅเบตเบ. เบ‚เปเป‰เบกเบนเบ™เป€เบเบปเปˆเบฒเปเบเปˆเบ—เบตเปˆเบชเบธเบ”เบ–เบทเบเบเบปเบเป€เบฅเบตเบ.

เบเบฒเบ™เบฅเบถเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบฑเบ‡เปเบปเบ”เปƒเบ™ buffer:

void ms_bufferizer_flush(MSBufferizer *obj); 

เบ•เบปเบงเบ™เบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ–เบทเบเบฃเบตเป€เบŠเบฑเบ”เป€เบ›เบฑเบ™เบชเบนเบ™.

เบเบฒเบ™เบฅเบถเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบฑเบ‡เปเบปเบ”เปƒเบ™ buffer:

void ms_bufferizer_uninit(MSBufferizer *obj); 

เป‚เบ•เบ™เบฑเบšเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เบทเบ™เปƒเปเปˆ.

เบเบฒเบ™เบ–เบญเบ”เบšเบฑเบŸเป€เบŸเบตเปเบฅเบฐเบ›เปˆเบญเบเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒ:

void ms_bufferizer_destroy(MSBufferizer *obj);  

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ buffer เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เปƒเบ™เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบ‚เบญเบ‡เบ•เบปเบงเบเบญเบ‡เบเบฐเปเบชเบชเบทเปˆเบซเบผเบฒเบเบญเบฑเบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบ™เบ•เบปเบงเบเบญเบ‡ MS_L16_ENC, เป€เบŠเบดเปˆเบ‡เบˆเบฑเบ”เบฅเบฝเบ‡เป„เบšเบ•เปŒเบ„เบทเบ™เปƒเบซเบกเปˆเปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบˆเบฒเบเบฅเปเบฒเบ”เบฑเบšเป€เบ„เบทเบญเบ‚เปˆเบฒเบเป„เบ›เบซเบฒเบ„เปเบฒเบชเบฑเปˆเบ‡เป‚เบฎเบ”: l16.c

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ•เปเปˆเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบšเบดเปˆเบ‡เบšเบฑเบ™เบซเบฒเบ‚เบญเบ‡เบเบฒเบ™เบ„เบฒเบ”เบ„เบฐเป€เบ™เบเบฒเบ™เป‚เบซเบผเบ”เปƒเบ™ ticker เปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบ•เปเปˆเบชเบนเป‰เบเบฑเบšเบเบฒเบ™เป‚เบซเบผเบ”เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเป‰เบซเบผเบฒเบเป€เบเบตเบ™เป„เบ›เปƒเบ™ media streamer.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™