Π˜ΡΡ‚Ρ€Π°ΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° VoIP ΠΌΠΎΡ‚ΠΎΡ€ΠΎΡ‚ Mediastreamer2. Π”Π΅Π» 5

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΡ˜Π°Π»ΠΎΡ‚ Π½Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° Π΅ ΠΏΡ€Π΅Π·Π΅ΠΌΠ΅Π½ ΠΎΠ΄ ΠΌΠΎΠ΅Ρ‚ΠΎ Π·Π΅Π½ ΠΊΠ°Π½Π°Π».

Вонски Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€

Π’ΠΎ послСдниот Π§Π»Π΅Π½ Π‘ΠΎΠ·Π΄Π°Π΄ΠΎΠ²ΠΌΠ΅ ΠΌΠ΅Ρ€Π°Ρ‡ Π½Π° Π½ΠΈΠ²ΠΎ Π½Π° сигнал. Π’ΠΎ ΠΎΠ²Π° ќС Π½Π°ΡƒΡ‡ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ΅ΠΌΠ΅ тонски сигнал.

Π˜ΡΡ‚Ρ€Π°ΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° VoIP ΠΌΠΎΡ‚ΠΎΡ€ΠΎΡ‚ 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β€œ, ΠΏΠΎΡ‚Π²Ρ€Π΄ΡƒΠ²Π°Ρ˜ΡœΠΈ со ΠΊΠΎΠΏΡ‡Π΅Ρ‚ΠΎ β€žEnterβ€œ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅Ρ‚Π΅ Π½Π΅ΡˆΡ‚ΠΎ ΠΊΠ°ΠΊΠΎ ΠΎΠ²Π°Π° листа:


2
ΠžΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: 2
                      ΠŸΡ€ΠΈΠ½ΡΡ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: V-
1
ΠžΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: 1
                      ΠŸΡ€ΠΈΠ½ΡΡ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: V+
3
ΠžΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: 3
                      ΠŸΡ€ΠΈΠ½ΡΡ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: C+
4
ΠžΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: 4
                      ΠŸΡ€ΠΈΠ½ΡΡ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: C-
0
$

Π“Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈΡ‚Π΅ Ρ‚ΠΎΠ½ΠΎΠ²ΠΈ сС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ испратСни ΠΈ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ΠΎΡ‚ Π³ΠΈ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΈΡ€Π°.

Π’ΠΎ слСдната ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° ќС сС свртимС ΠΊΠΎΠ½ прСнос Π½Π° Π°ΡƒΠ΄ΠΈΠΎ сигнал ΠΏΡ€Π΅ΠΊΡƒ Π΅Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΌΡ€Π΅ΠΆΠ° со помош Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΡ‚ RTP ΠΈ вСднаш ќС Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ΅ Π½Π° Π½Π°ΡˆΠΈΠΎΡ‚ далСчински ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Ρ‡.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€