Khám phá công cụ VoIP Mediastreamer2. Phần 2

Tài liệu của bài viết được lấy từ tài liệu của tôi kênh thiền.

Khám phá công cụ VoIP Mediastreamer2. Phần 2

Tạo bộ tạo âm

Trước đây Bài viết Chúng tôi đã cài đặt thư viện media streaming, các công cụ phát triển và kiểm tra chức năng của chúng bằng cách xây dựng một ứng dụng dùng thử.

Hôm nay chúng ta sẽ tạo một ứng dụng có thể tạo tín hiệu âm thanh trên card âm thanh. Để giải quyết vấn đề này chúng ta cần kết nối các bộ lọc vào mạch tạo âm thanh như hình bên dưới:

Khám phá công cụ VoIP Mediastreamer2. Phần 2

Chúng ta đọc sơ đồ từ trái sang phải, đây là hướng mà luồng dữ liệu của chúng ta di chuyển. Các mũi tên cũng gợi ý về điều này. Hình chữ nhật biểu thị các bộ lọc xử lý khối dữ liệu và đưa ra kết quả. Bên trong hình chữ nhật, vai trò của nó được chỉ định và loại bộ lọc được chỉ định bằng chữ in hoa ngay bên dưới. Các mũi tên nối các hình chữ nhật là hàng đợi dữ liệu qua đó các khối dữ liệu được phân phối từ bộ lọc này sang bộ lọc khác. Nói chung, một bộ lọc có thể có nhiều đầu vào và đầu ra.

Tất cả bắt đầu với nguồn đồng hồ, nguồn này đặt nhịp độ tính toán dữ liệu trong các bộ lọc. Theo chu kỳ xung nhịp của nó, mỗi bộ lọc xử lý tất cả các khối dữ liệu ở đầu vào của nó. Và đặt các khối có kết quả vào hàng đợi. Đầu tiên, bộ lọc gần nguồn đồng hồ nhất sẽ thực hiện các phép tính, sau đó các bộ lọc được kết nối với đầu ra của nó (có thể có nhiều đầu ra), v.v. Sau khi bộ lọc cuối cùng trong chuỗi xử lý xong, quá trình thực thi sẽ dừng lại cho đến khi có đồng hồ mới xuất hiện. Nhịp đập, theo mặc định, tuân theo khoảng thời gian 10 mili giây.

Hãy quay trở lại sơ đồ của chúng tôi. Các chu kỳ đồng hồ đến đầu vào của nguồn im lặng; đây là một bộ lọc đang bận tạo ra một khối dữ liệu chứa các số XNUMX ở đầu ra của nó cho mỗi chu kỳ đồng hồ. Nếu chúng ta coi khối này là một khối mẫu âm thanh thì đây chẳng qua là sự im lặng. Thoạt nhìn, việc tạo ra các khối dữ liệu ở chế độ im lặng có vẻ lạ - xét cho cùng thì không thể nghe thấy nó, nhưng những khối này cần thiết cho hoạt động của bộ tạo tín hiệu âm thanh. Máy phát điện sử dụng các khối này giống như một tờ giấy trắng, ghi các mẫu âm thanh vào đó. Ở trạng thái bình thường, bộ tạo bị tắt và chỉ chuyển tiếp các khối đầu vào đến đầu ra. Do đó, các khối im lặng không thay đổi xuyên suốt toàn bộ mạch từ trái sang phải, kết thúc ở card âm thanh. Âm thầm lấy các khối từ hàng đợi được kết nối với đầu vào của nó.

Nhưng mọi thứ sẽ thay đổi nếu máy phát được lệnh phát âm thanh, nó bắt đầu tạo các mẫu âm thanh và thay thế chúng bằng các mẫu trong khối đầu vào và đặt các khối đã thay đổi ở đầu ra. Card âm thanh bắt đầu phát âm thanh. Dưới đây là một chương trình thực hiện sơ đồ công việc được mô tả ở trên:

/* Файл 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);   
}

Sau khi khởi chạy bộ truyền phát đa phương tiện, ba bộ lọc sẽ được tạo: voidsource, dtmfgen, snd_card_write. Một nguồn đồng hồ được tạo ra.

Sau đó, bạn cần kết nối các bộ lọc theo mạch của chúng tôi và nguồn đồng hồ phải được kết nối sau cùng, vì sau đó, mạch sẽ ngay lập tức bắt đầu hoạt động. Nếu bạn kết nối nguồn đồng hồ với một mạch chưa hoàn thiện, có thể xảy ra trường hợp bộ truyền phát đa phương tiện gặp sự cố nếu phát hiện ít nhất một bộ lọc trong chuỗi có tất cả đầu vào hoặc tất cả đầu ra “treo lơ lửng” (không được kết nối).

Việc kết nối các bộ lọc được thực hiện bằng chức năng

ms_filter_link(src, src_out, dst, dst_in)

trong đó đối số đầu tiên là con trỏ tới bộ lọc nguồn, đối số thứ hai là số đầu ra nguồn (lưu ý rằng đầu vào và đầu ra được đánh số bắt đầu từ XNUMX). Đối số thứ ba là con trỏ tới bộ lọc máy thu, đối số thứ tư là số đầu vào của máy thu.

Tất cả các bộ lọc đều được kết nối và nguồn đồng hồ được kết nối cuối cùng (sau đây chúng ta sẽ gọi nó đơn giản là mã đánh dấu). Sau đó, mạch âm thanh của chúng tôi bắt đầu hoạt động, nhưng vẫn không thể nghe thấy gì trong loa máy tính - bộ tạo âm thanh bị tắt và chỉ chuyển qua các khối dữ liệu đầu vào trong im lặng. Để bắt đầu tạo âm báo, bạn cần chạy phương thức bộ lọc trình tạo.

Chúng ta sẽ tạo ra tín hiệu hai âm (DTMF) tương ứng với việc nhấn nút “1” trên điện thoại. Để làm điều này, chúng tôi sử dụng chức năng ms_filter_call_method() Chúng tôi gọi phương thức MS_DTMF_GEN_PLAY, chuyển nó làm đối số, một con trỏ tới mã mà tín hiệu phát lại phải tương ứng.

Tất cả những gì còn lại là biên dịch chương trình:

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

Và chạy:

$ ./mstest2

Sau khi khởi động chương trình, bạn sẽ nghe thấy một tín hiệu âm thanh ngắn gồm hai âm phát ra từ loa máy tính.

Chúng tôi đã xây dựng và ra mắt mạch âm thanh đầu tiên của mình. Chúng ta đã biết cách tạo các phiên bản bộ lọc, cách kết nối chúng và cách gọi các phương thức của chúng. Mặc dù hài lòng với thành công ban đầu của mình, nhưng chúng ta vẫn cần chú ý đến thực tế là chương trình của chúng ta không giải phóng bộ nhớ được phân bổ trước khi thoát. Ở phần tiếp theo Bài viết chúng ta sẽ học cách tự dọn dẹp.

Nguồn: www.habr.com

Thêm một lời nhận xét