Mediastreamer2 āĻ­āĻŋāĻ“āĻ†āĻ‡āĻĒāĻŋ āĻ‡āĻžā§āĻœāĻŋāĻ¨ āĻ…āĻ¨ā§āĻŦā§‡āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡āĨ¤ āĻĒāĻžāĻ°ā§āĻŸ 5

āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡āĻ° āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻ†āĻŽāĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻœā§‡āĻ¨ āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛.

āĻŸā§‹āĻ¨ āĻĄāĻŋāĻŸā§‡āĻ•ā§āĻŸāĻ°

āĻļā§‡āĻˇā§‡ āĻĒā§āĻ°āĻŦāĻ¨ā§āĻ§ āĻ†āĻŽāĻ°āĻž āĻ¸āĻŋāĻ—āĻ¨ā§āĻ¯āĻžāĻ˛ āĻ˛ā§‡āĻ­ā§‡āĻ˛ āĻŽāĻŋāĻŸāĻžāĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĻ›āĻŋāĨ¤ āĻāĻ‡ āĻāĻ•āĻŸāĻŋāĻ¤ā§‡ āĻ†āĻŽāĻ°āĻž āĻļāĻŋāĻ–āĻŦ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻŸā§‹āĻ¨ āĻ¸āĻ‚āĻ•ā§‡āĻ¤ āĻ¸āĻ¨āĻžāĻ•ā§āĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧāĨ¤

Mediastreamer2 āĻ­āĻŋāĻ“āĻ†āĻ‡āĻĒāĻŋ āĻ‡āĻžā§āĻœāĻŋāĻ¨ āĻ…āĻ¨ā§āĻŦā§‡āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡āĨ¤ āĻĒāĻžāĻ°ā§āĻŸ 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" āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻ¯ā§‡āĻ•ā§‹āĻ¨ā§‹ āĻ•ā§€ āĻŸāĻŋāĻĒā§āĻ¨, "āĻāĻ¨ā§āĻŸāĻžāĻ°" āĻ•ā§€ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°ā§‡, āĻ†āĻĒāĻ¨āĻžāĻ° āĻāĻ‡ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ° āĻŽāĻ¤ā§‹ āĻ•āĻŋāĻ›ā§ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤:


2
ОŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ° ĐēĐžĐŧĐ°ĐŊĐ´Đ°: 2
                      ПŅ€Đ¸ĐŊŅŅ‚Đ° ĐēĐžĐŧĐ°ĐŊĐ´Đ°: V-
1
ОŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ° ĐēĐžĐŧĐ°ĐŊĐ´Đ°: 1
                      ПŅ€Đ¸ĐŊŅŅ‚Đ° ĐēĐžĐŧĐ°ĐŊĐ´Đ°: V+
3
ОŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ° ĐēĐžĐŧĐ°ĐŊĐ´Đ°: 3
                      ПŅ€Đ¸ĐŊŅŅ‚Đ° ĐēĐžĐŧĐ°ĐŊĐ´Đ°: C+
4
ОŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ° ĐēĐžĐŧĐ°ĐŊĐ´Đ°: 4
                      ПŅ€Đ¸ĐŊŅŅ‚Đ° ĐēĐžĐŧĐ°ĐŊĐ´Đ°: C-
0
$

āĻ†āĻŽāĻ°āĻž āĻĻā§‡āĻ–āĻŋ āĻ¯ā§‡ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻŸā§‹āĻ¨ āĻ¸āĻĢāĻ˛āĻ­āĻžāĻŦā§‡ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻĄāĻŋāĻŸā§‡āĻ•ā§āĻŸāĻ° āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻ¨āĻžāĻ•ā§āĻ¤ āĻ•āĻ°ā§‡āĨ¤

āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡ āĻ†āĻŽāĻ°āĻž RTP āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻ‡āĻĨāĻžāĻ°āĻ¨ā§‡āĻŸ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻāĻ•āĻŸāĻŋ āĻ…āĻĄāĻŋāĻ“ āĻ¸āĻ‚āĻ•ā§‡āĻ¤ āĻĒā§āĻ°ā§‡āĻ°āĻŖā§‡āĻ° āĻĻāĻŋāĻ•ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯āĻžāĻŦ āĻāĻŦāĻ‚ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ°āĻŋāĻŽā§‹āĻŸ āĻ•āĻ¨ā§āĻŸā§āĻ°ā§‹āĻ˛ā§‡ āĻāĻŸāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻŦāĨ¤

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨