Inachunguza injini ya Mediastreamer2 VoIP. Sehemu ya 2

Nyenzo za kifungu zimechukuliwa kutoka kwangu chaneli ya zen.

Inachunguza injini ya Mediastreamer2 VoIP. Sehemu ya 2

Kuunda Jenereta ya Toni

Katika uliopita Ibara ya Tulisakinisha maktaba ya kipeperushi cha media, zana za ukuzaji na tukajaribu utendakazi wao kwa kuunda programu ya majaribio.

Leo tutaunda programu ambayo inaweza kutoa ishara ya sauti kwenye kadi ya sauti. Ili kutatua tatizo hili tunahitaji kuunganisha vichungi kwenye mzunguko wa jenereta ya sauti iliyoonyeshwa hapa chini:

Inachunguza injini ya Mediastreamer2 VoIP. Sehemu ya 2

Tunasoma mchoro kutoka kushoto kwenda kulia, hii ndio mwelekeo ambao mtiririko wetu wa data unasonga. Mishale pia inadokeza hili. Mistatili huonyesha vichujio vinavyochakata vizuizi vya data na kutoa matokeo. Ndani ya mstatili, jukumu lake linaonyeshwa na aina ya chujio imeonyeshwa kwa herufi kubwa hapa chini. Mishale inayounganisha mistatili ni foleni za data ambapo vipande vya data hutolewa kutoka kwa kichujio hadi kichujio. Kwa ujumla, kichujio kinaweza kuwa na pembejeo na matokeo mengi.

Yote huanza na chanzo cha saa, ambayo huweka tempo ambayo data huhesabiwa katika vichungi. Kulingana na mzunguko wake wa saa, kila kichujio huchakata vizuizi vyote vya data ambavyo viko kwenye ingizo lake. Na huweka vizuizi na matokeo kwenye foleni. Kwanza, chujio kilicho karibu na chanzo cha saa hufanya mahesabu, kisha vichungi vilivyounganishwa na matokeo yake (kunaweza kuwa na matokeo mengi), na kadhalika. Baada ya kichujio cha mwisho kwenye mnyororo kumaliza kuchakata, utekelezaji huacha hadi saa mpya ifike. Beats, kwa chaguo-msingi, hufuata muda wa milisekunde 10.

Wacha turudi kwenye mchoro wetu. Mizunguko ya saa hufika kwenye ingizo la chanzo cha ukimya; hiki ni kichujio, ambacho kinashughulika kutoa kizuizi cha data kilicho na sufuri kwenye matokeo yake kwa kila mzunguko wa saa. Ikiwa tutazingatia kizuizi hiki kama kizuizi cha sampuli za sauti, basi hii sio zaidi ya ukimya. Kwa mtazamo wa kwanza, inaonekana ya ajabu kuzalisha vitalu vya data kwa ukimya - baada ya yote, haiwezi kusikilizwa, lakini vitalu hivi ni muhimu kwa uendeshaji wa jenereta ya ishara ya sauti. Jenereta hutumia vitalu hivi kama karatasi tupu, kurekodi sampuli za sauti ndani yake. Katika hali yake ya kawaida, jenereta imezimwa na inapeleka tu vizuizi vya pembejeo kwa pato. Kwa hivyo, vitalu vya ukimya hupita bila kubadilika kupitia mzunguko mzima kutoka kushoto kwenda kulia, na kuishia kwenye kadi ya sauti. Ambayo huchukua vizuizi kimya kimya kutoka kwa foleni iliyounganishwa na pembejeo yake.

Lakini kila kitu kinabadilika ikiwa jenereta inapewa amri ya kucheza sauti, huanza kuzalisha sampuli za sauti na kuzibadilisha na sampuli katika vitalu vya pembejeo na kuweka vitalu vilivyobadilishwa kwenye pato. Kadi ya sauti huanza kucheza sauti. Ifuatayo ni programu inayotekeleza mpango wa kazi ulioelezwa hapo juu:

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

Baada ya kuanzisha kipeperushi cha media, vichungi vitatu huundwa: voidsource, dtmfgen, snd_card_write. Chanzo cha saa kinaundwa.

Kisha unahitaji kuunganisha filters kwa mujibu wa mzunguko wetu, na chanzo cha saa lazima kiunganishwe mwisho, tangu baada ya hii mzunguko utaanza kufanya kazi mara moja. Ikiwa unganisha chanzo cha saa kwenye mzunguko ambao haujakamilika, inaweza kutokea kwamba kipeperushi cha media kikaanguka ikiwa kitagundua angalau kichujio kimoja kwenye mnyororo na pembejeo zote au matokeo yote "yakining'inia hewani" (hayajaunganishwa).

Kuunganisha filters hufanyika kwa kutumia kazi

ms_filter_link(src, src_out, dst, dst_in)

ambapo hoja ya kwanza ni kiashirio kwa kichujio cha chanzo, hoja ya pili ni nambari ya pato la chanzo (kumbuka kuwa pembejeo na matokeo yamehesabiwa kuanzia sifuri). Hoja ya tatu ni pointer kwa kichujio cha mpokeaji, ya nne ni nambari ya pembejeo ya mpokeaji.

Vichungi vyote vimeunganishwa na chanzo cha saa kimeunganishwa mwisho (baadaye tutaiita kiashiria tu). Baada ya hapo mzunguko wetu wa sauti huanza kufanya kazi, lakini hakuna kitu kinachoweza kusikika katika wasemaji wa kompyuta bado - jenereta ya sauti imezimwa na hupita tu kupitia vitalu vya data ya pembejeo kwa ukimya. Ili kuanza kutoa toni, unahitaji kuendesha njia ya chujio cha jenereta.

Tutatoa ishara ya toni mbili (DTMF) inayolingana na kubonyeza kitufe cha "1" kwenye simu. Ili kufanya hivyo, tunatumia kazi ms_filter_call_method() Tunaita mbinu ya MS_DTMF_GEN_PLAY, tukiipitisha kama hoja kuwa kielekezi kwa msimbo ambao mawimbi ya uchezaji inapaswa kuendana nayo.

Kinachobaki ni kuandaa programu:

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

Na kukimbia:

$ ./mstest2

Baada ya kuanza programu, utasikia ishara fupi ya sauti inayojumuisha tani mbili kwenye kipaza sauti cha kompyuta.

Tulijenga na kuzindua mzunguko wetu wa kwanza wa sauti. Tuliona jinsi ya kuunda matukio ya chujio, jinsi ya kuwaunganisha na jinsi ya kuwaita njia zao. Ingawa tunafurahia mafanikio yetu ya awali, bado tunahitaji kuzingatia ukweli kwamba programu yetu haitoi kumbukumbu iliyokabidhiwa kabla ya kuondoka. Katika ijayo Ibara ya tutajifunza kujisafisha.

Chanzo: mapenzi.com

Kuongeza maoni