Entdeckt de Mediastreamer2 VoIP-Motor. Deel 2

D'Material vum Artikel ass aus mengem zen Kanal.

Entdeckt de Mediastreamer2 VoIP-Motor. Deel 2

Schafen engem Tone Generator

An der viregter Artikel Mir hunn d'Medien Streamer Bibliothéik, Entwécklungsinstrumenter installéiert an hir Funktionalitéit getest andeems mir eng Testapplikatioun bauen.

Haut wäerte mir eng Applikatioun erstellen déi e Tonsignal op enger Tounkaart generéiere kann. Fir dëse Problem ze léisen, musse mir d'Filter an de Sound Generator Circuit verbannen hei ënnendrënner:

Entdeckt de Mediastreamer2 VoIP-Motor. Deel 2

Mir liesen d'Diagramm vu lénks op riets, dëst ass d'Richtung an där eisen Datefloss sech beweegt. D'Pfeile weisen och drop hin. Rechtecke weisen op Filteren déi Datenblocker veraarbecht an d'Resultat ausginn. Am Rechteck gëtt seng Roll ugewisen an de Filtertyp gëtt a grousse Buschtawen just ënnen ugewisen. D'Pfeile, déi d'Rektangelen verbannen, sinn Datenschlaangen, duerch déi Datenblocken aus Filter op Filter geliwwert ginn. Am Allgemengen kann e Filter vill Inputen an Ausgänge hunn.

Et fänkt alles mat der Auerquell un, déi den Tempo setzt op deem Daten an de Filtere berechent ginn. No sengem Auerzyklus veraarbecht all Filter all Dateblocken, déi bei sengem Input sinn. A setzt Blöcke mam Resultat eraus an d'Schlaang. Als éischt mécht de Filter am nootsten un der Auerquell Berechnungen, dann d'Filtere verbonne mat sengen Ausgänge (et kënne vill Ausgänge sinn), a sou weider. Nodeems de leschte Filter an der Kette d'Veraarbechtung fäerdeg ass, stoppt d'Ausféierung bis eng nei Auer kënnt. Beats, par défaut, verfollegen en Intervall vun 10 Millisekonnen.

Komme mer zréck op eisen Diagramm. D'Auerzyklen kommen um Input vun der Stillequell un; dëst ass e Filter, dee beschäftegt ass e Block vun Daten ze generéieren, déi Nullen op senger Ausgang fir all Auerzyklus enthalen. Wa mir dëse Block als e Block vun Toun Echantillon betruechten, dann ass dëst näischt méi wéi Rou. Op den éischte Bléck schéngt et komesch fir Datenblocken mat Rou ze generéieren - et kann net héieren ginn, awer dës Blöcke sinn néideg fir d'Operatioun vum Soundsignalgenerator. De Generator benotzt dës Blöcke wéi en eidel Blat Pabeier, hëlt Tounproben an hinnen op. A sengem normalen Zoustand ass de Generator ausgeschalt an schéckt einfach Inputblocken op d'Ausgab. Sou passéieren d'Stilleblocken onverännert duerch de ganze Circuit vu lénks op riets, a kommen an der Soundkaart. Wat roueg hëlt Blocks aus der Schlaang verbonne mat sengem Input.

Awer alles ännert sech wann de Generator e Kommando kritt fir Toun ze spillen, et fänkt un Toun Echantillon ze generéieren an ersetzt se mat Echantillon an den Inputblocken a setzt déi geännert Blocken op der Ausgab. D'Soundkaart fänkt Toun ze spillen. Drënner ass e Programm deen d'Aarbechtsschema hei uewen beschriwwen implementéiert:

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

No der Initialiséierung vum Media Streamer ginn dräi Filtere erstallt: voidsource, dtmfgen, snd_card_write. Eng Auerquell gëtt erstallt.

Da musst Dir d'Filter am Aklang mat eisem Circuit verbannen, an d'Auerquell muss lescht verbonne sinn, well duerno fänkt de Circuit direkt un. Wann Dir eng Auerquell un en ongeschlossene Circuit verbënnt, kann et geschéien datt de Medienstreamer klappt wann et op d'mannst ee Filter an der Kette mat all Inputen oder all Ausgänge "an der Loft hänken" (net verbonne) erkennt.

D'Verbindung vu Filtere gëtt mat der Funktioun gemaach

ms_filter_link(src, src_out, dst, dst_in)

wou dat éischt Argument e Pointer op de Quellfilter ass, ass dat zweet Argument d'Quellausgangsnummer (notéiert datt d'Inputen an d'Ausgänge vun Null un nummeréiert sinn). Dat drëtt Argument ass e Pointer op den Empfängerfilter, de véierte ass d'Empfängerinputnummer.

All Filtere sinn ugeschloss an d'Auerquell ass lescht ugeschloss (nodréiglech nenne mir et einfach en Ticker). Duerno ufänkt eisen Tounkreeslaf ze schaffen, awer näischt kann nach an de Computerlauter héieren ginn - den Toungenerator ass ausgeschalt a passéiert einfach duerch d'Inputdatenblocker mat Rou. Fir unzefänken en Toun ze generéieren, musst Dir d'Generatorfiltermethod lafen.

Mir wäerten eng zwee-Toun (DTMF) Signal generéieren entspriechend der Press "1" Knäppchen um Telefon. Fir dëst ze maachen, benotze mir d'Funktioun ms_filter_call_method() Mir ruffen d'Methode MS_DTMF_GEN_PLAY, passéieren et als Argument e Pointer op de Code deen de Playback-Signal soll entspriechen.

Alles wat bleift ass de Programm ze kompiléieren:

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

A lafen:

$ ./mstest2

Nodeems Dir de Programm gestart hutt, héiert Dir e kuerzen Tounsignal, deen aus zwee Téin am Computer Lautsprecher besteet.

Mir hunn eisen éischten Sound Circuit gebaut a lancéiert. Mir hu gesinn wéi Dir Filterinstanzen erstellt, wéi se se verbannen a wéi se hir Methoden nennen. Och wa mir mat eisem initialen Erfolleg zefridden sinn, musse mir nach ëmmer oppassen datt eise Programm déi zougewisen Erënnerung net befreit ier Dir erausgeet. An der nächster Artikel mir léiere no eis selwer ze botzen.

Source: will.com

Setzt e Commentaire