Archwilio peiriant VoIP Mediastreamer2. Rhan 2

Mae deunydd yr erthygl yn cael ei gymryd o fy sianel zen.

Archwilio peiriant VoIP Mediastreamer2. Rhan 2

Creu Cynhyrchydd Tôn

Yn y blaenorol Erthygl Fe wnaethom osod y llyfrgell ffrydio cyfryngau, offer datblygu a phrofi eu swyddogaethau trwy adeiladu cymhwysiad prawf.

Heddiw, byddwn yn creu cymhwysiad a all gynhyrchu signal tôn ar gerdyn sain. I ddatrys y broblem hon mae angen i ni gysylltu'r hidlwyr â'r gylched generadur sain a ddangosir isod:

Archwilio peiriant VoIP Mediastreamer2. Rhan 2

Rydyn ni'n darllen y diagram o'r chwith i'r dde, dyma'r cyfeiriad y mae ein llif data yn symud iddo. Mae'r saethau hefyd yn awgrymu hyn. Mae petryalau yn dynodi hidlwyr sy'n prosesu blociau o ddata ac yn allbynnu'r canlyniad. Y tu mewn i'r petryal, nodir ei rôl a nodir y math o hidlydd mewn priflythrennau ychydig islaw. Mae'r saethau sy'n cysylltu'r petryalau yn giwiau data lle mae blociau o ddata'n cael eu danfon o'r hidlydd i'r hidlydd. Yn gyffredinol, gall hidlydd gael llawer o fewnbynnau ac allbynnau.

Mae'r cyfan yn dechrau gyda ffynhonnell y cloc, sy'n gosod y tempo ar gyfer cyfrifo data yn yr hidlyddion. Yn ôl ei gylchred cloc, mae pob hidlydd yn prosesu'r holl flociau data sydd wrth ei fewnbwn. Ac yn rhoi blociau gyda'r canlyniad allan i'r ciw. Yn gyntaf, mae'r hidlydd sydd agosaf at ffynhonnell y cloc yn gwneud cyfrifiadau, yna'r hidlwyr sy'n gysylltiedig â'i allbynnau (gall fod llawer o allbynnau), ac ati. Ar ôl i'r hidlydd olaf yn y gadwyn orffen prosesu, mae gweithredu'n stopio nes bod cloc newydd yn cyrraedd. Mae Beats, yn ddiofyn, yn dilyn egwyl o 10 milieiliad.

Gadewch i ni ddychwelyd at ein diagram. Mae'r cylchoedd cloc yn cyrraedd mewnbwn y ffynhonnell dawelwch; hidlydd yw hwn, sy'n brysur yn cynhyrchu bloc o ddata sy'n cynnwys sero yn ei allbwn ar gyfer pob cylch cloc. Os ydym yn ystyried y bloc hwn fel bloc o samplau sain, yna nid yw hyn yn ddim mwy na distawrwydd. Ar yr olwg gyntaf, mae'n ymddangos yn rhyfedd cynhyrchu blociau data gyda thawelwch - wedi'r cyfan, ni ellir ei glywed, ond mae'r blociau hyn yn angenrheidiol ar gyfer gweithrediad y generadur signal sain. Mae'r generadur yn defnyddio'r blociau hyn fel dalen wag o bapur, gan gofnodi samplau sain ynddynt. Yn ei gyflwr arferol, mae'r generadur yn cael ei ddiffodd ac yn syml yn anfon blociau mewnbwn ymlaen i'r allbwn. Felly, mae blociau o dawelwch yn mynd yn ddigyfnewid trwy'r gylched gyfan o'r chwith i'r dde, gan ddod i ben yn y cerdyn sain. Sy'n cymryd blociau yn dawel o'r ciw sy'n gysylltiedig â'i fewnbwn.

Ond mae popeth yn newid os rhoddir gorchymyn i'r generadur chwarae sain, mae'n dechrau cynhyrchu samplau sain ac yn eu disodli â samplau yn y blociau mewnbwn ac yn rhoi'r blociau wedi'u newid yn yr allbwn. Mae'r cerdyn sain yn dechrau chwarae sain. Isod mae rhaglen sy'n gweithredu'r cynllun gwaith a ddisgrifir uchod:

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

Ar ôl cychwyn y ffrwdwr cyfryngau, crëir tri hidlydd: ffynhonnell wag, dtmfgen, snd_card_write. Mae ffynhonnell cloc yn cael ei chreu.

Yna mae angen i chi gysylltu'r hidlwyr yn unol â'n cylched, a rhaid cysylltu ffynhonnell y cloc yn olaf, oherwydd ar ôl hyn bydd y gylched yn dechrau gweithredu ar unwaith. Os ydych chi'n cysylltu ffynhonnell cloc â chylched anorffenedig, mae'n bosibl y bydd y ffrwdwr cyfryngau yn damwain os yw'n canfod o leiaf un hidlydd yn y gadwyn gyda'r holl fewnbynnau neu'r holl allbynnau "yn hongian yn yr awyr" (heb eu cysylltu).

Mae cysylltu hidlwyr yn cael ei wneud gan ddefnyddio'r swyddogaeth

ms_filter_link(src, src_out, dst, dst_in)

lle mae'r ddadl gyntaf yn bwyntydd i'r hidlydd ffynhonnell, yr ail arg yw'r rhif allbwn ffynhonnell (sylwch fod mewnbynnau ac allbynnau wedi'u rhifo gan ddechrau o sero). Mae'r drydedd ddadl yn bwyntydd i'r hidlydd derbynnydd, y pedwerydd yw rhif mewnbwn y derbynnydd.

Mae'r holl hidlwyr wedi'u cysylltu ac mae ffynhonnell y cloc wedi'i chysylltu ddiwethaf (o hyn ymlaen byddwn yn ei alw'n diciwr). Ar ôl hynny mae ein cylched sain yn dechrau gweithio, ond ni ellir clywed dim yn y siaradwyr cyfrifiadurol eto - mae'r generadur sain wedi'i ddiffodd ac yn syml yn mynd trwy'r blociau data mewnbwn yn dawel. I ddechrau cynhyrchu naws, mae angen i chi redeg y dull hidlo generadur.

Byddwn yn cynhyrchu signal dwy-dôn (DTMF) sy'n cyfateb i wasgu'r botwm "1" ar y ffôn. I wneud hyn, rydym yn defnyddio'r swyddogaeth ms_filter_call_method() Rydym yn galw'r dull MS_DTMF_GEN_PLAY, gan ei basio fel dadl yn bwyntydd i'r cod y dylai'r signal chwarae yn ôl gyfateb iddo.

Y cyfan sydd ar ôl yw llunio'r rhaglen:

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

A rhedeg:

$ ./mstest2

Ar ôl dechrau'r rhaglen, byddwch yn clywed signal sain byr sy'n cynnwys dwy dôn yn siaradwr y cyfrifiadur.

Fe wnaethom adeiladu a lansio ein cylched sain cyntaf. Gwelsom sut i greu enghreifftiau hidlo, sut i'w cysylltu a sut i alw eu dulliau. Er ein bod yn hapus gyda'n llwyddiant cychwynnol, mae angen i ni dalu sylw o hyd i'r ffaith nad yw ein rhaglen yn rhyddhau'r cof a neilltuwyd cyn gadael. Yn y nesaf Erthygl byddwn yn dysgu glanhau ar ôl ein hunain.

Ffynhonnell: hab.com

Ychwanegu sylw