เจฒเฉเจ เจธเจฎเฉฑเจเจฐเฉ เจฎเฉเจฐเฉ เจคเฉเจ เจฒเจ เจเจ เจนเฉ
เจชเจฟเจเจฒเฉ เจตเจฟเฉฑเจ
เจ เจธเฉเจ เจเฉฑเจ เจชเจฒเฉฑเจเจเจจ เจตเจฟเจเจธเจฟเจค เจเจฐ เจฐเจนเฉ เจนเจพเจ
เจฎเฉเจกเฉเจ เจธเจเฉเจฐเฉเจฎเจฐ เจตเจฟเฉฑเจ เจชเจฒเฉฑเจเจเจจ, เจเจฟเจตเฉเจ เจเจฟ เจเจ เจนเฉเจฐ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจตเจฟเฉฑเจ, เจฎเฉเจกเฉเจ เจธเจเฉเจฐเฉเจฎเจฐ เจจเฉเฉฐ เจเจชเจฃเฉ เจเจช เจจเฉเฉฐ เจฆเฉเจฌเจพเจฐเจพ เจเฉฐเจชเจพเจเจฒ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจคเฉเจ เจฌเจฟเจจเจพเจ เจเจพเจฐเจเจเฉเจธเจผเจฒเจคเจพ เจจเฉเฉฐ เจตเจงเจพเจเจฃ เจฒเจ เจตเจฐเจคเจฟเจ เจเจพเจเจฆเจพ เจนเฉเฅค
เจคเฉเจนเจพเจกเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจตเจฟเฉฑเจ เจชเจฒเฉฑเจเจเจจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฒเจ, เจคเฉเจธเฉเจ เจตเจฐเจคเจฆเฉ เจนเฉ เจธเจผเจพเจฎเจฒ เจนเจจ เจชเจฒเฉฑเจเจเจจ เจนเฉเจกเจฐ เจซเจพเจเจฒ เจจเฉเฉฐ เจธเจผเจพเจฎเจฒ เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพ เจนเฉเฅค เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจฎเฉเฉฑเจ เจญเจพเจ เจตเจฟเฉฑเจ, เจซเฉฐเจเจธเจผเจจ 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 */
เจนเฉเจฃ เจคเฉเจธเฉเจ เจธเจฐเฉเจค เจซเจพเจเจฒ 'เจคเฉ เจเจพ เจธเจเจฆเฉ เจนเฉเฅค เจเจฟเฉฑเจชเจฃเฉเจเจ เจตเจพเจฒเฉ เจซเจฟเจฒเจเจฐ เจฒเจ เจธเจฐเฉเจค เจเฉเจก เจนเฉเจ เจพเจ เจฆเจฟเจเจพเจเจ เจเจฟเจ เจนเฉเฅค เจซเจฟเจฒเจเจฐ เจตเจฟเจงเฉเจเจ เจ เจคเฉ เจฒเฉเฉเฉเจเจฆเฉ เจซเจฟเจฒเจเจฐ เจซเฉฐเจเจธเจผเจจเจพเจ เจจเฉเฉฐ เจเฉฑเจฅเฉ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเฉเจคเจพ เจเจฟเจ เจนเฉเฅค เจซเจฟเจฐ เจขเฉฐเจเจพเจ เจ เจคเฉ เจซเฉฐเจเจธเจผเจจเจพเจ เจฆเฉ เจนเจตเจพเจฒเฉ เจจเจฟเจฐเจฏเจพเจค เจขเจพเจเจเฉ เจตเจฟเฉฑเจ เจเฉฑเจ เจเจพเจธ เจเฉเจฐเจฎ เจตเจฟเฉฑเจ เจฐเฉฑเจเฉ เจเจพเจเจฆเฉ เจนเจจ เจธเจพเจกเจพ_เจซเจฟเจฒเจเจฐ_เจกเฉเจธเจ. เจเฉ เจเจฟ เจฎเฉเจกเฉเจ เจธเจเฉเจฐเฉเจฎเจฐ เจฆเฉเจเจฐเจพ เจกเฉเจเจพ เจชเฉเจฐเฉเจธเฉเจธเจฟเฉฐเจ เจตเจฐเจเจซเจฒเฉ เจตเจฟเฉฑเจ เจเจธ เจเจฟเจธเจฎ เจฆเฉ เจซเจฟเจฒเจเจฐเจพเจ เจจเฉเฉฐ "เจเจฎเจชเจฒเจพเจเจ" เจเจฐเจจ เจฒเจ เจตเจฐเจคเจฟเจ เจเจพเจเจฆเจพ เจนเฉเฅค
/* ะคะฐะนะป 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
เจเฉ เจเจฟ เจเฉฑเจ เจซเจพเจเจฒ เจจเฉเฉฐ เจฒเจฟเจเจฃเจพ เจธเจผเฉเจฐเฉ เจเจฐเจฆเจพ เจนเฉ เจเจฟเจธเจจเฉเฉฐ เจเจนเจฟเฉฐเจฆเฉ เจนเจจ record.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