Mediastreamer2 वीओआईपी इंजन की खोज। भाग ---- पहला

लेख की सामग्री मेरे से ली गई है ज़ेन चैनल.

Mediastreamer2 वीओआईपी इंजन की खोज। भाग ---- पहला

टोन जेनरेटर बनाना

पिछले में लेख हमने मीडिया स्ट्रीमर लाइब्रेरी, विकास उपकरण स्थापित किए और एक परीक्षण एप्लिकेशन बनाकर उनकी कार्यक्षमता का परीक्षण किया।

आज हम एक ऐसा एप्लिकेशन बनाएंगे जो साउंड कार्ड पर टोन सिग्नल उत्पन्न कर सकता है। इस समस्या को हल करने के लिए हमें फ़िल्टर को नीचे दिखाए गए ध्वनि जनरेटर सर्किट से कनेक्ट करना होगा:

Mediastreamer2 वीओआईपी इंजन की खोज। भाग ---- पहला

हम आरेख को बाएं से दाएं पढ़ते हैं, यह वह दिशा है जिसमें हमारा डेटा प्रवाह चलता है। तीर भी इसी ओर संकेत करते हैं। आयतें उन फ़िल्टर को इंगित करती हैं जो डेटा के ब्लॉक को संसाधित करते हैं और परिणाम आउटपुट करते हैं। आयत के अंदर, इसकी भूमिका इंगित की गई है और फ़िल्टर प्रकार को ठीक नीचे बड़े अक्षरों में दर्शाया गया है। आयतों को जोड़ने वाले तीर डेटा कतारें हैं जिनके माध्यम से डेटा के ब्लॉक फ़िल्टर से फ़िल्टर तक वितरित किए जाते हैं। सामान्य तौर पर, एक फ़िल्टर में कई इनपुट और आउटपुट हो सकते हैं।

यह सब घड़ी स्रोत से शुरू होता है, जो उस गति को निर्धारित करता है जिस पर फ़िल्टर में डेटा की गणना की जाती है। अपने घड़ी चक्र के अनुसार, प्रत्येक फ़िल्टर अपने इनपुट पर मौजूद सभी डेटा ब्लॉक को संसाधित करता है। और परिणाम वाले ब्लॉक को कतार में रखता है। सबसे पहले, घड़ी स्रोत के निकटतम फ़िल्टर गणना करता है, फिर उसके आउटपुट से जुड़े फ़िल्टर (कई आउटपुट हो सकते हैं), और इसी तरह। श्रृंखला में अंतिम फ़िल्टर की प्रोसेसिंग समाप्त होने के बाद, नई घड़ी आने तक निष्पादन रुक जाता है। बीट्स, डिफ़ॉल्ट रूप से, 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" बटन दबाने के अनुरूप एक दो-टोन (डीटीएमएफ) सिग्नल उत्पन्न करेंगे। ऐसा करने के लिए, हम फ़ंक्शन का उपयोग करते हैं ms_filter_call_method() हम MS_DTMF_GEN_PLAY विधि को कॉल करते हैं, इसे एक तर्क के रूप में उस कोड के सूचक के रूप में पास करते हैं जिसके साथ प्लेबैक सिग्नल मेल खाना चाहिए।

जो कुछ बचा है वह कार्यक्रम को संकलित करना है:

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

और भाग खड़ा हुआ:

$ ./mstest2

प्रोग्राम शुरू करने के बाद, आपको कंप्यूटर स्पीकर में दो टोन वाला एक छोटा ध्वनि संकेत सुनाई देगा।

हमने अपना पहला साउंड सर्किट बनाया और लॉन्च किया। हमने देखा कि फ़िल्टर इंस्टेंस कैसे बनाएं, उन्हें कैसे कनेक्ट करें और उनके तरीकों को कैसे कॉल करें। हालाँकि हम अपनी प्रारंभिक सफलता से खुश हैं, फिर भी हमें इस तथ्य पर ध्यान देने की आवश्यकता है कि हमारा प्रोग्राम बाहर निकलने से पहले आवंटित मेमोरी को मुक्त नहीं करता है। अगले में लेख हम स्वयं सफाई करना सीखेंगे।

स्रोत: www.habr.com

एक टिप्पणी जोड़ें