వ్యాసం యొక్క పదార్థం నా నుండి తీసుకోబడింది
టోన్ జనరేటర్ను సృష్టిస్తోంది
మునుపటిలో
ఈ రోజు మనం సౌండ్ కార్డ్లో టోన్ సిగ్నల్ను రూపొందించగల అప్లికేషన్ను సృష్టిస్తాము. ఈ సమస్యను పరిష్కరించడానికి మేము దిగువ చూపిన సౌండ్ జనరేటర్ సర్క్యూట్కి ఫిల్టర్లను కనెక్ట్ చేయాలి:
మేము రేఖాచిత్రాన్ని ఎడమ నుండి కుడికి చదువుతాము, ఇది మా డేటా ప్రవాహం కదిలే దిశ. బాణాలు కూడా ఈ విషయాన్ని సూచిస్తున్నాయి. దీర్ఘచతురస్రాలు డేటా బ్లాక్లను ప్రాసెస్ చేసే మరియు ఫలితాన్ని అవుట్పుట్ చేసే ఫిల్టర్లను సూచిస్తాయి. దీర్ఘచతురస్రం లోపల, దాని పాత్ర సూచించబడుతుంది మరియు వడపోత రకం కేవలం దిగువ పెద్ద అక్షరాలలో సూచించబడుతుంది. దీర్ఘచతురస్రాలను కనెక్ట్ చేసే బాణాలు డేటా క్యూలు, దీని ద్వారా డేటా బ్లాక్లు ఫిల్టర్ నుండి ఫిల్టర్కు పంపిణీ చేయబడతాయి. సాధారణంగా, ఫిల్టర్ అనేక ఇన్పుట్లు మరియు అవుట్పుట్లను కలిగి ఉంటుంది.
ఇదంతా క్లాక్ సోర్స్తో మొదలవుతుంది, ఇది ఫిల్టర్లలో డేటాను లెక్కించే టెంపోను సెట్ చేస్తుంది. దాని గడియార చక్రం ప్రకారం, ప్రతి ఫిల్టర్ దాని ఇన్పుట్లో ఉన్న అన్ని డేటా బ్లాక్లను ప్రాసెస్ చేస్తుంది. మరియు ఫలితంతో బ్లాక్లను క్యూలో ఉంచుతుంది. మొదట, గడియార మూలానికి దగ్గరగా ఉన్న ఫిల్టర్ గణనలను నిర్వహిస్తుంది, ఆపై దాని అవుట్పుట్లకు కనెక్ట్ చేయబడిన ఫిల్టర్లు (అనేక అవుట్పుట్లు ఉండవచ్చు) మరియు మొదలైనవి. చైన్లోని చివరి ఫిల్టర్ ప్రాసెసింగ్ పూర్తయిన తర్వాత, కొత్త గడియారం వచ్చే వరకు అమలు ఆగిపోతుంది. బీట్స్, డిఫాల్ట్గా, 10 మిల్లీసెకన్ల విరామాన్ని అనుసరించండి.
మన రేఖాచిత్రానికి తిరిగి వెళ్దాం. క్లాక్ సైకిల్లు సైలెన్స్ సోర్స్ ఇన్పుట్ వద్దకు చేరుకుంటాయి; ఇది ఫిల్టర్, ఇది ప్రతి క్లాక్ సైకిల్కు అవుట్పుట్ వద్ద సున్నాలను కలిగి ఉన్న డేటా బ్లాక్ను రూపొందించడంలో బిజీగా ఉంటుంది. మేము ఈ బ్లాక్ను ధ్వని నమూనాల బ్లాక్గా పరిగణించినట్లయితే, ఇది నిశ్శబ్దం తప్ప మరేమీ కాదు. మొదటి చూపులో, నిశ్శబ్దంతో డేటా బ్లాక్లను రూపొందించడం వింతగా అనిపిస్తుంది - అన్నింటికంటే, ఇది వినబడదు, అయితే సౌండ్ సిగ్నల్ జనరేటర్ యొక్క ఆపరేషన్ కోసం ఈ బ్లాక్లు అవసరం. జెనరేటర్ ఈ బ్లాకులను ఖాళీ కాగితం వలె ఉపయోగిస్తుంది, వాటిలో ధ్వని నమూనాలను రికార్డ్ చేస్తుంది. దాని సాధారణ స్థితిలో, జనరేటర్ ఆఫ్ చేయబడింది మరియు ఇన్పుట్ బ్లాక్లను అవుట్పుట్కు ఫార్వార్డ్ చేస్తుంది. అందువలన, నిశ్శబ్దం యొక్క బ్లాక్లు మొత్తం సర్క్యూట్లో ఎడమ నుండి కుడికి మారకుండా, సౌండ్ కార్డ్లో ముగుస్తాయి. ఇది దాని ఇన్పుట్కి కనెక్ట్ చేయబడిన క్యూ నుండి నిశ్శబ్దంగా బ్లాక్లను తీసుకుంటుంది.
కానీ జనరేటర్కు ధ్వనిని ప్లే చేయమని ఆదేశం ఇచ్చినట్లయితే ప్రతిదీ మారుతుంది, అది సౌండ్ శాంపిల్స్ను రూపొందించడం ప్రారంభిస్తుంది మరియు వాటిని ఇన్పుట్ బ్లాక్లలోని నమూనాలతో భర్తీ చేస్తుంది మరియు మార్చబడిన బ్లాక్లను అవుట్పుట్ వద్ద ఉంచుతుంది. సౌండ్ కార్డ్ సౌండ్ ప్లే చేయడం ప్రారంభిస్తుంది. పైన వివరించిన పని పథకాన్ని అమలు చేసే ప్రోగ్రామ్ క్రింద ఉంది:
/* Файл mstest2.c */
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/mssndcard.h>
int main()
{
ms_init();
/* Создаем экземпляры фильтров. */
MSFilter *voidsource = ms_filter_new(MS_VOID_SOURCE_ID);
MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_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);
/* Создаем тикер. */
MSTicker *ticker = ms_ticker_new();
/* Соединяем фильтры в цепочку. */
ms_filter_link(voidsource, 0, dtmfgen, 0);
ms_filter_link(dtmfgen, 0, snd_card_write, 0);
/* Подключаем источник тактов. */
ms_ticker_attach(ticker, voidsource);
/* Включаем звуковой генератор. */
char key='1';
ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY, (void*)&key);
/* Даем, время, чтобы все блоки данных были получены звуковой картой.*/
ms_sleep(2);
}
మీడియా స్ట్రీమర్ను ప్రారంభించిన తర్వాత, మూడు ఫిల్టర్లు సృష్టించబడతాయి: voidsource, dtmfgen, snd_card_write. గడియార మూలం సృష్టించబడింది.
అప్పుడు మీరు మా సర్క్యూట్కు అనుగుణంగా ఫిల్టర్లను కనెక్ట్ చేయాలి మరియు క్లాక్ సోర్స్ చివరిగా కనెక్ట్ చేయబడాలి, ఎందుకంటే దీని తర్వాత సర్క్యూట్ వెంటనే పనిచేయడం ప్రారంభమవుతుంది. మీరు క్లాక్ సోర్స్ని అసంపూర్తిగా ఉన్న సర్క్యూట్కు కనెక్ట్ చేస్తే, మీడియా స్ట్రీమర్ అన్ని ఇన్పుట్లు లేదా అన్ని అవుట్పుట్లతో “గాలిలో వేలాడదీయడం” (కనెక్ట్ చేయబడలేదు) గొలుసులో కనీసం ఒక ఫిల్టర్ను గుర్తిస్తే అది క్రాష్ అయ్యే అవకాశం ఉంది.
ఫిల్టర్లను కనెక్ట్ చేయడం ఫంక్షన్ని ఉపయోగించి జరుగుతుంది
ms_filter_link(src, src_out, dst, dst_in)
మొదటి ఆర్గ్యుమెంట్ సోర్స్ ఫిల్టర్కు పాయింటర్ అయితే, రెండవ ఆర్గ్యుమెంట్ సోర్స్ అవుట్పుట్ నంబర్ (ఇన్పుట్లు మరియు అవుట్పుట్లు సున్నా నుండి ప్రారంభించబడిందని గమనించండి). మూడవ ఆర్గ్యుమెంట్ రిసీవర్ ఫిల్టర్కు పాయింటర్, నాల్గవది రిసీవర్ ఇన్పుట్ నంబర్.
అన్ని ఫిల్టర్లు కనెక్ట్ చేయబడ్డాయి మరియు క్లాక్ సోర్స్ చివరిగా కనెక్ట్ చేయబడింది (ఇకపై మేము దీనిని టిక్కర్ అని పిలుస్తాము). దీని తర్వాత మా సౌండ్ సర్క్యూట్ పనిచేయడం ప్రారంభిస్తుంది, కానీ కంప్యూటర్ స్పీకర్లలో ఇంకా ఏమీ వినబడదు - సౌండ్ జనరేటర్ ఆఫ్ చేయబడింది మరియు నిశ్శబ్దంతో ఇన్పుట్ డేటా బ్లాక్ల గుండా వెళుతుంది. టోన్ను రూపొందించడం ప్రారంభించడానికి, మీరు జనరేటర్ ఫిల్టర్ పద్ధతిని అమలు చేయాలి.
మేము ఫోన్లోని "1" బటన్ను నొక్కడానికి అనుగుణంగా రెండు-టోన్ (DTMF) సిగ్నల్ను రూపొందిస్తాము. దీన్ని చేయడానికి, మేము ఫంక్షన్ను ఉపయోగిస్తాము ms_filter_call_method() మేము MS_DTMF_GEN_PLAY పద్ధతిని పిలుస్తాము, దానిని ఆర్గ్యుమెంట్గా పంపడం ద్వారా ప్లేబ్యాక్ సిగ్నల్కి అనుగుణంగా ఉండే కోడ్కి పాయింటర్గా ఉంటుంది.
ప్రోగ్రామ్ను కంపైల్ చేయడం మాత్రమే మిగిలి ఉంది:
$ gcc mstest2.c -o mstest2 `pkg-config mediastreamer --libs --cflags`
మరియు అమలు చేయండి:
$ ./mstest2
ప్రోగ్రామ్ను ప్రారంభించిన తర్వాత, మీరు కంప్యూటర్ స్పీకర్లో రెండు టోన్లతో కూడిన చిన్న సౌండ్ సిగ్నల్ను వింటారు.
మేము మా మొదటి సౌండ్ సర్క్యూట్ని నిర్మించాము మరియు ప్రారంభించాము. ఫిల్టర్ ఉదంతాలను ఎలా సృష్టించాలో, వాటిని ఎలా కనెక్ట్ చేయాలి మరియు వాటి పద్ధతులను ఎలా కాల్ చేయాలో మేము చూశాము. మా ప్రారంభ విజయంతో మేము సంతోషంగా ఉన్నప్పటికీ, మా ప్రోగ్రామ్ నిష్క్రమించే ముందు కేటాయించిన మెమరీని ఖాళీ చేయదు అనే వాస్తవాన్ని మేము ఇంకా గమనించాలి. తదుపరి లో
మూలం: www.habr.com