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

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

เป€เบ„เบทเปˆเบญเบ‡เบเบงเบ”เบˆเบฑเบšเบชเบฝเบ‡

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

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

เปƒเบ™เบชเบฐ เป„เป เบเปˆเบญเบ™, เป€เบกเบทเปˆเบญเบ—เบธเบเบ„เบญเบšเบ„เบปเบงเบšเปเปˆเบกเบตเป‚เบ—เบฅเบฐเบ—เบฑเบ”, เปเบฅเบฐเป€เบ„เบดเปˆเบ‡ เปœเบถเปˆเบ‡ เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบ›เปˆเบฝเบ™เบŠเปˆเบญเบ‡เป‚เบ”เบเปƒเบŠเป‰เปเบœเปˆเบ™เบžเบฑเบš, เบ‚เปˆเบฒเบงเบ—เบตเปˆ เปœเป‰เบฒ เบชเบปเบ™เปƒเบˆเป„เบ”เป‰เบ›เบฐเบเบปเบ”เบขเบนเปˆเปƒเบ™เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ‚เบญเบ‡เบชเบทเปˆเบงเบดเบŠเบฒเบเบฒเบ™เบ•เปˆเบฒเบ‡เบ›เบฐเป€เบ—เบ”เบงเปˆเบฒเบœเบนเป‰เบœเบฐเบฅเบดเบ”เป‚เบ—เบฅเบฐเบžเบฒเบš เปœเบถเปˆเบ‡ เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบญเบธเบ›เบฐเบเบญเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบ”เป‰เบงเบเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบฃเบตเป‚เปเบ”เป„เบฎเป‰เบชเบฒเบ. เบˆเบฒเบเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป„เบ”เป‰เบฎเบนเป‰เบงเปˆเบฒเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเป„เบฅเบเบฐเป„เบเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป‚เบ”เบเบšเปเปˆเบกเบตเบซเบกเปเป‰เป„เบŸเบเป‰เบญเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™เบœเบดเบ”เบ›เบปเบเบเบฐเบ•เบด - เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเป„เบฅเบเบฐเป„เบเปเบกเปˆเบ™เบเบปเบ™เบˆเบฑเบเปเบฅเบฐเป€เบ›เบฑเบ™เบ›เบฐเบชเบปเบกเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบ”เบปเบ™เบ•เบต - metallophone เปเบฅเบฐ revolver. drum revolver เบšเบฑเบ™เบˆเบธเบเบฐเบšเบญเบเป‚เบฅเบซเบฐเบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบเบฒเบงเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เปเบฅเบฐเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ pin firing เบกเบปเบ™เบ•เบตเบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ, cylinder เป€เบฅเบตเปˆเบกเบ”เบฑเบ‡เบขเบนเปˆเปƒเบ™เบ„เบงเบฒเบกเบ–เบตเปˆเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡. เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบขเบนเปˆเปƒเบ™ ultrasound. เป€เบญเป€เบฅเบฑเบเป‚เบ•เบฃเบ™เบดเบเปƒเบ™เป‚เบ—เบฅเบฐเบžเบฒเบšเป„เบ”เป‰เบเบดเบ™เบชเบฑเบ™เบเบฒเบ™เบ™เบตเป‰เปเบฅเบฐ, เป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเบ–เบตเปˆเบ‚เบญเบ‡เบกเบฑเบ™, เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก - เบชเบฐเบซเบผเบฑเบšเบŠเปˆเบญเบ‡, เบ›เปˆเบฝเบ™เบฅเบฐเบ”เบฑเบšเบชเบฝเบ‡, เบ›เบดเบ”เป‚เบ—เบฅเบฐเบ—เบฑเบ”.

เบกเบทเป‰โ€‹เบ™เบตเป‰โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเบฐโ€‹เบžเบฐโ€‹เบเบฒโ€‹เบเบฒเบกโ€‹เป€เบžเบทเปˆเบญ reconstruct เบฅเบฐโ€‹เบšเบปเบšโ€‹เบเบฒเบ™โ€‹เบชเบปเปˆเบ‡โ€‹เบ„เปเบฒโ€‹เบชเบฑเปˆเบ‡โ€‹เบ™เบตเป‰โ€‹, เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบ„เบงเบฒเบกโ€‹เบฎเบนเป‰โ€‹เบ‚เบญเบ‡โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบ‚เบญเบ‡โ€‹เบชเบทเปˆโ€‹เบกเบงเบ™โ€‹เบŠเบปเบ™ streamerโ€‹.

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

struct _MSToneDetectorDef{  
     char tone_name[8];     
     int frequency; /**<Expected frequency of the tone*/ 
     int min_duration; /**<Min duration of the tone in milliseconds */ 
     float min_amplitude; /**<Minimum amplitude of the tone, 1.0 corresponding to the normalized 0dbm level */
};

typedef struct _MSToneDetectorDef MSToneDetectorDef;

เป€เบ„เบทเปˆเบญเบ‡เบเบงเบ”เบˆเบฑเบšเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบš 10 เบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป€เบ„เบทเปˆเบญเบ‡เบเบงเบ”เบˆเบฑเบšเบซเบ™เบถเปˆเบ‡เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบžเบทเปˆเบญเบเบงเบ”เบžเบปเบšเบชเบดเบšเบชเบฑเบ™เบเบฒเบ™เบชเบญเบ‡เป‚เบ•เบ™. เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰เบžเบฝเบ‡เปเบ•เปˆเบซเบปเบเบชเบฑเบ™เบเบฒเบ™เบชเบฝเบ‡เบ”เบฝเบง. เป€เบžเบทเปˆเบญเป‚เบญเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เบเบงเบ”เบˆเบฑเบš, เบงเบดเบ—เบตเบเบฒเบ™ MS_TONE_DETECTOR_ADD_SCAN เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰.

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

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


/** * Structure carried as argument of the MS_TONE_DETECTOR_EVENT**/
struct _MSToneDetectorEvent{ 
      char tone_name[8];       /* ะ˜ะผั ั‚ะพะฝะฐ ะบะพั‚ะพั€ะพะต ะผั‹ ะตะผัƒ ะฝะฐะทะฝะฐั‡ะธะปะธ ะฟั€ะธ ะฝะฐัั‚ั€ะพะนะบะต ะดะตั‚ะตะบั‚ะพั€ะฐ. */
      uint64_t tone_start_time;   /* ะ’ั€ะตะผั ะฒ ะผะธะปะปะธัะตะบัƒะฝะดะฐั…, ะบะพะณะดะฐ ั‚ะพะฝ ะฑั‹ะป ะพะฑะฝะฐั€ัƒะถะตะฝ. */
};

typedef struct _MSToneDetectorEvent MSToneDetectorEvent;

เปเบœเบ™เบงเบฒเบ”เบšเบฅเบฑเบญเบเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบชเบฑเบ™เบเบฒเบ™เปเบกเปˆเบ™เบชเบฐเปเบ”เบ‡เบขเบนเปˆเปƒเบ™เบฎเบนเบšเบซเบปเบงเบ‚เปเป‰.

เบ”เบต, เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบฅเบฐเบซเบฑเบ”เป‚เบ„เบ‡เบเบฒเบ™เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เบเบฑเบšเบ„เปเบฒเป€เบซเบฑเบ™.

/* ะคะฐะนะป mstest4.c ะ˜ะผะธั‚ะฐั‚ะพั€ ะฟัƒะปัŒั‚ะฐ ัƒะฟั€ะฐะฒะปะตะฝะธั ะธ ะฟั€ะธะตะผะฝะธะบะฐ. */
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/msvolume.h>
#include <mediastreamer2/mstonedetector.h>

/* ะŸะพะดะบะปัŽั‡ะฐะตะผ ะทะฐะณะพะปะพะฒะพั‡ะฝั‹ะน ั„ะฐะนะป ั ั„ัƒะฝะบั†ะธัะผะธ ัƒะฟั€ะฐะฒะปะตะฝะธั ัะพะฑั‹ั‚ะธัะผะธ
 * ะผะตะดะธะฐัั‚ั€ะธะผะตั€ะฐ. */
#include <mediastreamer2/mseventqueue.h>

/* ะคัƒะฝะบั†ะธั ะพะฑั€ะฐั‚ะฝะพะณะพ ะฒั‹ะทะพะฒะฐ, ะพะฝะฐ ะฑัƒะดะตั‚ ะฒั‹ะทะฒะฐะฝะฐ ั„ะธะปัŒั‚ั€ะพะผ, ะบะฐะบ ั‚ะพะปัŒะบะพ ะพะฝ
 * ะพะฑะฝะฐั€ัƒะถะธั‚ ัะพะฒะฟะฐะดะตะฝะธะต ั…ะฐั€ะฐะบั‚ะตั€ะธัั‚ะธะบ ะฒั…ะพะดะฝะพะณะพ ัะธะณะฝะฐะปะฐ ั ะทะฐะดะฐะฝะฝั‹ะผะธ. */
static void tone_detected_cb(void *data, MSFilter *f, unsigned int event_id,
        MSToneDetectorEvent *ev)
{
    printf("                      ะŸั€ะธะฝัั‚ะฐ ะบะพะผะฐะฝะดะฐ: %sn", ev->tone_name);
}

int main()
{
    ms_init();

    /* ะกะพะทะดะฐะตะผ ัะบะทะตะผะฟะปัั€ั‹ ั„ะธะปัŒั‚ั€ะพะฒ. */
    MSFilter  *voidsource = ms_filter_new(MS_VOID_SOURCE_ID);
    MSFilter  *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
    MSFilter  *volume = ms_filter_new(MS_VOLUME_ID);
    MSSndCard *card_playback =
        ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
    MSFilter  *snd_card_write = ms_snd_card_create_writer(card_playback);
    MSFilter  *detector = ms_filter_new(MS_TONE_DETECTOR_ID);

    /* ะžั‡ะธั‰ะฐะตะผ ะผะฐััะธะฒ ะฝะฐั…ะพะดัั‰ะธะนัั ะฒะฝัƒั‚ั€ะธ ะดะตั‚ะตะบั‚ะพั€ะฐ ั‚ะพะฝะพะฒ, ะพะฝ ะพะฟะธัั‹ะฒะฐะตั‚
     * ะพัะพะฑั‹ะต ะฟั€ะธะผะตั‚ั‹ ั€ะฐะทั‹ัะบะธะฒะฐะตะผั‹ั… ัะธะณะฝะฐะปะพะฒ.*/
    ms_filter_call_method(detector, MS_TONE_DETECTOR_CLEAR_SCANS, 0);

    /* ะกะพะทะดะฐะตะผ ะธัั‚ะพั‡ะฝะธะบ ั‚ะฐะบั‚ะพะฒ - ั‚ะธะบะตั€. */
    MSTicker *ticker=ms_ticker_new();

    /* ะกะพะตะดะธะฝัะตะผ ั„ะธะปัŒั‚ั€ั‹ ะฒ ั†ะตะฟะพั‡ะบัƒ. */
    ms_filter_link(voidsource, 0, dtmfgen, 0);
    ms_filter_link(dtmfgen, 0, volume, 0);
    ms_filter_link(volume, 0, detector, 0);
    ms_filter_link(detector, 0, snd_card_write, 0);

    /* ะŸะพะดะบะปัŽั‡ะฐะตะผ ะบ ั„ะธะปัŒั‚ั€ัƒ ั„ัƒะฝะบั†ะธัŽ ะพะฑั€ะฐั‚ะฝะพะณะพ ะฒั‹ะทะพะฒะฐ. */
    ms_filter_set_notify_callback(detector,
            (MSFilterNotifyFunc)tone_detected_cb, NULL);

    /* ะŸะพะดะบะปัŽั‡ะฐะตะผ ะธัั‚ะพั‡ะฝะธะบ ั‚ะฐะบั‚ะพะฒ. */
    ms_ticker_attach(ticker,voidsource);

    /* ะกะพะทะดะฐะตะผ ะผะฐััะธะฒ, ะบะฐะถะดั‹ะน ัะปะตะผะตะฝั‚ ะบะพั‚ะพั€ะพะณะพ ะพะฟะธัั‹ะฒะฐะตั‚ ั…ะฐั€ะฐะบั‚ะตั€ะธัั‚ะธะบัƒ
     * ะพะดะฝะพะณะพ ะธะท ั‚ะพะฝะพะฒ, ะบะพั‚ะพั€ั‹ะน ั‚ั€ะตะฑัƒะตั‚ัั ะพะฑะฝะฐั€ัƒะถะธะฒะฐั‚ัŒ: ะขะตะบัั‚ะพะฒะพะต ะธะผั
     * ะดะฐะฝะฝะพะณะพ ัะปะตะผะตะฝั‚ะฐ, ั‡ะฐัั‚ะพั‚ะฐ ะฒ ะณะตั€ั†ะฐั…, ะดะปะธั‚ะตะปัŒะฝะพัั‚ัŒ ะฒ ะผะธะปะปะธัะตะบัƒะฝะดะฐั…,
     * ะผะธะฝะธะผะฐะปัŒะฝั‹ะน ัƒั€ะพะฒะตะฝัŒ ะพั‚ะฝะพัะธั‚ะตะปัŒะฝะพ 0,775ะ’. */  
    MSToneDetectorDef  scan[6]=
    {
        {"V+",  440, 100, 0.1}, /* ะšะพะผะฐะฝะดะฐ "ะฃะฒะตะปะธั‡ะธั‚ัŒ ะณั€ะพะผะบะพัั‚ัŒ". */
        {"V-",  540, 100, 0.1}, /* ะšะพะผะฐะฝะดะฐ "ะฃะผะตะฝัŒัˆะธั‚ัŒ ะณั€ะพะผะบะพัั‚ัŒ". */
        {"C+",  640, 100, 0.1}, /* ะšะพะผะฐะฝะดะฐ "ะฃะฒะตะปะธั‡ะธั‚ัŒ ะฝะพะผะตั€ ะบะฐะฝะฐะปะฐ". */
        {"C-",  740, 100, 0.1}, /* ะšะพะผะฐะฝะดะฐ "ะฃะผะตะฝัŒัˆะธั‚ัŒ ะฝะพะผะตั€ ะบะฐะฝะฐะปะฐ". */
        {"ON",  840, 100, 0.1}, /* ะšะพะผะฐะฝะดะฐ "ะ’ะบะปัŽั‡ะธั‚ัŒ ั‚ะตะปะตะฒะธะทะพั€". */
        {"OFF", 940, 100, 0.1}  /* ะšะพะผะฐะฝะดะฐ "ะ’ั‹ะบะปัŽั‡ะธั‚ัŒ ั‚ะตะปะตะฒะธะทะพั€". */
    };

    /* ะŸะตั€ะตะดะฐะตะผ ะฒ ะดะตั‚ะตะบั‚ะพั€ ั‚ะพะฝะพะฒ ะฟั€ะธะผะตั‚ั‹ ัะธะณะฝะฐะปะพะฒ. */
    int i;
    for (i = 0; i < 6; i++)
    {
        ms_filter_call_method(detector, MS_TONE_DETECTOR_ADD_SCAN,
                &scan[i]);
    }

    /* ะะฐัั‚ั€ะฐะธะฒะฐะตะผ ัั‚ั€ัƒะบั‚ัƒั€ัƒ, ัƒะฟั€ะฐะฒะปััŽั‰ัƒัŽ ะฒั‹ั…ะพะดะฝั‹ะผ ัะธะณะฝะฐะปะพะผ ะณะตะฝะตั€ะฐั‚ะพั€ะฐ.*/
    MSDtmfGenCustomTone dtmf_cfg;
    dtmf_cfg.tone_name[0] = 0;
    dtmf_cfg.duration = 1000;
    dtmf_cfg.frequencies[0] = 440;
    /* ะ‘ัƒะดะตะผ ะณะตะฝะตั€ะธั€ะพะฒะฐั‚ัŒ ะพะดะธะฝ ั‚ะพะฝ, ั‡ะฐัั‚ะพั‚ัƒ ะฒั‚ะพั€ะพะณะพ ั‚ะพะฝะฐ ัƒัั‚ะฐะฝะพะฒะธะผ ะฒ 0.*/
    dtmf_cfg.frequencies[1] = 0;
    dtmf_cfg.amplitude = 1.0;
    dtmf_cfg.interval = 0.;
    dtmf_cfg.repeat_count = 0.;

    /* ะžั€ะณะฐะฝะธะทัƒะตะผ ั†ะธะบะป ัะบะฐะฝะธั€ะพะฒะฐะฝะธั ะฝะฐะถะฐั‚ั‹ั… ะบะปะฐะฒะธัˆ. ะ’ะฒะพะด ะฝัƒะปั ะทะฐะฒะตั€ัˆะฐะตั‚
     * ั†ะธะบะป ะธ ั€ะฐะฑะพั‚ัƒ ะฟั€ะพะณั€ะฐะผะผั‹. */
    char key='9';
    printf("ะะฐะถะผะธั‚ะต ะบะปะฐะฒะธัˆัƒ ะบะพะผะฐะฝะดั‹, ะทะฐั‚ะตะผ ะฒะฒะพะด.n"
        "ะ”ะปั ะทะฐะฒะตั€ัˆะตะฝะธั ะฟั€ะพะณั€ะฐะผะผั‹ ะฒะฒะตะดะธั‚ะต 0.n");
    while(key != '0')
    {
        key = getchar();
        if ((key >= 49) && (key <= 54))
        {
                printf("ะžั‚ะฟั€ะฐะฒะปะตะฝะฐ ะบะพะผะฐะฝะดะฐ: %cn", key);
            /* ะฃัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ั‡ะฐัั‚ะพั‚ัƒ ะณะตะฝะตั€ะฐั‚ะพั€ะฐ ะฒ ัะพะพั‚ะฒะตั‚ัั‚ะฒะธะธ ั
             * ะบะพะดะพะผ ะฝะฐะถะฐั‚ะพะน ะบะปะฐะฒะธัˆะธ.*/
            dtmf_cfg.frequencies[0] = 440 + 100*(key-49);

            /* ะ’ะบะปัŽั‡ะฐะตะผ ะทะฒัƒะบะพะฒะพะน ะณะตะฝะตั€ะฐั‚ะพั€ c ะพะฑะฝะพะฒะปะตะฝะฝะพะน ั‡ะฐัั‚ะพั‚ะพะน. */
            ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,
                    (void*)&dtmf_cfg);
        }
        ms_usleep(20000);
    }
}

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

$ ./mstest4
ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) Invalid CTL default:0
ortp-warning-Could not attach mixer to card: Invalid argument
ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM default:0
ortp-warning-Strange, sound card Intel 82801AA-ICH does not seems to be capable of anything, retrying with plughw...
ะะฐะถะผะธั‚ะต ะบะปะฐะฒะธัˆัƒ ะบะพะผะฐะฝะดั‹, ะทะฐั‚ะตะผ ะฒะฒะพะด.
ะ”ะปั ะทะฐะฒะตั€ัˆะตะฝะธั ะฟั€ะพะณั€ะฐะผะผั‹ ะฒะฒะตะดะธั‚ะต 0.
ortp-warning-alsa_set_params: periodsize:256 Using 256
ortp-warning-alsa_set_params: period:8 Using 8

เบเบปเบ”เบ—เบธเบเบ›เบธเปˆเบกเบˆเบฒเบ "1" เบซเบฒ "6", เบขเบทเบ™เบขเบฑเบ™เบ”เป‰เบงเบเบ›เบธเปˆเบก "Enter", เบ—เปˆเบฒเบ™เบ„เบงเบ™เป„เบ”เป‰เบฎเบฑเบšเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™: เบฅเบฒเบเบเบฒเบ™เบ™เบตเป‰:


2
ะžั‚ะฟั€ะฐะฒะปะตะฝะฐ ะบะพะผะฐะฝะดะฐ: 2
                      ะŸั€ะธะฝัั‚ะฐ ะบะพะผะฐะฝะดะฐ: V-
1
ะžั‚ะฟั€ะฐะฒะปะตะฝะฐ ะบะพะผะฐะฝะดะฐ: 1
                      ะŸั€ะธะฝัั‚ะฐ ะบะพะผะฐะฝะดะฐ: V+
3
ะžั‚ะฟั€ะฐะฒะปะตะฝะฐ ะบะพะผะฐะฝะดะฐ: 3
                      ะŸั€ะธะฝัั‚ะฐ ะบะพะผะฐะฝะดะฐ: C+
4
ะžั‚ะฟั€ะฐะฒะปะตะฝะฐ ะบะพะผะฐะฝะดะฐ: 4
                      ะŸั€ะธะฝัั‚ะฐ ะบะพะผะฐะฝะดะฐ: C-
0
$

เบžเบงเบเป€เบฎเบปเบฒเป€เบซเบฑเบ™เบงเปˆเบฒเบชเบฝเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เบ–เบทเบเบชเบปเปˆเบ‡เบขเปˆเบฒเบ‡เบชเปเบฒเป€เบฅเบฑเบ”เบœเบปเบ™เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบเบงเบ”เบˆเบฑเบšเป„เบ”เป‰เบเบงเบ”เบžเบปเบš.

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

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

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