เดฒเตเดเดจเดคเตเดคเดฟเดจเตเดฑเต เดฎเตเดฑเตเดฑเตเดฐเดฟเดฏเตฝ เดเดจเตเดฑเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดเตเดคเตเดคเดคเดพเดฃเต
เด
เดตเดธเดพเดจเดคเตเดคเดฟเตฝ
เดเดเตเดเตพ เดเดฐเต เดชเตเดฒเดเดฟเตป เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเดเตเดเดฏเดพเดฃเต
เดฎเตเดกเดฟเดฏ เดธเตเดเตเดฐเตเดฎเดฑเดฟเดฒเต เดชเตเดฒเดเดฟเดจเตเดเตพ, เดฎเดฑเตเดฑเต เดชเดฒ เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเดณเดฟเดฒเตเดฏเตเด เดชเตเดฒเต, เดฎเตเดกเดฟเดฏ เดธเตเดเตเดฐเตเดฎเตผ เดคเดจเตเดจเต เดตเตเดฃเตเดเตเด เดเดเดชเตเตฝ เดเตเดฏเตเดฏเดพเดคเต เดคเดจเตเดจเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด เดตเดฟเดชเตเดฒเตเดเดฐเดฟเดเตเดเดพเตป เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต.
เดจเดฟเดเตเดเดณเตเดเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเตฝ เดชเตเดฒเดเดฟเตป เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเด เดเตพเดชเตเดชเตเดเตเดจเตเดจเต เดชเตเดฒเดเดฟเตป เดนเตเดกเตผ เดซเดฏเตฝ เดเตพเดชเตเดชเตเดเตเดคเตเดคเดฃเด. เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเตเดฑเต เดฌเตเดกเดฟเดฏเดฟเตฝ, y เดเดจเตเดจ เดซเดเดเตเดทเตป เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต ms_filter_register() เดเดฐเต เดชเตเดคเดฟเดฏ เดซเดฟเตฝเดเตเดเตผ เดฐเดเดฟเดธเตเดฑเตเดฑเตผ เดเตเดฏเตเดฏเตเด. เดธเตเดตเดพเดญเดพเดตเดฟเดเดฎเดพเดฏเตเด, เดจเดฟเดเตเดเดณเตเดเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเด เดชเตเดฒเดเดฟเตป เดเดฑเดตเดฟเดเดตเตเด เดเดเดชเตเตฝ เดเตเดฏเตเดฏเตเดเดฏเตเด เดเดฐเต เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเดฟเตฝ เดเตเดเตเดเดฟเดเตเดเตเตผเดเตเดเตเดเดฏเตเด เดตเตเดฃเด.
เดเดจเดฟ เดจเดฎเตเดเตเดเต เดเดฐเต เดชเตเดฒเดเดฟเตป เดเดดเตเดคเตเดจเตเดจเดคเดฟเดฒเตเดเตเดเต เดคเดฟเดฐเดฟเดฏเดพเด. เดเดฒเตเดฒเดพ เดฎเตเดกเดฟเดฏ เดธเตเดเตเดฐเตเดฎเตผ เดซเดฟเตฝเดเตเดเดฑเตเดเดณเตเด เดชเตเดฒเดเดฟเดจเตเดจเตเดเดณเตเด เด เดตเดฐเตเดเต เดเดดเตเดคเตเดคเดฟเตฝ เดเดฐเต เดชเตเดคเต เดเดพเดจเตเตป เดชเดฟเดจเตเดคเตเดเดฐเตเดจเตเดจเต, เดเดคเต เดจเดฟเดเตเดเตพ เดชเด เดฟเดเตเดเดพเตป เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจ เด เดเตเดคเตเดค เดซเดฟเตฝเดเตเดเดฑเดฟเดจเตเดฑเต เดเดเดจ เดฎเดจเดธเตเดธเดฟเดฒเดพเดเตเดเตเดจเตเดจเดคเต เดตเดณเดฐเต เดเดณเตเดชเตเดชเดฎเดพเดเตเดเตเดจเตเดจเต. เด เดคเดฟเดจเดพเตฝ, เดเดจเตเดฑเดฟเดฑเตเดฑเดฟเดเดณเต เดเตเดฃเดฟเดเตเดเดพเดคเดฟเดฐเดฟเดเตเดเดพเตป, เดเดพเตป เดชเตเดฒเดเดฟเดจเตเดเดณเต เดซเดฟเตฝเดเตเดเดฑเตเดเตพ เดเดจเตเดจเต เดตเดฟเดณเดฟเดเตเดเตเด.
NASH_FILTR เดเดจเตเดจ เดชเตเดฐเดฟเตฝ เดเดฐเต เดชเตเดคเดฟเดฏ เดซเดฟเตฝเดเตเดเตผ เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดเดเตเดเตพ เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจเตเดตเตเดจเตเดจเต เดชเดฑเดฏเดพเด. เดเดคเต เดเดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเตเด - เด เดคเดฟเดจเตเดฑเต เดธเดฟเดเดเดฟเตพ เดเตปเดชเตเดเตเดเดฟเตฝ เดจเดฟเดจเตเดจเต เดฌเตเดฒเตเดเตเดเตเดเตพ เดธเตเดตเตเดเดฐเดฟเดเตเดเต เด เดคเดฟเดจเตเดฑเต เด เดเตเดเต เดเดเตเดเตเดชเตเดเตเดเตเดเดณเดฟเดฒเตเดเตเดเต เดเตเดฐเดพเตปเดธเตเดฎเดฟเดฑเตเดฑเต เดเตเดฏเตเดฏเตเด. เดคเดจเตเดจเดฟเดฐเดฟเดเตเดเตเดจเตเดจ เดชเดฐเดฟเดงเดฟเดเตเดเต เดคเดพเดดเตเดฏเตเดณเตเดณ เดธเดฟเดเตเดจเตฝ เดฒเตเดตเดฒเตเดณเตเดณ เด เดเตเดเดฟเตฝ เดเตเดเตเดคเตฝ เดฌเตเดฒเตเดเตเดเตเดเตพ เด เดคเดฟเดฒเตเดเต เดเดเดจเตเดจเตเดชเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ เด เดคเต เดเดฐเต เดเดตเดจเตเดฑเต เดธเตเดทเตเดเดฟเดเตเดเตเด, เดเตเดเดพเดคเต เดชเดฐเดฟเดงเดฟเดเตเดเต เดฎเตเดเดณเดฟเดฒเตเดณเตเดณ เดธเดฟเดเตเดจเตฝ เดฒเตเดตเดฒเตเดณเตเดณ เด เดเตเดเดฟเตฝ เดเตเดเตเดคเตฝ เดฌเตเดฒเตเดเตเดเตเดเตพ เด เดคเดฟเดฒเตเดเต เดเดเดจเตเดจเตเดชเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เด เดคเต เดเดฐเต เดเดตเดจเตเดฑเตเด เดธเตเดทเตเดเดฟเดเตเดเตเด.
เดซเดฟเตฝเดเตเดเตผ เดฐเตเดคเดฟ เดเดชเดฏเตเดเดฟเดเตเดเต เดชเดฐเดฟเดงเดฟ เดธเดเตเดเตเดเดฐเดฟเดเตเดเตเด. เดฐเดฃเตเดเดพเดฎเดคเตเดคเตเดฏเตเด เดฎเตเดจเตเดจเดพเดฎเดคเตเดคเตเดฏเตเด เดฐเตเดคเดฟเดเตพ เดเดเตเดธเดฟเดฑเตเดฑเตเดเดณเดฟเดฒเตเดเตเดเต เดฌเตเดฒเตเดเตเดเตเดเตพ เดเดเดจเตเดจเตเดชเตเดเดพเตป เด เดจเตเดตเดฆเดฟเดเตเดเตเด/เดจเดฟเดฐเตเดงเดฟเดเตเดเตเด.
เดจเดฎเตเดเตเดเต เดคเตเดเดเตเดเดพเด. เดเดฐเต เดซเดฟเตฝเดเตเดเตผ เดเดดเตเดคเตเดฎเตเดชเตเตพ, เดจเดฟเดเตเดเตพ เดเดฐเต เดนเตเดกเตเดกเตผ เดซเดฏเตฝ เดเดชเดฏเตเดเดฟเดเตเดเต เดเดฐเดเดญเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต. เดเดฆเตเดฏ เดตเดฐเดฟเดเดณเดฟเตฝ เด เดคเต เดซเดฏเตฝ เดเตพเดชเตเดชเตเดเตเดคเตเดคเดฃเด msfilter.h, MS_FILTER_METHOD เดฎเดพเดเตเดฐเต เดเดชเดฏเตเดเดฟเดเตเดเต, เดชเตเดคเดฟเดฏ เดซเดฟเตฝเดเตเดเดฑเดฟเดจเตเดฑเต เดฐเตเดคเดฟเดเตพ เดชเตเดฐเดเตเดฏเดพเดชเดฟเดเตเดเตเด (เดเดจเตเดคเตเดเตเดเดฟเดฒเตเด เดเดฃเตเดเตเดเตเดเดฟเตฝ), เดซเดฟเตฝเดเตเดเตผ เดธเตเดทเตเดเดฟเดเตเด เดเดตเดจเตเดฑเตเดเตพ (เดเดจเตเดคเตเดเตเดเดฟเดฒเตเด เดเดฃเตเดเตเดเตเดเดฟเตฝ) เดชเตเดฐเดเตเดฏเดพเดชเดฟเดเตเดเตเดเดฏเตเด เดคเดฐเดคเตเดคเดฟเดจเตเดฑเต เดเดฏเดฑเตเดฑเตเดฎเดคเดฟ เดเตเดฏเตเดค เดเดเดจ เดชเตเดฐเดเตเดฏเดพเดชเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเด MSFilterDesc เดซเดฟเตฝเดเตเดเตผ เดชเดพเดฐเดพเดฎเตเดฑเตเดฑเดฑเตเดเดณเตเดเต เดตเดฟเดตเดฐเดฃเดคเตเดคเตเดเตเดชเตเดชเด:
/* ะคะฐะนะป nash_filter.h, ะพะฟะธััะฒะฐะตั ัะธะปััั-ัะฐะทะฒะตัะฒะธัะตะปั ะธ ะฝะพะนะทะณะตะนั. */
#ifndef myfilter_h
#define myfilter_h
/* ะะพะดะบะปััะฐะตะผ ะทะฐะณะพะปะพะฒะพัะฝัะน ัะฐะนะป ั ะฟะตัะตัะธัะปะตะฝะธะตะผ ัะธะปัััะพะฒ ะผะตะดะธะฐัััะธะผะตัะฐ. */
#include <mediastreamer2/msticker.h>
/*
ะะฐะดะฐะตะผ ัะธัะปะพะฒะพะน ะธะดะตะฝัะธัะธะบะฐัะพั ะฝะพะฒะพะณะพ ัะธะฟะฐ ัะธะปัััะฐ. ะญัะพ ัะธัะปะพ ะฝะต ะดะพะปะถะฝะพ
ัะพะฒะฟะฐะดะฐัั ะฝะธ ั ะพะดะฝะธะผ ะธะท ะดััะณะธั
ัะธะฟะพะฒ. ะ ะผะตะดะธะฐัััะธะผะตัะต ะฒ ัะฐะนะปะต allfilters.h
ะตััั ัะพะพัะฒะตัััะฒัััะตะต ะฟะตัะตัะธัะปะตะฝะธะต enum MSFilterId. ะ ัะพะถะฐะปะตะฝะธั, ะฝะตะฟะพะฝััะฝะพ
ะบะฐะบ ะพะฟัะตะดะตะปะธัั ะผะฐะบัะธะผะฐะปัะฝะพะต ะทะฐะฝััะพะต ะทะฝะฐัะตะฝะธะต, ะบัะพะผะต ะบะฐะบ ะทะฐะณะปัะฝััั ะฒ ััะพั
ัะฐะนะป. ะะพ ะผั ะฒะพะทัะผะตะผ ะฒ ะบะฐัะตััะฒะต id ะดะปั ะฝะฐัะตะณะพ ัะธะปัััะฐ ะทะฐะฒะตะดะพะผะพ ะฑะพะปััะตะต
ะทะฝะฐัะตะฝะธะต: 4000. ะัะดะตะผ ะฟะพะปะฐะณะฐัั, ััะพ ัะฐะทัะฐะฑะพััะธะบะธ ะดะพะฑะฐะฒะปัั ะฝะพะฒัะต ัะธะปัััั, ะฝะต
ัะบะพัะพ ะดะพะฑะตััััั ะดะพ ััะพะณะพ ะฝะพะผะตัะฐ.
*/
#define NASH_FILTER_ID 4000
/*
ะะฟัะตะดะตะปัะตะผ ะผะตัะพะดั ะฝะฐัะตะณะพ ัะธะปัััะฐ. ะัะพััะผ ะฟะฐัะฐะผะตััะพะผ ะผะฐะบัะพัะฐ ะดะพะปะถะตะฝ
ะฟะพััะดะบะพะฒัะน ะฝะพะผะตั ะผะตัะพะดะฐ, ัะธัะปะพ ะพั 0. ะขัะตัะธะน ะฟะฐัะฐะผะตัั ััะพ ัะธะฟ ะฐัะณัะผะตะฝัะฐ
ะผะตัะพะดะฐ, ัะบะฐะทะฐัะตะปั ะฝะฐ ะบะพัะพััะน ะฑัะดะตั ะฟะตัะตะดะฐะฒะฐัััั ะผะตัะพะดั ะฟัะธ ะฒัะทะพะฒะต. ะฃ ะผะตัะพะดะพะฒ
ะฐัะณัะผะตะฝัะพะฒ ะผะพะถะตั ะธ ะฝะต ะฑััั, ะบะฐะบ ะฟะพะบะฐะทะฐะฝะพ ะฝะธะถะต.
*/
#define NASH_FILTER_SET_TRESHOLD MS_FILTER_METHOD(NASH_FILTER_ID , 0, float)
#define NASH_FILTER_TUNE_OFF MS_FILTER_METHOD_NO_ARG(NASH_FILTER_ID ,1)
#define NASH_FILTER_TUNE_ON MS_FILTER_METHOD_NO_ARG(NASH_FILTER_ID ,2)
/* ะขะตะฟะตัั ะพะฟัะตะดะตะปัะตะผ ััััะบัััั, ะบะพัะพัะฐั ะฑัะดะตั ะฟะตัะตะดะฐะฒะฐัััั ะฒะผะตััะต ั ัะพะฑััะธะตะผ. */
struct _NASHFilterEvent
{
/* ะญัะพ ะฟะพะปะต, ะบะพัะพัะพะต ะฑัะดะตั ะฒัะฟะพะปะฝััั ัะพะปั ัะปะฐะณะฐ,
0 - ะฟะพัะฒะธะปะธัั ะฝัะปะธ, 1 - ะฟะพัะฒะธะปัั ัะธะณะฝะฐะป.*/
char state;
/* ะัะตะผั, ะบะพะณะดะฐ ะฟัะพะธะทะพัะปะพ ัะพะฑััะธะต. */
uint64_t time;
};
typedef struct _NASHFilterEvent NASHFilterEvent;
/* ะะฟัะตะดะตะปัะตะผ ัะพะฑััะธะต ะดะปั ะฝะฐัะตะณะพ ัะธะปัััะฐ. */
#define NASH_FILTER_EVENT MS_FILTER_EVENT(MS_RTP_RECV_ID, 0, NASHFilterEvent)
/* ะะฟัะตะดะตะปัะตะผ ัะบัะฟะพััะธััะตะผัั ะฟะตัะตะผะตะฝะฝัั, ะบะพัะพัะฐั ะฑัะดะตั
ั
ัะฐะฝะธัั ั
ะฐัะฐะบัะตัะธััะธะบะธ ะดะปั ะดะฐะฝะฝะพะณะพ ัะธะฟะฐ ัะธะปัััะพะฒ. */
extern MSFilterDesc nash_filter_desc;
#endif /* myfilter_h */
เดเดชเตเดชเตเตพ เดจเดฟเดเตเดเตพเดเตเดเต เดเดฑเดตเดฟเด เดซเดฏเดฒเดฟเดฒเตเดเตเดเต เดชเตเดเดพเด. เดเดฎเดจเตเดฑเตเดเดณเตเดณเตเดณ เดซเดฟเตฝเดเตเดเดฑเดฟเดจเตเดฑเต เดธเตเดดเตเดธเต เดเตเดกเต เดคเดพเดดเต เดเดพเดฃเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต. เดซเดฟเตฝเดเตเดเตผ เดฐเตเดคเดฟเดเดณเตเด เดเดตเดถเตเดฏเดฎเดพเดฏ เดซเดฟเตฝเดเตเดเตผ เดซเดเดเตเดทเดจเตเดเดณเตเด เดเดตเดฟเดเต เดจเดฟเตผเดตเดเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต. เดเดฏเดฑเตเดฑเตเดฎเดคเดฟ เดเตเดฏเตเดค เดเดเดจเดฏเดฟเตฝ เดเดฐเต เดจเดฟเดถเตเดเดฟเดค เดเตเดฐเดฎเดคเตเดคเดฟเตฝ เดฐเตเดคเดฟเดเดณเตเดฏเตเด เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดเดณเตเดฏเตเด เดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดฑเดซเดฑเตปเดธเตเดเตพ เดธเตเดฅเดพเดชเดฟเดเตเดเตเดจเตเดจเต เดเดเตเดเดณเตเดเต_filter_desc. เด เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดซเดฟเตฝเดเตเดเดฑเตเดเตพ เดกเดพเดฑเตเดฑ เดชเตเดฐเตเดธเดธเตเดธเดฟเดเดเต เดตเตผเดเตเดเตเดซเตเดฒเตเดฏเดฟเดฒเตเดเตเดเต "เดเดเดชเตเดฒเดพเดจเตเดฑเต" เดเตเดฏเตเดฏเดพเตป เดฎเตเดกเดฟเดฏ เดธเตเดเตเดฐเตเดฎเตผ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเต.
/* ะคะฐะนะป nash_filter.ั, ะพะฟะธััะฒะฐะตั ัะธะปััั-ัะฐะทะฒะตัะฒะธัะตะปั ะธ ะฝะพะนะทะณะตะนั. */
#include "nash_filter.h"
#include <math.h>
#define NASH_FILTER_NOUTPUTS 5
/* ะะฟัะตะดะตะปัะตะผ ััััะบัััั, ะบะพัะพัะฐั ั
ัะฐะฝะธั ะฒะฝัััะตะฝะฝะตะต ัะพััะพัะฝะธะต ัะธะปัััะฐ. */
typedef struct _nash_filterData
{
bool_t disable_out; /* ะ ะฐะทัะตัะตะฝะธะต ะฟะตัะตะดะฐัะธ ะฑะปะพะบะพะฒ ะฝะฐ ะฒัั
ะพะด. */
int last_state; /* ะขะตะบััะตะต ัะพััะพัะฝะธะต ะฟะตัะตะบะปััะฐัะตะปั. */
char zero_count; /* ะกัะตััะธะบ ะฝัะปะตะฒัั
ะฑะปะพะบะพะฒ. */
char lag; /* ะะพะปะธัะตััะฒะพ ะฑะปะพะบะพะฒ ะดะปั ะฟัะธะฝััะธั ัะตัะตะฝะธั ะฝะพะนะทะณะตะนัะพะผ. */
char n_count; /* ะกัะตััะธะบ ะะะฝัะปะตะฒัั
ะฑะปะพะบะพะฒ. */
float skz_level; /* ะกัะตะดะฝะตะบะฒะฐะดัะฐัะธัะตัะบะพะต ะทะฝะฐัะตะฝะธะต ัะธะณะฝะฐะปะฐ ะฒะฝัััะธ
ะฑะปะพะบะฐ, ะฟัะธ ะบะพัะพัะพะผ ัะธะปััั ะฑัะดะตั ะฟัะพะฟััะบะฐัั ัะธะณะฝะฐะป. ะะดะฝะพะฒัะตะผะตะฝะฝะพ ััะพ ะฟะพัะพะณ
ััะฐะฑะฐััะฒะฐะฝะธั, ะฟะพ ะบะพัะพัะพะผั ะฑัะดะตั ัะพัะผะธัะพะฒะฐัััั ัะพะฑััะธะต. */
} nash_filterData;
/*----------------------------------------------------------*/
/* ะะฑัะทะฐัะตะปัะฝะฐั ััะฝะบัะธั ะธะฝะธัะธะฐะปะธะทะฐัะธะธ. */
static void nash_filter_init(MSFilter *f)
{
nash_filterData *d=ms_new0(nash_filterData, 1);
d->lag=5;
f->data=d;
}
/*----------------------------------------------------------*/
/* ะะฑัะทะฐัะตะปัะฝะฐั ััะฝะบัะธั ัะธะฝะฐะปะธะทะฐัะธะธ ัะฐะฑะพัั ัะธะปัััะฐ,
ะพัะฒะพะฑะพะถะดะฐะตััั ะฟะฐะผััั. */
static void nash_filter_uninit(MSFilter *f)
{
ms_free(f->data);
}
/*----------------------------------------------------------*/
/* ะะฟัะตะดะตะปัะตะผ ะพะฑัะฐะทัะพะฒัะน ะผะฐััะธะฒ ั ะฝัะปัะผะธ, ะทะฐะฒะตะดะพะผะพ
ะฑะพะปััะตะณะพ ัะฐะทะผะตัะฐ ัะตะผ ะฑะปะพะบ. */
char zero_array[1024]={0};
/* ะะฟัะตะดะตะปัะตะผ ัะพะฑััะธะต ัะธะปัััะฐ. */
NASHFilterEvent event;
/*----------------------------------------------------------*/
/* ะคัะฝะบัะธั ะพัะฟัะฐะฒะบะธ ัะพะฑััะธั. */
static void send_event(MSFilter *f, int state)
{
nash_filterData *d =( nash_filterData* ) f->data;
d->last_state = state;
/* ะฃััะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฒัะตะผั ะฒะพะทะฝะธะบะฝะพะฒะตะฝะธั ัะพะฑััะธั,
ะพั ะผะพะผะตะฝัะฐ ะฟะตัะฒะพะณะพ ัะธะบะฐ. ะัะตะผั ะฒ ะผะธะปะปะธัะตะบัะฝะดะฐั
. */
event.time=f -> ticker -> time;
event.state=state;
ms_filter_notify(f, NASH_FILTER_EVENT, &event);
}
/*----------------------------------------------------------*/
/* ะคัะฝะบัะธั ะฒััะธัะปัะตั ััะตะดะฝะตะบะฒะฐะดัะฐัะธัะตัะบะพะต (ัััะตะบัะธะฒะฝะพะต) ะทะฝะฐัะตะฝะธะต ัะธะณะฝะฐะปะฐ ะฒะฝัััะธ
ะฑะปะพะบะฐ. */
static float calc_skz(nash_filterData *d, int16_t *signal, int numsamples)
{
int i;
float acc = 0;
for (i=0; i<numsamples; i++)
{
int s=signal[i];
acc = acc + s * s;
}
float skz = (float)sqrt(acc / numsamples);
return skz;
}
/*----------------------------------------------------------*/
/* ะะฑัะทะฐัะตะปัะฝะฐั ััะฝะบัะธั ะพัะฝะพะฒะฝะพะณะพ ัะธะบะปะฐ ัะธะปัััะฐ,
ะฒัะทัะฒะฐะตััั ั ะบะฐะถะดัะผ ัะธะบะพะผ. */
static void nash_filter_process(MSFilter *f)
{
nash_filterData *d=(nash_filterData*)f->data;
/* ะฃะบะฐะทะฐัะตะปั ะฝะฐ ะฒั
ะพะดะฝะพะต ัะพะพะฑัะตะฝะธะต ัะพะดะตัะถะฐัะตะต ะฑะปะพะบ ะดะฐะฝะฝัั
. */
mblk_t *im;
int i;
int state;
/* ะััะธััะฒะฐะตะผ ัะพะพะฑัะตะฝะธั ะธะท ะฒั
ะพะดะฝะพะน ะพัะตัะตะดะธ
ะดะพ ะฟะพะปะฝะพะณะพ ะตั ะพะฟัััะพัะตะฝะธั. */
while((im=ms_queue_get(f->inputs[0]))!=NULL)
{
/* ะัะปะธ ะฒัั
ะพะดั ะทะฐะฟัะตัะตะฝั, ัะพ ะฟัะพััะพ ัะดะฐะปัะตะผ ะฒั
ะพะดะฝะพะต ัะพะพะฑัะตะฝะธะต. */
if ( d -> disable_out)
{
freemsg(im);
continue;
}
/* ะะทะผะตััะตะผ ััะพะฒะตะฝั ัะธะณะฝะฐะปะฐ ะธ ะฟัะธะฝะธะผะฐะตะผ ัะตัะตะฝะธะต ะพะฑ ะพัะฟัะฐะฒะบะต ัะธะณะฝะฐะปะฐ. */
float skz = calc_skz(d, (int16_t*)im->b_rptr, msgdsize(im));
state = (skz > d->skz_level) ? 1 : 0;
if (state)
{
d->n_count++;
d->zero_count = 0;
}
else
{
d->n_count = 0;
d->zero_count++;
}
if (((d->zero_count > d->lag) || (d->n_count > d->lag))
&& (d->last_state != state)) send_event(f, state);
/* ะัะธัััะฟะฐะตะผ ะบ ะบะพะฟะธัะพะฒะฐะฝะธั ะฒั
ะพะดะฝะพะณะพ ัะพะพะฑัะตะฝะธั ะธ ัะฐัะบะปะฐะดะบะต ะฟะพ ะฒัั
ะพะดะฐะผ. ะะพ
* ัะพะปัะบะพ ะฟะพ ัะตะผ, ะบ ะบะพัะพััะผ ะฟะพะดะบะปััะตะฝะฐ ะฝะฐะณััะทะบะฐ. ะัะธะณะธะฝะฐะปัะฝะพะต ัะพะพะฑัะตะฝะธะต
* ัะนะดะตั ะฝะฐ ะฒัั
ะพะด ั ะธะฝะดะตะบัะพะผ 0, ะฐ ะตะณะพ ะบะพะฟะธะธ ะฟะพะฟะฐะดัั ะฝะฐ ะพััะฐะปัะฝัะต
* ะฒัั
ะพะดั. */
int output_count = 0;
mblk_t *outm; /* ะฃะบะฐะทะฐัะตะปั ะฝะฐ ัะพะพะฑัะตะฝะธะต ั ะฒัั
ะพะดะฝัะผ ะฑะปะพะบะพะผ ะดะฐะฝะฝัั
. */
for(i=0; i < f->desc->noutputs; i++)
{
if (f->outputs[i]!=NULL)
{
if (output_count == 0)
{
outm = im;
}
else
{
/* ะกะพะทะดะฐะตะผ ะปะตะณะบัั ะบะพะฟะธั ัะพะพะฑัะตะฝะธั. */
outm = dupmsg(im);
}
/* ะะพะผะตัะฐะตะผ ะบะพะฟะธั ะธะปะธ ะพัะธะณะธะฝะฐะป ะฒั
ะพะดะฝะพะณะพ ัะพะพะฑัะตะฝะธั ะฝะฐ ะพัะตัะตะดะฝะพะน
* ะฒัั
ะพะด ัะธะปัััะฐ. */
ms_queue_put(f->outputs[i], outm);
output_count++;
}
}
}
}
/*----------------------------------------------------------*/
/* ะคัะฝะบัะธั-ะพะฑัะฐะฑะพััะธะบ ะฒัะทะพะฒะฐ ะผะตัะพะดะฐ NASH_FILTER_SET_LAG. */
static int nash_filter_set_treshold(MSFilter *f, void *arg)
{
nash_filterData *d=(nash_filterData*)f->data;
d->skz_level=*(float*)arg;
return 0;
}
/*----------------------------------------------------------*/
/* ะคัะฝะบัะธั-ะพะฑัะฐะฑะพััะธะบ ะฒัะทะพะฒะฐ ะผะตัะพะดะฐ NASH_FILTER_TUNE_OFF. */
static int nash_filter_tune_off(MSFilter *f, void *arg)
{
nash_filterData *d=(nash_filterData*)f->data;
d->disable_out=TRUE;
return 0;
}
/*----------------------------------------------------------*/
/* ะคัะฝะบัะธั-ะพะฑัะฐะฑะพััะธะบ ะฒัะทะพะฒะฐ ะผะตัะพะดะฐ NASH_FILTER_TUNE_ON. */
static int nash_filter_tune_on(MSFilter *f, void *arg)
{
nash_filterData *d=(nash_filterData*)f->data;
d->disable_out=FALSE;
return 0;
}
/*----------------------------------------------------------*/
/* ะะฐะฟะพะปะฝัะตะผ ัะฐะฑะปะธัั ะผะตัะพะดะพะฒ ัะธะปัััะฐ, ัะบะพะปัะบะพ ะผะตัะพะดะพะฒ
ะผั ะพะฟัะตะดะตะปะธะปะธ ะฒ ะทะฐะณะพะปะพะฒะพัะฝะพะผ ัะฐะนะปะต ััะพะปัะบะพ ะฝะตะฝัะปะตะฒัั
ัััะพะบ. */
static MSFilterMethod nash_filter_methods[]={
{ NASH_FILTER_SET_TRESHOLD, nash_filter_set_treshold },
{ NASH_FILTER_TUNE_OFF, nash_filter_tune_off },
{ NASH_FILTER_TUNE_ON, nash_filter_tune_on },
{ 0 , NULL } /* ะะฐัะบะตั ะบะพะฝัะฐ ัะฐะฑะปะธัั. */
};
/*----------------------------------------------------------*/
/* ะะฟะธัะฐะฝะธะต ัะธะปัััะฐ ะดะปั ะผะตะดะธะฐัััะธะผะตัะฐ. */
MSFilterDesc nash_filter_desc=
{
NASH_FILTER_ID,
"NASH_FILTER",
"A filter with noise gate that reads from input and copy to it's five outputs.",
MS_FILTER_OTHER,
NULL,
1,
NASH_FILTER_NOUTPUTS,
nash_filter_init,
NULL,
nash_filter_process,
NULL,
nash_filter_uninit,
nash_filter_methods
};
MS_FILTER_DESC_EXPORT(nash_filter_desc)
เดเดชเตเดชเตเตพ, เดเดพเดฒเดคเดพเดฎเดธเด เดเตเดเดพเดคเต, เดเดเตเดเตพ เดจเตเดฐเดคเตเดคเต เดเดฃเตเดเดพเดเตเดเดฟเดฏ เดเดจเตเดฑเตผเดเตเดฎเดฟเตฝ เดจเดฎเตเดฎเตเดเต เดซเดฟเตฝเดเตเดเตผ เดเดชเดฏเตเดเดฟเดเตเดเดพเด. เดถเตเตผเดทเด เดเดฟเดคเตเดฐเด เดชเดฐเดฟเดทเตเดเดฐเดฟเดเตเด เดเดจเตเดฑเตผเดเตเดฎเดฟเดจเตเดฑเต เดเดฐเต เดกเดฏเดเตเดฐเด เดเดพเดฃเดฟเดเตเดเตเดจเตเดจเต.
เดเดเตเดเดณเตเดเต เดเตเดเตเดฃเตเดเต เดจเดฟเตผเดฎเตเดฎเดฟเดเตเด เดซเดฟเตฝเดเตเดเตผ เดชเตเดฐเดคเตเดฏเตเดเดฟเดเตเดเต เดคเตเดณเดฟเดเตเดเดฎเตเดณเตเดณ เดฐเตเดคเดฟเดฏเดฟเตฝ เดเดฟเดคเตเดฐเตเดเดฐเดฟเดเตเดเดพเตป เดเดเตเดเตพ เดเดเตเดฐเดนเดฟเดเตเดเต. เด
เดคเดฟเดจเดพเตฝ, เดกเดฏเดเตเดฐเดพเดฎเดฟเตฝ เดเดเตเดเดณเตเดเต เดซเดฟเตฝเดเตเดเตผ เดจเดฟเดเตเดเตพ เดเดเตป เดเดฃเตเดเตเดคเตเดคเตเด.
เดธเตผเดเตเดฏเตเดเตเดเดฟเดฒเตเดเตเดเต เดเดฐเต เดซเดฟเตฝเดเตเดเตผ-เดฑเตเดเตเดเตเตผเดกเตผ เดเตเตผเดคเตเดคเต, เด
เดคเต เดเดฐเต wav เดซเดฏเดฒเดฟเดฒเตเดเตเดเต เดเตปเดชเตเดเตเดเต เดธเดฟเดเตเดจเตฝ เดเดดเตเดคเตเดจเตเดจเต. เดเดธเตเดคเตเดฐเดฃเด เดเตเดฏเตเดคเดคเตเดชเตเดฒเต, เดซเดฏเดฒเดฟเตฝ เดธเดเดญเดพเดทเดฃเดคเตเดคเดฟเตฝ เดคเดพเตฝเดเตเดเดพเดฒเดฟเดเดฎเดพเดฏเดฟ เดจเดฟเตผเดคเตเดคเตเดจเตเดจเดคเต เดเดดเดฟเดตเดพเดเตเดเดพเตป เดเดเตเดเดณเตเดเต เดซเดฟเตฝเดเตเดเตผ เดจเดฟเดเตเดเดณเต เด
เดจเตเดตเดฆเดฟเดเตเดเตเด. เด
เดเตเดเดจเต เด
เดคเดฟเดจเตเดฑเต เดตเดฒเดฟเดชเตเดชเด เดเตเดฑเดฏเตเดจเตเดจเต.
เดฒเตเดเดจเดคเตเดคเดฟเดจเตเดฑเต เดคเตเดเดเตเดเดคเตเดคเดฟเตฝ, เดเดเตเดเตพ เดซเดฟเตฝเดเตเดเดฑเดฟเดจเตเดฑเต เด
เตฝเดเตเดฐเดฟเดคเด เดตเดฟเดตเดฐเดฟเดเตเดเต. เดชเตเดฐเดงเดพเดจ เดเดชเตเดฒเดฟเดเตเดเตเดทเตป เด
เดคเต เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจ เดเดตเดจเตเดฑเตเดเตพ เดเตเดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเตเดจเตเดจเต. เดเดตเดจเตเดฑเดฟเตฝ "0" เดซเตเดฒเดพเดเต เด
เดเดเตเดเดฟเดฏเดฟเดเตเดเตเดฃเตเดเตเดเตเดเดฟเตฝ, เดนเตเดธเตเดฑเตเดฑเต เดเดชเตเดฒเดฟเดเตเดเตเดทเตป เดฑเตเดเตเดเตเตผเดกเดฟเดเดเต เดคเดพเตฝเดเตเดเดพเดฒเดฟเดเดฎเดพเดฏเดฟ เดจเดฟเตผเดคเตเดคเตเดจเตเดจเต. เดซเตเดฒเดพเดเต "1" เดเดณเตเดณ เดเดฐเต เดเดตเดจเตเดฑเต เดตเดจเตเดจเดพเดฒเตเดเตป, เดฑเตเดเตเดเตเตผเดกเดฟเดเดเต เดชเตเดจเดฐเดพเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเต.
เดฎเตเดฎเตเดชเดคเตเดคเตเดคเดฟเดฒเตเดเตเดเต เดฐเดฃเตเดเต เดเดฎเดพเตปเดกเต เดฒเตเตป เดเตผเดเตเดฏเตเดฎเตเดจเตเดฑเตเดเตพ เดเตเดเดฟ เดเตเตผเดคเตเดคเต: --ng
, เดเดคเต เดซเดฟเตฝเดเตเดเตผ เดคเตเดฐเตเดทเตเตพเดกเต เดฒเตเดตเตฝ เดธเดเตเดเตเดเดฐเดฟเดเตเดเตเดจเตเดจเต เดเดชเตเดชเด --rec
เดเดจเตเดจเต เดตเดฟเดณเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจ เดซเดฏเดฒเดฟเดฒเตเดเตเดเต เดเดดเตเดคเดพเตป เดคเตเดเดเตเดเตเดจเตเดจเต เดฑเตเดเตเดเตเตผเดกเต.wav.
/* ะคะฐะนะป mstest9.c ะะผะธัะฐัะพั ะฟะตัะตะณะพะฒะพัะฝะพะณะพ ััััะพะนััะฒะฐ c ัะตะณะธัััะฐัะพัะพะผ ะธ
* ะฝะพะนะทะณะตะนัะพะผ. */
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/msrtp.h>
#include <mediastreamer2/msfilerec.h>
/* ะะพะดะบะปััะฐะตะผ ะฝะฐั ัะธะปััั. */
#include "nash_filter.h"
/* ะะพะดะบะปััะฐะตะผ ัะฐะนะป ะพะฑัะธั
ััะฝะบัะธะน. */
#include "mstest_common.c"
/*----------------------------------------------------------*/
struct _app_vars
{
int local_port; /* ะะพะบะฐะปัะฝัะน ะฟะพัั. */
int remote_port; /* ะะพัั ะฟะตัะตะณะพะฒะพัะฝะพะณะพ ััััะพะนััะฒะฐ ะฝะฐ ัะดะฐะปะตะฝะฝะพะผ ะบะพะผะฟัััะตัะต. */
char remote_addr[128]; /* IP-ะฐะดัะตั ัะดะฐะปะตะฝะฝะพะณะพ ะบะพะผะฟัััะตัะฐ. */
MSDtmfGenCustomTone dtmf_cfg; /* ะะฐัััะพะนะบะธ ัะตััะพะฒะพะณะพ ัะธะณะฝะฐะปะฐ ะณะตะฝะตัะฐัะพัะฐ. */
MSFilter* recorder; /* ะฃะบะฐะทะฐัะตะปั ะฝะฐ ัะธะปััั ัะตะณะธัััะฐัะพั. */
bool_t file_is_open; /* ะคะปะฐะณ ัะพะณะพ, ััะพ ัะฐะนะป ะดะปั ะทะฐะฟะธัะธ ะพัะบััั. */
/* ะะพัะพะณ, ะฟัะธ ะบะพัะพัะพะผ ะฟัะตะบัะฐัะฐะตััั ะทะฐะฟะธัั ะฟัะธะฝะธะผะฐะตะผะพะณะพ ัะธะณะฝะฐะปะฐ ะฒ ัะฐะนะป. */
float treshold;
bool_t en_rec; /*ะะบะปััะธัั ะทะฐะฟะธัั ะฒ ัะฐะนะป.*/
};
typedef struct _app_vars app_vars;
/*----------------------------------------------------------*/
/* ะกะพะทะดะฐะตะผ ะดัะฟะปะตะบัะฝัั RTP-ัะตััะธั. */
RtpSession* create_duplex_rtp_session(app_vars v)
{
RtpSession *session = create_rtpsession (v.local_port, v.local_port + 1,
FALSE, RTP_SESSION_SENDRECV);
rtp_session_set_remote_addr_and_port(session, v.remote_addr, v.remote_port,
v.remote_port + 1);
rtp_session_set_send_payload_type(session, PCMU);
return session;
}
/*----------------------------------------------------------*/
/* ะคัะฝะบัะธั ะฟัะตะพะฑัะฐะทะพะฒะฐะฝะธั ะฐัะณัะผะตะฝัะพะฒ ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ ะฒ
* ะฝะฐัััะพะนะบะธ ะฟัะพะณัะฐะผะผั. */
void scan_args(int argc, char *argv[], app_vars *v)
{
char i;
for (i=0; i<argc; i++)
{
if (!strcmp(argv[i], "--help"))
{
char *p=argv[0]; p=p + 2;
printf(" %s walkie talkienn", p);
printf("--help List of options.n");
printf("--version Version of application.n");
printf("--addr Remote abonent IP address string.n");
printf("--port Remote abonent port number.n");
printf("--lport Local port number.n");
printf("--gen Generator frequency.n");
printf("--ng Noise gate treshold level from 0. to 1.0n");
printf("--rec record to file 'record.wav'.n");
exit(0);
}
if (!strcmp(argv[i], "--version"))
{
printf("0.1n");
exit(0);
}
if (!strcmp(argv[i], "--addr"))
{
strncpy(v->remote_addr, argv[i+1], 16);
v->remote_addr[16]=0;
printf("remote addr: %sn", v->remote_addr);
}
if (!strcmp(argv[i], "--port"))
{
v->remote_port=atoi(argv[i+1]);
printf("remote port: %in", v->remote_port);
}
if (!strcmp(argv[i], "--lport"))
{
v->local_port=atoi(argv[i+1]);
printf("local port : %in", v->local_port);
}
if (!strcmp(argv[i], "--gen"))
{
v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
printf("gen freq : %in", v -> dtmf_cfg.frequencies[0]);
}
if (!strcmp(argv[i], "--ng"))
{
v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
printf("noise gate treshold: %fn", v -> treshold);
}
if (!strcmp(argv[i], "--rec"))
{
v -> en_rec = TRUE;
printf("enable recording: %in", v -> en_rec);
}
}
}
/*----------------------------------------------------------*/
/* ะคัะฝะบัะธั ะพะฑัะฐัะฝะพะณะพ ะฒัะทะพะฒะฐ, ะพะฝะฐ ะฑัะดะตั ะฒัะทะฒะฐะฝะฐ ัะธะปัััะพะผ, ะบะฐะบ ัะพะปัะบะพ ะพะฝ
* ะทะฐะผะตัะธั, ััะพ ะฝะฐัััะฟะธะปะฐ ัะธัะธะฝะฐ ะธะปะธ ะฝะฐะพะฑะพัะพั ัะธัะธะฝะฐ ัะผะตะฝะธะปะฐัั ะทะฒัะบะฐะผะธ. */
static void change_detected_cb(void *data, MSFilter *f, unsigned int event_id,
NASHFilterEvent *ev)
{
app_vars *vars = (app_vars*) data;
/* ะัะปะธ ะทะฐะฟะธัั ะฝะต ะฑัะปะฐ ัะฐะทัะตัะตะฝะฐ, ัะพ ะฒัั
ะพะดะธะผ. */
if (! vars -> en_rec) return;
if (ev -> state)
{
/* ะะพะทะพะฑะฝะพะฒะปัะตะผ ะทะฐะฟะธัั. */
if(!vars->file_is_open)
{
ms_filter_call_method(vars->recorder, MS_FILE_REC_OPEN, "record.wav");
vars->file_is_open = 1;
}
ms_filter_call_method(vars->recorder, MS_FILE_REC_START, 0);
printf("Recording...n");
}
else
{
/* ะัะธะพััะฐะฝะฐะฒะปะธะฒะฐะตะผ ะทะฐะฟะธัั. */
ms_filter_call_method(vars->recorder, MS_FILE_REC_STOP, 0);
printf("Pause...n");
}
}
/*----------------------------------------------------------*/
int main(int argc, char *argv[])
{
/* ะฃััะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฝะฐัััะพะนะบะธ ะฟะพ ัะผะพะปัะฐะฝะธั. */
app_vars vars={5004, 7010, "127.0.0.1", {0}, 0, 0, 0.01, 0};
/* ะฃััะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฝะฐัััะพะนะบะธ ะฝะฐัััะพะนะบะธ ะฟัะพะณัะฐะผะผั ะฒ
* ัะพะพัะฒะตัััะฒะธะธ ั ะฐัะณัะผะตะฝัะฐะผะธ ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ. */
scan_args(argc, argv, &vars);
ms_init();
/* ะกะพะทะดะฐะตะผ ัะบะทะตะผะฟะปััั ัะธะปัััะพะฒ ะฟะตัะตะดะฐััะตะณะพ ััะฐะบัะฐ. */
MSSndCard *snd_card =
ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
MSFilter *snd_card_read = ms_snd_card_create_reader(snd_card);
MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
MSFilter *rtpsend = ms_filter_new(MS_RTP_SEND_ID);
/* ะกะพะทะดะฐะตะผ ัะธะปััั ะบะพะดะตัะฐ. */
MSFilter *encoder = ms_filter_create_encoder("PCMU");
/* ะ ะตะณะธัััะธััะตะผ ัะธะฟั ะฝะฐะณััะทะบะธ. */
register_payloads();
/* ะกะพะทะดะฐะตะผ ะดัะฟะปะตะบัะฝัั RTP-ัะตััะธั. */
RtpSession* rtp_session = create_duplex_rtp_session(vars);
ms_filter_call_method(rtpsend, MS_RTP_SEND_SET_SESSION, rtp_session);
/* ะกะพะตะดะธะฝัะตะผ ัะธะปัััั ะฟะตัะตะดะฐััะธะบะฐ. */
ms_filter_link(snd_card_read, 0, dtmfgen, 0);
ms_filter_link(dtmfgen, 0, encoder, 0);
ms_filter_link(encoder, 0, rtpsend, 0);
/* ะกะพะทะดะฐะตะผ ัะธะปัััั ะฟัะธะตะผะฝะพะณะพ ััะฐะบัะฐ. */
MSFilter *rtprecv = ms_filter_new(MS_RTP_RECV_ID);
ms_filter_call_method(rtprecv, MS_RTP_RECV_SET_SESSION, rtp_session);
/* ะกะพะทะดะฐะตะผ ัะธะปััั ะดะตะบะพะดะตัะฐ. */
MSFilter *decoder=ms_filter_create_decoder("PCMU");
//MS_FILE_REC_ID
/* ะ ะตะณะธัััะธััะตะผ ะฝะฐั ัะธะปััั. */
ms_filter_register(&nash_filter_desc);
MSFilter *nash = ms_filter_new(NASH_FILTER_ID);
/* ะกะพะทะดะฐะตะผ ัะธะปััั ะทะฒัะบะพะฒะพะน ะบะฐััั. */
MSFilter *snd_card_write = ms_snd_card_create_writer(snd_card);
/* ะกะพะทะดะฐะตะผ ัะธะปััั ัะตะณะธัััะฐัะพัะฐ. */
MSFilter *recorder=ms_filter_new(MS_FILE_REC_ID);
vars.recorder = recorder;
/* ะกะพะตะดะธะฝัะตะผ ัะธะปัััั ะฟัะธัะผะฝะพะณะพ ััะฐะบัะฐ. */
ms_filter_link(rtprecv, 0, decoder, 0);
ms_filter_link(decoder, 0, nash, 0);
ms_filter_link(nash, 0, snd_card_write, 0);
ms_filter_link(nash, 1, recorder, 0);
/* ะะพะดะบะปััะฐะตะผ ะบ ัะธะปัััั ััะฝะบัะธั ะพะฑัะฐัะฝะพะณะพ ะฒัะทะพะฒะฐ, ะธ ะฟะตัะตะดะฐะตะผ ะตะน ะฒ
* ะบะฐัะตััะฒะต ะฟะพะปัะทะพะฒะฐัะตะปััะบะธั
ะดะฐะฝะฝัั
ัะบะฐะทะฐัะตะปั ะฝะฐ ััััะบัััั ั ะฝะฐัััะพะนะบะฐะผะธ
* ะฟัะพะณัะฐะผะผั, ะฒ ะบะพัะพัะพะน ััะตะดะธ ะฟัะพัะธั
ะตััั ัะบะฐะทะฐัั ะฝะฐ ัะธะปััั
* ัะตะณะธัััะฐัะพัะฐ. */
ms_filter_set_notify_callback(nash,
(MSFilterNotifyFunc)change_detected_cb, &vars);
ms_filter_call_method(nash,NASH_FILTER_SET_TRESHOLD, &vars.treshold);
/* ะกะพะทะดะฐะตะผ ะธััะพัะฝะธะบ ัะฐะบัะพะฒ - ัะธะบะตั. */
MSTicker *ticker = ms_ticker_new();
/* ะะพะดะบะปััะฐะตะผ ะธััะพัะฝะธะบ ัะฐะบัะพะฒ. */
ms_ticker_attach(ticker, snd_card_read);
ms_ticker_attach(ticker, rtprecv);
/* ะัะปะธ ะฝะฐัััะพะนะบะฐ ัะฐััะพัั ะณะตะฝะตัะฐัะพัะฐ ะพัะปะธัะฝะฐ ะพั ะฝัะปั, ัะพ ะทะฐะฟััะบะฐะตะผ ะณะตะฝะตัะฐัะพั. */
if (vars.dtmf_cfg.frequencies[0])
{
/* ะะฐัััะฐะธะฒะฐะตะผ ััััะบัััั, ัะฟัะฐะฒะปััััั ะฒัั
ะพะดะฝัะผ ัะธะณะฝะฐะปะพะผ ะณะตะฝะตัะฐัะพัะฐ. */
vars.dtmf_cfg.duration = 10000;
vars.dtmf_cfg.amplitude = 1.0;
}
/* ะัะณะฐะฝะธะทัะตะผ ัะธะบะป ะฟะตัะตะทะฐะฟััะบะฐ ะณะตะฝะตัะฐัะพัะฐ. */
printf("Press ENTER to exit.n ");
char c=getchar();
while(c != 'n')
{
if(vars.dtmf_cfg.frequencies[0])
{
/* ะะบะปััะฐะตะผ ะทะฒัะบะพะฒะพะน ะณะตะฝะตัะฐัะพั. */
ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,
(void*)&vars.dtmf_cfg);
}
char c=getchar();
printf("--n");
}
if (vars.en_rec ) ms_filter_call_method(recorder, MS_FILE_REC_CLOSE, 0);
}
เดเดเตเดเตพ เดซเดฏเดฒเตเดเตพ เดเตเตผเดคเตเดคเดคเตเด เดฒเตเดฌเตเดฐเดฑเดฟ เดเดชเดฏเตเดเดฟเดเตเดเดคเตเด เดเดพเดฐเดฃเด เดเดฃเดเตเดเต, เดธเดฎเดพเดนเดพเดฐเดคเตเดคเดฟเดจเดพเดฏเตเดณเตเดณ เดเดฎเดพเตปเดกเต เดฒเตเตป เดเตเดเตเดคเตฝ เดธเดเตเดเตเตผเดฃเตเดฃเดฎเดพเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต, เดเดคเตเดชเตเดฒเต เดเดพเดฃเดชเตเดชเตเดเตเดจเตเดจเต:
$ gcc mstest9.c nash_filter.c -o mstest9 `pkg-config mediastreamer --libs --cflags` -lm
เดเดชเตเดฒเดฟเดเตเดเตเดทเตป เดจเดฟเตผเดฎเตเดฎเดฟเดเตเด เดถเตเดทเด, เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดเตผเดเตเดฏเตเดฎเตเดจเตเดฑเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดเดฆเตเดฏเดคเตเดคเต เดเดฎเตเดชเตเดฏเตเดเตเดเดฑเดฟเตฝ เดเดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเด:
$ ./mstest9 --lport 7010 --port 8010 --addr <ััั ะฐะดัะตั ะฒัะพัะพะณะพ ะบะพะผะฟัััะตัะฐ> --rec
เดฐเดฃเตเดเดพเดฎเดคเตเดคเต เดเดฎเตเดชเตเดฏเตเดเตเดเดฑเดฟเตฝ เดเดเตเดเตพ เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดเตเดฐเดฎเตเดเดฐเดฃเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดธเดฎเดพเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเต:
$ ./mstest9 --lport 8010 --port 7010 --addr <ััั ะฐะดัะตั ะฟะตัะฒะพะณะพ ะบะพะผะฟัััะตัะฐ>
เดเดคเดฟเดจเตเดถเตเดทเด, เดเดฆเตเดฏเดคเตเดคเต เดเดฎเตเดชเตเดฏเตเดเตเดเตผ เดจเดฟเดเตเดเตพ เดชเดฑเดฏเตเดจเตเดจเดคเตเดฒเตเดฒเดพเด เดฐเดฃเตเดเดพเดฎเดคเตเดคเตเดคเดฟเดจเตเดฑเต เดฎเตเดเตเดฐเตเดซเตเดฃเดฟเดฒเตเดเตเดเต เดฑเตเดเตเดเตเตผเดกเต เดเตเดฏเตเดฏเดพเตป เดคเตเดเดเตเดเตเด. เด เดธเดพเดนเดเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดตเดพเดเตเดเต "เดฑเตเดเตเดเตเตผเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเต...". เดจเดฟเดเตเดเตพ เดจเดฟเดถเดฌเตเดฆเดจเดพเดฏเดพเดฒเตเดเตป, เดเดฐเต เดธเดจเตเดฆเตเดถเด เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเตเดเต เดฑเตเดเตเดเตเตผเดกเดฟเดเดเต เดคเดพเตฝเดเตเดเดพเดฒเดฟเดเดฎเดพเดฏเดฟ เดจเดฟเตผเดคเตเดคเตเด"เดคเดพเตฝเดเตเดเดพเดฒเดฟเดเดฎเดพเดฏเดฟ เดจเดฟเตผเดคเตเดคเตเดโฆ"เดจเดฟเดเตเดเตพ เดคเตเดฐเตเดทเตเตพเดกเต เดฒเตเดตเดฒเดฟเตฝ เดชเดฐเตเดเตเดทเดฃเด เดจเดเดคเตเดคเตเดฃเตเดเดฟ เดตเดจเตเดจเตเดเตเดเดพเด.
เด เดฒเตเดเดจเดคเตเดคเดฟเตฝ เดซเดฟเตฝเดเตเดเดฑเตเดเตพ เดเดเตเดเดจเต เดเดดเตเดคเดพเดฎเตเดจเตเดจเต เดเดเตเดเตพ เดชเด เดฟเดเตเดเต. เดจเดฟเดเตเดเตพ เดถเตเดฐเดฆเตเดงเดฟเดเตเดเดฟเดฐเดฟเดเตเดเดพเด, nash_filter_process() เดซเดเดเตเดทเตป เดกเดพเดฑเตเดฑ เดฌเตเดฒเตเดเตเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดเตเดคเตเดฐเดฟเดฎเดคเตเดตเด เดจเดเดคเตเดคเตเดจเตเดจเต. เดเดฆเดพเดนเดฐเดฃเด เดตเดฟเดฆเตเดฏเดพเดญเตเดฏเดพเดธเดชเดฐเดฎเดพเดฏเดคเดฟเดจเดพเตฝ, เดกเดพเดฑเตเดฑ เดฌเตเดฒเตเดเตเดเตเดเตพ เดเตเดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฎเตเดกเดฟเดฏ เดธเตเดเตเดฐเตเดฎเดฑเดฟเดจเตเดฑเต เดเดฑเตเดฑเดตเตเด เดเตเดฑเดเตเด เดเดดเดฟเดตเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต.
เด
เดเตเดคเตเดคเดคเต
เด เดตเดฒเดเดฌเด: www.habr.com