Ṣiṣawari ẹrọ Mediastreamer2 VoIP. Apa 2

Awọn ohun elo ti awọn article ti wa ni ya lati mi zen ikanni.

Ṣiṣawari ẹrọ Mediastreamer2 VoIP. Apa 2

Ṣiṣẹda ohun orin monomono

Ni išaaju article A fi sori ẹrọ ile-ikawe ṣiṣan media, awọn irinṣẹ idagbasoke ati idanwo iṣẹ ṣiṣe wọn nipa kikọ ohun elo idanwo kan.

Loni a yoo ṣẹda ohun elo ti o le ṣe ina ifihan ohun orin lori kaadi ohun. Lati yanju iṣoro yii a nilo lati sopọ awọn asẹ sinu Circuit monomono ohun ti o han ni isalẹ:

Ṣiṣawari ẹrọ Mediastreamer2 VoIP. Apa 2

A ka aworan atọka lati osi si otun, eyi ni itọsọna ninu eyiti ṣiṣan data wa n gbe. Awọn ọfa naa tun tọka si eyi. Awọn igun onigun tọkasi awọn asẹ ti o ṣe ilana awọn bulọọki ti data ati jade abajade. Ninu igun onigun, ipa rẹ jẹ itọkasi ati iru àlẹmọ jẹ itọkasi ni awọn lẹta nla ni isalẹ. Awọn itọka ti o so awọn onigun mẹrin jẹ awọn ila data nipasẹ eyiti awọn bulọọki ti data ti wa ni jiṣẹ lati àlẹmọ si àlẹmọ. Ni gbogbogbo, àlẹmọ le ni ọpọlọpọ awọn igbewọle ati awọn igbejade.

Gbogbo rẹ bẹrẹ pẹlu orisun aago, eyiti o ṣeto akoko ni eyiti data ṣe iṣiro ninu awọn asẹ. Gẹgẹbi iwọn aago rẹ, àlẹmọ kọọkan ṣe ilana gbogbo awọn bulọọki data ti o wa ni titẹ sii rẹ. Ki o si fi awọn bulọọki pẹlu abajade jade sinu isinyi. Ni akọkọ, àlẹmọ ti o sunmọ orisun aago ṣe awọn iṣiro, lẹhinna awọn asẹ ti a ti sopọ si awọn abajade rẹ (o le jẹ ọpọlọpọ awọn abajade), ati bẹbẹ lọ. Lẹhin àlẹmọ ti o kẹhin ninu pq naa ti pari ṣiṣe, ipaniyan duro titi aago tuntun yoo fi de. Lu, nipa aiyipada, tẹle aarin aarin ti 10 milliseconds.

Jẹ ki a pada si aworan atọka wa. Awọn iyipo aago de ni titẹ sii ti orisun ipalọlọ; eyi jẹ àlẹmọ kan, eyiti o n ṣiṣẹ lọwọ ṣiṣẹda bulọọki data ti o ni awọn odo ni iṣelọpọ rẹ fun iyipo aago kọọkan. Ti a ba ṣe akiyesi bulọọki yii gẹgẹbi idina ti awọn ayẹwo ohun, lẹhinna eyi kii ṣe nkankan ju ipalọlọ. Ni wiwo akọkọ, o dabi ajeji lati ṣe ina awọn bulọọki data pẹlu ipalọlọ - lẹhinna, ko le gbọ, ṣugbọn awọn bulọọki wọnyi jẹ pataki fun iṣẹ ti olupilẹṣẹ ifihan ohun. Olupilẹṣẹ naa nlo awọn bulọọki wọnyi bi iwe ti o ṣofo, gbigbasilẹ awọn ayẹwo ohun sinu wọn. Ni ipo deede rẹ, monomono ti wa ni pipa ati nirọrun dari awọn bulọọki igbewọle si iṣelọpọ. Nitorinaa, awọn bulọọki ti ipalọlọ kọja ko yipada nipasẹ gbogbo agbegbe lati osi si otun, ti o pari ni kaadi ohun. Ewo ni idakẹjẹ gba awọn bulọọki lati isinyi ti a ti sopọ si titẹ sii rẹ.

Ṣugbọn ohun gbogbo yipada ti a ba fun monomono ni aṣẹ lati mu ohun ṣiṣẹ, o bẹrẹ lati ṣe ina awọn ayẹwo ohun ati rọpo wọn pẹlu awọn apẹẹrẹ ni awọn bulọọki titẹ sii ati fi awọn bulọọki ti o yipada si iṣẹjade. Kaadi ohun bẹrẹ ohun dun. Ni isalẹ ni eto ti o ṣe imuse ero iṣẹ ti a ṣalaye loke:

/* Файл 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);   
}

Lẹhin ti ipilẹṣẹ ṣiṣan media, awọn asẹ mẹta ti ṣẹda: voidsource, dtmfgen, snd_card_write. A ṣẹda orisun aago kan.

Lẹhinna o nilo lati sopọ awọn asẹ ni ibamu pẹlu Circuit wa, ati pe orisun aago gbọdọ wa ni asopọ nikẹhin, nitori lẹhin eyi Circuit yoo bẹrẹ iṣẹ lẹsẹkẹsẹ. Ti o ba so orisun aago kan pọ si iyika ti a ko pari, o le ṣẹlẹ pe ṣiṣan media n kọlu ti o ba ṣe awari o kere ju àlẹmọ kan ninu pq pẹlu gbogbo awọn igbewọle tabi gbogbo awọn abajade “firọ ni afẹfẹ” (ko sopọ).

Sisopọ awọn asẹ jẹ ṣiṣe ni lilo iṣẹ naa

ms_filter_link(src, src_out, dst, dst_in)

nibiti ariyanjiyan akọkọ jẹ itọka si àlẹmọ orisun, ariyanjiyan keji jẹ nọmba abajade orisun (akiyesi pe awọn igbewọle ati awọn igbejade jẹ nọmba ti o bẹrẹ lati odo). Ariyanjiyan kẹta jẹ itọka si àlẹmọ olugba, ẹkẹrin ni nọmba igbewọle olugba.

Gbogbo awọn asẹ ti sopọ ati orisun aago ti sopọ nikẹhin (lẹhinna a yoo kan pe ni ami-ami). Lẹhin eyiti Circuit ohun wa bẹrẹ ṣiṣẹ, ṣugbọn ko si ohun ti a le gbọ ninu awọn agbohunsoke kọnputa sibẹsibẹ - olupilẹṣẹ ohun ti wa ni pipa ati nirọrun kọja nipasẹ awọn bulọọki data titẹ sii pẹlu ipalọlọ. Lati bẹrẹ ṣiṣẹda ohun orin kan, o nilo lati ṣiṣẹ ọna àlẹmọ monomono.

A yoo ṣe ina ifihan ohun orin meji (DTMF) ti o baamu si titẹ bọtini “1” lori foonu naa. Lati ṣe eyi, a lo iṣẹ naa ms_filter_ọna_ipe() A pe ọna MS_DTMF_GEN_PLAY, ti o kọja bi ariyanjiyan ni itọka si koodu ti ifihan ṣiṣiṣẹsẹhin yẹ ki o baamu.

Gbogbo ohun ti o ku ni lati ṣajọ eto naa:

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

Ati ṣiṣe:

$ ./mstest2

Lẹhin ti o bẹrẹ eto naa, iwọ yoo gbọ ifihan ohun kukuru kan ti o ni awọn ohun orin meji ninu agbọrọsọ kọnputa.

A kọ ati ṣe ifilọlẹ Circuit ohun akọkọ wa. A rii bii o ṣe le ṣẹda awọn apẹẹrẹ àlẹmọ, bii o ṣe le sopọ wọn ati bii o ṣe le pe awọn ọna wọn. Lakoko ti a ba ni idunnu pẹlu aṣeyọri akọkọ wa, a tun nilo lati fiyesi si otitọ pe eto wa ko ni ominira iranti ti a pin ṣaaju ki o to jade. Ni atẹle article a máa kọ́ bí a ṣe ń fọ́ ara wa mọ́.

orisun: www.habr.com

Fi ọrọìwòye kun