Ṣiṣawari ẹrọ Mediastreamer2 VoIP. Apa 5

Awọn ohun elo ti awọn article ti wa ni ya lati mi zen ikanni.

Oluwari ohun orin

Ni ikẹhin article A ti ṣẹda mita ipele ifihan agbara. Ninu ọkan yii a yoo kọ bi a ṣe le rii ifihan ohun orin kan.

Ṣiṣawari ẹrọ Mediastreamer2 VoIP. Apa 5

Ni awọn ọjọ atijọ, nigbati kii ṣe gbogbo idile ni TV kan, ati idaji wọn yipada awọn ikanni nipa lilo awọn pliers, awọn iroyin iyalẹnu han ninu awọn atunyẹwo ti tẹ imọ-ẹrọ ajeji pe olupese TV kan ni ipese awọn ẹrọ wọn pẹlu isakoṣo latọna jijin alailowaya. Lati awọn alaye o ti mọ pe isakoṣo latọna jijin ṣiṣẹ laisi awọn batiri ọpẹ si lilo ọna aibikita - iṣakoso latọna jijin jẹ ẹrọ ati pe o jẹ arabara ti ohun elo orin kan - metallophone ati Revolver. Ilu Revolver ni awọn silinda irin ti o yatọ si gigun, ati nigbati pin ibọn kan lu ọkan ninu wọn, silinda naa bẹrẹ si ohun orin ni igbohunsafẹfẹ tirẹ. Aigbekele lori olutirasandi. Awọn ẹrọ itanna ti o wa ninu TV gbọ ifihan agbara yii ati, ti o ti pinnu ipo igbohunsafẹfẹ rẹ, ṣe iṣẹ ti o yẹ - yi ikanni pada, yi iwọn didun pada, pa TV naa.

Loni a yoo gbiyanju lati tun ṣe eto gbigbe aṣẹ yii, ni lilo imọ wa ti ṣiṣan media.

Lati ṣe adaṣe isakoṣo latọna jijin, a yoo lo ọrọ ti apẹẹrẹ olupilẹṣẹ ohun orin wa. A yoo ṣafikun si iṣakoso ti igbohunsafẹfẹ monomono lati awọn bọtini bọtini ati olugba kan pẹlu decoder ti yoo gbejade awọn aṣẹ ti o gba si console. Lẹhin iyipada, olupilẹṣẹ yẹ ki o gbe awọn ohun orin ti awọn igbohunsafẹfẹ 6, pẹlu eyiti a yoo fi koodu koodu sii lati mu / dinku iwọn didun, yi ikanni pada, tan / pa TV naa. Lati tunto aṣawari, ọna atẹle yii lo:

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;

A le fun aṣawari 10 ti awọn ẹya wọnyi, nitorinaa aṣawari kan le tunto lati ṣawari awọn ifihan agbara ohun orin meji mẹwa. Ṣugbọn a yoo lo awọn ifihan agbara-ohun orin mẹfa nikan. Lati gbe eto lọ si aṣawari, ọna MS_TONE_DETECTOR_ADD_SCAN lo.

Ni ibere fun aṣawari lati sọ fun wa pe ifihan kan pẹlu awọn paati igbohunsafẹfẹ ti o fẹ ti de titẹ sii rẹ, a gbọdọ pese pẹlu iṣẹ ipe pada ti yoo ṣe ifilọlẹ ninu ọran yii. Eyi ni a ṣe nipa lilo iṣẹ naa ms_filter_set_notify_callback(). Gẹgẹbi awọn ariyanjiyan, o gba itọka si àlẹmọ, itọka si iṣẹ ipe pada, ati itọka si data ti a yoo fẹ lati kọja si iṣẹ ipe pada (data olumulo).

Nigbati aṣawari naa ba jẹ okunfa, iṣẹ ipe pada yoo gba data olumulo, itọka si àlẹmọ aṣawari, idamọ iṣẹlẹ, ati igbekalẹ ti n ṣalaye iṣẹlẹ naa:


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

Aworan atọka ti sisẹ ifihan agbara han ninu aworan akọle.

O dara, bayi koodu eto funrararẹ pẹlu awọn asọye.

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

A ṣe akopọ ati ṣiṣe eto naa. Ti ohun gbogbo ba ṣiṣẹ ni deede, lẹhinna lẹhin ifilọlẹ a yẹ ki o gba nkan bii ihuwasi eto yii:

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

Tẹ awọn bọtini eyikeyi lati “1” si “6”, ifẹsẹmulẹ pẹlu bọtini “Tẹ”, o yẹ ki o gba nkan bi atokọ yii:


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

A rii pe awọn ohun orin aṣẹ ti firanṣẹ ni aṣeyọri ati aṣawari naa rii wọn.

Ninu nkan ti o tẹle a yoo yipada si gbigbe ifihan ohun afetigbọ sori nẹtiwọọki Ethernet nipa lilo ilana RTP ati lo lẹsẹkẹsẹ ni isakoṣo latọna jijin wa.

orisun: www.habr.com

Fi ọrọìwòye kun