แกแขแแขแแแก แแแกแแแ แแฆแแแฃแแแ แฉแแแ
แขแแแแก แแแขแแฅแขแแ แ
แฒแแแแก
แซแแแ แแ แแจแ, แ แแแแกแแช แงแแแแ แแฏแแฎแก แแ แฐแฅแแแแ แขแแแแแแแแ แ แแ แแแแ แแแฎแแแแ แ แแ แฎแแแก แชแแแแแ แฅแแแแแ, แฃแชแฎแแฃแ แ แขแแฅแแแแฃแ แ แแ แแกแแก แแแแแฎแแแแแจแ แแแแแฉแแแ แแแแแแแขแ แแแแแแแ แแแแแแ, แ แแ แแ แ-แแ แแแ แขแแแแแแแแ แแก แแฌแแ แแแแแแแแ แแแแแกแ แแแฌแงแแแแแแแแแ แฃแกแแแแแ แแแกแขแแแชแแฃแ แ แแแ แแแแก แกแแจแฃแแแแแแ แแฆแญแฃแ แแ. แแแขแแแแแแแแ แชแแแแแแ แแแฎแแ, แ แแ แแแกแขแแแชแแฃแ แ แแแ แแแแก แแฃแแขแ แแฃแจแแแแแ แแแขแแ แแแแแก แแแ แแจแ แฃแฉแแแฃแแ แแแแแแแแก แแแแแงแแแแแแก แฌแงแแแแแแ - แแฃแแขแ แแแฅแแแแแฃแ แ แแงแ แแ แแฃแกแแแแแฃแ แ แแแกแขแ แฃแแแแขแแก - แแแขแแแแคแแแแกแ แแ แ แแแแแแแ แแก แฐแแแ แแแก แฌแแ แแแแแแแแแ. แ แแแแแแแ แแก แแแ แแแแแ แจแแแชแแแแ แกแฎแแแแแกแฎแแ แกแแแ แซแแก แแแขแแแแก แชแแแแแแ แแแก แแ แ แแแแกแแช แกแแกแ แแแ แแแแ แแ แ-แแ แ แแแแแแแก แแแฎแแแ, แชแแแแแแ แ แแแแแกแ แกแแฎแจแแ แแ แแแแฌแงแ แ แแแแ. แกแแแแ แแฃแแแ แแฅแแกแแแแแแแ. แขแแแแแแแแ แจแ แแแแฅแขแ แแแแแแ แแแแกแแแแ แแก แกแแแแแแ แแ, แแแกแ แกแแฎแจแแ แแก แแแแแแแแก แจแแแแแ, แจแแแกแ แฃแแ แจแแกแแแแแแกแ แแแฅแแแแแแ - แจแแชแแแแแ แแ แฎแ, แจแแชแแแแแ แฎแแ, แแแแแ แแแ แขแแแแแแแแ แ.
แแฆแแก แฉแแแ แจแแแแชแแแแแ แแ แแ แซแแแแแแก แแแแแชแแแแก แกแแกแขแแแแก แ แแแแแกแขแ แฃแฅแชแแแก แแแแแ แกแขแ แแแแ แแก แจแแกแแฎแแ แฉแแแแ แชแแแแแก แแแแแงแแแแแแ.
แแแกแขแแแชแแฃแ แ แแแ แแแแก แกแแแฃแแแชแแแกแแแแก, แฉแแแ แแแแแแแงแแแแแ แฉแแแแ แขแแแแก แแแแแ แแขแแ แแก แแแแแแแแก. แฉแแแ แแแก แแแแแแแขแแแ แแแแแ แแขแแ แแก แกแแฎแจแแ แแก แแแแขแ แแแก แแแแแแจแแแแก แแแญแแ แแ แแ แแแแฆแแแก แแแแแแแ แแ, แ แแแแแแช แแแแแกแชแแแก แแแฆแแแฃแ แแ แซแแแแแแแก แแแแกแแแจแ. แชแแแแแแแแก แจแแแแแ แแแแแ แแขแแ แแ แฃแแแ แแแแแฃแจแแแก 6 แกแแฎแจแแ แแก แขแแแ, แ แแแแแแแช แแแแแจแแคแ แแแ แแ แซแแแแแแแก แฎแแแก แแแแ แแแก/แจแแแชแแ แแแแก, แแ แฎแแก แจแแชแแแแก, แขแแแแแแแแ แแก แฉแแ แแแ/แแแแแ แแแแก แแ แซแแแแแแแก. แแแขแแฅแขแแ แแก แแแแคแแแฃแ แแชแแแกแแแแก แแแแแแงแแแแแ แจแแแแแแ แกแขแ แฃแฅแขแฃแ แ:
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 แแกแแแ แกแขแ แฃแฅแขแฃแ แ, แแกแ แ แแ, แแ แแ แแแขแแฅแขแแ แ แจแแแซแแแแ แแงแแก แแแแคแแแฃแ แแ แแแฃแแ แแแ แแ แขแแแแแแ แกแแแแแแแก แแฆแแแกแแฉแแแแ. แแแแ แแ แฉแแแ แแแแแแแงแแแแแ แแฎแแแแ แแฅแแก แแ แแฎแแแแ แกแแแแแแก. แแแ แแแแขแ แแแแก แแแขแแฅแขแแ แแ แแแแแกแแขแแแแ แแแแแแงแแแแแ MS_TONE_DETECTOR_ADD_SCAN แแแแแแ.
แแแแกแแแแก, แ แแ แแแขแแฅแขแแ แแ แจแแแแแขแงแแแแแแก, แ แแ แแแก แจแแกแแกแแแแแจแ แแแแแแ แกแแแแแแ แกแแกแฃแ แแแแ แกแแฎแจแแ แแก แแแแแแแแแขแแแแ, แฉแแแ แฃแแแ แแแแแฌแแแแ แแแก แแแแแซแแฎแแแแก แคแฃแแฅแชแแ, แ แแแแแกแแช แแก แแ แจแแแแฎแแแแแจแ แแแฃแจแแแแก. แแก แแแแแแแ แคแฃแแฅแชแแแก แแแแแงแแแแแแ ms_filter_set_notify_callback(). แ แแแแ แช แแ แแฃแแแแขแแแ, แแก แแฆแแแก แแแฉแแแแแแแแก แคแแแขแ แแกแแแ, แแแฉแแแแแแแแก แแแแแซแแฎแแแแก แคแฃแแฅแชแแแกแแแ แแ แแแฉแแแแแแแแก แแ แแแแแชแแแแแแ, แ แแแแแแแช แแแกแฃแ แก แแแแแแแขแแแแ แแแแแซแแฎแแแแก แคแฃแแฅแชแแแแ (แแแแฎแแแ แแแแแก แแแแแชแแแแแ).
แ แแแแกแแช แแแขแแฅแขแแ แ แแแแฅแแแแแแแ, แแแแแซแแฎแแแแก แคแฃแแฅแชแแ แแแแฆแแแก แแแแฎแแแ แแแแแก แแแแแชแแแแแก, แแแฉแแแแแแแแก แแแขแแฅแขแแ แแก แคแแแขแ แแ, แแแแแแแแก แแแแแขแแคแแแแขแแ แก แแ แกแขแ แฃแฅแขแฃแ แแก, แ แแแแแแช แแฆแฌแแ แก แแแแแแแแก:
/** * 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
$
แฉแแแ แแฎแแแแแ, แ แแ แแ แซแแแแแแก แขแแแแแ แฌแแ แแแขแแแแ แแแแแแแแแ แแ แแแขแแฅแขแแ แ แแฆแแแแฉแแแก แแแ.
แจแแแแแ แกแขแแขแแแจแ แฉแแแ แแแแแแ แแแแ แแฃแแแ แกแแแแแแแก แแแแแชแแแแก Ethernet แฅแกแแแจแ RTP แแ แแขแแแแแแก แแแแแงแแแแแแ แแ แแแฃแงแแแแแแแแ แแแแแแแงแแแแแ แแแก แฉแแแแก แแแกแขแแแชแแฃแ แแแแขแ แแแจแ.
แฌแงแแ แ: www.habr.com