๊ธ์ ์์ฌ๋ ์ ๊ธ์์ ๊ฐ์ ธ์์ต๋๋ค.
ํค ์์ฑ๊ธฐ ๋ง๋ค๊ธฐ
์ด์
์ค๋์ ์ฌ์ด๋ ์นด๋์์ ํค ์ ํธ๋ฅผ ์์ฑํ ์ ์๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์๋ ํ์๋ ์ฌ์ด๋ ์์ฑ๊ธฐ ํ๋ก์ ํํฐ๋ฅผ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค.
๋ค์ด์ด๊ทธ๋จ์ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฝ์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ์ดํฐ ํ๋ฆ์ด ์ด๋ํ๋ ๋ฐฉํฅ์ ๋๋ค. ํ์ดํ๋ ์ด๋ฅผ ์์ํฉ๋๋ค. ์ง์ฌ๊ฐํ์ ๋ฐ์ดํฐ ๋ธ๋ก์ ์ฒ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ํํฐ๋ฅผ ๋ํ๋ ๋๋ค. ์ง์ฌ๊ฐํ ์์๋ ์ญํ ์ด ํ์๋์ด ์์ผ๋ฉฐ, ๋ฐ๋ก ์๋์๋ ํํฐ ์ ํ์ด ๋๋ฌธ์๋ก ํ์๋์ด ์์ต๋๋ค. ์ง์ฌ๊ฐํ์ ์ฐ๊ฒฐํ๋ ํ์ดํ๋ ๋ฐ์ดํฐ ๋ธ๋ก์ด ํํฐ์์ ํํฐ๋ก ์ ๋ฌ๋๋ ๋ฐ์ดํฐ ๋๊ธฐ์ด์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํํฐ์๋ ๋ง์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ด ์์ ์ ์์ต๋๋ค.
๋ชจ๋ ๊ฒ์ ํํฐ์์ ๋ฐ์ดํฐ๊ฐ ๊ณ์ฐ๋๋ ํ ํฌ๋ฅผ ์ค์ ํ๋ ํด๋ญ ์์ค์์ ์์๋ฉ๋๋ค. ํด๋ก ์ฃผ๊ธฐ์ ๋ฐ๋ผ ๊ฐ ํํฐ๋ ์ ๋ ฅ์ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ ๋ธ๋ก์ ์ฒ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๊ฐ ๋ด๊ธด ๋ธ๋ก์ ๋๊ธฐ์ด์ ๋ฃ์ต๋๋ค. ๋จผ์ ํด๋ก ์์ค์ ๊ฐ์ฅ ๊ฐ๊น์ด ํํฐ๊ฐ ๊ณ์ฐ์ ์ํํ ๋ค์ ์ถ๋ ฅ์ ์ฐ๊ฒฐ๋ ํํฐ(์ถ๋ ฅ์ด ๋ง์ ์ ์์) ๋ฑ์ ์ํํฉ๋๋ค. ์ฒด์ธ์ ๋ง์ง๋ง ํํฐ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ํ ์ ์๊ณ๊ฐ ๋์ฐฉํ ๋๊น์ง ์คํ์ด ์ค์ง๋ฉ๋๋ค. ๋นํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก 10๋ฐ๋ฆฌ์ด ๊ฐ๊ฒฉ์ ๋ฐ๋ฆ ๋๋ค.
๋ค์ด์ด๊ทธ๋จ์ผ๋ก ๋์๊ฐ ๋ณด๊ฒ ์ต๋๋ค. ํด๋ก ์ฌ์ดํด์ ๋ฌด์ ์์ค์ ์ ๋ ฅ์ ๋๋ฌํฉ๋๋ค. ์ด๋ ๊ฐ ํด๋ก ์ฌ์ดํด์ ์ถ๋ ฅ์์ โโXNUMX์ ํฌํจํ๋ ๋ฐ์ดํฐ ๋ธ๋ก์ ์์ฑํ๋ ๋ฐ ๋ฐ์ ํํฐ์ ๋๋ค. ์ด ๋ธ๋ก์ ์ฌ์ด๋ ์ํ ๋ธ๋ก์ผ๋ก ๊ฐ์ฃผํ๋ฉด ์ด๋ ์นจ๋ฌต์ ์ง๋์ง ์์ต๋๋ค. ์ธ๋ป ๋ณด๊ธฐ์๋ ์นจ๋ฌต์ผ๋ก ๋ฐ์ดํฐ ๋ธ๋ก์ ์์ฑํ๋ ๊ฒ์ด ์ด์ํด ๋ณด์ ๋๋ค. ๊ฒฐ๊ตญ ๋ค์ ์๋ ์์ง๋ง ์ด๋ฌํ ๋ธ๋ก์ ์ฌ์ด๋ ์ ํธ ์์ฑ๊ธฐ์ ์๋์ ํ์ํฉ๋๋ค. ์์ฑ๊ธฐ๋ ์ด๋ฌํ ๋ธ๋ก์ ๋น ์ข ์ด์ฒ๋ผ ์ฌ์ฉํ์ฌ ์ฌ์ด๋ ์ํ์ ๋ น์ํฉ๋๋ค. ์ ์ ์ํ์์๋ ์์ฑ๊ธฐ๊ฐ ๊บผ์ง๊ณ ๋จ์ํ ์ ๋ ฅ ๋ธ๋ก์ ์ถ๋ ฅ์ผ๋ก ์ ๋ฌํฉ๋๋ค. ๋ฐ๋ผ์ ์นจ๋ฌต์ ๋ธ๋ก์ ์ ์ฒด ํ๋ก๋ฅผ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณ๊ฒฝ ์์ด ํต๊ณผํ์ฌ ์ฌ์ด๋ ์นด๋์ ๋๋ฌํฉ๋๋ค. ์ ๋ ฅ์ ์ฐ๊ฒฐ๋ ๋๊ธฐ์ด์์ ์๋์ผ๋ก ๋ธ๋ก์ ๊ฐ์ ธ์ต๋๋ค.
๊ทธ๋ฌ๋ ์์ฑ๊ธฐ์ ์ฌ์ด๋ ์ฌ์ ๋ช ๋ น์ด ์ฃผ์ด์ง๋ฉด ๋ชจ๋ ๊ฒ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค. ์ฌ์ด๋ ์ํ์ ์์ฑํ๊ธฐ ์์ํ๊ณ ์ด๋ฅผ ์ ๋ ฅ ๋ธ๋ก์ ์ํ๋ก ๋์ฒดํ๊ณ ๋ณ๊ฒฝ๋ ๋ธ๋ก์ ์ถ๋ ฅ์ ๋ฃ์ต๋๋ค. ์ฌ์ด๋ ์นด๋๊ฐ ์๋ฆฌ๋ฅผ ์ฌ์ํ๊ธฐ ์์ํฉ๋๋ค. ๋ค์์ ์์์ ์ค๋ช ํ ์์ ๊ณํ์ ๊ตฌํํ๋ ํ๋ก๊ทธ๋จ์ ๋๋ค.
/* ะคะฐะนะป 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)
์ฌ๊ธฐ์ ์ฒซ ๋ฒ์งธ ์ธ์๋ ์์ค ํํฐ์ ๋ํ ํฌ์ธํฐ์ด๊ณ ๋ ๋ฒ์งธ ์ธ์๋ ์์ค ์ถ๋ ฅ ๋ฒํธ์ ๋๋ค(์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋ฒํธ๋ XNUMX๋ถํฐ ์์๋ฉ๋๋ค). ์ธ ๋ฒ์งธ ์ธ์๋ ์์ ์ ํํฐ์ ๋ํ ํฌ์ธํฐ์ด๊ณ , ๋ค ๋ฒ์งธ ์ธ์๋ ์์ ์ ์ ๋ ฅ ๋ฒํธ์ ๋๋ค.
๋ชจ๋ ํํฐ๊ฐ ์ฐ๊ฒฐ๋๊ณ ํด๋ก ์์ค๊ฐ ๋ง์ง๋ง์ ์ฐ๊ฒฐ๋ฉ๋๋ค(์ดํ ๊ฐ๋จํ ํฐ์ปค๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค). ๊ทธ ํ ์ฌ์ด๋ ํ๋ก๊ฐ ์๋ํ๊ธฐ ์์ํ์ง๋ง ์์ง ์ปดํจํฐ ์คํผ์ปค์์๋ ์๋ฌด ์๋ฆฌ๋ ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์ฌ์ด๋ ์์ฑ๊ธฐ๊ฐ ๊บผ์ง๊ณ ์ ๋ ฅ ๋ฐ์ดํฐ ๋ธ๋ก์ ์กฐ์ฉํ ํต๊ณผํฉ๋๋ค. ํค ์์ฑ์ ์์ํ๋ ค๋ฉด ์์ฑ๊ธฐ ํํฐ ๋ฉ์๋๋ฅผ ์คํํด์ผ ํฉ๋๋ค.
์ ํ๊ธฐ์ "1" ๋ฒํผ์ ๋๋ฅด๋ ๊ฒ์ ํด๋นํ๋ ํฌํค(DTMF) ์ ํธ๋ฅผ ์์ฑํ๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ms_filter_call_method() MS_DTMF_GEN_PLAY ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ฌ์ ์ ํธ๊ฐ ๋์ํด์ผ ํ๋ ์ฝ๋์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค.
๋จ์ ๊ฒ์ ํ๋ก๊ทธ๋จ์ ์ปดํ์ผํ๋ ๊ฒ๋ฟ์ ๋๋ค.
$ gcc mstest2.c -o mstest2 `pkg-config mediastreamer --libs --cflags`
๊ทธ๋ฆฌ๊ณ ๋ค์์ ์คํํ์ธ์:
$ ./mstest2
ํ๋ก๊ทธ๋จ์ ์์ํ๋ฉด ์ปดํจํฐ ์คํผ์ปค์์ ๋ ๊ฐ์ง ํค์ผ๋ก ๊ตฌ์ฑ๋ ์งง์ ์ฌ์ด๋ ์ ํธ๊ฐ ๋ค๋ฆฝ๋๋ค.
์ฐ๋ฆฌ๋ ์ฒซ ๋ฒ์งธ ์ฌ์ด๋ ํ๋ก๋ฅผ ๊ตฌ์ถํ๊ณ ์ถ์ํ์ต๋๋ค. ํํฐ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ, ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ ๋ฐ ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์์ต๋๋ค. ์ด๊ธฐ ์ฑ๊ณต์ ๋ง์กฑํ์ง๋ง ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋๊ธฐ ์ ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ์ง ์๋๋ค๋ ์ฌ์ค์ ์ฌ์ ํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํฉ๋๋ค. ๋ค์์
์ถ์ฒ : habr.com