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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹