Mediastreamer2 VoIP เดŽเดžเตเดšเดฟเตป เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดญเดพเด—เด‚ 5

เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เดฎเต†เดฑเตเดฑเต€เดฐเดฟเดฏเตฝ เดŽเดจเตเดฑเต†เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดŽเดŸเตเดคเตเดคเดคเดพเดฃเต เดธเต†เตป เดšเดพเดจเตฝ.

เดŸเต‹เตบ เดกเดฟเดฑเตเดฑเด•เตเดŸเตผ

เด…เดตเดธเดพเดจเดคเตเดคเดฟเตฝ เดฒเต‡เด–เดจเด‚ เดžเด™เตเด™เตพ เด’เดฐเต เดธเดฟเด—เตเดจเตฝ เดฒเต†เดตเตฝ เดฎเต€เดฑเตเดฑเตผ เดธเตƒเดทเตเดŸเดฟเดšเตเดšเต. เด’เดฐเต เดŸเต‹เตบ เดธเดฟเด—เตเดจเตฝ เดŽเด™เตเด™เดจเต† เด•เดฃเตเดŸเต†เดคเตเดคเดพเดฎเต†เดจเตเดจเต เด‡เดคเดฟเตฝ เดจเดฎเตเดฎเตพ เดชเด เดฟเด•เตเด•เตเด‚.

Mediastreamer2 VoIP เดŽเดžเตเดšเดฟเตป เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดญเดพเด—เด‚ 5

เดชเดดเดฏ เด•เดพเดฒเดคเตเดคเต, เดŽเดฒเตเดฒเดพ เด•เตเดŸเตเด‚เดฌเด™เตเด™เตพเด•เตเด•เตเด‚ เดŸเดฟเดตเดฟ เด‡เดฒเตเดฒเดพเดคเดฟเดฐเตเดจเตเดจเดชเตเดชเต‹เตพ, เด…เดตเดฐเดฟเตฝ เดชเด•เตเดคเดฟเดฏเตเด‚ เดชเตเดฒเดฏเตผ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดšเดพเดจเดฒเตเด•เตพ เดฎเดพเดฑเตเดฑเดฟ, เด’เดฐเต เดŸเดฟเดตเดฟ เดจเดฟเตผเดฎเตเดฎเดพเดคเดพเดตเต เด…เดตเดฐเตเดŸเต† เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเดฟเตฝ เดตเดฏเตผเดฒเต†เดธเต เดฑเดฟเดฎเต‹เดŸเตเดŸเต เด•เตบเดŸเตเดฐเต‹เตพ เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เดจเตเดจเต เดตเดฟเดฆเต‡เดถ เดธเดพเด™เตเด•เต‡เดคเดฟเด• เดชเดคเตเดฐเด™เตเด™เดณเตเดŸเต† เด…เดตเดฒเต‹เด•เดจเด™เตเด™เดณเดฟเตฝ เด•เต—เดคเตเด•เด•เดฐเดฎเดพเดฏ เดตเดพเตผเดคเตเดคเด•เตพ เดชเตเดฐเดคเตเดฏเด•เตเดทเดชเตเดชเต†เดŸเตเดŸเต. เด…เดธเดพเดงเดพเดฐเดฃเดฎเดพเดฏ เด’เดฐเต เดธเดฎเต€เดชเดจเดคเตเดคเดฟเตปเตเดฑเต† เด‰เดชเดฏเต‹เด—เดคเตเดคเดฟเดจเต เดจเดจเตเดฆเดฟ, เดตเดฟเดฆเต‚เดฐ เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด‚ เดฌเดพเดฑเตเดฑเดฑเดฟเด•เดณเดฟเดฒเตเดฒเดพเดคเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต†เดจเตเดจเต เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด…เดฑเดฟเดฏเดพเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต - เดฑเดฟเดฎเต‹เดŸเตเดŸเต เด•เตบเดŸเตเดฐเต‹เตพ เดฎเต†เด•เตเด•เดพเดจเดฟเด•เตเด•เตฝ เด†เดฏเดฟเดฐเตเดจเตเดจเต, เด’เดฐเต เดธเด‚เด—เต€เดค เด‰เดชเด•เดฐเดฃเดคเตเดคเดฟเตปเตเดฑเต† เดนเตˆเดฌเตเดฐเดฟเดกเต เด†เดฏเดฟเดฐเตเดจเตเดจเต - เด’เดฐเต เดฎเต†เดฑเตเดฑเดฒเต‹เดซเต‹เดฃเตเด‚ เดฑเดฟเดตเต‹เตพเดตเดฑเตเด‚. เดฑเดฟเดตเต‹เตพเดตเตผ เดกเตเดฐเดฎเตเดฎเดฟเตฝ เดตเตเดฏเดคเตเดฏเดธเตเดค เดจเต€เดณเดฎเตเดณเตเดณ เดฒเต‹เดน เดธเดฟเดฒเดฟเดฃเตเดŸเดฑเตเด•เตพ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเต, เดซเดฏเดฑเดฟเด‚เด—เต เดชเดฟเตป เด…เดตเดฏเดฟเดฒเตŠเดจเตเดจเดฟเตฝ เดคเดŸเตเดŸเดฟเดฏเดชเตเดชเต‹เตพ, เดธเดฟเดฒเดฟเดฃเตเดŸเตผ เด…เดคเดฟเตปเตเดฑเต‡เดคเดพเดฏ เด†เดตเตƒเดคเตเดคเดฟเดฏเดฟเตฝ เดฑเดฟเด‚เด—เต เดšเต†เดฏเตเดฏเดพเตป เดคเตเดŸเด™เตเด™เดฟ. เด’เดฐเตเดชเด•เตเดทเต‡ เด…เตพเดŸเตเดฐเดพเดธเต—เดฃเตเดŸเดฟเตฝ. เดŸเดฟเดตเดฟเดฏเดฟเดฒเต† เด‡เดฒเด•เตเดŸเตเดฐเต‹เดฃเดฟเด•เตเดธเต เดˆ เดธเดฟเด—เตเดจเตฝ เด•เต‡เดŸเตเดŸเต, เด…เดคเดฟเตปเตเดฑเต† เด†เดตเตƒเดคเตเดคเดฟ เดจเดฟเตผเดฃเตเดฃเดฏเดฟเดšเตเดšเต, เด‰เดšเดฟเดคเดฎเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดจเดŸเดคเตเดคเดฟ - เดšเดพเดจเตฝ เดธเตเดตเดฟเดšเตเดšเตเดšเต†เดฏเตเดฏเตเด•, เดตเต‹เดณเดฟเดฏเด‚ เดฎเดพเดฑเตเดฑเตเด•, เดŸเดฟเดตเดฟ เด“เดซเต เดšเต†เดฏเตเดฏเตเด•.

เดฎเต€เดกเดฟเดฏ เดธเตเดŸเตเดฐเต€เดฎเดฑเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดžเด™เตเด™เดณเตเดŸเต† เด…เดฑเดฟเดตเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดˆ เด•เดฎเดพเตปเดกเต เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดธเดฟเดธเตเดฑเตเดฑเด‚ เดชเตเดจเตผเดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเตป เด‡เดจเตเดจเต เดžเด™เตเด™เตพ เดถเตเดฐเดฎเดฟเด•เตเด•เตเด‚.

เด’เดฐเต เดฑเดฟเดฎเต‹เดŸเตเดŸเต เด•เตบเดŸเตเดฐเต‹เตพ เด…เดจเตเด•เดฐเดฟเด•เตเด•เดพเตป, เดžเด™เตเด™เดณเตเดŸเต† เดŸเต‹เตบ เดœเดจเดฑเต‡เดฑเตเดฑเดฑเดฟเตปเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด‚ เดžเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚. เด•เต€เดธเตเดŸเตเดฐเต‹เด•เตเด•เตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดœเดจเดฑเต‡เดฑเตเดฑเตผ เดซเตเดฐเต€เด•เตเดตเตปเดธเดฟเดฏเตเดŸเต† เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเดตเตเด‚ เด•เตบเดธเต‹เดณเดฟเดฒเต‡เด•เตเด•เต เดฒเดญเดฟเดšเตเดš เด•เดฎเดพเตปเดกเตเด•เตพ เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เดกเต€เด•เต‹เดกเดฑเตเดณเตเดณ เด’เดฐเต เดฑเดฟเดธเต€เดตเดฑเตเด‚ เดžเด™เตเด™เตพ เด‡เดคเดฟเดฒเต‡เด•เตเด•เต เดšเต‡เตผเด•เตเด•เตเด‚. เดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚, เดœเดจเดฑเต‡เดฑเตเดฑเตผ 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
$

เด•เดฎเดพเตปเดกเต เดŸเต‹เดฃเตเด•เตพ เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟ เด…เดฏเดšเตเดšเดคเดพเดฏเตเด‚ เดกเดฟเดฑเตเดฑเด•เตเดŸเตผ เด…เดตเดฏเต† เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเดคเตเด‚ เดžเด™เตเด™เตพ เด•เดพเดฃเตเดจเตเดจเต.

เด…เดŸเตเดคเตเดค เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ, เดžเด™เตเด™เตพ RTP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เด‡เดฅเตผเดจเต†เดฑเตเดฑเต เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเดฒเต‚เดŸเต† เด’เดฐเต เด“เดกเดฟเดฏเต‹ เดธเดฟเด—เตเดจเตฝ เด•เตˆเดฎเดพเดฑเตเดจเตเดจเดคเดฟเดฒเต‡เด•เตเด•เต เดคเดฟเดฐเดฟเดฏเตเด•เดฏเตเด‚ เด…เดคเต เดžเด™เตเด™เดณเตเดŸเต† เดฑเดฟเดฎเต‹เดŸเตเดŸเต เด•เตบเดŸเตเดฐเต‹เดณเดฟเตฝ เด‰เดŸเดจเดŸเดฟ เดชเตเดฐเดฏเต‹เด—เดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•