Menjelajahi mesin VoIP Mediastreamer2. Bagian 2

Materi artikel diambil dari saya saluran Zen.

Menjelajahi mesin VoIP Mediastreamer2. Bagian 2

Membuat Generator Nada

Di sebelumnya Artikel Kami memasang perpustakaan media streamer, alat pengembangan, dan menguji fungsinya dengan membangun aplikasi uji coba.

Hari ini kita akan membuat aplikasi yang dapat menghasilkan sinyal nada pada kartu suara. Untuk mengatasi masalah ini kita perlu menghubungkan filter ke rangkaian pembangkit suara yang ditunjukkan di bawah ini:

Menjelajahi mesin VoIP Mediastreamer2. Bagian 2

Kita membaca diagram dari kiri ke kanan, inilah arah pergerakan aliran data kita. Panah juga mengisyaratkan hal ini. Persegi panjang menunjukkan filter yang memproses blok data dan mengeluarkan hasilnya. Di dalam persegi panjang, perannya ditunjukkan dan jenis filter ditunjukkan dengan huruf kapital tepat di bawah. Panah yang menghubungkan persegi panjang adalah antrian data yang melaluinya blok data dikirimkan dari filter ke filter. Secara umum, sebuah filter dapat memiliki banyak masukan dan keluaran.

Semuanya dimulai dengan sumber jam, yang mengatur tempo penghitungan data dalam filter. Menurut siklus jamnya, setiap filter memproses semua blok data yang dimasukkannya. Dan menempatkan blok dengan hasilnya ke dalam antrian. Pertama, filter yang paling dekat dengan sumber jam melakukan perhitungan, kemudian filter terhubung ke outputnya (outputnya bisa banyak), dan seterusnya. Setelah filter terakhir dalam rantai selesai diproses, eksekusi berhenti hingga jam baru tiba. Ketukan, secara default, mengikuti interval 10 milidetik.

Mari kembali ke diagram kita. Siklus jam tiba pada masukan dari sumber keheningan; ini adalah filter, yang sibuk menghasilkan blok data yang berisi nol pada keluarannya untuk setiap siklus jam. Jika kita menganggap blok ini sebagai blok sampel suara, maka ini tidak lebih dari keheningan. Pada pandangan pertama, tampaknya aneh untuk menghasilkan blok data dengan keheningan - lagi pula, tidak dapat didengar, tetapi blok ini diperlukan agar generator sinyal suara berfungsi. Generator menggunakan balok-balok ini seperti selembar kertas kosong, merekam sampel suara ke dalamnya. Dalam keadaan normal, generator dimatikan dan hanya meneruskan blok input ke output. Dengan demikian, blok keheningan melewati seluruh rangkaian dari kiri ke kanan tanpa perubahan, berakhir di kartu suara. Yang secara diam-diam mengambil blok dari antrian yang terhubung ke inputnya.

Tetapi semuanya berubah jika generator diberi perintah untuk memutar suara, ia mulai menghasilkan sampel suara dan menggantinya dengan sampel di blok masukan dan menempatkan blok yang diubah pada keluaran. Kartu suara mulai memutar suara. Di bawah ini adalah program yang mengimplementasikan skema kerja yang dijelaskan di atas:

/* Π€Π°ΠΉΠ» 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);   
}

Setelah menginisialisasi media streamer, tiga filter dibuat: voidsource, dtmfgen, snd_card_write. Sumber jam dibuat.

Kemudian Anda perlu menghubungkan filter sesuai dengan rangkaian kami, dan sumber jam harus dihubungkan terakhir, karena setelah ini rangkaian akan segera mulai beroperasi. Jika Anda menghubungkan sumber jam ke sirkuit yang belum selesai, streamer media mungkin mogok jika mendeteksi setidaknya satu filter dalam rantai dengan semua input atau semua output β€œmenggantung di udara” (tidak terhubung).

Menghubungkan filter dilakukan menggunakan fungsi

ms_filter_link(src, src_out, dst, dst_in)

dimana argumen pertama adalah penunjuk ke filter sumber, argumen kedua adalah nomor keluaran sumber (perhatikan bahwa masukan dan keluaran diberi nomor mulai dari nol). Argumen ketiga adalah penunjuk ke filter penerima, argumen keempat adalah nomor masukan penerima.

Semua filter terhubung dan sumber jam terhubung terakhir (selanjutnya kita sebut saja ticker). Setelah itu sirkuit suara kami mulai bekerja, tetapi belum ada yang terdengar di speaker komputer - generator suara dimatikan dan melewati blok data input dengan diam. Untuk mulai menghasilkan nada, Anda perlu menjalankan metode filter generator.

Kami akan menghasilkan sinyal dua nada (DTMF) sesuai dengan menekan tombol "1" di telepon. Untuk melakukan ini, kami menggunakan fungsi tersebut ms_filter_call_method() Kami memanggil metode MS_DTMF_GEN_PLAY, meneruskannya sebagai argumen penunjuk ke kode yang harus sesuai dengan sinyal pemutaran.

Yang tersisa hanyalah mengkompilasi program:

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

Dan lari:

$ ./mstest2

Setelah memulai program, Anda akan mendengar sinyal suara pendek yang terdiri dari dua nada di speaker komputer.

Kami membangun dan meluncurkan sirkuit suara pertama kami. Kita melihat cara membuat instance filter, cara menghubungkannya, dan cara memanggil metodenya. Meskipun kami senang dengan keberhasilan awal kami, kami masih perlu memperhatikan fakta bahwa program kami tidak mengosongkan memori yang dialokasikan sebelum keluar. Selanjutnya Artikel kita akan belajar membersihkan diri kita sendiri.

Sumber: www.habr.com

Tambah komentar