Омӯзиши муҳаррики Mediastreamer2 VoIP. Қисми 5

Материали макола аз ман гирифта шудааст канали zen.

Детектори оҳанг

Дар охир мақола Мо ченкунаки сатҳи сигналро офаридаем. Дар ин мақола мо мефаҳмем, ки чӣ тавр муайян кардани сигнали оҳанг.

Омӯзиши муҳаррики Mediastreamer2 VoIP. Қисми 5

Дар айёми пеш, ки на хар оила телевизор дошту нисфи онхо бо истифода аз анбур канал иваз мекарданд, дар баррасихои матбуоти техникии хоричй хабари ачоиб пайдо шуд, ки як тавлидкунандаи телевизор дастгоххои худро бо пулти бесим муҷаҳҳаз кардааст. Аз тафсилот маълум буд, ки пульти пульт ба туфайли истифодаи усули гайриоддй бе батарея кор мекунад — пульти пульт механикй буда, гибриди асбоби мусикй — металлофон ва револьвер буд. Дар барабани револьвер баллонхои металлии дарозиашон гуногун буданд ва хангоми ба яке аз онхо бархурдани силиндр бо басомади худ занг мезад. Эҳтимол дар УЗИ. Электроникаи телевизор ин сигналро шунида, басомади онро муайян карда, амалиёти дахлдорро ичро кард — каналро иваз кунед, овози баландро иваз кунед, телевизорро хомуш кунед.

Имрӯз мо кӯшиш хоҳем кард, ки ин системаи интиқоли фармонро бо истифода аз дониши худ дар бораи стримери медиа дубора барқарор кунем.

Барои тақлид кардани идоракунии дурдаст, мо матни намунаи генератори оҳангиамонро истифода мебарем. Мо ба он назорати басомади генераторро аз зарбаҳои клавиатура ва қабулкунаки декодер илова мекунем, ки фармонҳои қабулшударо ба консол мебарорад. Пас аз тағир додан, генератор бояд оҳангҳои 6 басомадро тавлид кунад, ки мо бо онҳо фармонҳои зиёд кардан/кам кардани садо, иваз кардани канал, фурӯзон/хомӯш кардани телевизорро рамзгузорӣ мекунем. Барои танзими детектор сохтори зерин истифода мешавад:

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-тои ин сохтор дода мешавад, аз ин рӯ як детекторро барои муайян кардани даҳ сигнали дутонг танзим кардан мумкин аст. Аммо мо танҳо шаш сигнали якрангро истифода хоҳем бурд. Барои интиқоли танзимот ба детектор усули MS_TONE_DETECTOR_ADD_SCAN истифода мешавад.

Барои он ки детектор моро огоҳ созад, ки сигнал бо ҷузъҳои басомади дилхоҳ ба вуруди он расидааст, мо бояд онро бо функсияи бозхонд таъмин кунем, ки он дар ин ҳолат оғоз меёбад. Ин бо истифода аз функсия анҷом дода мешавад ms_filter_set_notify_callback(). Ҳамчун аргументҳо, он ишоракунакро ба филтр, ишоракунакро ба функсияи бозхонд ва нишондодеро ба маълумоте мегирад, ки мо мехоҳем ба функсияи бозхонд (маълумоти корбар) интиқол диҳем.

Вақте ки детектор ба кор андохта мешавад, функсияи бозхонд маълумоти корбар, ишоракунанда ба филтри детектор, идентификатори ҳодиса ва сохтореро, ки ҳодисаро тавсиф мекунад, қабул мекунад:


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

Мо мебинем, ки оҳангҳои фармон бомуваффақият фиристода мешаванд ва детектор онҳоро муайян мекунад.

Дар мақолаи навбатӣ мо ба интиқоли сигнали аудиоӣ тавассути шабакаи Ethernet бо истифода аз протоколи RTP рӯ меорем ва фавран онро дар идоракунии дурдасти худ татбиқ мекунем.

Манбаъ: will.com

Илова Эзоҳ