Mediastreamer2 VoIP انجڻ جي ڳولا. حصو 2

مضمون جو مواد منهنجي طرفان ورتو ويو آهي زين چينل.

Mediastreamer2 VoIP انجڻ جي ڳولا. حصو 2

هڪ ٽون جنريٽر ٺاهڻ

پوئين ۾ مضمون اسان انسٽال ڪيو ميڊيا اسٽريمر لائبريري، ڊولپمينٽ ٽولز ۽ آزمائشي ايپليڪيشن ٺاهي انهن جي ڪارڪردگي کي جانچيو.

اڄ اسان هڪ ايپليڪيشن ٺاهينداسين جيڪا آواز ڪارڊ تي ٽون سگنل ٺاهي سگهي ٿي. ھن مسئلي کي حل ڪرڻ لاءِ اسان کي ھيٺ ڏنل ڏيکاريل آواز جنريٽر سرڪٽ ۾ فلٽر کي ڳنڍڻو پوندو.

Mediastreamer2 VoIP انجڻ جي ڳولا. حصو 2

اسان ڊراگرام کي کاٻي کان ساڄي طرف پڙهون ٿا، هي اهو رخ آهي جنهن ۾ اسان جي ڊيٽا جو وهڪرو هلندو آهي. تيرن به هن طرف اشارو ڪيو. مستطيل فلٽر ظاهر ڪن ٿا جيڪي ڊيٽا جي بلاڪ کي پروسيس ڪن ٿا ۽ نتيجو ڪڍي ٿو. مستطيل جي اندر، ان جو ڪردار اشارو ڪيو ويو آهي ۽ فلٽر جو قسم صرف هيٺ ڏنل وڏن اکرن ۾ ظاهر ڪيو ويو آهي. مستطيل کي ڳنڍڻ وارا تير ڊيٽا جون قطارون آهن جن جي ذريعي ڊيٽا جا بلاڪ فلٽر کان فلٽر تائين پهچائي رهيا آهن. عام طور تي، فلٽر ۾ ڪيترائي ان پٽ ۽ آئوٽ ٿي سگھن ٿا.

اهو سڀ شروع ٿئي ٿو گھڙي جي ماخذ سان، جيڪو ٽائيم سيٽ ڪري ٿو جنهن تي ڊيٽا کي فلٽر ۾ ڳڻيو ويندو آهي. ان جي گھڙي جي چڪر جي مطابق، هر فلٽر سڀني ڊيٽا بلاڪ کي پروسيس ڪري ٿو جيڪي ان جي ان پٽ تي آهن. ۽ نتيجن سان بلاڪ کي قطار ۾ رکي ٿو. سڀ کان پهريان، فلٽر گھڙي جي ماخذ جي ويجھو حساب سان انجام ڏئي ٿو، پوء فلٽر ان جي ٻاھرين سان ڳنڍيل آھن (ڪيترائي ٻاھر ٿي سگھي ٿو)، وغيره. زنجير ۾ آخري فلٽر ختم ٿيڻ کان پوءِ پروسيسنگ ختم ٿي وڃي ٿي، ايگزيڪيوشن بند ٿي وڃي ٿي جيستائين نئين گھڙي اچي. بيٽس، ڊفالٽ طور، 10 ملي سيڪنڊن جي وقفي جي پيروي ڪريو.

اچو ته اسان جي ڊائريگرام ڏانهن واپس وڃو. گھڙيءَ جا چڪر خاموشيءَ واري ماخذ جي ان پٽ تي پهچن ٿا؛ هي هڪ فلٽر آهي، جيڪو هر ڪلاڪ جي چڪر لاءِ ان جي آئوٽ تي زيرو تي مشتمل ڊيٽا جو هڪ بلاڪ تيار ڪرڻ ۾ مصروف آهي. جيڪڏهن اسان هن بلاڪ کي آواز جي نمونن جو بلاڪ سمجهون ٿا، پوء اهو خاموشيء کان سواء ٻيو ڪجهه ناهي. پهرين نظر ۾، خاموشيء سان ڊيٽا بلاڪ ٺاهڻ لاء عجيب لڳي ٿو - سڀ کان پوء، اهو ٻڌي نٿو سگهجي، پر اهي بلاڪ آواز سگنل جنريٽر جي آپريشن لاء ضروري آهن. جنريٽر انهن بلاڪن کي ڪاغذ جي خالي شيٽ وانگر استعمال ڪري ٿو، انهن ۾ آواز جا نمونا رڪارڊ ڪري ٿو. ان جي عام حالت ۾، جنريٽر بند ڪيو ويو آهي ۽ صرف ان پٽ بلاڪ کي ٻاڦ ڏانهن اڳتي وڌائي ٿو. اهڙيء طرح، خاموشيء جا بلاڪ سڄي سرڪٽ ذريعي کاٻي کان ساڄي طرف، آواز ڪارڊ ۾ ختم ٿي ويندا آهن. جيڪو خاموشيءَ سان پنهنجي ان پٽ سان جڙيل قطار مان بلاڪ کڻي ٿو.

پر سڀ ڪجهه تبديل ٿي ويندو آهي جيڪڏهن جنريٽر کي آواز هلائڻ جو حڪم ڏنو وڃي، اهو آواز جا نمونا پيدا ڪرڻ شروع ڪري ٿو ۽ انهن کي ان پٽ بلاڪن ۾ نمونن سان تبديل ڪري ٿو ۽ تبديل ٿيل بلاڪن کي آئوٽ پٽ تي رکي ٿو. سائونڊ ڪارڊ آواز کيڏڻ شروع ڪري ٿو. هيٺ ڏنل هڪ پروگرام آهي جيڪو مٿي بيان ڪيل ڪم منصوبي کي لاڳو ڪري ٿو:

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

ميڊيا اسٽريمر کي شروع ڪرڻ کان پوء، ٽي فلٽر ٺاهيا ويا آهن: voidsource، dtmfgen، snd_card_write. ھڪڙي گھڙي جو ذريعو ٺاھيو ويو آھي.

پوء توهان کي اسان جي سرڪٽ جي مطابق فلٽر کي ڳنڍڻ جي ضرورت آهي، ۽ گھڙي جو ذريعو آخري ڳنڍڻ گهرجي، ڇاڪاڻ ته ان کان پوء سرڪٽ فوري طور تي ڪم ڪرڻ شروع ڪيو ويندو. جيڪڏھن توھان ھڪڙي گھڙي جي ماخذ کي ھڪڙي نامڪمل سرڪٽ سان ڳنڍيندا آھيو، اھو ٿي سگھي ٿو ته ميڊيا اسٽريمر حادثو ٿي سگھي ٿو جيڪڏھن اھو زنجير ۾ گھٽ ۾ گھٽ ھڪڙو فلٽر سڀني انپٽس يا سڀني آئوٽ پٽس سان "هوا ۾ لٽڪيل" (ڳنڍيل نه آھي).

فلٽر کي ڳنڍڻ فنڪشن استعمال ڪندي ڪيو ويندو آهي

ms_filter_link(src, src_out, dst, dst_in)

جتي پهريون دليل ماخذ فلٽر ڏانهن اشارو ڪندڙ آهي، ٻيو دليل آهي سورس آئوٽ پٽ نمبر (ياد رهي ته ان پٽ ۽ آئوٽ پُٽ کي صفر کان شروع ڪيو ويو آهي). ٽيون دليل رسيور فلٽر ڏانهن اشارو آهي، چوٿين رسيور ان پٽ نمبر آهي.

سڀئي فلٽر ڳنڍيل آهن ۽ گھڙي جو ذريعو آخري ڳنڍيل آهي (هتي اسان ان کي صرف هڪ ٽکر سڏينداسين). جنهن کان پوءِ اسان جو سائونڊ سرڪٽ ڪم ڪرڻ شروع ڪري ٿو، پر ڪمپيوٽر جي اسپيڪرز ۾ اڃا تائين ڪجهه به ٻڌڻ ۾ نه ٿو اچي- ساؤنڊ جنريٽر بند آهي ۽ بس خاموشيءَ سان ان پٽ ڊيٽا بلاڪن مان گذري ٿو. ٽون ٺاهڻ شروع ڪرڻ لاءِ، توهان کي هلائڻو پوندو جنريٽر فلٽر جو طريقو.

اسان فون تي "1" بٽڻ کي دٻائڻ سان لاڳاپيل هڪ ٻه-ٽون (DTMF) سگنل پيدا ڪنداسين. هن کي ڪرڻ لاء، اسان فنڪشن استعمال ڪندا آهيون ms_filter_call_method() اسان MS_DTMF_GEN_PLAY طريقي کي سڏيندا آهيون، ان کي دليل جي طور تي پاس ڪندي ڪوڊ ڏانهن پوائنٽر جيڪو پلے بیک سگنل سان لاڳاپيل هجڻ گهرجي.

جيڪو باقي رهي ٿو اهو پروگرام گڏ ڪرڻ آهي:

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

۽ هلائڻ:

$ ./mstest2

پروگرام شروع ڪرڻ کان پوءِ، توهان کي ڪمپيوٽر جي اسپيڪر ۾ هڪ مختصر آواز وارو سگنل ٻڌڻ ۾ ايندو، جنهن ۾ ٻه ٽونز هوندا.

اسان پنهنجو پهريون آواز سرڪٽ ٺاهيو ۽ شروع ڪيو. اسان ڏٺو ته فلٽر مثال ڪيئن ٺاهجن، انهن کي ڪيئن ڳنڍجي ۽ انهن جي طريقن کي ڪيئن سڏجي. جڏهن ته اسان اسان جي شروعاتي ڪاميابي سان خوش آهيون، اسان کي اڃا تائين ان حقيقت تي ڌيان ڏيڻ جي ضرورت آهي ته اسان جو پروگرام ٻاهر نڪرڻ کان اڳ مختص ڪيل ياداشت کي آزاد نٿو ڪري. ايندڙ ۾ مضمون اسان پاڻ کي صاف ڪرڻ سکندا سين.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو