แž€แžถแžšแžšแžปแž€แžšแž€แž˜แŸ‰แžถแžŸแŸŠแžธแž“ Mediastreamer2 VoIP แŸ” แž•แŸ’แž“แŸ‚แž€แž‘แžธ 5

แžŸแž˜แŸ’แž—แžถแžšแŸˆแž“แŸƒแžขแžแŸ’แžแž”แž‘แž‚แžบแž™แž€แž–แžธแžแŸ’แž‰แžปแŸ† แž”แŸ‰แžปแžŸแŸ’แžแžทแŸ zen.

แžงแž”แž€แžšแžŽแŸแž…แžถแž”แŸ‹แžŸแž˜แŸ’แž›แŸแž„

แž€แŸ’แž“แžปแž„โ€‹แžขแžแžธแžแž€แžถแž› แžขแžแŸ’แžแž”แž‘ แž™แžพแž„แž”แžถแž“แž”แž„แŸ’แž€แžพแžแžงแž”แž€แžšแžŽแŸแžœแžถแžŸแŸ‹แž€แž˜แŸ’แžšแžทแžแžŸแž‰แŸ’แž‰แžถแŸ” แž“แŸ…แž€แŸ’แž“แžปแž„แž˜แžฝแž™แž“แŸแŸ‡ แž™แžพแž„แž“แžนแž„แžšแŸ€แž“แž–แžธแžšแž”แŸ€แž”แžŠแžพแž˜แŸ’แž”แžธแžšแž€แžƒแžพแž‰แžŸแž‰แŸ’แž‰แžถแžŸแŸ†แžกแŸแž„แŸ”

แž€แžถแžšแžšแžปแž€แžšแž€แž˜แŸ‰แžถแžŸแŸŠแžธแž“ 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

แž”แž“แŸ’แžแŸ‚แž˜แž˜แžแžทแž™แŸ„แž”แž›แŸ‹