Материалът на статията е взет от моя .

Подобряваме примера на тонален генератор
В предишната създадохме приложение на тонален генератор и с негова помощ извлякохме звук от високоговорителя на компютъра. Сега ще се съсредоточим върху факта, че нашата програма, след като завърши работа, не освобождава паметта обратно в купчината. Навреме е да внесем яснота по този въпрос.
След като схемата вече не ни е нужна, освобождаването на паметта трябва да започне с спиране на конвейера за данни. За целта трябва да изключим източника на тактови сигнали от схемата с помощта на функцията ms_ticker_detach(). В нашия случай трябва да изключим тактовия сигнал от входа на филтъра voidsource:
ms_ticker_detach(ticker, voidsource)Между другото, след спирането на конвейера можем да променим схемата и отново да я пуснем в работа, отново свързвайки тактовия сигнал.
Сега можем да го изтрием, използвайки функцията ms_ticker_destroy():
ms_ticker_destroy(ticker)Конвейера е спрян и можем да започнем да разглобяваме частите, разединявайки филтри. За това се използва функцията ms_filter_unlink():
ms_filter_unlink(voidsource, 0, dtmfgen, 0);
ms_filter_unlink(dtmfgen, 0, snd_card_write, 0);назначението на аргументите е същото като при функцията ms_filter_link().
Изтриваме, сега вече разделените, филтри с помощта на ms_filter_destroy():
ms_filter_destroy(voidsource);
ms_filter_destroy(dtmfgen);
ms_filter_destroy(snd_card_write);Добавяйки тези редове в нашия пример, ще получим коректно завършване на програмата, що се отнася до управлението на паметта.
Както виждаме, правилното завършване на програмата изисква да добавим приблизително същото количество редове код, колкото в началото ѝ, като на всеки филтър средно се падат четири реда код. Излиза, че размерът на програмния код ще нараства пропорционално на броя на използваните във проекта филтри. Говорейки за хиляда филтъра в схемата, към вашия код ще се добавят четири хиляди реда рутинни операции по създаването и унищожаването им.
Сега знаете как да завършите програмата, използваща медиастримера коректно. В следващите примери, за компактност на изложението, ще 'забравя' да го правя. Но вие, нали, няма да забравите?
Разработчиците на медиастримера не предвидиха софтуерни средства за улесняване на манипулациите с филтрите при сглобяване/разглобяване на схеми. Въпреки това там има хелпер, който позволява бързо вмъкване/изваждане на филтър от схемата.
Ще се върнем към решението на този въпрос по-късно, когато броят на филтрите в нашите примери надвиши десетина.
В следващата Ние ще създадем схема на измервател на сигнал и ще научим как да четем резултата от измерването от филтъра. Ще оценим точността на измерването.
Източник: habr.com
