Mediastreamer2 VoIP motorra arakatzen. 2. zatia

Artikuluaren materiala niretik hartua da zen kanala.

Mediastreamer2 VoIP motorra arakatzen. 2. zatia

Tonu Sortzailea sortzea

Aurrekoan Artikulu Media streamer liburutegia, garapen tresnak instalatu ditugu eta haien funtzionaltasuna probatu dugu probako aplikazio bat eraikiz.

Gaur soinu-txartel batean tonu-seinalea sor dezakeen aplikazio bat sortuko dugu. Arazo hau konpontzeko iragazkiak behean agertzen den soinu-sorgailuaren zirkuitura konektatu behar ditugu:

Mediastreamer2 VoIP motorra arakatzen. 2. zatia

Diagrama ezkerretik eskuinera irakurtzen dugu, hau da gure datu-fluxua mugitzen den norabidea. Geziek ere hori iradokitzen dute. Laukizuzenek datu-blokeak prozesatu eta emaitza ateratzen duten iragazkiak adierazten dituzte. Laukizuzenaren barruan, bere eginkizuna adierazten da eta iragazki mota behean letra larriz adierazten da. Laukizuzenak lotzen dituzten geziak datu-ilarak dira, zeinen bidez datu-blokeak iragazkiz iragazki bidaltzen diren. Oro har, iragazki batek sarrera eta irteera asko izan ditzake.

Dena erloju-iturburutik hasten da, zeinak iragazkietan datuak kalkulatzeko denbora ezartzen du. Bere erloju-zikloaren arabera, iragazki bakoitzak bere sarreran dauden datu-bloke guztiak prozesatzen ditu. Eta emaitza duten blokeak ilaran jartzen ditu. Lehenik eta behin, erloju-iturburutik hurbilen dagoen iragazkiak kalkuluak egiten ditu, gero bere irteeretara konektatutako iragazkiak (irteera asko egon daitezke), eta abar. Kateko azken iragazkia prozesatzen amaitu ondoren, exekuzioa gelditzen da erloju berri bat iritsi arte. Taupadak, lehenespenez, 10 milisegundoko tartea jarraitzen dute.

Itzuli gaitezen gure diagramara. Erloju-zikloak isiltasun-iturriaren sarrerara iristen dira; hau iragazkia da, eta bere irteeran zeroak dituen datu-bloke bat sortzen ari da erloju-ziklo bakoitzeko. Bloke hau soinu-laginen bloketzat hartzen badugu, hau isiltasuna baino ez da. Lehen begiratuan, arraroa dirudi datu-blokeak isiltasunez sortzea - ​​azken finean, ezin da entzun, baina bloke horiek beharrezkoak dira soinu-seinalearen sorgailuaren funtzionamendurako. Sorgailuak bloke hauek paper zuri bat bezala erabiltzen ditu, soinu-laginak horietan grabatzen ditu. Egoera normalean, sorgailua itzalita dago eta sarrerako blokeak irteerara bidaltzen ditu. Horrela, isiltasun blokeak aldatu gabe igarotzen dira zirkuitu osoan ezkerretik eskuinera, soinu-txartelean bukatzeko. Horrek isilik hartzen ditu bere sarrerara konektatutako ilaratik blokeak.

Baina dena aldatzen da sorgailuari soinua erreproduzitzeko komandoa ematen bazaio, soinu-laginak sortzen hasten da eta sarrerako blokeetan laginekin ordezkatzen ditu eta aldatutako blokeak irteeran jartzen ditu. Soinu-txartela soinua erreproduzitzen hasten da. Jarraian, goian deskribatutako lan-eskema ezartzen duen programa da:

/* Π€Π°ΠΉΠ» 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);   
}

Multimedia erreproduzitzailea hasieratu ondoren, hiru iragazki sortzen dira: voidsource, dtmfgen, snd_card_write. Erloju iturri bat sortzen da.

Ondoren, iragazkiak gure zirkuituaren arabera konektatu behar dituzu, eta erloju-iturria azkena konektatu behar da, ondoren zirkuitua berehala hasiko baita funtzionatzen. Erloju-iturburu bat amaitu gabeko zirkuitu batera konektatzen baduzu, gerta daiteke multimedia-streamer-a huts egitea, gutxienez sarrera edo irteera guztiak "airean zintzilik" dituen kateko iragazki bat detektatzen badu (konektatu gabe).

Iragazkiak konektatzea funtzioa erabiliz egiten da

ms_filter_link(src, src_out, dst, dst_in)

non lehen argumentua iturburu-iragazkiaren erakuslea den, bigarren argumentua iturburuko irteera-zenbakia da (kontuan izan sarrerak eta irteerak zerotik hasita zenbatzen direla). Hirugarren argumentua hartzailearen iragazkiaren erakuslea da, laugarrena hartzailearen sarrera-zenbakia.

Iragazki guztiak konektatuta daude eta erloju-iturria azkena konektatzen da (aurrerantzean ticker deituko diogu besterik gabe). Horren ondoren, gure soinu-zirkuitua funtzionatzen hasten da, baina oraindik ez da ezer entzuten ordenagailuko bozgorailuetan - soinu-sorgailua itzali egiten da eta sarrerako datu-blokeetatik igarotzen da isilik. Tonu bat sortzen hasteko, sorgailuaren iragazki metodoa exekutatu behar duzu.

Telefonoko "1" botoia sakatzeari dagokion bi tonuko seinalea (DTMF) sortuko dugu. Horretarako, funtzioa erabiltzen dugu ms_filter_call_method() MS_DTMF_GEN_PLAY metodoari deitzen diogu, erreprodukzio-seinaleak dagokion kodearen erakuslea argumentu gisa pasatuz.

Programa osatzea besterik ez da geratzen:

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

Eta korrika:

$ ./mstest2

Programa hasi ondoren, bi tonuz osatutako soinu-seinale labur bat entzungo duzu ordenagailuaren bozgorailuan.

Gure lehen soinu zirkuitua eraiki eta martxan jarri genuen. Iragazki-instantziak nola sortu, nola konektatu eta haien metodoei nola deitu ikusi genuen. Hasierako arrakastarekin pozik gauden arren, oraindik ere arreta jarri behar dugu gure programak ez duela esleitutako memoria askatzen irten aurretik. Hurrengoan Artikulu geure buruaren ondoren garbitzen ikasiko dugu.

Iturria: www.habr.com

Gehitu iruzkin berria