استكشاف محرك 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);   
}

بعد تهيئة مشغل الوسائط، يتم إنشاء ثلاثة مرشحات: مصدر الفراغ، dtmfgen، snd_card_write. يتم إنشاء مصدر الساعة.

ثم تحتاج إلى توصيل المرشحات وفقًا لدائرتنا، ويجب توصيل مصدر الساعة أخيرًا، لأنه بعد ذلك ستبدأ الدائرة في العمل على الفور. إذا قمت بتوصيل مصدر ساعة بدائرة غير مكتملة، فقد يحدث أن يتعطل جهاز بث الوسائط إذا اكتشف مرشحًا واحدًا على الأقل في السلسلة مع جميع المدخلات أو جميع المخرجات "معلقة في الهواء" (غير متصلة).

يتم توصيل المرشحات باستخدام الوظيفة

ms_filter_link(src, src_out, dst, dst_in)

حيث تكون الوسيطة الأولى مؤشرًا لمرشح المصدر، والوسيطة الثانية هي رقم مخرجات المصدر (لاحظ أن المدخلات والمخرجات يتم ترقيمها بدءًا من الصفر). الوسيطة الثالثة هي مؤشر لمرشح جهاز الاستقبال، والرابعة هي رقم إدخال جهاز الاستقبال.

يتم توصيل جميع المرشحات ويتم توصيل مصدر الساعة أخيرًا (سنسميه فيما بعد مؤشرًا). بعد ذلك، تبدأ دائرة الصوت الخاصة بنا في العمل، ولكن لا يمكن سماع أي شيء في مكبرات صوت الكمبيوتر حتى الآن - يتم إيقاف تشغيل مولد الصوت ويمرر ببساطة عبر كتل بيانات الإدخال بصمت. للبدء في إنشاء نغمة، تحتاج إلى تشغيل طريقة فلتر المولد.

سنقوم بإنشاء إشارة ثنائية النغمة (DTMF) تتوافق مع الضغط على الزر "1" الموجود على الهاتف. للقيام بذلك، نستخدم الدالة ms_filter_call_method() نحن نطلق على طريقة MS_DTMF_GEN_PLAY، ونمررها كوسيطة كمؤشر للكود الذي يجب أن تتوافق معه إشارة التشغيل.

كل ما تبقى هو تجميع البرنامج:

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

و اهرب:

$ ./mstest2

بعد بدء تشغيل البرنامج ستسمع إشارة صوتية قصيرة مكونة من نغمتين في مكبر صوت الكمبيوتر.

قمنا ببناء وإطلاق أول دائرة صوتية لدينا. لقد رأينا كيفية إنشاء مثيلات التصفية وكيفية توصيلها وكيفية استدعاء أساليبها. على الرغم من أننا سعداء بنجاحنا الأولي، إلا أننا لا نزال بحاجة إلى الانتباه إلى حقيقة أن برنامجنا لا يحرر الذاكرة المخصصة قبل الخروج. في اليوم التالي مقالة سوف نتعلم كيفية التنظيف بعد أنفسنا.

المصدر: www.habr.com

إضافة تعليق