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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹