Π˜Π·ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ VoIP двигатСля Mediastreamer2. Част 5

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΡŠΡ‚ Π½Π° статията Π΅ Π²Π·Π΅Ρ‚ ΠΎΡ‚ моя Π΄Π·Π΅Π½-ΠΊΠ°Π½Π°Π».

ΠžΡ‚ΠΊΡ€ΠΈΠ²Π°Ρ‚Π΅Π» Π½Π° Ρ‚ΠΎΠ½Π°Π»Π΅Π½ сигнал

Π’ ΠΌΠΈΠ½Π°Π»ΠΎΡ‚ΠΎ статии Π‘ΡŠΠ·Π΄Π°Π΄ΠΎΡ…ΠΌΠ΅ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚Π΅Π» Π½Π° Π½ΠΈΠ²ΠΎΡ‚ΠΎ Π½Π° сигнала. Π’ Ρ‚ΠΎΠ²Π°, Ρ‰Π΅ Π½Π°ΡƒΡ‡ΠΈΠΌ ΠΊΠ°ΠΊ Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ½Π°Π»Π΅Π½ сигнал.

Π˜Π·ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ VoIP двигатСля Mediastreamer2. Част 5

Π’ стари Π²Ρ€Π΅ΠΌΠ΅Π½Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π½Π΅ всяко сСмСйство имашС Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€, ΠΈ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°Ρ‚Π° ΠΎΡ‚ тях смСняха ΠΊΠ°Π½Π°Π»ΠΈΡ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠ»Π΅Ρ‰ΠΈ, Π² ΠΏΡ€Π΅Π³Π»Π΅Π΄ΠΈΡ‚Π΅ Π½Π° чуТдСстранната тСхничСска прСса сС появи интСрСсна Π½ΠΎΠ²ΠΈΠ½Π°, Ρ‡Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π° Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€ΠΈ Π΅ снабдил своитС Π°ΠΏΠ°Ρ€Π°Ρ‚ΠΈ с дистанционно Π±Π΅Π·ΠΆΠΈΡ‡Π½ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅. ΠžΡ‚ Π΄Π΅Ρ‚Π°ΠΉΠ»ΠΈΡ‚Π΅ бСшС извСстно, Ρ‡Π΅ дистанционното Ρ€Π°Π±ΠΎΡ‚ΠΈ Π±Π΅Π· Π±Π°Ρ‚Π΅Ρ€ΠΈΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° Π½Π΅ΠΎΠ±ΠΈΡ‡Π°Π΅Π½ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ - дистанционното бСшС ΠΌΠ΅Ρ…Π°Π½ΠΈΡ‡Π½ΠΎ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ²Π°ΡˆΠ΅ Ρ…ΠΈΠ±Ρ€ΠΈΠ΄ Π½Π° ΠΌΡƒΠ·ΠΈΠΊΠ°Π»Π΅Π½ инструмСнт - ΠΌΠ΅Ρ‚Π°Π»ΠΎΡ„ΠΎΠ½ ΠΈ Ρ€Π΅Π²ΠΎΠ»Π²Π΅Ρ€. Π’ Π±Π°Ρ€Π°Π±Π°Π½Π° Π½Π° Ρ€Π΅Π²ΠΎΠ»Π²Π΅Ρ€Π° имашС ΠΌΠ΅Ρ‚Π°Π»Π½ΠΈ Ρ†ΠΈΠ»ΠΈΠ½Π΄Ρ€ΠΈ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Π° дълТина ΠΈ ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΡƒΠ΄Π°Ρ€Π½ΠΈΠΊΡŠΡ‚ ΡƒΠ΄Ρ€ΡΡˆΠ΅ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ тях, Ρ†ΠΈΠ»ΠΈΠ½Π΄ΡŠΡ€ΡŠΡ‚ Π·Π°ΠΏΠΎΡ‡Π²Π°ΡˆΠ΅ Π΄Π° звъни Π½Π° собствСната си чСстота. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΠΎ Π½Π° ΡƒΠ»Ρ‚Ρ€Π°Π·Π²ΡƒΠΊ. Π•Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½ΠΈΠΊΠ°Ρ‚Π° Π² Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€Π° ΡƒΠ»Π°Π²ΡΡˆΠ΅ Ρ‚ΠΎΠ·ΠΈ сигнал ΠΈ, опрСдСлявайки Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° чСстота, изпълнявашС ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎΡ‚ΠΎ дСйствиС - смСняшС ΠΊΠ°Π½Π°Π»Π°, ΠΏΡ€ΠΎΠΌΠ΅Π½ΡΡˆΠ΅ силата Π½Π° Π·Π²ΡƒΠΊΠ°, ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π²Π°ΡˆΠ΅ Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€Π°.

ДнСс Ρ‰Π΅ ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ рСконструкция Π½Π° Ρ‚Π°Π·ΠΈ систСма Π·Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π½Π°ΡˆΠΈΡ‚Π΅ знания Π·Π° мСдиастримСра.

Π—Π° имитация Π½Π° дистанционното, Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ тСкста Π½Π° нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Ρ‚ΠΎΠ½Π°Π»Π΅Π½ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€. Π©Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° чСстотата Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΎΡ‚ натискания с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°Ρ‚Π° ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ с Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π°. Π‘Π»Π΅Π΄ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅, Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΡŠΡ‚ трябва Π΄Π° ΠΏΡ€ΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π° Ρ‚ΠΎΠ½Π°Π»Π½ΠΈ сигнали с 6 чСстоти, с ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ ΠΊΠΎΠ΄ΠΈΡ€Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ Π·Π° ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π°Π½Π΅/намаляванС Π½Π° Π·Π²ΡƒΠΊΠ°, смяна Π½Π° ΠΊΠ°Π½Π°Π»Π°, Π²ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅/ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ Π½Π° Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€Π°. Π—Π° настройка Π½Π° Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° структура:

struct _MSToneDetectorDef{  
     char tone_name[8];     
     int frequency; \/**<ΠžΡ‡Π°ΠΊΠ²Π°Π½Π° чСстота Π½Π° Ρ‚ΠΎΠ½Π°*\/ 
     int min_duration; \/**<Мин. ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚ Π½Π° Ρ‚ΠΎΠ½Π° Π² милисСкунди *\/ 
     float min_amplitude; \/**<Минимална Π°ΠΌΠΏΠ»ΠΈΡ‚ΡƒΠ΄Π° Π½Π° Ρ‚ΠΎΠ½Π°, 1.0 ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π° Π½Π° Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎΡ‚ΠΎ 0dbm Π½ΠΈΠ²ΠΎ *\/\n};\n\ntypedef 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) НСпознати ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) НСвалидСн CTL default:0
ortp-warning-НС ΠΌΠΎΠΆΠ° Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅ миксСра с ΠΊΠ°Ρ€Ρ‚Π°Ρ‚Π°: НСвалидСн Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚
ALSA lib conf.c:4738:(snd_config_expand) НСпознати ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) НСвалидСн PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) НСпознати ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) НСвалидСн PCM default:0
ortp-warning-Π‘Ρ‚Ρ€Π°Π½Π½ΠΎ, Π·Π²ΡƒΠΊΠΎΠ²Π°Ρ‚Π° ΠΊΠ°Ρ€Ρ‚Π° Intel 82801AA-ICH Π½Π΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π΄Π° Π΅ способна Π½Π° Π½Π΅Ρ‰ΠΎ, ΠΎΠΏΠΈΡ‚Π²Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ с plughw...
НатиснСтС клавиша Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈ слСд Ρ‚ΠΎΠ²Π° Enter.
Π—Π° Π΄Π° Π·Π°Π²ΡŠΡ€ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, Π²ΡŠΠ²Π΅Π΄Π΅Ρ‚Π΅ 0.
ortp-warning-alsa_set_params: periodsize:256 ИзползванС на 256
ortp-warning-alsa_set_params: period:8 ИзползванС на 8

НатискамС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ клавиши ΠΎΡ‚ '1' Π΄ΠΎ '6', ΠΏΠΎΡ‚Π²ΡŠΡ€Π΄ΡΠ²Π°ΠΉΠΊΠΈ с 'Enter', трябва Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ‚Π°ΠΊΡŠΠ² списък:


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

Π’ΠΈΠΆΠ΄Π°ΠΌΠ΅, Ρ‡Π΅ Ρ‚ΠΎΠ½ΠΎΠ²Π΅Ρ‚Π΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ сС ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Ρ‚ ΠΈ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ Π³ΠΈ ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°.

Π’ слСдващата статия Ρ‰Π΅ сС Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌ с ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π·Π²ΡƒΠΊΠΎΠ² сигнал ΠΏΠΎ Ethernet ΠΌΡ€Π΅ΠΆΠ° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° RTP ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΈ Π²Π΅Π΄Π½Π°Π³Π° Ρ‰Π΅ Π³ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠΌ Π² нашия дистанционСн ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ».

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster