用到的模块主要模块是mod_spandsp, 该模块是freeswitch默认安装的。打开配置文件conf/autoload_configs/spandsp.conf.xml,添加如下内容
<!-- china -->
<descriptor name="cn">
<tone name="RING_TONE" description="China ring">
<element freq1="450" freq2="0" min="900" max="1100"/>
<element freq1="0" freq2="0" min="900" max="4100"/>
</tone>
<tone name="BUSY_TONE">
<element freq1="450" freq2="0" min="300" max="400"/>
<element freq1="0" freq2="0" min="300" max="400"/>
<element freq1="450" freq2="0" min="300" max="400"/>
<element freq1="0" freq2="0" min="300" max="400"/>
<element freq1="450" freq2="0" min="300" max="400"/>
<element freq1="0" freq2="0" min="300" max="400"/>
</tone>
</descriptor>
其中 RING_TONE 就是回铃音,BUSY_TONE是忙音;
我们知道中国电话信号音是:
拨号音 450±25 -10±3dBm0 <10% 连续信号音
回铃音 450±25 -10±3dBm0 <10% 1S(H)/4S(L) 频率450 1秒通 4秒停
忙音 450±25 -10±3dBm0 <10% 0.35S(H)/0.35S(L) 频率450 0.35秒通 0.35秒停
拥塞音 450±25 -10±3dBm0 <10% 0.7S(H)/0.7S(L)
我们回头看 RING_TONE 的配置,其实就是实现了 “频率450 1秒通 4秒停” 只不过 min和 max 为了网络延迟和信号差做了前后100毫秒的调整。
在esl 的 CHANNEL_PROGRESS_MEDIA 的事件中,调用 spandsp_start_tone_detect uuid cn ,uuid为通道的uuid,cn为刚才配置文件的descriptor name,如果检测成功 会产生 DETECTED_TONE 事件,header中的 Detected-Tone 会包含配置的检测出来的 tone名称,比如RING_TONE 或者BUSY_TONE。
有一点需要注意,如果对方手机设置了彩铃,检测回铃音则会失效。