Материал статьи взят с моего
Улучшаем пример тонального генератора
В предыдущей
После того, как схема стала нам не нужна, освобождение памяти должно начинаться с остановки конвейера данных. Для этого нужно от схемы отключить источник тактов, тикер 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);
Добавив эти строки в наш пример мы получим корректное, с точки зрения управления памятью, завершение программы.
Как мы видим, правильное завершение программы потребовало от нас добавить примерно столько же строк кода что и в её начале, причём в среднем на каждый фильтр пришлось четыре строки кода. Получается, что размер кода программы у на будет нарастать пропорционально количеству использованных в проекте фильтров. Если говорить о тысяче фильтров в схеме, то к вашему коду добавится четыре тысячи строк рутинных операций по созданию и их уничтожению.
Теперь вы знаете как корректно завершать программу использующую медиастример. В следующих примерах, для компактности изложения, я буду "забывать" это делать. Но вы-то не забудете?
Разработчики медиастримера не предусмотрели программных средств по облегчению манипуляций с фильтрами при сборке/разборке схем. Тем не менее там есть хелпер который позволяет быстро вставлять/вынимать фильтр из схемы.
Мы вернёмся к решению этого вопроса позже, когда количество фильтров в наших примерах превысит пару десятков.
В следующей
Источник: habr.com