የ Mediastreamer2 VoIP ሞተርን ማሰስ። ክፍል 5

የጽሁፉ ይዘት ከኔ የተወሰደ ነው። የዜን ቻናል.

የቃና ዳሳሽ

በመጨረሻው ጽሑፍ የሲግናል ደረጃ መለኪያ ፈጠርን. በዚህ ውስጥ የድምፅ ምልክትን እንዴት መለየት እንደሚቻል እንማራለን.

የ 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_አዘጋጅ_ተመልሰን_ጥሪ_አሳውቅ(). እንደ ክርክሮች፣ የማጣሪያው ጠቋሚ፣ የመልሶ መደወያ ተግባር ጠቋሚ እና ወደ መልሶ መደወያ ተግባር (የተጠቃሚ ውሂብ) ማስተላለፍ የምንፈልገውን መረጃ ጠቋሚ ይቀበላል።

ማወቂያው ሲቀሰቀስ፣ የመልሶ መደወያ ተግባር የተጠቃሚ ውሂብ፣ የፈላጊ ማጣሪያ ጠቋሚ፣ የክስተት መለያ እና ክስተቱን የሚገልጽ መዋቅር ይቀበላል፡


/** * 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 ፕሮቶኮልን በመጠቀም በኤተርኔት አውታረመረብ ላይ የኦዲዮ ምልክትን ወደ ማስተላለፍ እንሸጋገራለን እና ወዲያውኑ በሪሞት መቆጣጠሪያችን ውስጥ እንተገብራለን።

ምንጭ: hab.com

አስተያየት ያክሉ