ΠŸΡ€ΠΎΡƒΡ‡Π²Π°Π½Π΅ Π½Π° VoIP двигатСля Π½Π° Mediastreamer2. част 2

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

ΠŸΡ€ΠΎΡƒΡ‡Π²Π°Π½Π΅ Π½Π° VoIP двигатСля Π½Π° Mediastreamer2. част 2

БъздаванС Π½Π° Ρ‚ΠΎΠ½ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€

Π’ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ Бтатия Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Ρ…ΠΌΠ΅ ΠΌΠ΅Π΄ΠΈΠΉΠ½Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π° ΡΡ‚Ρ€ΠΈΠΉΠΌΡŠΡ€, инструмСнти Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈ тСствахмС тяхната функционалност, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΡ…ΠΌΠ΅ ΠΏΡ€ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

ДнСс Ρ‰Π΅ създадСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° Ρ‚ΠΎΠ½Π°Π»Π΅Π½ сигнал Π½Π° Π·Π²ΡƒΠΊΠΎΠ²Π° ΠΊΠ°Ρ€Ρ‚Π°. Π—Π° Π΄Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌ Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, трябва Π΄Π° ΡΠ²ΡŠΡ€ΠΆΠ΅ΠΌ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ‚Π΅ към Π²Π΅Ρ€ΠΈΠ³Π°Ρ‚Π° Π½Π° звуковия Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ:

ΠŸΡ€ΠΎΡƒΡ‡Π²Π°Π½Π΅ Π½Π° VoIP двигатСля Π½Π° Mediastreamer2. част 2

Π§Π΅Ρ‚Π΅ΠΌ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ°Ρ‚Π° отляво надясно, Ρ‚ΠΎΠ²Π° Π΅ посоката, Π² която сС Π΄Π²ΠΈΠΆΠΈ Π½Π°ΡˆΠΈΡΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ. Π—Π° Ρ‚ΠΎΠ²Π° подсказват ΠΈ стрСлкитС. ΠŸΡ€Π°Π²ΠΎΡŠΠ³ΡŠΠ»Π½ΠΈΡ†ΠΈΡ‚Π΅ ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ‚ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‚ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ ΠΈ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Ρ‚ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π°. Π’ΡŠΡ‚Ρ€Π΅ Π² ΠΏΡ€Π°Π²ΠΎΡŠΠ³ΡŠΠ»Π½ΠΈΠΊΠ° Π΅ посочСна Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° роля ΠΈ Ρ‚ΠΈΠΏΡŠΡ‚ Π½Π° Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° Π΅ посочСн с Π³Π»Π°Π²Π½ΠΈ Π±ΡƒΠΊΠ²ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΡ‚Π΄ΠΎΠ»Ρƒ. Π‘Ρ‚Ρ€Π΅Π»ΠΊΠΈΡ‚Π΅, ΡΠ²ΡŠΡ€Π·Π²Π°Ρ‰ΠΈ ΠΏΡ€Π°Π²ΠΎΡŠΠ³ΡŠΠ»Π½ΠΈΡ†ΠΈΡ‚Π΅, са опашки ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ, ΠΏΡ€Π΅Π· ΠΊΠΎΠΈΡ‚ΠΎ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ сС доставят ΠΎΡ‚ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ към Ρ„ΠΈΠ»Ρ‚ΡŠΡ€. ΠšΠ°Ρ‚ΠΎ цяло Π΅Π΄ΠΈΠ½ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ…ΠΎΠ΄ΠΎΠ²Π΅ ΠΈ ΠΈΠ·Ρ…ΠΎΠ΄ΠΈ.

Всичко Π·Π°ΠΏΠΎΡ‡Π²Π° с ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° Π½Π° часовник, ΠΊΠΎΠΉΡ‚ΠΎ Π·Π°Π΄Π°Π²Π° Ρ‚Π΅ΠΌΠΏΠΎΡ‚ΠΎ, с ΠΊΠΎΠ΅Ρ‚ΠΎ сС изчисляват Π΄Π°Π½Π½ΠΈΡ‚Π΅ във Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ‚Π΅. Π‘ΠΏΠΎΡ€Π΅Π΄ своя Ρ‚Π°ΠΊΡ‚ΠΎΠ² Ρ†ΠΈΠΊΡŠΠ» всСки Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° всички Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ са Π½Π° нСговия Π²Ρ…ΠΎΠ΄. И поставя Π±Π»ΠΎΠΊΠΎΠ²Π΅ с Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° Π² ΠΎΠΏΠ°ΡˆΠΊΠ°Ρ‚Π°. ΠŸΡŠΡ€Π²ΠΎ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ΡŠΡ‚, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Π½Π°ΠΉ-Π±Π»ΠΈΠ·ΠΎ Π΄ΠΎ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° Π½Π° часовник, ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° изчислСния, слСд Ρ‚ΠΎΠ²Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ‚Π΅, ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ към Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ ΠΈΠ·Ρ…ΠΎΠ΄ΠΈ (ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·Ρ…ΠΎΠ΄ΠΈ) ΠΈ Ρ‚.Π½. Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ послСдният Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ във Π²Π΅Ρ€ΠΈΠ³Π°Ρ‚Π° Π·Π°Π²ΡŠΡ€ΡˆΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π°, ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ спира, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ пристигнС Π½ΠΎΠ² часовник. Π£Π΄Π°Ρ€ΠΈΡ‚Π΅ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ слСдват ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΎΡ‚ 10 милисСкунди.

Π”Π° сС β€‹β€‹Π²ΡŠΡ€Π½Π΅ΠΌ към Π½Π°ΡˆΠ°Ρ‚Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ°. Π’Π°ΠΊΡ‚ΠΎΠ²ΠΈΡ‚Π΅ Ρ†ΠΈΠΊΠ»ΠΈ пристигат Π½Π° Π²Ρ…ΠΎΠ΄Π° Π½Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° Π½Π° ΠΌΡŠΠ»Ρ‡Π°Π½ΠΈΠ΅; Ρ‚ΠΎΠ²Π° Π΅ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Π·Π°Π΅Ρ‚ с Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π±Π»ΠΎΠΊ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ Π½ΡƒΠ»ΠΈ Π½Π° своя ΠΈΠ·Ρ…ΠΎΠ΄ Π·Π° всСки Ρ‚Π°ΠΊΡ‚ΠΎΠ² Ρ†ΠΈΠΊΡŠΠ». Ако Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ Ρ‚ΠΎΠ·ΠΈ Π±Π»ΠΎΠΊ ΠΊΠ°Ρ‚ΠΎ Π±Π»ΠΎΠΊ ΠΎΡ‚ Π·Π²ΡƒΠΊΠΎΠ²ΠΈ ΠΏΡ€ΠΎΠ±ΠΈ, Ρ‚ΠΎΠ³Π°Π²Π° Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ Π½ΠΈΡ‰ΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ Ρ‚ΠΈΡˆΠΈΠ½Π°. На ΠΏΡ€ΡŠΠ² ΠΏΠΎΠ³Π»Π΅Π΄ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° странно Π΄Π° сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ с ΠΌΡŠΠ»Ρ‡Π°Π½ΠΈΠ΅ - Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Ρ‡ΡƒΠ΅, Π½ΠΎ Ρ‚Π΅Π·ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π½Π° Π·Π²ΡƒΠΊΠΎΠ² сигнал. Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΡŠΡ‚ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Ρ‚Π΅Π·ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€Π°Π·Π΅Π½ лист хартия, записвайки Π·Π²ΡƒΠΊΠΎΠ²ΠΈ ΠΏΡ€ΠΎΠ±ΠΈ Π² тях. Π’ Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎΡ‚ΠΎ си ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Π΅ ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΈ просто ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‰Π° Π²Ρ…ΠΎΠ΄Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ към ΠΈΠ·Ρ…ΠΎΠ΄Π°. Π’Π°ΠΊΠ° Π±Π»ΠΎΠΊΠΎΠ²Π΅Ρ‚Π΅ Π½Π° ΠΌΡŠΠ»Ρ‡Π°Π½ΠΈΠ΅Ρ‚ΠΎ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°Ρ‚ Π½Π΅ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈ ΠΏΡ€Π΅Π· цялата Π²Π΅Ρ€ΠΈΠ³Π° отляво надясно, Π·Π°Π²ΡŠΡ€ΡˆΠ²Π°ΠΉΠΊΠΈ Π² Π·Π²ΡƒΠΊΠΎΠ²Π°Ρ‚Π° ΠΊΠ°Ρ€Ρ‚Π°. ΠšΠΎΠ΅Ρ‚ΠΎ Π±Π΅Π·ΡˆΡƒΠΌΠ½ΠΎ Π²Π·Π΅ΠΌΠ° Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΎΡ‚ ΠΎΠΏΠ°ΡˆΠΊΠ°Ρ‚Π°, ΡΠ²ΡŠΡ€Π·Π°Π½Π° с нСговия Π²Ρ…ΠΎΠ΄.

Но всичко сС промСня, Π°ΠΊΠΎ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΡŠΡ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° Π²ΡŠΠ·ΠΏΡ€ΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π·Π²ΡƒΠΊ, Ρ‚ΠΎΠΉ Π·Π°ΠΏΠΎΡ‡Π²Π° Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° Π·Π²ΡƒΠΊΠΎΠ²ΠΈ ΠΏΡ€ΠΎΠ±ΠΈ ΠΈ Π³ΠΈ замСня с ΠΏΡ€ΠΎΠ±ΠΈ във Π²Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΈ поставя ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈΡ‚Π΅ Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π°. Π—Π²ΡƒΠΊΠΎΠ²Π°Ρ‚Π° ΠΊΠ°Ρ€Ρ‚Π° Π·Π°ΠΏΠΎΡ‡Π²Π° Π΄Π° Π²ΡŠΠ·ΠΏΡ€ΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π° Π·Π²ΡƒΠΊ. По-Π΄ΠΎΠ»Ρƒ Π΅ Π΄Π°Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, която изпълнява описаната ΠΏΠΎ-Π³ΠΎΡ€Π΅ Ρ€Π°Π±ΠΎΡ‚Π½Π° схСма:

/* Π€Π°ΠΉΠ» mstest2.c */
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/mssndcard.h>
int main()
{
    ms_init();

    /* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ экзСмпляры Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ². */
    MSFilter  *voidsource = ms_filter_new(MS_VOID_SOURCE_ID);
    MSFilter  *dtmfgen = ms_filter_new(MS_DTMF_GEN_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);

    /* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ‚ΠΈΠΊΠ΅Ρ€. */
    MSTicker *ticker = ms_ticker_new();

    /* БоСдиняСм Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ. */
    ms_filter_link(voidsource, 0, dtmfgen, 0);
    ms_filter_link(dtmfgen, 0, snd_card_write, 0);

   /* ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ источник Ρ‚Π°ΠΊΡ‚ΠΎΠ². */
   ms_ticker_attach(ticker, voidsource);

   /* Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€. */
   char key='1';
   ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY, (void*)&key);

   /* Π”Π°Π΅ΠΌ, врСмя, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Π±Π»ΠΎΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ ΠΊΠ°Ρ€Ρ‚ΠΎΠΉ.*/
   ms_sleep(2);   
}

Π‘Π»Π΅Π΄ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° мСдийния стримСр сС ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ Ρ‚Ρ€ΠΈ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π°: voidsource, dtmfgen, snd_card_write. Бъздава сС ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° часовник.

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° трябва Π΄Π° ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ‚Π΅ Π² ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅ с Π½Π°ΡˆΠ°Ρ‚Π° схСма ΠΈ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΡŠΡ‚ Π½Π° часовник трябва Π΄Π° бъдС ΡΠ²ΡŠΡ€Π·Π°Π½ послСдСн, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ слСд Ρ‚ΠΎΠ²Π° Π²Π΅Ρ€ΠΈΠ³Π°Ρ‚Π° Π²Π΅Π΄Π½Π°Π³Π° Ρ‰Π΅ Π·Π°ΠΏΠΎΡ‡Π½Π΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ. Ако ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° часовник към Π½Π΅Π·Π°Π²ΡŠΡ€ΡˆΠ΅Π½Π° Π²Π΅Ρ€ΠΈΠ³Π°, ΠΌΠΎΠΆΠ΅ Π΄Π° сС случи мСдийният стримСр Π΄Π° сС сринС, Π°ΠΊΠΎ ΠΎΡ‚ΠΊΡ€ΠΈΠ΅ ΠΏΠΎΠ½Π΅ Π΅Π΄ΠΈΠ½ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ във Π²Π΅Ρ€ΠΈΠ³Π°Ρ‚Π° с всички Π²Ρ…ΠΎΠ΄ΠΎΠ²Π΅ ΠΈΠ»ΠΈ всички ΠΈΠ·Ρ…ΠΎΠ΄ΠΈ, β€žΠ²ΠΈΡΡΡ‰ΠΈ във Π²ΡŠΠ·Π΄ΡƒΡ…Π°β€œ (Π½Π΅ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ).

Π‘Π²ΡŠΡ€Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° функцията

ms_filter_link(src, src_out, dst, dst_in)

ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΏΡŠΡ€Π²ΠΈΡΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» към Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ, вторият Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π΅ Π½ΠΎΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π° Π½Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° (ΠΎΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Π΅ Π²Ρ…ΠΎΠ΄ΠΎΠ²Π΅Ρ‚Π΅ ΠΈ ΠΈΠ·Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ са Π½ΠΎΠΌΠ΅Ρ€ΠΈΡ€Π°Π½ΠΈ, Π·Π°ΠΏΠΎΡ‡Π²Π°ΠΉΠΊΠΈ ΠΎΡ‚ Π½ΡƒΠ»Π°). ВрСтият Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» към Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°, Ρ‡Π΅Ρ‚Π²ΡŠΡ€Ρ‚ΠΈΡΡ‚ Π΅ входният Π½ΠΎΠΌΠ΅Ρ€ Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°.

Всички Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ са ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ ΠΈ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΡŠΡ‚ Π½Π° часовник Π΅ ΡΠ²ΡŠΡ€Π·Π°Π½ послСдСн (ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ Ρ‰Π΅ Π³ΠΎ Π½Π°Ρ€ΠΈΡ‡Π°ΠΌΠ΅ просто Ρ‚ΠΈΠΊΠ΅Ρ€). Π‘Π»Π΅Π΄ ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π°ΡˆΠ°Ρ‚Π° Π·Π²ΡƒΠΊΠΎΠ²Π° Π²Π΅Ρ€ΠΈΠ³Π° Π·Π°ΠΏΠΎΡ‡Π²Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ, Π½ΠΎ всС ΠΎΡ‰Π΅ Π½ΠΈΡ‰ΠΎ Π½Π΅ сС Ρ‡ΡƒΠ²Π° Π² високоговоритСлитС Π½Π° ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€Π° - звуковият Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π΅ ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΈ просто ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π° ΠΏΡ€Π΅Π· Π²Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ с ΠΌΡŠΠ»Ρ‡Π°Π½ΠΈΠ΅. Π—Π° Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚Π΅ Ρ‚ΠΎΠ½, трябва Π΄Π° стартиратС Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.

Π©Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ Π΄Π²ΡƒΡ‚ΠΎΠ½Π°Π»Π΅Π½ (DTMF) сигнал, ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π°Ρ‰ Π½Π° натисканС Π½Π° Π±ΡƒΡ‚ΠΎΠ½Π° "1" Π½Π° Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°. Π—Π° Ρ†Π΅Π»Ρ‚Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ функцията ms_filter_call_method() ИзвиквамС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° MS_DTMF_GEN_PLAY, ΠΊΠ°Ρ‚ΠΎ ΠΌΡƒ ΠΏΡ€Π΅Π΄Π°Π²Π°ΠΌΠ΅ ΠΊΠ°Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» към ΠΊΠΎΠ΄Π°, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ трябва Π΄Π° ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π° ΡΠΈΠ³Π½Π°Π»ΡŠΡ‚ Π·Π° Π²ΡŠΠ·ΠΏΡ€ΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅.

Всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ остава, Π΅ Π΄Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°:

$ gcc mstest2.c -o mstest2 `pkg-config mediastreamer --libs --cflags`

И Ρ‚ΠΈΡ‡Π°ΠΉ:

$ ./mstest2

Π‘Π»Π΅Π΄ стартиранС Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΎΡ‚ високоговоритСля Π½Π° ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€Π° Ρ‰Π΅ Ρ‡ΡƒΠ΅Ρ‚Π΅ ΠΊΡ€Π°Ρ‚ΡŠΠΊ Π·Π²ΡƒΠΊΠΎΠ² сигнал, ΡΡŠΡΡ‚ΠΎΡΡ‰ сС ΠΎΡ‚ Π΄Π²Π° Ρ‚ΠΎΠ½Π°.

Π˜Π·Π³Ρ€Π°Π΄ΠΈΡ…ΠΌΠ΅ ΠΈ пуснахмС ΠΏΡŠΡ€Π²Π°Ρ‚Π° си Π·Π²ΡƒΠΊΠΎΠ²Π° Π²Π΅Ρ€ΠΈΠ³Π°. ВидяхмС ΠΊΠ°ΠΊ Π΄Π° създавамС СкзСмпляри Π½Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ, ΠΊΠ°ΠΊ Π΄Π° Π³ΠΈ ΡΠ²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ ΠΈ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΌΠ΅ Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ смС Π΄ΠΎΠ²ΠΎΠ»Π½ΠΈ ΠΎΡ‚ ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΈΡ си успСх, всС ΠΏΠ°ΠΊ трябва Π΄Π° ΠΎΠ±ΡŠΡ€Π½Π΅ΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π½Π΅ освобоТдава Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°Ρ‚Π° ΠΏΠ°ΠΌΠ΅Ρ‚, ΠΏΡ€Π΅Π΄ΠΈ Π΄Π° ΠΈΠ·Π»Π΅Π·Π΅. Π’ слСдващитС Бтатия Ρ‰Π΅ сС Π½Π°ΡƒΡ‡ΠΈΠΌ Π΄Π° чистим слСд сСбС си.

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€