เบเบฒเบ™เบชเบณเบซเบผเบงเบ”เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ Mediastreamer2 VoIP. เบžเบฒเบเบ—เบต 4

เป€เบญเบเบฐเบชเบฒเบ™เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเปเบกเปˆเบ™เป€เบญเบปเบฒเบกเบฒเบˆเบฒเบเบ‚เบญเบ‡เบ‚เป‰เบญเบ เบŠเปˆเบญเบ‡ zen.

เบเบฒเบ™เบชเป‰เบฒเบ‡เป€เบ„เบทเปˆเบญเบ‡เบงเบฑเบ”เปเบ—เบเบฅเบฐเบ”เบฑเบšเบชเบฑเบ™เบเบฒเบ™

เปƒเบ™เบ—เบตเปˆเบชเบธเบ” เบšเบปเบ”เบ„เบงเบฒเบก เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป„เบ”เป‰โ€‹เบเบฐโ€‹เบˆเปˆเบฒเบ‡โ€‹เปเบˆเป‰เบ‡โ€‹เบเบฒเบ™โ€‹เบ›เบดเบ”โ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบ–เบทเบโ€‹เบ•เป‰เบญเบ‡โ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบชเบทเปˆโ€‹เบกเบงเบ™โ€‹เบŠเบปเบ™ streamerโ€‹.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบฐเบเบญเบšเบงเบปเบ‡เบˆเบญเบ™เป€เบ„เบทเปˆเบญเบ‡เบงเบฑเบ”เปเบ—เบเบฅเบฐเบ”เบฑเบšเบชเบฑเบ™เบเบฒเบ™เปเบฅเบฐเบฎเบฝเบ™เบฎเบนเป‰เบงเบดเบ—เบตเบเบฒเบ™เบญเปˆเบฒเบ™เบœเบปเบ™เบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบˆเบฒเบเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡. เปƒเบซเป‰เบ›เบฐเป€เบกเบตเบ™เบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบงเบฑเบ”เปเบ—เบ.

เบŠเบธเบ”เบ‚เบญเบ‡เบ•เบปเบงเบเบญเบ‡เบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เป‚เบ”เบ media streamer เบ›เบฐเบเบญเบšเบกเบตเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡, MS_VOLUME, เป€เบŠเบดเปˆเบ‡เบชเบฒเบกเบฒเบ”เบงเบฑเบ”เปเบ—เบเบฅเบฐเบ”เบฑเบš RMS เบ‚เบญเบ‡เบชเบฑเบ™เบเบฒเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฑเบ™, เบซเบผเบธเบ”เบœเปˆเบญเบ™เบชเบฑเบ™เบเบฒเบ™เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบซเบผเบฒเบเปเบฅเบฐเบšเปเปˆเบ„เบฒเบ”เบ„เบดเบ”. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบญเบธเบ—เบดเบ”เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบฑเบ‡เปเบปเบ”เปƒเบซเป‰เบเบฑเบšเบ•เบปเบงเบเบญเบ‡เบ™เบตเป‰เปƒเบ™เบžเบฒเบเบซเบผเบฑเบ‡. เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เปเบกเบฑเบ”.

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบเปเบฒเป€เบ™เบตเบ”เบชเบฝเบ‡เป€เบ›เบฑเบ™เปเบซเบผเปˆเบ‡เบชเบฑเบ™เบเบฒเบ™, เบชเบฑเบ™เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบซเบฒเบ•เบปเบงเบเบญเบ‡ MS_VOLUME, เป„เบ›เบซเบฒเบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ—เบตเปˆเบšเบฑเบ”เบชเบฝเบ‡เบ–เบทเบเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ.

เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบเปเบฒเป€เบ™เบตเบ”เปƒเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เป€เบฅเบฑเบเบ™เป‰เบญเบ - เบกเบฑเบ™เบˆเบฐเบชเป‰เบฒเบ‡เบชเบฑเบ™เบเบฒเบ™เบชเบฝเบ‡เบ”เบฝเบงเบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒ, i.e. เบชเบฑเบ™โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบซเบ™เบถเปˆเบ‡ oscillation sinusoidalโ€‹.

เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบ„เบงเบฒเบกเบ–เบตเปˆเปเบฅเบฐเบ„เบงเบฒเบกเบเบงเป‰เบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เป‰เบญเบ‡เบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเบ—เบตเปˆเบชเบฑเบ™เบเบฒเบ™เบˆเบฐเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™; เบกเบฑเบ™เบ•เป‰เบญเบ‡เบžเบฝเบ‡เบžเปเป€เบžเบทเปˆเบญเปƒเบซเป‰เบˆเปเบฒเบ™เบงเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบžเบฝเบ‡เบžเปเบœเปˆเบฒเบ™เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡ MS_VOLUME เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบฑเบ”เปเบ—เบ. เป€เบžเบทเปˆเบญเป‚เบญเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เบเปเบฒเป€เบ™เบตเบ”, เป‚เบ„เบ‡เบชเป‰เบฒเบ‡ 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 เบ‚เบญเบ‡เบกเบฑเบ™.

เปเบœเบ™เบงเบฒเบ”เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบชเบฑเบ™เบเบฒเบ™:

เบเบฒเบ™เบชเบณเบซเบผเบงเบ”เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ Mediastreamer2 VoIP. เบžเบฒเบเบ—เบต 4

เบฅเบฐเบซเบฑเบ”เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ„เบ‡เบเบฒเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰.

/* ะคะฐะนะป 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. เปƒเบซเป‰เปเบฅเปˆเบ™เบกเบฑเบ™เปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš:

ะะผะฟะปะธั‚ัƒะดะต ัะธะฝัƒัะฐ 1.000000 ะฒะพะปัŒั‚  ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒะตั‚ ัั€ะตะดะฝะตะบะฒะฐะดั€ะฐั‚ะธั‡ะตัะบะพะต ะทะฝะฐั‡ะตะฝะธะต 0.707733 ะฒะพะปัŒั‚.

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰, เบœเบปเบ™เบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบเบปเบ‡เบเบฑเบ™เบเบฑเบšเบˆเบธเบ”เบ—เบปเบ”เบชเบฐเบ™เบดเบเบปเบกเบ—เบต 2 เบ”เป‰เบงเบเบ„เปˆเบฒเบ—เบฒเบ‡เบ—เบดเบ”เบชเบฐเบ”เบตเป€เบ—เบปเปˆเบฒเบเบฑเบšเบฎเบฒเบเบชเบญเบ‡เบ‚เบญเบ‡เบชเบญเบ‡เปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เป€เบ„เบดเปˆเบ‡เปœเบถเปˆเบ‡: sqr(2)/0,7071067811865475=XNUMX

เบเบฒเบ™เบšเปˆเบฝเบ‡เป€เบšเบ™เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบ‚เบญเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเบฒเบเบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เปเบกเปˆเบ™ 0.1%. เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ›เบฐเป€เบกเบตเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ‚เบญเบ‡เบเบฒเบ™เบงเบฑเบ”เปเบ—เบเปƒเบ™เบฅเบฐเบ”เบฑเบšเบชเบฑเบ™เบเบฒเบ™เบชเบนเบ‡เบชเบธเบ”. เบ•เบฒเบกเบ™เบฑเป‰เบ™เปเบฅเป‰เบง, เป€เบกเบทเปˆเบญเบฅเบฐเบ”เบฑเบšเบซเบผเบธเบ”เบฅเบปเบ‡, เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ„เบงเบ™เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบ—เปˆเบฒเบ™เบ›เบฐเป€เบกเบตเบ™เบกเบฑเบ™เบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡เบชเปเบฒเบฅเบฑเบšเบฅเบฐเบ”เบฑเบšเบชเบฑเบ™เบเบฒเบ™เบ•เปˆเปเบฒ.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ•เปเปˆเป„เบ›เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบฐเบเบญเบšเบงเบปเบ‡เบˆเบญเบ™เบ—เบตเปˆเบเบงเบ”เบžเบปเบšเบเบฒเบ™เบ›เบฐเบเบปเบ”เบ•เบปเบงเบ‚เบญเบ‡เบชเบฑเบ™เบเบฒเบ™เป‚เบ•เบ™เบ‚เบญเบ‡เบ„เบงเบฒเบกเบ–เบตเปˆเบ‚เบญเบ‡เบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบเบงเบ”เบˆเบฑเบšเบชเบฝเบ‡. เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบˆเบฐเป„เบ”เป‰เบฎเบฝเบ™เบฎเบนเป‰เบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เป€เบซเบ”เบเบฒเบ™เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป‚เบ”เบเบ•เบปเบงเบเบญเบ‡.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™