Eksplore motè VoIP Mediastreamer2 la. Pati 5

Materyèl atik la pran nan men mwen zen channel.

Detektè ton

Nan tan lontan an Atik Nou te kreye yon mèt nivo siyal. Nan yon sèl sa a nou pral aprann ki jan yo detekte yon siyal ton.

Eksplore motè VoIP Mediastreamer2 la. Pati 5

Nan tan lontan, lè se pa tout fanmi ki te gen yon televizyon, ak mwatye nan yo te chanje chanèl lè l sèvi avèk pens, nouvèl entrigan te parèt nan revizyon laprès teknik etranje a ke yon sèl manifakti televizyon te ekipe aparèy yo ak yon kontwòl remote san fil. Soti nan detay yo, li te konnen ke kontwòl remote la opere san yo pa pil gras a itilize nan yon apwòch etranj - kontwòl remote la te mekanik e li te yon ibrid nan yon enstriman mizik - yon metalofòn ak yon revòlvè. Tanbou revòlvè a te gen silenn metal ki gen diferan longè, epi lè peny lan frape youn nan yo, silenn lan te kòmanse sonnen nan pwòp frekans li. Sipoze sou ultrason. Elektwonik yo nan televizyon an te tande siyal sa a epi, lè yo te detèmine frekans li yo, te fè aksyon ki apwopriye a - chanje chanèl la, chanje volim, fèmen televizyon an.

Jodi a nou pral eseye rekonstwi sistèm transmisyon lòd sa a, lè l sèvi avèk konesans nou nan streamer medya a.

Pou simule yon kontwòl remote, nou pral sèvi ak tèks egzanp dèlko ton nou an. Nou pral ajoute nan li kontwòl nan frekans dèlko a soti nan frap ak yon reseptè ak yon dekodeur ki pral pwodiksyon resevwa kòmandman nan konsole a. Apre chanjman an, dèlko a ta dwe pwodwi ton nan 6 frekans, ak ki nou pral kode kòmandman ogmante / diminye volim nan, chanje chanèl la, limen / fèmen televizyon an. Pou konfigirasyon detektè a, yo itilize estrikti sa a:

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;

Yon detektè ka bay 10 nan estrikti sa yo, kidonk yon sèl detektè ka configuré pou detekte dis siyal de-ton. Men, nou pral sèvi ak sèlman sis siyal yon sèl-ton. Pou transfere paramèt yo nan detektè a, yo itilize metòd MS_TONE_DETECTOR_ADD_SCAN.

Nan lòd pou detektè a fè nou konnen ke yon siyal ak eleman frekans yo vle rive nan opinyon li, nou dwe bay li ak yon fonksyon callback ke li pral lanse nan ka sa a. Sa a se fè lè l sèvi avèk fonksyon an ms_filter_set_notify_callback(). Kòm agiman, li resevwa yon konsèy sou filtè a, yon konsèy sou fonksyon an callback, ak yon konsèy sou done yo ke nou ta renmen pase nan fonksyon an callback (done itilizatè).

Lè detektè a deklanche, fonksyon callback la pral resevwa done itilizatè a, yon konsèy sou filtè detektè a, yon idantifyan evènman, ak yon estrikti ki dekri evènman an:


/** * 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;

Dyagram nan blòk nan pwosesis siyal yo montre nan foto tit la.

Oke, kounye a kòd pwogram nan tèt li ak kòmantè.

/* Файл 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);
    }
}

Nou konpile epi kouri pwogram nan. Si tout bagay ap travay kòrèkteman, apre lansman nou ta dwe jwenn yon bagay tankou konpòtman pwogram sa a:

$ ./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

Peze nenpòt kle soti nan "1" a "6", konfime ak "Enter" kle a, ou ta dwe jwenn yon bagay tankou lis sa a:


2
Отправлена команда: 2
                      Принята команда: V-
1
Отправлена команда: 1
                      Принята команда: V+
3
Отправлена команда: 3
                      Принята команда: C+
4
Отправлена команда: 4
                      Принята команда: C-
0
$

Nou wè ke ton lòd yo voye avèk siksè epi detektè a detekte yo.

Nan pwochen atik la nou pral vire nan transmèt yon siyal odyo sou yon rezo Ethernet lè l sèvi avèk pwotokòl la RTP epi imedyatman aplike li nan kontwòl remote nou an.

Sous: www.habr.com

Add nouvo kòmantè