Tha stuth an artaigil air a thoirt bho mo .
Lorgaire comharran tòna
Anns an àm a dh ’fhalbh Chruthaich sinn meatair ìre comharran. San oideachadh seo, ionnsaichidh sinn mar a lorgas sinn comharra tòna.
![]()
Anns na seann làithean, nuair nach robh telebhisean aig a h-uile teaghlach, agus leth dhiubh ag atharrachadh seanalan le clobhairean, dh’innis am preas teicnigeach cèin an naidheachd inntinneach gun robh aon neach-dèanamh telebhisean air na seataichean aca a uidheamachadh le smachd iomallach gun uèir. Nochd mion-fhiosrachadh gun robh an smachd iomallach ag obair às aonais bataraidhean le taing do dhòigh-obrach neo-àbhaisteach - bha e meacanaigeach agus measgachadh de dh’ionnsramaid ciùil - glockenspiel agus revolver. Bha siolandairean meatailt de dhiofar fhaid ann an druma an revolver, agus nuair a bhuail an neach-bualaidh fear dhiubh, thòisich an siolandair a’ glaodhaich aig a tricead fhèin, is dòcha ultrasonach. Chuala an eileagtronaig anns an telebhisean an comharra seo agus, às deidh dhaibh a tricead a dhearbhadh, rinn iad an gnìomh iomchaidh - atharraich an sianal, atharraich an tomhas-lìonaidh, no cuir dheth an telebhisean.
An-diugh feuchaidh sinn ris an t-siostam tar-chuir àithne seo ath-thogail a’ cleachdadh ar n-eòlais air an t-sruthadh mheadhanan.
Gus smachd iomallach a shamhlachadh, cleachdaidh sinn an còd bhon eisimpleir gineadair tòna againn. Cuiridh sinn smachd ris air tricead a’ ghineadair tòna stèidhichte air stròcan iuchrach agus glacadair le decoder a chuireas a-mach òrdughan a gheibhear chun chonsól. Às deidh atharrachadh, bu chòir don ghineadair tòna sia tònaichean tricead a leigeil a-mach, a chleachdas sinn gus òrdughan a chòdachadh airson meud suas/sìos, atharrachadh seanail, agus Tbh air/dheth. Gus an lorgaire a rèiteachadh, cleachd an structar 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;Faodar an lorgaire a rèiteachadh gus 10 structaran mar sin a lorg, a’ ciallachadh gum faodar aon lorgaire a rèiteachadh gus 10 comharran dà-thòna a lorg. Ach, cha bhith sinn a’ cleachdadh ach sia comharran aon-thòna. Tha an dòigh MS_TONE_DETECTOR_ADD_SCAN air a chleachdadh gus an lorgaire a rèiteachadh.
Gus an urrainn don lorgaire fios a chur thugainn gu bheil comharra leis na co-phàirtean tricead a tha thu ag iarraidh air ruighinn aig a’ chuir-a-steach aige, feumaidh sinn gnìomh gairm-air-ais a thoirt dha a chuireas e an gnìomh sa chùis seo. Nithear seo le bhith a’ cleachdadh an gnìomh ms_filter_set_notify_callback()Mar argamaidean, gheibh e comharraiche chun chriathrag, comharraiche chun ghnìomh gairm air ais, agus comharraiche chun dàta a bu mhath leinn a thoirt don ghnìomh gairm air ais (dàta neach-cleachdaidh).
Nuair a thèid an lorgaire a bhrosnachadh, gheibh an gnìomh gairm-air-ais dàta neach-cleachdaidh, comharraiche chun chriathrag lorgaire, comharraiche tachartais, agus structar a tha a’ toirt cunntas air an tachartas:
/** * 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;
Tha diagram structarail a’ ghiullachd chomharran ri fhaicinn san dealbh tiotail.
Uill, a-nis còd a’ phrògraim fhèin le beachdan.
/* Файл 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);
}
}Cuir ri chèile agus ruith am prògram. Ma tha a h-uile càil ag obair ceart, bu chòir dhut rudeigin mar seo fhaicinn às dèidh a ruith:
$ ./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ùth air iuchair sam bith bho "1" gu "6", a’ dearbhadh leis an iuchair "Enter", bu chòir dhut liosta fhaighinn a tha coltach ri seo:
2
Отправлена команда: 2
Принята команда: V-
1
Отправлена команда: 1
Принята команда: V+
3
Отправлена команда: 3
Принята команда: C+
4
Отправлена команда: 4
Принята команда: C-
0
$Chì sinn gu bheil na tònaichean-àithne air an cur gu soirbheachail agus gu bheil an lorgaire gan lorg.
Anns an ath artaigil, coimheadaidh sinn air claisneachd a thar-chur thairis air lìonra Ethernet a’ cleachdadh protocol RTP agus cuiridh sinn an sàs e sa bhad air ar smachd iomallach.
Source: www.habr.com
