Ke ʻimi nei i ka ʻenekini Mediastreamer2 VoIP. Mahele 5

Lawe ʻia ka mea o ka ʻatikala mai kaʻu zen channel.

Mea ʻike leo

I ka hope loa 'ōlelo Ua hana mākou i kahi mika pae hōʻailona. Ma kēia e aʻo ai mākou pehea e ʻike ai i kahi hōʻailona leo.

Ke ʻimi nei i ka ʻenekini Mediastreamer2 VoIP. Mahele 5

I ka wā kahiko, ʻaʻole i loaʻa ka TV i kēlā me kēia ʻohana, a ua hoʻololi ka hapalua o lākou i nā kaha me ka hoʻohana ʻana i nā pliers, ua ʻike ʻia nā nūhou hoihoi i nā loiloi o ka paʻi ʻenehana haole i hoʻolako ʻia e kekahi mea hana TV i kā lākou mau hāmeʻa me kahi mana mamao uea. Mai nā kikoʻī i ʻike ʻia ua hoʻohana ʻia ka mana mamao me ka ʻole o nā pila ma muli o ka hoʻohana ʻana i kahi ala maʻamau - ʻo ka mana mamao he mechanical a he hybrid o kahi mea kani - he metallophone a me kahi revolver. Aia i loko o ka pahu kipi nā pahu metala o nā lōʻihi like ʻole, a i ka wā i paʻi ai ka pine kī i kekahi o lākou, ua hoʻomaka ke kani ʻana o ka pahu i kona alapine ponoʻī. Malia paha ma ka ultrasound. Ua lohe ka uila uila i kēia hōʻailona a, i ka hoʻoholo ʻana i kona alapine, hana i ka hana kūpono - hoʻololi i ke kahawai, hoʻololi i ka leo, hoʻopau i ka TV.

I kēia lā e hoʻāʻo mākou e kūkulu hou i kēia ʻōnaehana hoʻouna kauoha, me ka hoʻohana ʻana i ko mākou ʻike i ka streamer media.

No ka hoʻohālike i kahi mana mamao, e hoʻohana mākou i ke kikokikona o kā mākou hiʻohiʻona leo generator. E hoʻohui mākou iā ia i ka mana o ka frequency generator mai nā kī kī a me kahi mea hoʻokipa me kahi decoder e hoʻopuka i nā kauoha i loaʻa i ka console. Ma hope o ka hoʻololi ʻana, pono e hoʻopuka ka mea hana i nā leo o 6 mau alapine, kahi e hoʻopili ai mākou i nā kauoha e hoʻonui / hoʻemi i ka leo, hoʻololi i ke kahawai, hoʻohuli / hoʻopau i ka TV. No ka hoʻonohonoho ʻana i ka detector, hoʻohana ʻia kēia ʻano hana:

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;

Hiki ke hāʻawi ʻia kahi mea ʻike i 10 o kēia mau hale, no laila hiki ke hoʻonohonoho ʻia hoʻokahi mea ʻike e ʻike i nā hōʻailona ʻelua-leo he ʻumi. Akā e hoʻohana mākou i ʻeono mau leo ​​kani hoʻokahi wale nō. No ka hoʻololi ʻana i nā hoʻonohonoho i ka mea ʻike, hoʻohana ʻia ke ʻano MS_TONE_DETECTOR_ADD_SCAN.

I mea e hōʻike mai ai ka mea ʻike iā mākou ua hiki mai kahi hōʻailona me nā ʻāpana alapine i makemake ʻia i kāna hoʻokomo, pono mākou e hāʻawi iā ia me kahi hana callback e hoʻomaka ai i kēia hihia. Hana ʻia kēia me ka hoʻohana ʻana i ka hana ms_filter_set_notify_callback(). E like me nā hoʻopaʻapaʻa, loaʻa iā ia kahi kuhikuhi i ka kānana, kahi kuhikuhi i ka hana callback, a me kahi kuhikuhi i ka ʻikepili a mākou e makemake ai e hāʻawi i ka hana callback (ʻikepili mea hoʻohana).

Ke hoʻomaka ʻia ka mea ʻike maka, e loaʻa i ka hana callback ka ʻikepili mea hoʻohana, kahi kuhikuhi i ka kānana ʻike, kahi mea hōʻike hanana, a me kahi hale e wehewehe ana i ka hanana:


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

Hōʻike ʻia ke kiʻi poʻomanaʻo o ka hana hōʻailona ma ke kiʻi poʻo inoa.

ʻAe, i kēia manawa ke code program me nā manaʻo.

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

Hoʻopili mākou a holo i ka papahana. Inā holo pololei nā mea a pau, a laila ma hope o ka hoʻomaka ʻana e loaʻa iā mākou kahi mea e like me kēia ʻano papahana:

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

E kaomi i nā kī mai "1" a i "6", e hōʻoia ana me ke kī "Enter", pono ʻoe e loaʻa i kahi mea e like me kēia papa inoa:


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

ʻIke mākou ua hoʻouna maikaʻi ʻia nā leo kauoha a ʻike ka mea ʻike iā lākou.

Ma ka ʻatikala aʻe e huli mākou i ka hoʻouna ʻana i kahi hōʻailona leo ma luna o kahi pūnaewele Ethernet me ka hoʻohana ʻana i ka protocol RTP a hoʻopili koke iā ia i kā mākou mana mamao.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka