የ 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_ማጣሪያ_ጥሪ_ዘዴ() የMS_DTMF_GEN_PLAY ዘዴ ብለን እንጠራዋለን፣ እንደ ክርክር እናስተላልፋለን የመልሶ ማጫወት ምልክቱ መመሳሰል ያለበትን ኮድ ጠቋሚ ነው።

ፕሮግራሙን ማጠናቀር ብቻ ነው የቀረው፡-

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

እና ሩጡ:

$ ./mstest2

ፕሮግራሙን ከጀመሩ በኋላ በኮምፒተር ድምጽ ማጉያ ውስጥ ሁለት ድምፆችን ያካተተ አጭር የድምፅ ምልክት ይሰማዎታል.

የመጀመሪያውን የድምጽ ወረዳ ገንብተን አስጀመርን። የማጣሪያ ምሳሌዎችን እንዴት እንደሚፈጥሩ, እንዴት እንደሚገናኙ እና ዘዴዎቻቸውን እንዴት እንደሚጠሩ አይተናል. በመጀመርያ ስኬታችን ደስተኛ ብንሆንም ፕሮግራማችን ከመውጣታችን በፊት የተመደበውን ሚሞሪ ነፃ አለማድረጉን አሁንም ትኩረት መስጠት አለብን። በሚቀጥለው ጽሑፍ ከራሳችን በኋላ ማጽዳትን እንማራለን.

ምንጭ: hab.com

አስተያየት ያክሉ