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_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
$

ہم دیکھتے ہیں کہ کمانڈ ٹونز کامیابی کے ساتھ بھیجے گئے ہیں اور ڈیٹیکٹر ان کا پتہ لگاتا ہے۔

اگلے مضمون میں ہم آر ٹی پی پروٹوکول کا استعمال کرتے ہوئے ایتھرنیٹ نیٹ ورک پر آڈیو سگنل کی ترسیل کی طرف رجوع کریں گے اور اسے فوری طور پر اپنے ریموٹ کنٹرول میں لاگو کریں گے۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں