áá±á¬ááºážáá«ážá á¡ááŒá±á¬ááºážá¡áá¬ááᯠáá»áœááºá¯ááºáá¶á០áá°áá«áááºá
á¡áá¶áááºážáááááá¬
áá±á¬ááºáá¯á¶ážá
ááŸá±ážáá±ááºá¡áá«á áááá¬ážá á¯ááá¯ááºáž TV áááŸááá±á¬á¡áá« áááºáááºááá·áºááẠááá¬áá¬áá»á¬ážá¡áá¯á¶ážááŒá¯á áá»ááºáááºáá»á¬ážááᯠááŒá±á¬ááºážáá²á·ááŒáᬠáá®áá®áá¯ááºáá¯ááºáá°áá áºáŠážááẠáááºážááá¯á·áá ááºáá á¹á ááºážáá»á¬ážááᯠááŒáá¯ážáá²á·á¡áá±ážááááºážá áá áºááŒáá·áº áááºáááºáá±ážáá²á·áá±á¬ ááá¯ááºáá¶ááŒá¬ážáááºážááá¬ááá¯ááºáᬠááááºážá á¬ááŸááºážáááºážááœá²áá»á¬ážááœáẠáááºážááŒááºáá±á¬ááááºážáá»á¬áž ááœááºáá±á«áºáá¬áá²á·áááºá áá®áá¯ááºááœááºáááá¯ážááẠáá¯á¶ááŸááºááá¯ááºáá±á¬áá»ááºážáááºáááºážááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŒá±á¬áá·áº áááºááá®ááá«áá² áá®áá¯ááºááœááºáááá¯ážááᯠáááºáááºá á±ááŒá±á¬ááºáž á¡áá±ážá áááºá¡áá»ááºá¡áááºáá»á¬ážá¡á á¡áá±ážááááºážááá¯ááºááẠá ááºááá¯ááºážááá¯ááºáá¬ááŒá áºááŒá®áž áááºáááºááá¯áá¯ááºážááŸáá·áº ááŒá±á¬ááºáá¯á¶ážááŒá°ážáá áºáá¯á¶ážááá¯á·áá±á«ááºážá ááºáá¬ážááá·áº áá®ááá°áááá¬áá áºáá¯ááŒá áºáááºá ááŒá±á¬ááºáá¯á¶ážááŒá°ážááááºááœáẠá¡áá»á¬ážá¡áá»áá¯ážáá»áá¯ážááŸáááá·áº ááá¹áá¯ááááºáá«áá»á¬ážáá«ááŸáááŒá®áž áá áºáááºáááºáá¶áá áºáá¯ááááœá¬ážáá±á¬á¡áá« ááááºáá«ááẠáááºážáááá¯ááºááá¯ááºááŒáááºááŸá¯ááºážááŒáá·áº á áááºááŒááºáá¬áááºá á¡á¬ááá¬áá±á¬ááºážááœáẠááŒá áºááá¯ááºáááºá áá®ááœá®ááŸá á¡á®áááºáááœááºážáá áºáá á¹á ááºážáá»á¬ážááẠá€á¡áá»ááºááŒááŸá¯ááᯠááŒá¬ážááŒá®áž áááºážáááŒáááºááŸá¯ááºážááᯠáá¯á¶ážááŒááºááŒá®ážáá±á¬áẠááá·áºáá»á±á¬áºáá±á¬áá¯ááºáá±á¬ááºáá»ááºááᯠáá¯ááºáá±á¬ááºáá²á·ááẠ- áá»ááºáááºááá¯ááŒá±á¬ááºážáá«á á¡áá¶á¡ááá¯ážá¡áá»ááºááá¯ááŒá±á¬ááºážáá²áá«á áá®áá®ááá¯ááááºááá¯ááºáá«á
ááá±á·áá»áœááºá¯ááºááá¯á·ááẠmedia streamer ááŸáá·áºáááºáááºáá±á¬á¡ááááá¬ááá¯á¡áá¯á¶ážááŒá¯á ဠcommand transmission system ááá¯ááŒááºáááºáááºáá±á¬ááºáááºááŒáá¯ážá á¬ážáá«áááºá
á¡áá±ážááááºážááá¯ááºááᯠá¡áá¯áá°áááºá áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·á á¡áá¶áá¯ááºáá¯ááºááá·áº á¥ááá¬á á á¬áá¬ážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá áá±á¬á·áááºááŒááºážá០áá»ááºááá±áᬠááŒáááºááŸá¯ááºážááᯠááááºážáá»á¯ááºááŒááºážááŸáá·áº ááœááºááá¯ážááºááá¯á· áááºáá¶áááŸáááá·áº ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠáá¯ááºáá±ážááá·áº áá®áá¯ááºáá«ááŒáá·áº áááºáá¶áá°á¡á¬áž áááºážááœáẠáá±á«ááºážááá·áºáá«áááºá á¡ááŒá±á¬ááºážá¡áá²ááŒá®ážáá±á¬ááºá áá»ááºááá±áá¬ááẠá¡áá¶á¡ááá¯ážá¡áá»ááºááᯠááá¯áž/áá»áŸá±á¬á·áá»ááẠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážá áá»ááºáááºááᯠááŒá±á¬ááºážáá²áááºá áá®áá®ááᯠááœáá·áº/ááááºááẠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠáá¯ááºáá¶áá«áẠ6 ááŒáááºááŸá¯ááºážááŒáá·áº á¡áá¶ááœááºááá«áááºá detector ááᯠconfigure áá¯ááºáááºá á¡á±á¬ááºáá« ááœá²á·á ááºážáá¯á¶ááᯠá¡áá¯á¶ážááŒá¯áááº-
struct _MSToneDetectorDef{
char tone_name[8];
int frequency; /**<Expected frequency of the tone*/
int min_duration; /**<Min duration of the tone in milliseconds */
float min_amplitude; /**<Minimum amplitude of the tone, 1.0 corresponding to the normalized 0dbm level */
};
typedef struct _MSToneDetectorDef MSToneDetectorDef;
á€ááœá²á·á ááºážáá¯á¶áá»á¬ážáá²á០10 áá¯ááᯠdetector áá áºáá¯á¡á¬áž áá±ážá áœááºážááá¯ááºáááºá ááá¯á·ááŒá±á¬áá·áº detector áá áºáá¯ááẠtwo-tone signals áááºáá¯ááᯠdetect áá¯ááºááá¯á· configure áá¯ááºááá¯ááºáá«áááºá ááá¯á·áá±á¬áº áá»áœááºá¯ááºááá¯á·ááẠsingle-tone signals ááŒá±á¬ááºáá¯ááá¯áᬠá¡áá¯á¶ážááŒá¯áá«áááºá áááºáááºáá»á¬ážááᯠdetector ááá¯á·ááœáŸá²ááŒá±á¬ááºážááẠMS_TONE_DETECTOR_ADD_SCAN áááºážáááºážááᯠá¡áá¯á¶ážááŒá¯áá¬ážáááºá
á¡ááá¯ááŸááá±á¬ ááŒáááºááŸá¯ááºáž á¡á áááºá¡ááá¯ááºážáá»á¬ážáá«ááŸááá±á¬ á¡áá»ááºááŒááŸá¯áá áºáá¯ááẠáááºážá input ááá¯á·áá±á¬ááºááŸáááŒá±á¬ááºáž detector á០áá»áœááºá¯ááºááá¯á·á¡á¬áž á¡áááá±ážáááºá¡ááœááºá á€ááá á¹á ááœáẠáááºážá áááºááá·áº callback function ááᯠáááºážá¡á¬áž áá±ážááá«áááºá áááºážááẠfunction ááá¯á¡áá¯á¶ážááŒá¯ááŒá®ážáá¯ááºáá±á¬ááºáááºá ms_filter_set_notify_callback(). á¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážá¡áá±ááŸáá·áºá áááºážááẠfilter ááá¯á·ááœáŸááºááŒáá»ááºáá áºáá¯á ááŒááºáá±á«áºááá·áºáá¯ááºáá±á¬ááºáá»ááºá¡ááœááºááœáŸááºááŒáá»ááºáá áºáá¯ááŸáá·áº callback function (á¡áá¯á¶ážááŒá¯áá°áá±áá¬) ááá¯á·áá»áœááºá¯ááºááá¯á·ááŒááºáááºážááá¯áá±á¬áá±áá¬áá®ááá¯á·ááœáŸááºááŒáá»ááºáá áºáá¯áááºáá¶áááŸááááºá
áá±á¬ááºááŸááºážáááááá¬ááᯠá¡á áá»áá¯ážááá¯ááºáá±á¬á¡áá«á ááŒááºáá±á«áºááá·áºáá¯ááºáá±á¬ááºáá»ááºááẠá¡áá¯á¶ážááŒá¯áá°áá±áá¬á áá±á¬ááºááŸááºážááá·áº á á áºáá¯ááºááŸá¯áá®ááá¯á· ááœáŸááºááŒáá»ááºáá áºáá¯á ááŒá áºáááºááᯠáááºááŸááºáá±ážááá·áºá áá áºááŸáá·áº á¡ááŒá áºá¡áá»ááºááᯠáá±á¬áºááŒááá·áº ááœá²á·á ááºážáá¯á¶ááᯠáááºáá¶áááŸááááá·áºáááº-
/** * Structure carried as argument of the MS_TONE_DETECTOR_EVENT**/
struct _MSToneDetectorEvent{
char tone_name[8]; /* ÐÐŒÑ ÑПМа кПÑПÑПе ÐŒÑ ÐµÐŒÑ ÐœÐ°Ð·ÐœÐ°ÑОлО пÑО МаÑÑÑПйке ЎеÑекÑПÑа. */
uint64_t tone_start_time; /* ÐÑÐµÐŒÑ Ð² ЌОллОÑекÑМЎаÑ
, кПгЎа ÑПМ бÑл ПбМаÑÑжеМ. */
};
typedef struct _MSToneDetectorEvent MSToneDetectorEvent;
á¡áá»ááºááŒáá¯ááºáá±á¬ááºááŒááºážá ááá±á¬ááºááá¬ážááᯠáá±á«ááºážá ááºáá¯á¶ááœáẠááŒáá¬ážáááºá
áá±á¬ááºážááŒá®á ááᯠáááá¯ááááºáá¯ááºááᯠááŸááºáá»ááºáá»á¬ážááŒáá·áº áá±ážáá¬ážáááºá
/* Ѐайл mstest4.c ÐЌОÑаÑÐŸÑ Ð¿ÑлÑÑа ÑпÑÐ°Ð²Ð»ÐµÐœÐžÑ Ðž пÑОеЌМОка. */
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/msvolume.h>
#include <mediastreamer2/mstonedetector.h>
/* ÐПЎклÑÑаеЌ загПлПвПÑÐœÑй Ñайл Ñ ÑÑМкÑОÑЌО ÑпÑÐ°Ð²Ð»ÐµÐœÐžÑ ÑПбÑÑОÑЌО
* ЌеЎОаÑÑÑОЌеÑа. */
#include <mediastreamer2/mseventqueue.h>
/* ЀÑМкÑÐžÑ ÐŸÐ±ÑаÑМПгП вÑзПва, ПМа бÑÐŽÐµÑ Ð²ÑзваМа ÑОлÑÑÑПЌ, как ÑПлÑкП ПМ
* ПбМаÑÑÐ¶ÐžÑ ÑПвпаЎеМОе Ñ
аÑакÑеÑОÑÑОк вÑ
ПЎМПгП ÑОгМала Ñ Ð·Ð°ÐŽÐ°ÐœÐœÑЌО. */
static void tone_detected_cb(void *data, MSFilter *f, unsigned int event_id,
MSToneDetectorEvent *ev)
{
printf(" ÐÑОМÑÑа кПЌаМЎа: %sn", ev->tone_name);
}
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);
MSFilter *detector = ms_filter_new(MS_TONE_DETECTOR_ID);
/* ÐÑОÑаеЌ ЌаÑÑОв МаÑ
ПЎÑÑОйÑÑ Ð²ÐœÑÑÑО ЎеÑекÑПÑа ÑПМПв, ПМ ПпОÑÑваеÑ
* ПÑПбÑе пÑОЌеÑÑ ÑазÑÑкОваеЌÑÑ
ÑОгМалПв.*/
ms_filter_call_method(detector, MS_TONE_DETECTOR_CLEAR_SCANS, 0);
/* СПзЎаеЌ ОÑÑПÑМОк ÑакÑПв - ÑОкеÑ. */
MSTicker *ticker=ms_ticker_new();
/* СПеЎОМÑеЌ ÑОлÑÑÑÑ Ð² ÑепПÑкÑ. */
ms_filter_link(voidsource, 0, dtmfgen, 0);
ms_filter_link(dtmfgen, 0, volume, 0);
ms_filter_link(volume, 0, detector, 0);
ms_filter_link(detector, 0, snd_card_write, 0);
/* ÐПЎклÑÑаеЌ к ÑОлÑÑÑÑ ÑÑМкÑÐžÑ ÐŸÐ±ÑаÑМПгП вÑзПва. */
ms_filter_set_notify_callback(detector,
(MSFilterNotifyFunc)tone_detected_cb, NULL);
/* ÐПЎклÑÑаеЌ ОÑÑПÑМОк ÑакÑПв. */
ms_ticker_attach(ticker,voidsource);
/* СПзЎаеЌ ЌаÑÑОв, кажЎÑй ÑÐ»ÐµÐŒÐµÐœÑ ÐºÐŸÑПÑПгП ПпОÑÑÐ²Ð°ÐµÑ Ñ
аÑакÑеÑОÑÑОкÑ
* ПЎМПгП Оз ÑПМПв, кПÑПÑÑй ÑÑебÑеÑÑÑ ÐŸÐ±ÐœÐ°ÑÑжОваÑÑ: ТекÑÑПвПе ОЌÑ
* ЎаММПгП ÑлеЌеМÑа, ÑаÑÑПÑа в геÑÑаÑ
, ЎлОÑелÑМПÑÑÑ Ð² ЌОллОÑекÑМЎаÑ
,
* ЌОМОЌалÑÐœÑй ÑÑÐŸÐ²ÐµÐœÑ ÐŸÑМПÑОÑелÑМП 0,775Ð. */
MSToneDetectorDef scan[6]=
{
{"V+", 440, 100, 0.1}, /* ÐПЌаМЎа "УвелОÑОÑÑ Ð³ÑПЌкПÑÑÑ". */
{"V-", 540, 100, 0.1}, /* ÐПЌаМЎа "УЌеМÑÑОÑÑ Ð³ÑПЌкПÑÑÑ". */
{"C+", 640, 100, 0.1}, /* ÐПЌаМЎа "УвелОÑОÑÑ ÐœÐŸÐŒÐµÑ ÐºÐ°ÐœÐ°Ð»Ð°". */
{"C-", 740, 100, 0.1}, /* ÐПЌаМЎа "УЌеМÑÑОÑÑ ÐœÐŸÐŒÐµÑ ÐºÐ°ÐœÐ°Ð»Ð°". */
{"ON", 840, 100, 0.1}, /* ÐПЌаМЎа "ÐклÑÑОÑÑ ÑелевОзПÑ". */
{"OFF", 940, 100, 0.1} /* ÐПЌаМЎа "ÐÑклÑÑОÑÑ ÑелевОзПÑ". */
};
/* ÐеÑеЎаеЌ в ЎеÑекÑÐŸÑ ÑПМПв пÑОЌеÑÑ ÑОгМалПв. */
int i;
for (i = 0; i < 6; i++)
{
ms_filter_call_method(detector, MS_TONE_DETECTOR_ADD_SCAN,
&scan[i]);
}
/* ÐаÑÑÑаОваеЌ ÑÑÑÑкÑÑÑÑ, ÑпÑавлÑÑÑÑÑ Ð²ÑÑ
ПЎМÑÐŒ ÑОгМалПЌ геМеÑаÑПÑа.*/
MSDtmfGenCustomTone dtmf_cfg;
dtmf_cfg.tone_name[0] = 0;
dtmf_cfg.duration = 1000;
dtmf_cfg.frequencies[0] = 440;
/* ÐÑЎеЌ геМеÑОÑПваÑÑ ÐŸÐŽÐžÐœ ÑПМ, ÑаÑÑПÑÑ Ð²ÑПÑПгП ÑПМа ÑÑÑаМПвОЌ в 0.*/
dtmf_cfg.frequencies[1] = 0;
dtmf_cfg.amplitude = 1.0;
dtmf_cfg.interval = 0.;
dtmf_cfg.repeat_count = 0.;
/* ÐÑгаМОзÑеЌ ÑОкл ÑкаМОÑÐŸÐ²Ð°ÐœÐžÑ ÐœÐ°Ð¶Ð°ÑÑÑ
клавОÑ. ÐвПЎ ÐœÑÐ»Ñ Ð·Ð°Ð²ÐµÑÑаеÑ
* ÑОкл О ÑабПÑÑ Ð¿ÑПгÑаЌЌÑ. */
char key='9';
printf("ÐажЌОÑе клавОÑÑ ÐºÐŸÐŒÐ°ÐœÐŽÑ, заÑеЌ ввПЎ.n"
"ÐÐ»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐœÐžÑ Ð¿ÑПгÑÐ°ÐŒÐŒÑ Ð²Ð²ÐµÐŽÐžÑе 0.n");
while(key != '0')
{
key = getchar();
if ((key >= 49) && (key <= 54))
{
printf("ÐÑпÑавлеМа кПЌаМЎа: %cn", key);
/* УÑÑаМавлОваеЌ ÑаÑÑПÑÑ Ð³ÐµÐœÐµÑаÑПÑа в ÑППÑвеÑÑÑвОО Ñ
* кПЎПЌ МажаÑПй клавОÑО.*/
dtmf_cfg.frequencies[0] = 440 + 100*(key-49);
/* ÐклÑÑаеЌ звÑкПвПй геМеÑаÑÐŸÑ c ПбМПвлеММПй ÑаÑÑПÑПй. */
ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,
(void*)&dtmf_cfg);
}
ms_usleep(20000);
}
}
áá»áœááºá¯ááºááá¯á·ááẠáááá¯ááááºááᯠá á¯á ááºážááŒá®áž áá¯ááºáá±á¬ááºáááºá á¡áá¬á¡á¬ážáá¯á¶áž ááŸááºáááºáá«áá á áááºááŒá®ážáá±á¬áẠá€áááá¯ááááºáá²á·ááá¯á· á¡ááŒá¯á¡áá°áá áºáá¯áá¯ááᯠáá»áœááºá¯ááºááá¯á· áááŸáááá·áºáááº-
$ ./mstest4
ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) Invalid CTL default:0
ortp-warning-Could not attach mixer to card: Invalid argument
ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM default:0
ortp-warning-Strange, sound card Intel 82801AA-ICH does not seems to be capable of anything, retrying with plughw...
ÐажЌОÑе клавОÑÑ ÐºÐŸÐŒÐ°ÐœÐŽÑ, заÑеЌ ввПЎ.
ÐÐ»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐœÐžÑ Ð¿ÑПгÑÐ°ÐŒÐŒÑ Ð²Ð²ÐµÐŽÐžÑе 0.
ortp-warning-alsa_set_params: periodsize:256 Using 256
ortp-warning-alsa_set_params: period:8 Using 8
"1" á០"6" áá±á¬á·áá»á¬ážááá¯ááŸáááºáá«á "Enter" áá±á¬á·ááŒáá·áºá¡áááºááŒá¯áá«á áááºáááºá€á á¬áááºážáá²á·ááá¯á·áá±á¬áá áºáá¯áá¯ááá¯áááá·áºáááº-
2
ÐÑпÑавлеМа кПЌаМЎа: 2
ÐÑОМÑÑа кПЌаМЎа: V-
1
ÐÑпÑавлеМа кПЌаМЎа: 1
ÐÑОМÑÑа кПЌаМЎа: V+
3
ÐÑпÑавлеМа кПЌаМЎа: 3
ÐÑОМÑÑа кПЌаМЎа: C+
4
ÐÑпÑавлеМа кПЌаМЎа: 4
ÐÑОМÑÑа кПЌаМЎа: C-
0
$
á¡áááá·áºáá±ážáá¶áá»á¬ážááᯠá¡á±á¬ááºááŒááºá áœá¬ áá±ážááá¯á·ááŒá®áž detector á áááºážááá¯á·ááᯠááááŸáááá¯ááºáááºááᯠáá»áœááºá¯ááºááá¯á·ááœá±á·ááŒááºááá«áááºá
áá±á¬ááºáá±á¬ááºážáá«ážááœáẠáá»áœááºá¯ááºááá¯á·ááẠRTP áááá¯ááá¯áá±á¬ááᯠá¡áá¯á¶ážááŒá¯á Ethernet ááœááºáááºá០á¡áá¶á¡áá»ááºááŒááŸá¯ááᯠáá¯ááºááœáŸáá·áºááŒá®áž áá»áœááºá¯ááºááá¯á·á á¡áá±ážááááºážááá¯ááºááœáẠáááºážááá¯áá»ááºáá»ááºážá¡áá¯á¶ážááŒá¯áá«áááºá
source: www.habr.com