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

نیا تبصرہ شامل کریں