{"id":87065,"date":"2020-07-03T07:42:01","date_gmt":"2020-07-03T05:42:01","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-3"},"modified":"2020-07-03T07:42:01","modified_gmt":"2020-07-03T05:42:01","slug":"izuchaem-voip-dvizhok-mediastreamer2-chast-3","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-3","title":{"rendered":"Explorando o motor VoIP Mediastreamer2. Parte 3","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>O conte\u00fado deste artigo foi retirado do meu <noindex><a rel=\"nofollow\" href=\"https:\/\/zen.yandex.ru\/id\/5e3f8e0751f5346faab4fc7a\">canal Zen<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Explorando o motor VoIP Mediastreamer2. Parte 3\" src=\"\/wp-content\/uploads\/2020\/07\/7c688fd21de37d61722c681961442e33.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"uluchshaem-primer-tonalnogo-generatora\">Melhorando o exemplo do gerador tonal<\/h2>\n<p><\/p>\n<p>Na anterior <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495728\/\">artigo<\/a><\/noindex> escrevemos um aplicativo de gerador tonal e, com ele, extra\u00edmos som do alto-falante do computador. Agora, vamos focar no fato de que nosso programa, ao concluir seu trabalho, n\u00e3o retorna a mem\u00f3ria de volta para o heap. Chegou a hora de esclarecer essa quest\u00e3o.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Depois que o esquema n\u00e3o for mais necess\u00e1rio, a libera\u00e7\u00e3o de mem\u00f3ria deve come\u00e7ar com a parada do pipeline de dados. Para isso, precisamos desconectar a fonte de clock, o ticker, da fun\u00e7\u00e3o <em>ms_ticker_detach()<\/em>. No nosso caso, devemos desconectar o ticker da entrada do filtro <em>voidsource<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">ms_ticker_detach(ticker, voidsource)<\/code><\/pre>\n<p><\/p>\n<p>A prop\u00f3sito, ap\u00f3s parar o pipeline, podemos alterar seu esquema e coloc\u00e1-lo para funcionar novamente, reconectando o ticker.<\/p>\n<p><\/p>\n<p>Agora podemos remov\u00ea-lo, utilizando a fun\u00e7\u00e3o <em>ms_ticker_destroy()<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">ms_ticker_destroy(ticker)<\/code><\/pre>\n<p><\/p>\n<p>O pipeline foi parado e podemos come\u00e7ar a desmontar suas partes, desconectando os filtros. Para isso, utilizamos a fun\u00e7\u00e3o <em>ms_filter_unlink()<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">ms_filter_unlink(voidsource, 0, dtmfgen, 0);\nms_filter_unlink(dtmfgen, 0, snd_card_write, 0);<\/code><\/pre>\n<p><\/p>\n<p>a fun\u00e7\u00e3o n\u00e3o muda, \u00e9 a mesma que a da fun\u00e7\u00e3o <em>ms_filter_link()<\/em>.<\/p>\n<p><\/p>\n<p>Removemos agora os filtros j\u00e1 desconectados com <em>ms_filter_destroy()<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">ms_filter_destroy(voidsource);\nms_filter_destroy(dtmfgen);\nms_filter_destroy(snd_card_write);<\/code><\/pre>\n<p><\/p>\n<p>Adicionando essas linhas ao nosso exemplo, teremos uma finaliza\u00e7\u00e3o correta do programa em termos de gerenciamento de mem\u00f3ria.<\/p>\n<p><\/p>\n<p>Como podemos ver, a finaliza\u00e7\u00e3o correta do programa exigiu que adicion\u00e1ssemos aproximadamente o mesmo n\u00famero de linhas de c\u00f3digo que no in\u00edcio, sendo que em m\u00e9dia, cada filtro consumiu quatro linhas de c\u00f3digo. Assim, o tamanho do c\u00f3digo do programa crescer\u00e1 proporcionalmente ao n\u00famero de filtros utilizados no projeto. Se falarmos de mil filtros no esquema, seu c\u00f3digo acrescentar\u00e1 quatro mil linhas de opera\u00e7\u00f5es rotineiras para cria\u00e7\u00e3o e destrui\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>Agora voc\u00ea sabe como encerrar corretamente um programa que utiliza um media streamer. Nos pr\u00f3ximos exemplos, por quest\u00e3o de concis\u00e3o, eu vou \"esquecer\" de fazer isso. Mas voc\u00ea n\u00e3o vai esquecer?<\/p>\n<p><\/p>\n<p>Os desenvolvedores do media streamer n\u00e3o previram ferramentas para facilitar a manipula\u00e7\u00e3o de filtros durante a montagem\/desmontagem de esquemas. No entanto, h\u00e1 um helper que permite inserir\/remover rapidamente um filtro do esquema.<\/p>\n<p><\/p>\n<p>Voltaremos a resolver essa quest\u00e3o mais tarde, quando o n\u00famero de filtros em nossos exemplos ultrapassar algumas dezenas.<\/p>\n<p><\/p>\n<p>Na pr\u00f3xima <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495982\/\">artigo<\/a><\/noindex> Vamos montar o esquema do medidor de n\u00edvel de sinal e aprender a ler o resultado da medi\u00e7\u00e3o do filtro. Avaliaremos a precis\u00e3o da medi\u00e7\u00e3o.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495780\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0437\u044f\u0442 \u0441 \u043c\u043e\u0435\u0433\u043e \u0434\u0437\u0435\u043d-\u043a\u0430\u043d\u0430\u043b\u0430. \u0423\u043b\u0443\u0447\u0448\u0430\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0437\u0432\u043b\u0435\u043a\u043b\u0438 \u0437\u0432\u0443\u043a \u0438\u0437 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u0448\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0443, \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043a\u0443\u0447\u0443. \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u043d\u0435\u0441\u0442\u0438 \u044f\u0441\u043d\u043e\u0441\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u0432\u043e\u043f\u0440\u043e\u0441. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0441\u0445\u0435\u043c\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":87066,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-87065","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0437\u044f\u0442 \u0441 \u043c\u043e\u0435\u0433\u043e \u0434\u0437\u0435\u043d-\u043a\u0430\u043d\u0430\u043b\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-3\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u0437\u0443\u0447\u0430\u0435\u043c VoIP-\u0434\u0432\u0438\u0436\u043e\u043a Mediastreamer2. \u0427\u0430\u0441\u0442\u044c 3 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0437\u044f\u0442 \u0441 \u043c\u043e\u0435\u0433\u043e \u0434\u0437\u0435\u043d-\u043a\u0430\u043d\u0430\u043b\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-3\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-03T05:42:01+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-03T05:42:01+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Explorando o motor VoIP Mediastreamer2. Parte 3 | ProHoster","description":"O material do artigo foi retirado do meu canal no Zen.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-3","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u0437\u0443\u0447\u0430\u0435\u043c VoIP-\u0434\u0432\u0438\u0436\u043e\u043a Mediastreamer2. \u0427\u0430\u0441\u0442\u044c 3 | ProHoster","og:description":"\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0437\u044f\u0442 \u0441 \u043c\u043e\u0435\u0433\u043e \u0434\u0437\u0435\u043d-\u043a\u0430\u043d\u0430\u043b\u0430.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-3","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-03T05:42:01+00:00","article:modified_time":"2020-07-03T05:42:01+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"87065","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:59:55","updated":"2022-10-02 12:50:43","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/87065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=87065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/87065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/87066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=87065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=87065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=87065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}