Esplorante la Mediastreamer2 VoIP-motoron. Parto 2

La materialo de la artikolo estas prenita el mia zen kanalo.

Esplorante la Mediastreamer2 VoIP-motoron. Parto 2

Kreante Tonan Generatoron

En la antaŭa artikolo Ni instalis la amaskomunikilaran streamer-bibliotekon, evoluilojn kaj testis ilian funkciecon konstruante provan aplikaĵon.

Hodiaŭ ni kreos aplikaĵon, kiu povas generi tonsignalon sur sonkarto. Por solvi ĉi tiun problemon ni devas konekti la filtrilojn al la songeneratora cirkvito montrita sube:

Esplorante la Mediastreamer2 VoIP-motoron. Parto 2

Ni legas la diagramon de maldekstre dekstren, jen la direkto en kiu moviĝas nia datumfluo. La sagoj ankaŭ sugestas tion. Rektanguloj indikas filtrilojn kiuj prilaboras blokojn de datenoj kaj eligas la rezulton. Ene de la rektangulo, ĝia rolo estas indikita kaj la filtripo estas indikita en majuskloj tuj malsupre. La sagoj ligantaj la rektangulojn estas datenvicoj tra kiuj blokoj de datumoj estas liveritaj de filtrilo al filtrilo. Ĝenerale, filtrilo povas havi multajn enirojn kaj elirojn.

Ĉio komenciĝas per la horloĝfonto, kiu fiksas la takton, je kiu datumoj estas kalkulitaj en la filtriloj. Laŭ sia horloĝciklo, ĉiu filtrilo prilaboras ĉiujn datumblokojn kiuj estas ĉe sia enigo. Kaj metas blokojn kun la rezulto eksteren en la voston. Unue, la filtrilo plej proksima al la horloĝa fonto faras kalkulojn, poste la filtriloj konektitaj al ĝiaj eliroj (povas esti multaj eliroj), ktp. Post kiam la lasta filtrilo en la ĉeno finas prilaboradon, ekzekuto ĉesas ĝis nova horloĝo alvenas. Taktoj, defaŭlte, sekvas intervalon de 10 milisekundoj.

Ni revenu al nia diagramo. La horloĝcikloj alvenas ĉe la enigaĵo de la silentfonto; tio estas filtrilo, kiu estas okupata generante blokon da datenoj enhavantaj nulojn ĉe sia produktaĵo por ĉiu horloĝciklo. Se ni konsideras ĉi tiun blokon kiel blokon de sonspecimenoj, tiam ĉi tio estas nenio pli ol silento. Unuavide ŝajnas strange generi datumblokojn kun silento - finfine, ĝi ne povas esti aŭdata, sed ĉi tiuj blokoj estas necesaj por la funkciado de la sonsignala generatoro. La generatoro uzas ĉi tiujn blokojn kiel malplenan paperfolion, registrante sonspecimenojn en ili. En ĝia normala stato, la generatoro estas malŝaltita kaj simple plusendas enigblokojn al la produktaĵo. Tiel, blokoj de silento pasas senŝanĝe tra la tuta cirkvito de maldekstre dekstren, alvenante en la sonkarto. Kiu silente prenas blokojn de la vosto ligita al sia enigo.

Sed ĉio ŝanĝiĝas se la generatoro ricevas komandon por ludi sonon, ĝi komencas generi sonspecimenojn kaj anstataŭigas ilin per specimenoj en la enigblokoj kaj metas la ŝanĝitajn blokojn ĉe la eligo. La sonkarto komencas ludi sonon. Malsupre estas programo, kiu efektivigas la laborskemon priskribitan supre:

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

Post pravalorigo de la amaskomunikila streamer, tri filtriloj estas kreitaj: voidsource, dtmfgen, snd_card_write. Horloĝfonto estas kreita.

Tiam vi devas konekti la filtrilojn laŭ nia cirkvito, kaj la horloĝfonto devas esti konektita laste, ĉar post tio la cirkvito tuj komencos funkcii. Se vi konektas horloĝan fonton al nefinita cirkvito, povas okazi, ke la amaskomunikila streamer kraŝas se ĝi detektas almenaŭ unu filtrilon en la ĉeno kun ĉiuj enigoj aŭ ĉiuj eliroj "pendantaj en la aero" (ne konektitaj).

Konekti filtrilojn estas farita per la funkcio

ms_filter_link(src, src_out, dst, dst_in)

kie la unua argumento estas montrilo al la fontfiltrilo, la dua argumento estas la fonta eligo nombro (notu ke enigaĵoj kaj eliroj estas numeritaj ekde nulo). La tria argumento estas montrilo al la ricevila filtrilo, la kvara estas la ricevila eniga nombro.

Ĉiuj filtriloj estas konektitaj kaj la horloĝfonto estas konektita laste (ĉi-poste ni simple nomos ĝin ticker). Post tio ekfunkcias nia soncirkvito, sed ankoraŭ nenio aŭdeblas en la komputilaj laŭtparoliloj - la songeneratoro estas malŝaltita kaj simple trapasas la enigajn datumblokojn silente. Por komenci generi tonon, vi devas ruli la generatoran filtrilon.

Ni generos dutonan (DTMF) signalon respondan al premado de la butono "1" sur la telefono. Por fari tion, ni uzas la funkcion ms_filter_call_method () Ni nomas la MS_DTMF_GEN_PLAY-metodon, pasante ĝin kiel argumenton montrilon al la kodo, al kiu la reprodukta signalo devus respondi.

Restas nur kompili la programon:

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

Kaj kuru:

$ ./mstest2

Post lanĉo de la programo, vi aŭdos mallongan sonsignalon konsistantan el du tonoj en la komputila laŭtparolilo.

Ni konstruis kaj lanĉis nian unuan soncirkviton. Ni vidis kiel krei filtrilaj okazoj, kiel konekti ilin kaj kiel nomi iliajn metodojn. Kvankam ni ĝojas pri nia komenca sukceso, ni ankoraŭ devas atenti la fakton, ke nia programo ne liberigas la asignitan memoron antaŭ ol eliri. En la sekva artikolo ni lernos purigi post ni mem.

fonto: www.habr.com

Aldoni komenton