ויספאָרשן די Mediastreamer2 וואָיפּ מאָטאָר. טייל 5

דער מאַטעריאַל פון דעם אַרטיקל איז גענומען פון מיין זען קאַנאַל.

טאָן דעטעקטאָר

אין דער פאַרגאַנגענהייט אַרטיקל מיר האָבן באשאפן אַ סיגנאַל מדרגה מעטער. אין דעם איין מיר וועלן לערנען ווי צו דעטעקט אַ טאָן סיגנאַל.

ויספאָרשן די Mediastreamer2 וואָיפּ מאָטאָר. טייל 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
$

מיר זען אַז די באַפֿעל טאָנעס זענען הצלחה געשיקט און די דעטעקטאָר דיטעקץ זיי.

אין דער ווייַטער אַרטיקל מיר וועלן ווענדן צו טראַנסמיטינג אַ אַודיאָ סיגנאַל איבער אַן עטהערנעט נעץ ניצן די RTP פּראָטאָקאָל און גלייך צולייגן עס אין אונדזער ווייַט קאָנטראָל.

מקור: www.habr.com

לייגן אַ באַמערקונג