<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tamkovich.com: Телеком/VoIP блог &#187; dahdi_dummy</title>
	<atom:link href="http://tamkovich.com/tag/dahdi_dummy/feed/" rel="self" type="application/rss+xml" />
	<link>http://tamkovich.com</link>
	<description>Телеком, ИТ и все все все</description>
	<lastBuildDate>Sun, 05 Sep 2010 14:15:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Время и Asterisk</title>
		<link>http://tamkovich.com/2008/12/asterisk-timers/</link>
		<comments>http://tamkovich.com/2008/12/asterisk-timers/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 17:36:53 +0000</pubDate>
		<dc:creator>sergee</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[asterisk timer]]></category>
		<category><![CDATA[dahdi_dummy]]></category>
		<category><![CDATA[timerfd]]></category>
		<category><![CDATA[ztdummy]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=31</guid>
		<description><![CDATA[<img src=http://tamkovich.com/wp-content/uploads/2008/12/outdoor-clock-10842bk-1831-150x150.jpg align=right>
<p align=justify>
Asterisk timers - очень важная подсистема. Наличие синхронизирующего сигнала - является ключевым требованием для реализации такого функционала как: микширование нескольких звуковых потоков, IAX2 уплотнение (trunking), подавление тишины, качественное проигрывание файлов и т.д. До недавнего времени Asterisk использовал модули DAHDI (Zaptel) для доступа к высокоточному таймеру. Для тех, у кого телефонных плат не было, предлагался модуль ztdummy. Однако данный модуль вызывал много нареканий. значально, ztdummy разрабатывался только для Linux, и имел проблемы с работоспособностью на других unix-like платформах. Начиная с версии 1.6.1 Asterisk переходит на использование нового API времени.
</p>]]></description>
			<content:encoded><![CDATA[<p><img src=http://tamkovich.com/wp-content/uploads/2008/12/outdoor-clock-10842bk-1831-150x150.jpg align=right></p>
<h4>Мат. Часть</h4>
<p align=justify>
Наличие синхронизирующего сигнала &#8211; является ключевым требованием для реализации такого функционала как: микширование нескольких звуковых потоков, IAX2 уплотнение (trunking), подавление тишины, качественное проигрывание файлов и т.д. До недавнего времени <a href=http://tamkovich.com/asterisk/ >Asterisk</a> использовал модули DAHDI (Zaptel) для доступа к высокоточному таймеру. Данный метод замечательно подходил для пользователей, использующих оборудование Digium. Для тех, у кого телефонных плат не было, предлагался модуль ztdummy. Однако данный модуль вызывал много нареканий. Изначально, ztdummy разрабатывался только для Linux, и имел проблемы с работоспособностью на других unix-like платформах. Начиная с версии 1.6.1 <a href=http://tamkovich.com/asterisk/ >Asterisk</a> переходит на использование нового API времени.<span id="more-31"></span> Теперь источник точного времени для <a href=http://tamkovich.com/asterisk/ >Asterisk</a> зависит от того, какой модуль вы загрузили. На сегодня доступно три модуля: <b>res_timing_dahdi</b>, <b>res_timing_pthread</b> и <b>res_timing_timerfd</b>.
</p>
<h4>res_timing_timerfd</h4>
<p align=justify>
Начиная с версии 2.6.22 в ядре доступно новое API для тайминга &#8211; <code>timerfd()</code>. Ключевой идеей данного API является ассоциация таймеров с файловыми дескрипторами. Да да! Теперь с таймерами можно работать как с обычными файлами. Вызов
</p>

<div class="wp_syntax"><div class="code"><pre class="c c" style="font-family:monospace;"><span style="color: #993333;">int</span> timerfd_create<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> clockid<span style="color: #009900;">&#41;</span>;</pre></div></div>

<p align=justify> создает таймер и возвращает файловый дескриптор ассоциированный с ним. Настроить созданный таймер можно с помощью вызова:
</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="c c" style="font-family:monospace;"><span style="color: #993333;">int</span> timerfd_settime<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> fd<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> flags<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">struct</span> itimerspec <span style="color: #339933;">*</span>timer<span style="color: #339933;">,</span> <span style="color: #993333;">struct</span> itimerspec <span style="color: #339933;">*</span>previous<span style="color: #009900;">&#41;</span>;</pre></div></div>

</p>
<p align=justify>
Где <code>fd</code> &#8211; файловый дескриптор, возвращенный вызовом <code>int timerfd_create(int clockid)</code>, <code>timer</code> &#8211; указатель на структуру с новыми настройками таймера, а <code>previous</code> &#8211; указатель на структуру, где будут сохранены текущие настройки таймера. Теперь, если вызвать <code>read()</code> на дескрипторе, ассоциированном с таймером, вызов заблокируется до срабатывания таймера, иначе, <code>read()</code> вернет целочисленное 64 битное значение, содержащие количество срабатываний таймера.
</p>
<p align=justify>
Месяц назад, 19 ноября, в транк был добавлен новый модуль <b>res_timing_timerfd</b>. Данный модуль реализует доступ к высокоточному источнику времени с помощью нового API ядра. Еще предстоит всестороннее тестирование и обкатка данного модуля, однако уже сейчас он выглядит весьма многообещающе.
</p>
<h4>res_timing_pthread</h4>
<p align=justify>
Вместе с новыми API времени, в <a href=http://tamkovich.com/asterisk/ >Asterisk</a> был добавлен модуль <b>res_timing_pthread</b>. Принцип работы этого модуля заключается в создании отдельного потока (thread) в фоновом режиме. Далее, с помощью вызовов <code>ast_cond_wait()</code> и <code>ast_cond_timedwait()</code> (которые являются аналогами вызовов <code>pthread_cond_wait()</code> и <code>pthread_cond_timedwait()</code>) при каждом тике таймера в файловый дескритер пайпа записывается байт 0x2A. Данный модуль очень интенсивно использует процессор. Уже были <a href=http://lists.digium.com/pipermail/asterisk-dev/2008-June/033621.html>жалобы</a> о невозможности использования данного модуля в устройствах со слабыми (портативными) процессорами. Так же пока не ясно, как изменится точность таймера, предоставляемого данным модулем, при загрузке системы близкой к максимальной. Не стоит использовать данный модуль на production системах, это, скорее, демонстрация возможностей нового API времени.
</p>
<h4>res_timing_dahdi</h4>
<p align=justify>
Данный модуль является реализацией стандартного, на сегодняшний день, таймера &#8211; модулей DAHDI (Zaptel). Исходный код модуля <b>res_timing_dahdi</b> является самым маленьким, т.к. его единственной задачей является трансляция вызовов между API времени <a href=http://tamkovich.com/asterisk/ >Asterisk</a> и модулями DAHDI (Zaptel), с помощью <code>ioctl()</code>. По совместительству, данный таймер является самым &laquo;взрослым&raquo; и обкатанным решением для <a href=http://tamkovich.com/asterisk/ >Asterisk</a>.
</p>
<h4>API времени в <a href=http://tamkovich.com/asterisk/ >Asterisk</a></h4>
<p align=justify>
Новое API времени представляет собой набор программных вызовов, для управления источником времени. Все вызовы описаны в файле заголовке <a href=http://svn.digium.com/view/asterisk/trunk/include/asterisk/timing.h?view=markup>include/asterisk/timing.h</a>. Перечислим их с краткими комментариями:
</p>
<ul>
<li> <code>ast_install_timing_functions()</code> &#8211; Инициирует колбеки для функций времени. Используется при загрузке модуля, предоставляющего источник времени, для того, что бы сообщить <a href=http://tamkovich.com/asterisk/ >Asterisk</a> адреса функций в модуле.
<li> <code>ast_uninstall_timing_functions()</code> &#8211; Удаляет установленные ранее колбеки. Используется при выгрузке модуля для предотвращения сегфолта.
<li> <code>ast_timer_open()</code> &#8211; Открывает файловый дескриптор таймера для <a href=http://tamkovich.com/asterisk/ >Asterisk</a>.
<li> <code>ast_timer_close()</code> &#8211; Закрывает ранее открытый файловый дескриптор таймера.
<li> <code>ast_timer_set_rate()</code> &#8211; Устанавливает частоту тиков для таймера.
<li> <code>ast_timer_ack()</code> &#8211; Подтверждает срабатывание таймера. Используется только в том случае, если состояние таймера &#8211; <code>AST_TIMING_EVENT_EXPIRED</code>.
<li> <code>ast_timer_enable_continuous()</code> &#8211; Перевести таймер в непрерывный режим. Основное отличие непрерывного режима, состоит в том, что вызов <code>poll()</code> на файловом дескрипторе таймера &#8211; не блокируется.
<li> <code>ast_timer_disable_continuous()</code> &#8211; Выключает непрерывный режим таймера.
<li> <code>ast_timer_get_event()</code> &#8211; Возвращает событие, которое вызвало срабатывание таймера.
<li> <code>ast_timer_get_max_rate()</code> &#8211; Возвращает максимальную поддерживаемую частоту тиков для данного таймера.
</ul>
<h4>Использованная литература</h4>
<p align=justify>
<ul>
<li> <a href=http://lwn.net/Articles/251413/>LWN: The new timerfd() API</a>
<li> <a href=http://www.russellbryant.net/blog/2008/06/16/asterisk-16-now-with-a-new-timing-api/>Asterisk 1.6, Now with a New Timing API</a>
<li> <a href=http://www.jeremy-mcnamara.com/2008/06/17/a-new-timing-api-for-asterisk-silencing-digium-critics/>A New Timing API for Asterisk, Silencing Digium Critics</a>
<li> <a href=http://svn.digium.com/view/asterisk/trunk/include/asterisk/timing.h?view=markup>include/asterisk/timing.h</a>
<li> <a href=http://www.opengroup.org/onlinepubs/007908775/xsh/pthread_cond_wait.html>pthread_cond_wait() и pthread_cond_timedwait()</a>
</ul></p>
]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2008/12/asterisk-timers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
