Mediastreamer2 VoIP mühərriki araşdırılır. 2-ci hissə

Məqalənin materialı məndən götürülmüşdür zen kanalı.

Mediastreamer2 VoIP mühərriki araşdırılır. 2-ci hissə

Ton Generatorunun yaradılması

Əvvəlkidə məqalə Biz media streamer kitabxanasını, inkişaf alətlərini quraşdırdıq və sınaq tətbiqi qurmaqla onların funksionallığını sınaqdan keçirdik.

Bu gün biz səs kartında ton siqnalı yarada bilən proqram yaradacağıq. Bu problemi həll etmək üçün filtrləri aşağıda göstərilən səs generatoru dövrəsinə qoşmalıyıq:

Mediastreamer2 VoIP mühərriki araşdırılır. 2-ci hissə

Diaqramı soldan sağa oxuyuruq, bu, məlumat axınımızın hərəkət etdiyi istiqamətdir. Oxlar da buna işarə edir. Düzbucaqlılar məlumat bloklarını emal edən və nəticə çıxaran filtrləri göstərir. Düzbucaqlının içərisində onun rolu və filtr növü bir az aşağıda böyük hərflərlə göstərilmişdir. Düzbucaqlıları birləşdirən oxlar verilənlər bloklarının filtrdən filtrə çatdırıldığı məlumat növbələridir. Ümumiyyətlə, bir filtrdə çoxlu giriş və çıxışlar ola bilər.

Hər şey filtrlərdə məlumatların hesablanacağı tempi təyin edən saat mənbəyi ilə başlayır. Saat dövrünə uyğun olaraq, hər bir filtr onun girişində olan bütün məlumat bloklarını emal edir. Və nəticə ilə blokları növbəyə qoyur. Əvvəlcə saat mənbəyinə ən yaxın olan filtr hesablamalar aparır, sonra onun çıxışlarına qoşulan filtrlər (çox çıxışlar ola bilər) və s. Zəncirdəki sonuncu filtr emalını bitirdikdən sonra yeni saat gələnə qədər icra dayandırılır. Beats, standart olaraq, 10 millisaniyəlik intervalı izləyir.

Diaqramımıza qayıdaq. Saat dövrləri sükut mənbəyinin girişinə çatır; bu, hər saat dövrü üçün çıxışında sıfırları olan məlumat blokunu yaratmaqla məşğul olan bir filtrdir. Bu bloku səs nümunələri bloku hesab etsək, bu, sükutdan başqa bir şey deyil. İlk baxışdan, məlumat bloklarını səssizliklə yaratmaq qəribə görünür - axırda onu eşitmək olmur, lakin bu bloklar səs siqnalı generatorunun işləməsi üçün lazımdır. Generator bu bloklardan boş bir vərəq kimi istifadə edərək səs nümunələrini onlara qeyd edir. Normal vəziyyətdə, generator söndürülür və sadəcə giriş bloklarını çıxışa yönləndirir. Beləliklə, sükut blokları dəyişməz olaraq bütün dövrə boyunca soldan sağa keçir və səs kartında sona çatır. Hansı ki, girişinə qoşulmuş növbədən səssizcə bloklar götürür.

Lakin generatora səs çalmaq əmri verilsə, hər şey dəyişir, o, səs nümunələrini yaratmağa başlayır və onları giriş bloklarında nümunələrlə əvəz edir və dəyişdirilmiş blokları çıxışa qoyur. Səs kartı səs çalmağa başlayır. Aşağıda yuxarıda təsvir edilən iş sxemini həyata keçirən bir proqram var:

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

Media yayımlayıcısını işə saldıqdan sonra üç filtr yaradılır: voidsource, dtmfgen, snd_card_write. Saat mənbəyi yaradılır.

Sonra filtrləri dövrəmizə uyğun birləşdirməlisiniz və saat mənbəyi ən son qoşulmalıdır, çünki bundan sonra dövrə dərhal işə başlayacaq. Saat mənbəyini tamamlanmamış dövrəyə qoşarsanız, bütün girişləri və ya bütün çıxışları "havada asılı" (qoşulmamış) olan zəncirdə ən azı bir filtr aşkar edərsə, media yayımlayıcısı qəzaya uğraya bilər.

Filtrləri birləşdirmək funksiyadan istifadə etməklə həyata keçirilir

ms_filter_link(src, src_out, dst, dst_in)

birinci arqument mənbə filtrinə göstəricidir, ikinci arqument mənbə çıxış nömrəsidir (qeyd edək ki, giriş və çıxışlar sıfırdan başlayaraq nömrələnir). Üçüncü arqument qəbuledici filtrə işarədir, dördüncüsü qəbuledicinin giriş nömrəsidir.

Bütün filtrlər birləşdirilir və saat mənbəyi ən son bağlanır (bundan sonra biz onu sadəcə olaraq işarə adlandıracağıq). Bundan sonra səs dövrəmiz işləməyə başlayır, lakin kompüter dinamiklərində hələ heç bir şey eşidilmir - səs generatoru söndürülür və sadəcə səssizliklə giriş məlumat bloklarından keçir. Ton yaratmağa başlamaq üçün generator filtri metodunu işə salmalısınız.

Telefonda "1" düyməsini basmağa uyğun iki tonlu (DTMF) siqnal yaradacağıq. Bunun üçün funksiyadan istifadə edirik ms_filter_call_method() Biz MS_DTMF_GEN_PLAY metodunu çağırırıq, onu arqument kimi oxutma siqnalının uyğun gəlməli olduğu kodun göstəricisi kimi ötürürük.

Proqramı tərtib etmək qalır:

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

Və qaç:

$ ./mstest2

Proqramı işə saldıqdan sonra kompüter dinamikində iki tondan ibarət qısa bir səs siqnalı eşidəcəksiniz.

İlk səs dövrəmizi qurduq və işə saldıq. Filtr nümunələrinin necə yaradılacağını, onları necə birləşdirəcəyini və metodlarını necə çağıracağını gördük. İlkin uğurumuzdan məmnun olsaq da, proqramımızdan çıxmazdan əvvəl ayrılmış yaddaşı boşaltmadığına diqqət yetirməliyik. Növbətidə məqalə özümüzdən sonra təmizləməyi öyrənəcəyik.

Mənbə: www.habr.com

Добавить комментарий