Su'esu'e le afi Mediastreamer2 VoIP. Vaega 9

O mea o le tusiga e maua mai i laʻu zen alavai.

Duplex intercom

Su'esu'e le afi Mediastreamer2 VoIP. Vaega 9

I le mulimuli tusiga na faasilasilaina se intercom duplex, ma i le tasi lenei o le a tatou faia.

O le ata o lo'o fa'aalia i le fa'ailoga igoa. O le filifili pito i lalo o filiga e fausia ai le ala faʻasalalau, lea e amata mai le kata leo. E maua ai fa'ata'ita'iga fa'ailo mai le masini faaleotele leo. Ona o le faaletonu, e tupu lenei mea i se fua faatatau o 8000 samples i le sekone. O le loloto o faʻamatalaga o loʻo faʻaogaina e le aufaasālalau faʻasalalau leo ​​e 16 bits (e le taua lenei; pe a e manaʻo ai, e mafai ona e tusia ni filiga o le a aoga i se maualuga maualuga). O faʻamaumauga o loʻo tuʻufaʻatasia i poloka o 160 faʻataʻitaʻiga. O lea la, o poloka taʻitasi e 320 paita le lapopoa. Le isi, matou te fafagaina faʻamatalaga i le faʻaogaina o le generator, lea, pe a tape, e "manino" i faʻamatalaga. Na ou faʻaopoopoina ina neʻi e fiu e talanoa i totonu o le masini faaleotele leo i le taimi o le debugging - e mafai ona e faʻaogaina le afi e "fana" ai le ala ma se faailo leo.

A maeʻa le afi, e alu le faailo i le encoder, lea e liua ai a tatou faʻataʻitaʻiga 16-bit e tusa ai ma le µ-law (G.711 standard) i le valu-bit. I le gaosiga o le encoder, ua uma ona i ai se matou poloka faʻamaumauga afa afa. I se tulaga lautele, e mafai ona tatou lafoina faʻamatalaga e aunoa ma le faʻamalosi pe a tatou le manaʻomia le faʻasaoina o feoaiga. Ae o iinei e aoga le faʻaogaina o se encoder, talu ai e mafai e Wireshark ona toe gaosia le leo mai se vaitafe RTP pe a faʻapipiʻiina e tusa ai ma le µ-law poʻo se-tulafono.

A maeʻa le encoder, o poloka mama o faʻamatalaga e lafoina i le rtpsend filter, lea o le a tuʻuina i totonu o se pusa RTP, seti fuʻa manaʻomia ma tuʻuina atu i le faʻasalalauga faʻasalalau mo le tuʻuina atu i luga o le fesoʻotaʻiga i le tulaga o se pusa UDP.

O le filifili pito i luga o filiga e fausia ai le auala e maua ai; O pusa RTP na maua e le aufaasālalau mai le fesoʻotaʻiga e ulufale atu i le rtprecv filter, i le mea e faʻaalia ai i foliga o poloka faʻamaumauga, e tutusa uma ma le tasi pepa na maua. O le poloka o loʻo i ai naʻo faʻamaumauga o totogi; i le tusiga muamua na faʻaalia i le lanu meamata i le ata.

O le isi, o poloka e auina atu i le faamama decoder, lea e liua ai faʻataʻitaʻiga tasi-byte o loʻo i totonu ia i latou i laina laina, 16-bit. Lea e mafai ona fa'agasolo e ala fa'asalalau streamer filiga. I la matou tulaga, matou te lafoina i latou i le kata leo mo le toe taʻalo i luga o sipika o lau ulu.

Se'i o tatou aga'i atu i le fa'atinoga o polokalame. Ina ia faia lenei mea, matou te tuʻufaʻatasia le faila ma faila faila na matou vavaeeseina muamua. Aʻo leʻi oʻo i lenei mea, matou te faʻaogaina tulaga faʻamautu mo ports ma tuatusi, ae o lea matou te manaʻomia le polokalame e mafai ai ona faʻaogaina tulaga matou te faʻamaonia i le amataga. Ina ia faia lenei mea, matou te faʻaopoopoina galuega mo le faʻatulagaina o finauga laina laina. A maeʻa lea o le a mafai ona matou setiina le tuatusi IP ma le taulaga o le intercom lea matou te mananaʻo e faʻavae ai se fesoʻotaʻiga.

Muamua, seʻi o tatou faʻaopoopoina se fausaga i le polokalame e teu ai ona faʻatulagaga:

struct _app_vars
{
  int  local_port;              /* Локальный порт. */
  int  remote_port;             /* Порт переговорного устройства на удаленном компьютере. */
  char remote_addr[128];        /* IP-адрес удаленного компьютера. */
  MSDtmfGenCustomTone dtmf_cfg; /* Настройки тестового сигнала генератора. */
};

typedef struct _app_vars app_vars;

O le polokalame o le a faʻaalia se fausaga o lenei ituaiga e taʻua o vars.
Le isi, se'i o tatou fa'aopoopoina se galuega e fa'avasega ai finauga o laina fa'atonu:

/* Функция преобразования аргументов командной строки в
* настройки программы. */
void  scan_args(int argc, char *argv[], app_vars *v)
{
    char i;
    for (i=0; i<argc; i++)
    {
        if (!strcmp(argv[i], "--help"))
        {
            char *p=argv[0]; p=p + 2;
            printf("  %s walkie talkienn", p);
            printf("--help      List of options.n");
            printf("--version   Version of application.n");
            printf("--addr      Remote abonent IP address string.n");
            printf("--port      Remote abonent port number.n");
            printf("--lport     Local port number.n");
            printf("--gen       Generator frequency.n");
            exit(0);
        }

        if (!strcmp(argv[i], "--version"))
        {
            printf("0.1n");
            exit(0);
        }

        if (!strcmp(argv[i], "--addr"))
        {
            strncpy(v->remote_addr, argv[i+1], 16);
            v->remote_addr[16]=0;
            printf("remote addr: %sn", v->remote_addr);
        }

        if (!strcmp(argv[i], "--port"))
        {
            v->remote_port=atoi(argv[i+1]);
            printf("remote port: %in", v->remote_port);
        }

        if (!strcmp(argv[i], "--lport"))
        {
            v->local_port=atoi(argv[i+1]);
            printf("local port : %in", v->local_port);
        }

        if (!strcmp(argv[i], "--gen"))
        {
            v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
                printf("gen freq : %in", v -> dtmf_cfg.frequencies[0]);
        }
    }
}

O se fa'ai'uga o le fa'avasegaina, o le a tu'u le fa'aupuga o le laina fa'atonu i totonu o fanua o le vars structure. O le galuega autu o le talosaga o le aoina mai lea o le felauaiga ma le mauaina o auala mai le filiga; a uma ona faʻafesoʻotaʻi le faʻailoga, o le a faʻafeiloaʻi le pule i se matasele e le iʻu lea, pe a fai e seti le afi eletise i le leai-zero, o le a toe amata le afi suʻega ina ia e galue e aunoa ma se taofi.

O le a manaʻomia e le afi nei toe faʻafouina ona o lona mamanu; mo nisi mafuaʻaga e le mafai ona maua se faʻailoga e sili atu i le 16 sekone. E tatau ona maitauina o lona umi e faʻamaonia e se numera 32-bit.

O le polokalama atoa o le a pei o lenei:

/* Файл mstest8.c Имитатор переговорного устройства. */

#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/msrtp.h>

/* Подключаем файл общих функций. */
#include "mstest_common.c"

/*----------------------------------------------------------*/
struct _app_vars
{
    int  local_port;              /* Локальный порт. */
    int  remote_port;             /* Порт переговорного устройства на удаленном компьютере. */
    char remote_addr[128];        /* IP-адрес удаленного компьютера. */
    MSDtmfGenCustomTone dtmf_cfg; /* Настройки тестового сигнала генератора. */
};

typedef struct _app_vars app_vars;

/*----------------------------------------------------------*/
/* Создаем дуплексную RTP-сессию. */
RtpSession* create_duplex_rtp_session(app_vars v)
{
    RtpSession *session = create_rtpsession (v.local_port, v.local_port + 1, FALSE, RTP_SESSION_SENDRECV);
    rtp_session_set_remote_addr_and_port(session, v.remote_addr, v.remote_port, v.remote_port + 1);
    rtp_session_set_send_payload_type(session, PCMU);
    return session;
}

/*----------------------------------------------------------*/
/* Функция преобразования аргументов командной строки в
* настройки программы. */
void  scan_args(int argc, char *argv[], app_vars *v)
{
    char i;
    for (i=0; i<argc; i++)
    {
        if (!strcmp(argv[i], "--help"))
        {
            char *p=argv[0]; p=p + 2;
            printf("  %s walkie talkienn", p);
            printf("--help      List of options.n");
            printf("--version   Version of application.n");
            printf("--addr      Remote abonent IP address string.n");
            printf("--port      Remote abonent port number.n");
            printf("--lport     Local port number.n");
            printf("--gen       Generator frequency.n");
            exit(0);
        }

        if (!strcmp(argv[i], "--version"))
        {
            printf("0.1n");
            exit(0);
        }

        if (!strcmp(argv[i], "--addr"))
        {
            strncpy(v->remote_addr, argv[i+1], 16);
            v->remote_addr[16]=0;
            printf("remote addr: %sn", v->remote_addr);
        }

        if (!strcmp(argv[i], "--port"))
        {
            v->remote_port=atoi(argv[i+1]);
            printf("remote port: %in", v->remote_port);
        }

        if (!strcmp(argv[i], "--lport"))
        {
            v->local_port=atoi(argv[i+1]);
            printf("local port : %in", v->local_port);
        }

        if (!strcmp(argv[i], "--gen"))
        {
            v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
                printf("gen freq : %in", v -> dtmf_cfg.frequencies[0]);
        }
    }
}

/*----------------------------------------------------------*/
int main(int argc, char *argv[])
{
    /* Устанавливаем настройки по умолчанию. */
    app_vars vars={5004, 7010, "127.0.0.1", {0}};

    /* Устанавливаем настройки настройки программы в
     * соответствии с аргументами командной строки. */
    scan_args(argc, argv, &vars);

    ms_init();

    /* Создаем экземпляры фильтров передающего тракта. */
    MSSndCard *snd_card =
        ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
    MSFilter *snd_card_read = ms_snd_card_create_reader(snd_card);
    MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
    MSFilter *rtpsend = ms_filter_new(MS_RTP_SEND_ID);

    /* Создаем фильтр кодера. */
    MSFilter *encoder = ms_filter_create_encoder("PCMU");

    /* Регистрируем типы нагрузки. */
    register_payloads();

    /* Создаем дуплексную RTP-сессию. */
    RtpSession* rtp_session= create_duplex_rtp_session(vars);
    ms_filter_call_method(rtpsend, MS_RTP_SEND_SET_SESSION, rtp_session);

    /* Соединяем фильтры передатчика. */
    ms_filter_link(snd_card_read, 0, dtmfgen, 0);
    ms_filter_link(dtmfgen, 0, encoder, 0);
    ms_filter_link(encoder, 0, rtpsend, 0);

    /* Создаем фильтры приемного тракта. */
    MSFilter *rtprecv = ms_filter_new(MS_RTP_RECV_ID);
    ms_filter_call_method(rtprecv, MS_RTP_RECV_SET_SESSION, rtp_session);

    /* Создаем фильтр декодера, */
    MSFilter *decoder=ms_filter_create_decoder("PCMU");

    /* Создаем фильтр звуковой карты. */
    MSFilter *snd_card_write = ms_snd_card_create_writer(snd_card);

    /* Соединяем фильтры приёмного тракта. */
    ms_filter_link(rtprecv, 0, decoder, 0);
    ms_filter_link(decoder, 0,  snd_card_write, 0);

    /* Создаем источник тактов - тикер. */
    MSTicker *ticker = ms_ticker_new();

    /* Подключаем источник тактов. */
    ms_ticker_attach(ticker, snd_card_read);
    ms_ticker_attach(ticker, rtprecv);

    /* Если настройка частоты генератора отлична от нуля, то запускаем генератор. */   
    if (vars.dtmf_cfg.frequencies[0])
    {
        /* Настраиваем структуру, управляющую выходным сигналом генератора. */
        vars.dtmf_cfg.duration = 10000;
        vars.dtmf_cfg.amplitude = 1.0;
    }

    /* Организуем цикл перезапуска генератора. */
    while(TRUE)
    {
        if(vars.dtmf_cfg.frequencies[0])
        {
            /* Включаем звуковой генератор. */
            ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,
                    (void*)&vars.dtmf_cfg);
        }
        /* Укладываем тред в спячку на 20мс, чтобы другие треды
         * приложения получили время на работу. */
        ms_usleep(20000);
    }
}

Tatou tuufaatasia. Ona mafai lea ona faʻatautaia le polokalame i komepiuta e lua. Po o le tasi, e pei ona ou faia nei. Matou te faʻalauiloaina TShark faʻatasi ai ma finauga nei:

$ sudo tshark -i lo -f "udp dst port 7010" -P -V -O RTP -o rtp.heuristic_rtp:TRUE -x

Afai o le faʻalauiloaina o le fanua i totonu o le faʻamafanafanaga e naʻo le faʻaalia o se feʻau e uiga i le amataga o le puʻeina, o se faʻailoga lelei lea - o lona uiga e foliga mai e le o nofoia le tatou taulaga i isi polokalame. I se isi laina, matou te faʻalauiloaina se polokalame faʻataʻitaʻiga o le a faʻataʻitaʻiina se "mamao" intercom e ala i le faʻamaonia o lenei numera o le taulaga:

$ ./mstest8 --port 9010 --lport 7010

E pei ona mafai ona vaʻaia mai le tusiga o le polokalame, o le tuatusi IP le aoga o le 127.0.0.1 (local backback).

I se isi laina, matou te faʻalauiloaina se faʻataʻitaʻiga lona lua o le polokalame, lea e faʻataʻitaʻiina ai se masini faʻapitonuʻu. Matou te faʻaogaina se faʻamatalaga faaopoopo e mafai ai ona galue le generator suʻega faʻapipiʻi:

$ ./mstest8  --port 7010 --lport 9010 --gen 440

I le taimi nei, o pepa e tuʻuina atu i le masini "mamao" e tatau ona amata ona moli i totonu o le faʻamafanafanaga ma TShark, ma o le a faʻalogoina se leo faʻaauau mai le failauga komepiuta.

Afai na tupu mea uma e pei ona tusia, ona toe amata lea o le kopi lona lua o le polokalama, ae aunoa ma le ki ma le finauga "-gen 440". O le ae faia nei le matafaioi o le generator. A maeʻa lenei mea, e mafai ona e pisa i totonu o le masini faaleotele leo; e tatau ona e faʻalogoina le leo tutusa i le sipika poʻo le headphone. E mafai fo'i ona tupu le fa'afiafiaina o le tagata lava ia; fa'aitiitia le leo o le sipika ma o le a mou atu le a'afiaga.

Afai e te taʻavale i luga o komepiuta e lua ma e te leʻi fenumiai e uiga i tuatusi IP, ona faʻatali mai lea o le iʻuga tutusa - lua-ala numera numera leo fesoʻotaʻiga.

I le isi tusiga o le a tatou aʻoaʻoina pe faʻapefea ona tusia a tatou lava filiga - faʻapipiʻi, faʻafetai i lenei tomai o le a mafai ai ona e faʻaogaina le ala faʻasalalau e le gata mo leo ma vitio, ae faʻapea foʻi i se isi vaega patino.

puna: www.habr.com

Faaopoopo i ai se faamatalaga