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" பொத்தானை அழுத்துவதற்கு ஒத்த இரண்டு-தொனி (டிடிஎம்எஃப்) சிக்னலை உருவாக்குவோம். இதைச் செய்ய, நாங்கள் செயல்பாட்டைப் பயன்படுத்துகிறோம் ms_filter_call_method() MS_DTMF_GEN_PLAY முறையை நாங்கள் அழைக்கிறோம், அதை ஒரு வாதமாக அனுப்புவதன் மூலம், பிளேபேக் சிக்னல் தொடர்புடைய குறியீட்டிற்கான ஒரு சுட்டிக்காட்டி.

நிரலை தொகுக்க மட்டுமே எஞ்சியுள்ளது:

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

மற்றும் இயக்கவும்:

$ ./mstest2

நிரலைத் தொடங்கிய பிறகு, கணினி ஸ்பீக்கரில் இரண்டு டோன்களைக் கொண்ட ஒரு குறுகிய ஒலி சமிக்ஞையை நீங்கள் கேட்பீர்கள்.

நாங்கள் எங்கள் முதல் ஒலி சுற்றுகளை உருவாக்கி தொடங்கினோம். வடிகட்டி நிகழ்வுகளை எவ்வாறு உருவாக்குவது, அவற்றை எவ்வாறு இணைப்பது மற்றும் அவற்றின் முறைகளை எவ்வாறு அழைப்பது என்பதைப் பார்த்தோம். எங்கள் ஆரம்ப வெற்றியில் நாங்கள் மகிழ்ச்சியாக இருந்தாலும், வெளியேறும் முன் எங்கள் நிரல் ஒதுக்கப்பட்ட நினைவகத்தை விடுவிக்காது என்பதில் கவனம் செலுத்த வேண்டும். அடுத்து கட்டுரை நம்மை நாமே சுத்தம் செய்ய கற்றுக்கொள்வோம்.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்