เนื้อหาของบทความนำมาจากของฉัน
การสร้างเครื่องกำเนิดเสียง
ในคราวที่แล้ว
วันนี้เราจะสร้างแอพพลิเคชั่นที่สามารถสร้างสัญญาณเสียงบนการ์ดเสียงได้ เพื่อแก้ปัญหานี้ เราจำเป็นต้องเชื่อมต่อตัวกรองเข้ากับวงจรกำเนิดเสียงที่แสดงด้านล่าง:
เราอ่านแผนภาพจากซ้ายไปขวา นี่คือทิศทางที่กระแสข้อมูลของเราเคลื่อนที่ ลูกศรก็บอกเป็นนัยถึงสิ่งนี้ สี่เหลี่ยมหมายถึงตัวกรองที่ประมวลผลบล็อคข้อมูลและส่งออกผลลัพธ์ ภายในสี่เหลี่ยมผืนผ้า บทบาทของตัวกรองจะถูกระบุ และประเภทตัวกรองจะแสดงด้วยตัวพิมพ์ใหญ่ด้านล่าง ลูกศรที่เชื่อมต่อสี่เหลี่ยมคือคิวข้อมูลที่บล็อกข้อมูลจะถูกส่งจากตัวกรองหนึ่งไปยังอีกตัวกรองหนึ่ง โดยทั่วไป ตัวกรองสามารถมีอินพุตและเอาต์พุตได้จำนวนมาก
ทุกอย่างเริ่มต้นด้วยแหล่งที่มาของนาฬิกา ซึ่งกำหนดจังหวะในการคำนวณข้อมูลในตัวกรอง ตามรอบสัญญาณนาฬิกา ตัวกรองแต่ละตัวจะประมวลผลบล็อคข้อมูลทั้งหมดที่อยู่ในอินพุต และวางบล็อกที่มีผลลัพธ์ออกมาในคิว ขั้นแรก ตัวกรองที่อยู่ใกล้กับแหล่งสัญญาณนาฬิกามากที่สุดจะทำการคำนวณ จากนั้นตัวกรองที่เชื่อมต่อกับเอาต์พุต (อาจมีเอาต์พุตได้หลายเอาต์พุต) และอื่นๆ หลังจากที่ตัวกรองสุดท้ายในห่วงโซ่เสร็จสิ้นการประมวลผล การดำเนินการจะหยุดลงจนกว่านาฬิกาใหม่จะมาถึง ตามค่าเริ่มต้น จังหวะจะเป็นไปตามช่วงเวลา 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