Iniúchadh ar inneall VoIP Mediastreamer2. Cuid 5

Tógtar ábhar an ailt ó mo cainéal zen.

Brathadóir ton

Sa cheann deireanach Airteagal Tá méadar leibhéal comhartha cruthaithe againn. Sa cheann seo beidh muid ag foghlaim conas a bhrath comhartha ton.

Iniúchadh ar inneall VoIP Mediastreamer2. Cuid 5

Sna seanlaethanta, nuair nach raibh teilifís ag gach teaghlach, agus a leath acu ag aistriú cainéil ag baint úsáide as greamairí, bhí nuacht shuimiúil le feiceáil in athbhreithnithe ar an bpreas teicniúil eachtrach go ndearna monaróir teilifíse amháin cianrialtán gan sreang ar a gcuid feistí. Ó na sonraí bhí sé ar eolas go raibh an cianrialtán ag feidhmiú gan cadhnraí a bhuíochas le húsáid cur chuige neamhghnách - bhí an cianrialtán meicniúil agus bhí sé ina hibrideach d'ionstraim ceoil - miotalafón agus gunnán. Bhí sorcóirí miotail de fhaid éagsúla sa druma gunnán, agus nuair a bhuail an bioráin lámhaigh ceann acu, thosaigh an sorcóir ag glaoch ar a mhinicíocht féin. Is dócha ar ultrafhuaime. Chuala an leictreonaic sa teilifís an comhartha seo agus, tar éis a mhinicíocht a chinneadh, rinne siad an gníomh cuí - athraigh an cainéal, athraigh an toirt, cas as an teilifís.

Inniu déanfaimid iarracht an córas tarchurtha ordaithe seo a athchruthú, ag baint úsáide as ár n-eolas ar an sruthóir meán.

Chun cianrialtán a insamhladh, úsáidfimid téacs ár sampla gineadóra ton. Cuirfimid leis rialú minicíocht an ghineadóra ó eochairbhuillí agus glacadóir le díchódóir a aschuirfidh orduithe faighte chuig an gconsól. Tar éis an athraithe, ba cheart don ghineadóir toin de 6 mhinicíocht a tháirgeadh, lena n-ionchódóimid orduithe chun an toirt a mhéadú/a laghdú, an cainéal a athrú, an teilifís a chasadh air/as. Chun an brathadóir a chumrú, úsáidtear an struchtúr seo a leanas:

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;

Is féidir brathadóir 10 gcinn de na struchtúir seo a thabhairt, mar sin is féidir brathadóir amháin a chumrú chun deich comhartha dhá-ton a bhrath. Ach ní úsáidfimid ach sé chomhartha aon-ton. Chun socruithe a aistriú go dtí an brathadóir, úsáidtear an modh MS_TONE_DETECTOR_ADD_SCAN.

Chun gur féidir leis an brathadóir a chur in iúl dúinn go bhfuil comhartha leis na comhpháirteanna minicíochta inmhianaithe tar éis teacht ar a ionchur, ní mór dúinn feidhm aisghlaoite a sholáthar dó a sheolfaidh sé sa chás seo. Déantar é seo ag baint úsáide as an fheidhm ms_filter_set_notify_callback(). Mar argóintí, faigheann sé pointeoir chuig an scagaire, pointeoir don fheidhm aisghlao, agus pointeoir do na sonraí ba mhaith linn a chur ar aghaidh chuig an bhfeidhm aisghlao (sonraí úsáideora).

Nuair a spreagtar an brathadóir, gheobhaidh an fheidhm aisghlao sonraí úsáideora, pointeoir chuig an scagaire braite, aitheantóir teagmhais, agus struchtúr a chuireann síos ar an imeacht:


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

Taispeántar an blocléaráid de phróiseáil comhartha sa phictiúr teidil.

Bhuel, anois an cód clár féin le tuairimí.

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

Déanaimid an clár a thiomsú agus a reáchtáil. Má oibríonn gach rud i gceart, ansin tar éis seoladh ba cheart dúinn rud éigin mar seo a fháil ar iompar an chláir:

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

Brúigh aon eochracha ó “1” go “6”, ag deimhniú leis an eochair “Iontráil”, ba cheart duit rud éigin mar seo a fháil:


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

Feicimid go seoltar na toin ordaithe go rathúil agus go mbraitheann an brathadóir iad.

Sa chéad alt eile casfaimid chuig comhartha fuaime a tharchur thar líonra Ethernet ag baint úsáide as an bprótacal RTP agus cuirfimid é i bhfeidhm láithreach inár gcianrialtán.

Foinse: will.com

Add a comment