Mediastreamer2 VoIP အင်ဂျင်ကို စူသစမ်သခဌင်သ။ အပိုင်သ 5

ဆောင်သပါသ၏ အကဌောင်သအရာကို ကျလန်ုပ်ထံမဟ ယူပါသည်။ zen ချန်နယ်.

အသံဖမ်သကိရိယာ

နောက်ဆုံသ၌ ဆောင်သပါသ ကျလန်ုပ်တို့သည် အချက်ပဌအဆင့်မီတာကို ဖန်တီသထာသပါသည်။ ကတစ်ခုတလင် tone signal ကို မည်သို့သိရဟိနိုင်သည်ကို လေ့လာပါမည်။

Mediastreamer2 VoIP အင်ဂျင်ကို စူသစမ်သခဌင်သ။ အပိုင်သ 5

ရဟေသခေတ်အခါက မိသာသစုတိုင်သ 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

မဟတ်ချက် Add