Π Π°Π·ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° VoIP-Π΄Π²ΠΈΠΆΠΊΠ° Mediastreamer2. Част 5

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

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

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

Π Π°Π·ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° VoIP-Π΄Π²ΠΈΠΆΠΊΠ° Mediastreamer2. Част 5

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

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

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

struct _MSToneDetectorDef{  
     char tone_name[8];     
     int frequency; 
     int min_duration; 
     float min_amplitude; 
};

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...
НатиснСтС клавиша Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°, слСд Ρ‚ΠΎΠ²Π° Enter.
Π—Π° Π΄Π° Π·Π°Π²ΡŠΡ€ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, Π²ΡŠΠ²Π΅Π΄Π΅Ρ‚Π΅ 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-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΈ Ρ‰Π΅ Π³ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠΌ Π² Π½Π°ΡˆΠ΅Ρ‚ΠΎ дистанционно ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅.

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

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