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" تائين ڪنهن به ڪيچ کي دٻايو، "داخل ڪريو" سان تصديق ڪندي، توهان کي هن لسٽنگ وانگر ڪجهه حاصل ڪرڻ گهرجي:


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

اسان ڏسون ٿا ته ڪمانڊ ٽونز ڪاميابيءَ سان موڪليا ويا آهن ۽ ڊيڪٽر انهن کي ڳولي ٿو.

ايندڙ آرٽيڪل ۾ اسين آر ٽي پي پروٽوڪول استعمال ڪندي ايٿرنيٽ نيٽ ورڪ تي آڊيو سگنل منتقل ڪرڻ ڏانهن رخ ڪنداسين ۽ ان کي فوري طور تي اسان جي ريموٽ ڪنٽرول ۾ لاڳو ڪنداسين.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو