áá±á¬ááºážáá«ážá á¡ááŒá±á¬ááºážá¡áá¬ááᯠáá»áœááºá¯ááºáá¶á០áá°áá«áááºá
á¡áá»ááºááŒá¡ááá·áºáá®áá¬ááᯠáááºáá®ážááŒááºážá
áá±á¬ááºáá¯á¶ážá
á€áá±á¬ááºážáá«ážááœáẠáá»áœááºá¯ááºááá¯á·ááẠá¡áá»ááºááŒá¡ááá·áºáá®áá¬áááºáááºážááᯠá á¯á ááºážááŒá®áž filter á០ááá¯ááºážáá¬ááŒááºážááááºááᯠáááºááá¯á·áááºááááºááᯠáá±á·áá¬áá«áááºá ááá¯ááºážáá¬ááŸá¯ áááá»ááŸá¯ááᯠá¡áá²ááŒááºááŒáá«á áá¯á·á
áá®áá®áá¬áá¯ááºááœáŸáá·áºáá°á០áá¶á·ááá¯ážáá±ážááá·áº á á áºáá¯ááºááŸá¯á¡á á¯ááœáẠMS_VOLUME ááẠáááºážááŒááºáááºážááœá¬ážáá±á¬ signal á RMS á¡ááá·áºááᯠááá¯ááºážáá¬ááá¯ááºááŒá®áž á¡áá»ááºááŒááŸá¯ááᯠáá»á±á¬á·áá»áᬠá¡áá¯á¶ážáááºááŒá®áž áá»áŸá±á¬áºááá·áºááá¬ážáá±á¬áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá áœá¬ááᯠáá¯ááºáá±á¬ááºáá±ážááá¯ááºááá·áº á á áºáá¯ááºááŸá¯áá áºáᯠáá«áááºáááºá áá»áœááºá¯ááºááá¯á·ááẠáá±á¬ááºááá¯ááºážááœáẠá€á á áºáá¯ááºááŸá¯ááœáẠáá±á¬ááºážáá«ážáá áºáá¯áá¯á¶ážááᯠááŒáŸá¯ááºááŸá¶áá«áááºá áá«áá±ááá·áº á¡áá¯á¡áá»áááºááŸá¬áá±á¬á· á¡á²áá«ááᯠáá®áá¬á¡ááŒá Ạáá¯á¶ážáááºá
MS_VOLUME á á áºáá¯ááºááŸá¯ááá¯á· áá±ážááá¯á·ááá·áº á¡áá»ááºááŒááŸá¯á០á¡áá¶áááºááᯠáá»áááºáááºáá¬ážááá·áº á¡ááœááºááá¯á· á¡áá¶ááœáẠáá»ááºááá±áá¬á¡á¬áž á¡áá¯á¶ážááŒá¯áá«áááºá
á€á¥ááá¬ááœááºá áá»áœááºá¯ááºááá¯á·ááẠá¡áááºážáááºááœá²ááŒá¬ážáá±á¬áá¯ááºááœáẠgenerator filter ááá¯á¡áá¯á¶ážááŒá¯áá«ááẠ- áááºážááẠáá»áœááºá¯ááºááá¯á·á¡ááœáẠsingle-tone signal ááá¯áá¯ááºáá±ážáááá·áºáááºá i.e. sinusoidal oscillation áá áºáá¯áá¬áá«ááŸááá±á¬ á¡áá»ááºááŒáá áºáá¯á
ááŒáááºááŸá¯ááºážááŸáá·áº ááá¬áá¡ááŒááºá signal áá¯ááºáá±ážááá·áºá¡áá»áááºááᯠáá»áœááºá¯ááºááá¯á· áááºááŸááºááẠááá¯á¡ááºáááºááŒá áºááŒá®ážá ááá¯ááºážáá¬áááºá¡ááœáẠMS_VOLUME filter ááŸáááá·áº áá¯á¶áá±á¬ááºáá±á¬ááá°áá¬á¡áá±á¡ááœááºááᯠááŒááºááœá¬ážá á±ááẠáááºážááẠáá¯á¶áá±á¬ááºááá«áááºá áááºáááºáá»á¬ážááᯠáá®ážá ááºááá¯á· ááœáŸá²ááŒá±á¬ááºážáááºá MSDtmfGenCustomTone ááœá²á·á ááºážáá¯á¶ááᯠá¡áá¯á¶ážááŒá¯áááº-
struct _MSDtmfGenCustomTone{
char tone_name[8]; /* ТекÑÑПвПе МазваМОе ÑОгМала Оз 8 бÑкв.*/
int duration; /* ÐлОÑелÑМПÑÑÑ ÑОгМала в ЌОллОÑекÑМЎаÑ
.*/
int frequencies[2]; /* ÐаÑа ÑаÑÑÐŸÑ ÐžÐ· кПÑПÑÑÑ
ЎПлжеМ ÑПÑÑПÑÑÑ Ð²ÑÑ
ПЎМПй ÑОгМал. */
float amplitude; /* ÐЌплОÑÑЎа ÑПМПв, 1.0 ÑППÑвеÑÑÑвÑÐµÑ ÑÑÐŸÐ²ÐœÑ 0 ÐŽÐ ÐŸÑ ÐŒÐžÐ»Ð»ÐžÐ²Ð°ÑÑа Ма МагÑÑзке 600 ÐÐŒ.*/
int interval; /* ÐаÑза в ЌОллОÑекÑМЎаÑ
пеÑеЎ МаÑалПЌ пПвÑПÑМПгП пÑПОгÑÑÐ²Ð°ÐœÐžÑ ÑОгМала.*/
int repeat_count; /* ÐПлОÑеÑÑвП пПвÑПÑПв.*/
};
typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;
áá®ážá ááºá áááºáááºá áá»áœááºá¯ááºááá¯á·ááẠáááºážá MS_DTMF_GEN_PLAY_CUSTOM áááºážáááºážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
á¡áá»ááºááŒáá¯ááºáá±á¬ááºááŒááºážá ááááºááá¯á·ááŒááºáž ááá¬áž-
á€á¡á á®á¡á ááºááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá·áº áááá¯ááááºáá¯ááºááᯠá¡á±á¬ááºááœáẠááŒáá¬ážáááºá
/* Ѐайл mstest3.c */
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/msvolume.h>
int main()
{
ms_init();
/* СПзЎаеЌ ÑкзеЌплÑÑÑ ÑОлÑÑÑПв. */
MSFilter *voidsource=ms_filter_new(MS_VOID_SOURCE_ID);
MSFilter *dtmfgen=ms_filter_new(MS_DTMF_GEN_ID);
MSFilter *volume=ms_filter_new(MS_VOLUME_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, volume, 0);
ms_filter_link(volume, 0, snd_card_write, 0);
/* ÐПЎклÑÑаеЌ ОÑÑПÑМОк ÑакÑПв. */
ms_ticker_attach(ticker,voidsource);
MSDtmfGenCustomTone dtmf_cfg;
/* УÑÑаМавлОваеЌ ÐžÐŒÑ ÐœÐ°ÑегП ÑОгМала, Ð¿ÐŸÐŒÐœÑ ÐŸ ÑПЌ, ÑÑП в ЌаÑÑОве ÐŒÑ ÐŽÐŸÐ»Ð¶ÐœÑ
ПÑÑавОÑÑ ÐŒÐµÑÑП ÐŽÐ»Ñ ÐœÑлÑ, кПÑПÑÑй ПбПзМаÑÐ°ÐµÑ ÐºÐŸÐœÐµÑ ÑÑÑПкО. */
strncpy(dtmf_cfg.tone_name, "busy", sizeof(dtmf_cfg.tone_name));
dtmf_cfg.duration=1000;
dtmf_cfg.frequencies[0]=440; /* ÐÑЎеЌ геМеÑОÑПваÑÑ ÐŸÐŽÐžÐœ ÑПМ, ÑаÑÑПÑÑ Ð²ÑПÑПгП ÑПМа ÑÑÑаМПвОЌ в 0.*/
dtmf_cfg.frequencies[1]=0;
dtmf_cfg.amplitude=1.0; /* ТакПй аЌплОÑÑЎе ÑОМÑÑа ЎПлжеМ ÑППÑвеÑÑÑвПваÑÑ ÑезÑлÑÑÐ°Ñ ÐžÐ·ÐŒÐµÑÐµÐœÐžÑ 0.707.*/
dtmf_cfg.interval=0.;
dtmf_cfg.repeat_count=0.;
/* ÐклÑÑаеЌ звÑкПвПй геМеÑаÑПÑ. */
ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM, (void*)&dtmf_cfg);
/* ÐаеЌ, вÑÐµÐŒÑ Ð¿ÐŸÐ»ÐŸÐ²ÐžÐœÑ ÑекÑМЎÑ, ÑÑÐŸÐ±Ñ ÐžÐ·ÐŒÐµÑОÑÐµÐ»Ñ ÐœÐ°ÐºÐŸÐ¿ÐžÐ» ЎаММÑе. */
ms_usleep(500000);
/* ЧОÑаеЌ ÑезÑлÑÑÐ°Ñ ÐžÐ·ÐŒÐµÑеМОÑ. */
float level=0;
ms_filter_call_method(volume, MS_VOLUME_GET_LINEAR,&level);
printf("ÐЌплОÑÑЎе ÑОМÑÑа %f вПлÑÑ ÑППÑвеÑÑÑвÑÐµÑ ÑÑеЎМекваЎÑаÑОÑеÑкПе зМаÑеМОе %f вПлÑÑ.n", dtmf_cfg.amplitude, level);
}
áá»áœááºá¯ááºááá¯á·ááẠááááºááá²á·ááá¯á· áá»áœááºá¯ááºááá¯á·á á¥ááá¬ááᯠááá¯ááºá¡áááºááŒáá·áºáᬠá á¯á ááºážáá«áááºá mstest3. áááºážááᯠrun ááŒá®ážááááºááá¯ááá°ááŒáá«á áá¯á·á
ÐЌплОÑÑЎе ÑОМÑÑа 1.000000 вПлÑÑ ÑППÑвеÑÑÑвÑÐµÑ ÑÑеЎМекваЎÑаÑОÑеÑкПе зМаÑеМОе 0.707733 вПлÑÑ.
áááºááŒááºááá·áºá¡ááá¯ááºážá ááá¯ááºážáá¬ááŸá¯ááááºááẠáá áºáááºááœá²áá¬ážáá±á¬ ááŸá áºáááºááááºážá ááŸá áºáááºááááºážááŸáá·áºáá®áá»áŸáá±á¬ áá®á¡áá¯áá®áááºááá¯ážááŸáá·áº áá®áá»áŸáá±á¬ áááááá¿ááá±áá¬ááŸáá·áº ááá¯ááºááá¯ááºáá±áááº- sqr(2)/2=0,7071067811865475
áááºááá¯ážá¡ááŸááºá០ááááºá ááŸáá¯ááºážáááœá±áááºááŸá¯ááẠ0.1% ááŒá áºáááºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááŒáá·áºáá¯á¶ážá¡áá»ááºááŒá¡ááá·áºááœáẠááá¯ááºážáá¬ááŸá¯á¡ááŸá¬ážá¡ááœááºážááᯠá¡áá²ááŒááºáá²á·áááºá ááá¯á·ááŒá±á¬áá·áº á¡ááá·áºáá»á±á¬á·áá¬áááºááŸáá·áºá¡áá»áŸ error ááá¯ážáá¬ááá·áºáááºá áááá·áºáá±á¬á¡áá»ááºááŒá¡ááá·áºáá»á¬ážá¡ááœáẠáááºážááᯠáááºááá¯ááºááá¯ááºá¡áá²ááŒááºááẠáá»áœááºá¯ááºá¡ááŒá¶ááŒá¯á¡ááºáá«áááºá
áá±á¬ááºáá±á¬ááºážáá«ážááœáẠtone detector ááᯠá¡áá¯á¶ážááŒá¯á input ááœáẠáá±ážáá¬ážáá±á¬ ááŒáááºááŸá¯ááºážáá áºáá¯á tone signal ááŸáááŒá±á¬ááºáž ááááŸáááá¯ááºáá±á¬ circuit áá áºáá¯ááᯠá á¯á ááºážáá«áááºá á á áºáá¯ááºááŸá¯áá»á¬ážá០áá¯ááºáá±ážááá·áº á¡ááŒá áºá¡áá»ááºáá»á¬ážááᯠá á®áá¶áá±á¬ááºááœááºáá¯á¶ááá¯áááºáž áá»áœááºá¯ááºááá¯á· áá±á·áá¬áá«áááºá
source: www.habr.com