Indaba ye-athikili ithathwe kweyami
Ukudala i-Tone Generator
Kwedlule
Namuhla sizodala uhlelo lokusebenza olungakhiqiza isignali yethoni ekhadini lomsindo. Ukuze sixazulule le nkinga sidinga ukuxhuma izihlungi kumjikelezo wejeneretha yomsindo oboniswe ngezansi:
Sifunda umdwebo ukusuka kwesobunxele kuya kwesokudla, lesi isiqondiso lapho ukuhamba kwedatha yethu kuhamba khona. Imicibisholo nayo iyakusikisela lokhu. Onxande babonisa izihlungi ezicubungula amabhlokhi wedatha futhi zikhiphe umphumela. Ngaphakathi kukanxande, indima yawo ibonisiwe futhi uhlobo lwesihlungi lukhonjiswe ngosonhlamvukazi ngezansi nje. Imicibisholo exhuma onxande iwumugqa wedatha lapho amabhulokhi edatha alethwa khona ukusuka kusihlungi kuye kusihlungi. Ngokuvamile, isihlungi singaba nokokufaka okuningi nokuphumayo.
Konke kuqala ngomthombo wewashi, omisa i-tempo lapho idatha ibalwa khona ezihlungini. Ngokomjikelezo waso wewashi, isihlungi ngasinye sicubungula wonke amabhulokhi edatha akhona ngokokufaka kwaso. Futhi ibeka amabhlogo anomphumela emgqeni. Okokuqala, isihlungi esiseduze nomthombo wewashi senza izibalo, bese izihlungi zixhunywe emiphumeleni yaso (kungaba nemiphumela eminingi), njalonjalo. Ngemuva kokuthi isihlungi sokugcina ochungechungeni siqede ukucubungula, ukusebenzisa kuyama kuze kufike iwashi elisha. Amabhithi, ngokuzenzakalelayo, alandela isikhawu samamillisecond angu-10.
Masibuyele kumdwebo wethu. Imijikelezo yewashi ifika kokokufaka komthombo wokuthulisa; lesi isihlungi, esimatasa sikhiqiza ibhulokhi yedatha equkethe oziro ekuphumeni kwayo kumjikelezo wewashi ngamunye. Uma sibheka leli bhulokhi njengebhulokhi yamasampuli omsindo, lokhu akukhona okungaphezu kokuthula. Ekuboneni kokuqala, kubonakala kungavamile ukukhiqiza amabhlokhi wedatha ngokuthula - emva kwakho konke, angeke kuzwakale, kodwa la mabhulokhi ayadingeka ekusebenzeni kwejeneretha yesignali yomsindo. Ijeneretha isebenzisa la mabhuloki njengephepha elingenalutho, irekhoda amasampula omsindo kuwo. Esimeni sayo esijwayelekile, ijeneretha iyacishwa futhi ivele idlulisele amabhulokhi okokufaka kokuphumayo. Ngakho-ke, amabhlokhi okuthula adlula engashintshiwe kuwo wonke umjikelezo ukusuka kwesobunxele kuya kwesokudla, agcine ekhadini lomsindo. Okuthatha buthule amabhlogo kulayini oxhunywe kokokufaka kwawo.
Kodwa yonke into iyashintsha uma ijeneretha inikezwa umyalo wokudlala umsindo, iqala ukukhiqiza amasampula omsindo futhi iwafake esikhundleni samasampula kumabhulokhi wokufaka bese ibeka amabhlogo ashintshiwe ekuphumeni. Ikhadi lomsindo liqala ukudlala umsindo. Ngezansi uhlelo olusebenzisa isikimu somsebenzi esichazwe ngenhla:
/* Π€Π°ΠΉΠ» 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);
}
Ngemuva kokuqaliswa kokusakaza kwemidiya, izihlungi ezintathu ziyadalwa: voidsource, dtmfgen, snd_card_write. Kudalwe umthombo wewashi.
Khona-ke udinga ukuxhuma izihlungi ngokuhambisana nesifunda sethu, futhi umthombo wewashi kufanele uxhunywe ekugcineni, kusukela ngemva kwalokhu isifunda sizoqala ukusebenza ngokushesha. Uma uxhuma umthombo wewashi kumjikelezo ongaqediwe, kungenzeka ukuthi isisakaza-midiya siphahlazeke uma sithola okungenani isihlungi esisodwa kuketango nakho konke okokufaka noma konke okuphumayo βokulenga emoyeniβ (akuxhunyiwe).
Ukuxhuma izihlungi kwenziwa kusetshenziswa umsebenzi
ms_filter_link(src, src_out, dst, dst_in)
lapho i-agumenti yokuqala iyinkomba yesihlungi somthombo, i-agumenti yesibili inombolo yokuphuma komthombo (qaphela ukuthi okokufaka nokuphumayo kubalwa kusukela kuziro). I-agumenti yesithathu iyisikhombi kusihlungi somamukeli, eyesine inombolo yokufaka yomamukeli.
Zonke izihlungi zixhunyiwe futhi umthombo wewashi uxhumeke ekugcineni (ngemuva kwalokhu sizomane sikubize ngokuthi ithikha). Ngemva kwalokho isifunda sethu somsindo siqala ukusebenza, kodwa akukho lutho olungazwakala kuzipikha zekhompiyutha okwamanje - ijeneretha yomsindo ivaliwe futhi imane idlule kumabhulokhi wedatha yokufaka ngokuthula. Ukuze uqale ukukhiqiza ithoni, udinga ukusebenzisa indlela yokuhlunga i-generator.
Sizokhiqiza isignali yamathoni amabili (i-DTMF) ehambisana nokucindezela inkinobho ethi "1" ocingweni. Ukuze wenze lokhu, sisebenzisa umsebenzi ms_filter_call_method() Sibiza indlela ye-MS_DTMF_GEN_PLAY, siyidlulise njenge-agumenti njengesikhombi sekhodi okufanele isignali yokudlala ihambisane nayo.
Okusele ukuhlanganisa uhlelo:
$ gcc mstest2.c -o mstest2 `pkg-config mediastreamer --libs --cflags`
Bese ugijima:
$ ./mstest2
Ngemva kokuqala uhlelo, uzozwa isignali yomsindo emfushane ehlanganisa amathoni amabili kusipika sekhompyutha.
Sakha futhi sethula isifunda sethu sokuqala somsindo. Sibonile ukuthi zingakha kanjani izimo zokuhlunga, ukuthi ungazixhuma kanjani nokuthi ungazishayela kanjani izindlela zazo. Yize sijabule ngempumelelo yethu yokuqala, sisadinga ukunaka iqiniso lokuthi uhlelo lwethu alukhululi inkumbulo eyabelwe ngaphambi kokuphuma. Kolandelayo
Source: www.habr.com