<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=215407&amp;view=findpost&amp;p=3712187</guid>
        <pubDate>Mon, 20 Mar 2017 14:51:53 +0000</pubDate>
        <title>как отловить момент поднятия телефонной трубки на другом конце линии?</title>
        <link>https://forum.sources.ru/index.php?showtopic=215407&amp;view=findpost&amp;p=3712187</link>
        <description><![CDATA[Gonarh: Обалдеть. Почти 10 лет прошло. В общем так. Пару недель назад опять пришлось столкнуться с задачей определения поднятия трубки. Пошукав по интернетам, перелопатив довольно таки огромное количество топиков на десятках различных форумах(на этот топик тоже через поиск наткнулся  :lol: ), понял что единственный высоковероятностный метод определения поднятия трубки, это запись данных телефонной линии после набора номера, и спектрального анализа этих данных алгоритмом <a class='tag-url' href='https://ru.wikipedia.org/wiki/%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5' target='_blank'>быстрого преобразования фурье</a>, либо поднимать <a class='tag-url' href='https://ru.wikipedia.org/wiki/Asterisk' target='_blank'>Астериск</a> и скриптовать там. Второй путь был отвергнут сразу, ибо это всё равно что электронным микроскопом забивать гвозди. Остановился на первом варианте, в результате родился эдакий быдлокод, который с довольно высокой вероятностью определяет момент поднятия трубки.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#!/usr/bin/perl -w</div><div class="code_line">&nbsp;</div><div class="code_line">use Math::FFT;</div><div class="code_line">use Time::HiRes;</div><div class="code_line">use Device::SerialPort;</div><div class="code_line">use strict;</div><div class="code_line">use Switch;</div><div class="code_line">use warnings;</div><div class="code_line">use List::MoreUtils qw(firstidx);</div><div class="code_line">&nbsp;</div><div class="code_line">my %notes = ( 255 =&#62; &#39;Vmin&#39;, 275 =&#62; &#39;V1&#39;, 300 =&#62; &#39;V2&#39;, 325 =&#62; &#39;V3&#39;, 350 =&#62; &#39;V4&#39;, 375 =&#62; &#39;Vmax&#39;, 425 =&#62; &#39;A&#39;, 1000 =&#62; &#39;B&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">my @freqs = sort { $a &#60;=&#62; $b } keys %notes;</div><div class="code_line">&nbsp;</div><div class="code_line">use constant DLE &nbsp; &nbsp; &nbsp; &nbsp;=&#62; 0x10;</div><div class="code_line">use constant ESC &nbsp; &nbsp; &nbsp; &nbsp;=&#62; 0x1B;</div><div class="code_line">&nbsp;</div><div class="code_line">use constant MAX_TIME_VAD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&#62; 50; #sec</div><div class="code_line">use constant BYTES_FOR_FFT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=&#62; 4096;</div><div class="code_line">&nbsp;</div><div class="code_line">my $DLE_DETECT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= chr(DLE);</div><div class="code_line">my $DLE_BUSY &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= chr(0x62);</div><div class="code_line">my $CONNECT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = &quot;CONNECT\r\n&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">my $port = &#39;/dev/ttyS0&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">my $number = &#39;1234567&#39;; #Номер куда звоним</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;my $hDevice = new Device::SerialPort($port) or die &quot;Can&#39;t open port $port: $!\n&quot;;</div><div class="code_line">&nbsp;&nbsp;my @handshake_opts = $hDevice-&#62;handshake;</div><div class="code_line">&nbsp;&nbsp;my $can_set_rts = 0;</div><div class="code_line">&nbsp;&nbsp;foreach (@handshake_opts) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ($_ eq &#39;rts&#39;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;$can_set_rts = 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;last;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;die &quot;Cannot set handshake &#39;rts&#39; to port $port&quot; if ($can_set_rts == 0);</div><div class="code_line">&nbsp;&nbsp;$hDevice-&#62;buffers(BYTES_FOR_FFT, BYTES_FOR_FFT);</div><div class="code_line">&nbsp;&nbsp;$hDevice-&#62;baudrate(115200);</div><div class="code_line">&nbsp;&nbsp;$hDevice-&#62;parity(&#39;none&#39;);</div><div class="code_line">&nbsp;&nbsp;$hDevice-&#62;databits(8);</div><div class="code_line">&nbsp;&nbsp;$hDevice-&#62;stopbits(1);</div><div class="code_line">&nbsp;&nbsp;$hDevice-&#62;handshake(&#39;rts&#39;);</div><div class="code_line">&nbsp;&nbsp;$hDevice-&#62;read_const_time(150);</div><div class="code_line">&nbsp;&nbsp;$hDevice-&#62;write_settings;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;send_cmd($hDevice, &#39;ATZ&#39;);</div><div class="code_line">&nbsp;&nbsp;send_cmd($hDevice, &#39;ATS7=50&#39;);</div><div class="code_line">&nbsp;&nbsp;send_cmd($hDevice, &#39;AT+FCLASS=8;+FLO=2&#39;);</div><div class="code_line">&nbsp;&nbsp;send_cmd($hDevice, &#39;AT+VRN=0;+VTD=10;+VIT=0&#39;);</div><div class="code_line">&nbsp;&nbsp;send_cmd($hDevice, &#39;AT+VGR=128&#39;);</div><div class="code_line">&nbsp;&nbsp;send_cmd($hDevice, &#39;AT+VSM=128,8000,0,0&#39;);</div><div class="code_line">&nbsp;&nbsp;my ($prev, $dle, $code, $pos);</div><div class="code_line">&nbsp;&nbsp;my $state = -1;</div><div class="code_line">&nbsp;&nbsp;my $start = 1;</div><div class="code_line">&nbsp;&nbsp;if (send_cmd($hDevice, &quot;ATDT $number&quot;) =~ /OK/) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;$hDevice-&#62;write(&#39;AT+VRX&#39; . &quot;\r&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;$hDevice-&#62;lookclear;</div><div class="code_line">&nbsp;&nbsp; &nbsp;$buff = &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;my $time_start = time;</div><div class="code_line">&nbsp;&nbsp; &nbsp;my $counter = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while(1) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;my ($count,$raw) = $hDevice-&#62;read(BYTES_FOR_FFT);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if($count &#62; 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (($raw =~ /$CONNECT/) &amp;&amp; ($start == 1)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$pos &nbsp; = $+[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$raw &nbsp; = substr($raw, $pos);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$start = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$state = 0 if ($raw =~ /[^$DLE_DETECT][$DLE_DETECT][$DLE_BUSY]/);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;last if ((time-$time_start &#62; MAX_TIME_VAD) || ($state &#62;= 0));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$raw =~ s/[$DLE_DETECT][$DLE_DETECT]/[$DLE_DETECT/g;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$buff .= $raw;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (length($buff) &#62;= BYTES_FOR_FFT) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;switch (detect_ring_back_tone(substr($buff, 0, BYTES_FOR_FFT))) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case 0 { $counter = 0; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case 1 { $counter = 10; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$buff = substr($buff, BYTES_FOR_FFT);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$counter++;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$state = 1 if ($counter &#62; 10);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;$hDevice-&#62;write(chr(ESC));</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ($state == 1) &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;#ВОТ ЗДЕСЬ МЫ БУДЕМ КОГДА ТРУБКА БУДЕТ ПОДНЯТА</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;send_cmd($hDevice, &#39;ATH&#39;);</div><div class="code_line">&nbsp;&nbsp;send_cmd($hDevice, &#39;ATZ&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;undef $hDevice;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">sub send_cmd {</div><div class="code_line">&nbsp;&nbsp;my ($hDev, $cmd, $no_with_CRLF, $no_wait) = @_;</div><div class="code_line">&nbsp;&nbsp;my $result = &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;$cmd .= &quot;\r&quot; unless (defined($no_with_CRLF));</div><div class="code_line">&nbsp;&nbsp;$hDev-&#62;lookclear;</div><div class="code_line">&nbsp;&nbsp;$hDev-&#62;write($cmd);</div><div class="code_line">&nbsp;&nbsp;return 0 if (defined($no_wait));</div><div class="code_line">&nbsp;&nbsp;while(1) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;my ($count,$saw) = $hDev-&#62;read(4096);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if($count &#62; 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;$result .= $saw;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;last if (($saw =~ /OK/) or ($saw =~/ERROR/) or ($saw =~ /DIALTONE/) or ($saw =~ /CONNECT/));</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;return $result;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">sub detect_ring_back_tone {</div><div class="code_line">&nbsp;&nbsp;my ($data, $x) = @_;</div><div class="code_line">&nbsp;&nbsp;my $fft = Math::FFT-&#62;new( [ unpack( &#39;s&#60;*&#39;, substr $data, 0, BYTES_FOR_FFT, &#39;&#39; ) ] );</div><div class="code_line">&nbsp;&nbsp;my $spectrum = $fft-&#62;spctrm();</div><div class="code_line">&nbsp;&nbsp;my ( $min, $max ) = $fft-&#62;range($spectrum);</div><div class="code_line">&nbsp;&nbsp;my $f = firstidx { $_ &#62;= $max } @$spectrum;</div><div class="code_line">&nbsp;&nbsp;my $result = 0;</div><div class="code_line">&nbsp;&nbsp;return -1 unless $f;</div><div class="code_line">&nbsp;&nbsp;while ( $f &#60; $freqs[0] ) { $f *= 2; }</div><div class="code_line">&nbsp;&nbsp;while ( $f &#62; $freqs[-1] ) { $f /= 2; }</div><div class="code_line">&nbsp;&nbsp;for ( my $i = 1 ; $i &#60; @freqs ; $i++ ) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ( $f &#60;= $freqs[$i] ) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;my $index = $i;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;$index-- if ( $freqs[$i] - $f &#62; $f - $freqs[ $i - 1 ] );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;my $ampl = ( $f - $freqs[$index] ) / ( $freqs[$i] - $freqs[ $i - 1 ] );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;$result = 0 if ($freqs[$index] == 425);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;$result = 1 if (($freqs[$index] &#62;= 255) &amp;&amp; ($freqs[$index] &#60;= 400));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;last;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;return $result;</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>У меня другой вопрос: как скормить wav модему? Этот вопрос тоже периодически всплывает и внятного ответа раз и навсегда пока не было. </div></div><br>
Элементарно, подгототавливаем wav в PCM, 8кГц, 8бит, моно, в буфер &#036;buff_wav данные из файла без заголовка WAV в 44 байта, затем<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">send_cmd($hDevice, &#39;AT+FCLASS=8&#39;);</div><div class="code_line">send_cmd($hDevice, &#39;AT+VGT=128&#39;);</div><div class="code_line">send_cmd($hDevice, &#39;AT+VSM=132,8000,0,0&#39;); #Pltcm</div><div class="code_line">send_cmd($hDevice, &#39;AT+VTX&#39;);</div><div class="code_line">$hDevice-&#62;write($buff_wav) if (length($buff_wav) &#62; 0);</div><div class="code_line">send_cmd($hDev, chr(DLE) . chr(3), 1, 1);</div></ol></div></div></div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2017-03-20T17:53:47+03:00">20.03.17, 14:53</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=215407&view=findpost&p=1803168'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Prince &#064; <time class="tag-quote__quoted-time" datetime="2007-12-14T11:03:11+00:00">14.12.07, 11:03</time></span><div class='quote '>На сигнал  КПВ(1 раз в 5 секунд) модем выдаёт комбинации из двух байт: <strong class='tag-b'>&lt;DLE&gt;b</strong>. DLE=char(&#036;10).</div></div><br>
Нет, &lt;DLE&gt;+b, это DCE посылает сигнал занятости линии на том конце, когда мы набрали номер. КПВ никак не сигнализируется. Проверено. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2017-03-20T14:58:08+00:00">20.03.17, 14:58</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=215407&view=findpost&p=1802901'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Gonarh &#064; <time class="tag-quote__quoted-time" datetime="2007-12-14T09:36:13+00:00">14.12.07, 09:36</time></span><div class='quote '>Тогда другой вопрос: каким образом это делают программы подобные<br>
VentaFax&#39;у (кстати она тоже писана на дельфи)</div></div><br>
Отвечу сам себе  :lol: Именно алгоритмом FFT.]]></description>
        <author>Gonarh</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=215407&amp;view=findpost&amp;p=1803168</guid>
        <pubDate>Fri, 14 Dec 2007 11:03:11 +0000</pubDate>
        <title>как отловить момент поднятия телефонной трубки на другом конце линии?</title>
        <link>https://forum.sources.ru/index.php?showtopic=215407&amp;view=findpost&amp;p=1803168</link>
        <description><![CDATA[Prince: Через Tapi без понятия. На уровне AT команд, в принципе, можно. Если модем голосовой и аппаратно поддерживает соответсвующие функции.<br>
Методика примерно такая.<br>
AT#CLS=8 //перевод в голосовой режим<br>
ATD ...  //набор номера, если нет тона станции или аб. занят, модем вернёт NO        DIALTONE или BUSY вместо VCON. <br>
А вот дальше начинаем ловить сигнал контроля посылки вызова. Для этого нужно &quot;слушать&quot; модем. На сигнал  КПВ(1 раз в 5 секунд) модем выдаёт комбинации из двух байт: <strong class='tag-b'>&lt;DLE&gt;b</strong>. DLE=char(&#036;10). <br>
Вот эту комбинацию можно проверять. Кроме того, когда снимаешь трубку и начинаешь говорить, то получишь из модема целый букет всевозожных сигналов, которые он &quot;распознал&quot;в речевом сигнале. Если телефонная станция тмпользует специальный сигнал ответа, модем и его обнаружит. В общем, извратиться можно.<br>
Вот как-то так. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray">Shielded codes sent to the DTE &lt;DLE&gt;0 - &lt;DLE&gt;9<br>
&lt;DLE&gt;* - &lt;DLE&gt;#<br>
&lt;DLE&gt;A - &lt;DLE&gt;D  DTMF digits 0 to 9, *, # and A to D detected by the modem. <br>
&lt;DLE&gt;a Answer tone detected. V.25 or T.30. <br>
&lt;DLE&gt;b The BUSY signal is detected. <br>
&lt;DLE&gt;c The T.30 calling tone is detected. <br>
&lt;DLE&gt;d Dial tone is detected. <br>
&lt;DLE&gt;e The V.25 calling tone is detected. <br>
&lt;DLE&gt;f Bell answer tone is detected. <br>
&lt;DLE&gt;h Local handset has been hung up. <br>
&lt;DLE&gt;o An overrun has occurred in voice receive mode. <br>
&lt;DLE&gt;q Silence has been detected in voice receive mode and there has been valid voice previously detected. <br>
&lt;DLE&gt;s Silence has been detected in voice receive mode and there has not been valid voice previously detected. <br>
&lt;DLE&gt;t Local handset has been picked up. <br>
&lt;DLE&gt;u An under-run has occurred in voice transmit mode. <br>
&lt;DLE&gt;&lt;ETX&gt; Acknowledgement to a key press abort in voice receive mode. <br>
<br>
<br>
Shielded codes sent from the DTE &lt;DLE&gt;&lt;ETX&gt; Sent to indicate the end of voice transmission. <br>
&lt;DLE&gt;&lt;CAN&gt; Sent to cancel current voice transmission and flush any data in the transmit buffer. <br>
&lt;DLE&gt;p Sent to pause the current voice transmission. <br>
&lt;DLE&gt;r Sent to resume a paused voice transmission. </span> <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2007-12-14T11:09:13+00:00">14.12.07, 11:09</time></span></span><br>
У меня другой вопрос: как скормить wav модему? Этот вопрос тоже периодически всплывает и внятного ответа раз и навсегда пока не было. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2007-12-14T11:19:46+00:00">14.12.07, 11:19</time></span></span> <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>-Added <time class="tag-mergetime" datetime="2007-12-14T11:21:33+00:00">14.12.07, 11:21</time></span></span><br>
А, я ещё забыл самый очевидный вариант. Перевести модем в режим записи с линии (AT#VRX) и анализировать входящий аудиопоток ручками. ИМХО, самый надёжный вариант. Вот только как это правильно сделать. У меня пока не получилось(захват аудиопотока). Да я уже и забросил как-то эту задачу(тоже хотел звонилку сделать, а оказалось, что с моим модемом и VentaFax работает криво).]]></description>
        <author>Prince</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=215407&amp;view=findpost&amp;p=1803123</guid>
        <pubDate>Fri, 14 Dec 2007 10:49:46 +0000</pubDate>
        <title>как отловить момент поднятия телефонной трубки на другом конце линии?</title>
        <link>https://forum.sources.ru/index.php?showtopic=215407&amp;view=findpost&amp;p=1803123</link>
        <description><![CDATA[Gonarh: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Ожидают пилотного тона факса приемной стороны. :)</div></div><br>
для тех кто в танке: что такое пилотный тон факса<br>
кроме того какой может быть пилотный тон факса, если трубку снимает человек, VentaFax ловит это и начинает транслировать WAV файл в линию]]></description>
        <author>Gonarh</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=215407&amp;view=findpost&amp;p=1803114</guid>
        <pubDate>Fri, 14 Dec 2007 10:46:11 +0000</pubDate>
        <title>как отловить момент поднятия телефонной трубки на другом конце линии?</title>
        <link>https://forum.sources.ru/index.php?showtopic=215407&amp;view=findpost&amp;p=1803114</link>
        <description><![CDATA[medved_68: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=215407&view=findpost&p=1802901'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Mr. Gonarh &#064; <time class="tag-quote__quoted-time" datetime="2007-12-14T09:36:13+00:00">14.12.07, 09:36</time></span><div class='quote '>Тогда другой вопрос: каким образом это делают программы подобные<br>
VentaFax&#39;у (кстати она тоже писана на дельфи) </div></div><br>
Ожидают пилотного тона факса приемной стороны. :)]]></description>
        <author>medved_68</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=215407&amp;view=findpost&amp;p=1802901</guid>
        <pubDate>Fri, 14 Dec 2007 09:36:13 +0000</pubDate>
        <title>как отловить момент поднятия телефонной трубки на другом конце линии?</title>
        <link>https://forum.sources.ru/index.php?showtopic=215407&amp;view=findpost&amp;p=1802901</link>
        <description><![CDATA[Gonarh: Искал в поиске,гуглил, с периодичностью раз в 2-3 месяца данный вопрос <br>проскальзывает и на нашем форуме, везде практически один и тотже ответ:<br>&quot;никак или чрезвычайно сложно&quot;. Нигде нет даже приблизительной<br>реализации<br>Тогда другой вопрос: каким образом это делают программы подобные<br>VentaFax&#39;у (кстати она тоже писана на дельфи)]]></description>
        <author>Gonarh</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	