สำรวจเครื่องมือ 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)

โดยที่อาร์กิวเมนต์แรกเป็นตัวชี้ไปยังตัวกรองแหล่งที่มา อาร์กิวเมนต์ที่สองคือหมายเลขเอาต์พุตของแหล่งที่มา (โปรดทราบว่าอินพุตและเอาต์พุตจะมีหมายเลขกำกับโดยเริ่มจากศูนย์) อาร์กิวเมนต์ที่สามคือตัวชี้ไปยังตัวกรองตัวรับ ส่วนตัวที่สี่คือหมายเลขอินพุตของตัวรับ

เชื่อมต่อตัวกรองทั้งหมดแล้วและแหล่งสัญญาณนาฬิกาเชื่อมต่อเป็นลำดับสุดท้าย (ต่อไปนี้เราจะเรียกมันว่าทิกเกอร์) หลังจากนั้นวงจรเสียงของเราก็เริ่มทำงาน แต่ยังไม่มีอะไรได้ยินในลำโพงคอมพิวเตอร์ - เครื่องกำเนิดเสียงปิดอยู่และเพียงส่งผ่านบล็อกข้อมูลอินพุตอย่างเงียบ ๆ หากต้องการเริ่มสร้างโทนเสียง คุณต้องเรียกใช้วิธีตัวกรองตัวสร้าง

เราจะสร้างสัญญาณทูโทน (DTMF) ที่สอดคล้องกับการกดปุ่ม "1" บนโทรศัพท์ เมื่อต้องการทำเช่นนี้ เราใช้ฟังก์ชัน ms_filter_call_method() เราเรียกเมธอด MS_DTMF_GEN_PLAY โดยส่งผ่านเป็นอาร์กิวเมนต์เพื่อชี้ไปยังโค้ดที่สัญญาณการเล่นควรสอดคล้องกัน

สิ่งที่เหลืออยู่คือการรวบรวมโปรแกรม:

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

และวิ่ง:

$ ./mstest2

หลังจากเริ่มโปรแกรม คุณจะได้ยินสัญญาณเสียงสั้นซึ่งประกอบด้วยสองโทนเสียงในลำโพงคอมพิวเตอร์

เราสร้างและเปิดตัววงจรเสียงชุดแรกของเรา เราเห็นวิธีสร้างอินสแตนซ์ตัวกรอง วิธีเชื่อมต่อ และวิธีการเรียกเมธอดของพวกเขา แม้ว่าเราจะพอใจกับความสำเร็จในช่วงแรกของเรา แต่เรายังคงต้องใส่ใจกับความจริงที่ว่าโปรแกรมของเราไม่ได้เพิ่มหน่วยความจำที่จัดสรรไว้ก่อนที่จะออก ในครั้งต่อไป статье เราจะเรียนรู้ที่จะทำความสะอาดตามตัวเราเอง

ที่มา: will.com

เพิ่มความคิดเห็น