Materialul articolului provine de pe canalul meu .

Îmbunătățim exemplul generatorului tonal
În articolul anterior Am scris o aplicație pentru generatorul tonal și cu ajutorul acesteia am extras sunetul din difuzorul computerului. Acum ne vom concentra pe faptul că programul nostru, la finalizarea lucrării, nu returnează memoria înapoi în heap. A sosit timpul să clarificăm această problemă.
După ce schema nu ne mai este necesară, eliberarea memoriei trebuie să înceapă prin oprirea conveierului de date. Pentru aceasta, trebuie să deconectăm sursa ceasului de la schemă, ticker-ul, folosind funcția ms_ticker_detach(). În cazul nostru, trebuie să deconectăm ticker-ul de intrarea filtrului voidsource:
ms_ticker_detach(ticker, voidsource)Apropo, după oprirea conveierului, putem schimba schema și să o repornim, reconectând ticker-ul.
Acum putem să-l eliminăm, folosind funcția ms_ticker_destroy():
ms_ticker_destroy(ticker)Conveierul este oprit și putem să începem dezasamblarea acestuia, deconectând filtrele. Pentru aceasta, se folosește funcția ms_filter_unlink():
ms_filter_unlink(voidsource, 0, dtmfgen, 0);
ms_filter_unlink(dtmfgen, 0, snd_card_write, 0);Destinația argumentelor este aceeași ca la funcția ms_filter_link().
Eliminăm acum filtrele deja deconectate cu ajutorul ms_filter_destroy():
ms_filter_destroy(voidsource);
ms_filter_destroy(dtmfgen);
ms_filter_destroy(snd_card_write);Adăugând aceste linii în exemplul nostru, vom obține o terminare corectă, din punct de vedere al gestionării memoriei, a programului.
După cum vedem, terminarea corectă a programului a necesitat să adăugăm aproximativ la fel de multe linii de cod ca la început, iar în medie, pentru fiecare filtru, au fost necesare patru linii de cod. Rezultatul este că dimensiunea codului programului va crește proporțional cu numărul de filtre utilizate în proiect. Dacă vorbim despre o mie de filtre în schemă, atunci codului vostru i se va adăuga patru mii de linii de operațiuni de rutină pentru crearea și distrugerea lor.
Acum știți cum să terminați corect un program care folosește un media streamer. În exemplele următoare, pentru a fi concis, voi "uita" să fac asta. Dar voi nu veți uita?
Dezvoltatorii media streamer-ului nu au prevăzut instrumente software pentru a facilita manipularea filtrelor la asamblarea/dezasamblarea schemelor. Cu toate acestea, există un asistent care permite inserarea/extragerea rapidă a filtrelor din schemă.
Ne vom întoarce la soluția acestei probleme mai târziu, când numărul de filtre din exemplele noastre va depăși câteva zeci.
În următoarea Vom construi schema unui măsurător de nivel de semnal și vom învăța să citim rezultatul măsurătorii din filtru. Vom evalua precizia măsurării.
Sursa: habr.com
