Материал статьи взят с моего дзен-канала.


Улучшаем пример тонального генератора


В предыдущей статье мы написали приложение тонального генератора и с его помощью извлекли звук из динамика компьютера. Теперь мы обратим внимание на то, что наша программа, заканчивая работу, не возвращает память обратно в кучу. Пришло время внести ясность в этом вопрос.


После того, как схема стала нам не нужна, освобождение памяти должно начинаться с остановки конвейера данных. Для этого нужно от схемы отключить источник тактов, тикер c помощью функции 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().


Удаляем, теперь уже разобщенные, фильтры c помощью ms_filter_destroy():


ms_filter_destroy(voidsource);
ms_filter_destroy(dtmfgen);
ms_filter_destroy(snd_card_write);

Добавив эти строки в наш пример мы получим корректное, с точки зрения управления памятью, завершение программы.


Как мы видим, правильное завершение программы потребовало от нас добавить примерно столько же строк кода что и в её начале, причём в среднем на каждый фильтр пришлось четыре строки кода. Получается, что размер кода программы у на будет нарастать пропорционально количеству использованных в проекте фильтров. Если говорить о тысяче фильтров в схеме, то к вашему коду добавится четыре тысячи строк рутинных операций по созданию и их уничтожению.


Теперь вы знаете как корректно завершать программу использующую медиастример. В следующих примерах, для компактности изложения, я буду "забывать" это делать. Но вы-то не забудете?


Разработчики медиастримера не предусмотрели программных средств по облегчению манипуляций с фильтрами при сборке/разборке схем. Тем не менее там есть хелпер который позволяет быстро вставлять/вынимать фильтр из схемы.


Мы вернёмся к решению этого вопроса позже, когда количество фильтров в наших примерах превысит пару десятков.


В следующей статье мы соберем схему измерителя уровня сигнала и научимся читать результат измерения из фильтра. Оценим точность измерения.