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
$

แƒฉแƒ•แƒ”แƒœ แƒ•แƒฎแƒ”แƒ“แƒแƒ•แƒ—, แƒ แƒแƒ› แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒขแƒแƒœแƒ”แƒ‘แƒ˜ แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ‘แƒ แƒ“แƒ แƒ“แƒ”แƒขแƒ”แƒฅแƒขแƒแƒ แƒ˜ แƒแƒฆแƒ›แƒแƒแƒฉแƒ”แƒœแƒก แƒ›แƒแƒ—.

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ›แƒ˜แƒ•แƒ›แƒแƒ แƒ—แƒแƒ•แƒ— แƒแƒฃแƒ“แƒ˜แƒ แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜แƒก แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒแƒก Ethernet แƒฅแƒกแƒ”แƒšแƒจแƒ˜ RTP แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ›แƒแƒก แƒฉแƒ•แƒ”แƒœแƒก แƒ“แƒ˜แƒกแƒขแƒแƒœแƒชแƒ˜แƒฃแƒ  แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒจแƒ˜.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ