a856d81a06
Use the amount of audio data received in misdn_read() to determine how many bytes we need to send to the b-channel (= how much free space is left in the b-channel tx queue). (This is how libosmo-abis and LCR handle it too.) A pipe is used as a poll()-able audio tx buffer (filled in misdn_write()): FTDM_WRITE wait requests are currently poll()-ed on the input side of the pipe, whereas FTDM_READ and _EVENT requests are poll()-ed on the b-channel socket itself. For every N-bytes of audio data read from the b-channel in misdn_read(), we try to get as much out of the tx pipe, convert it into the ISDN_P_B_RAW format and send it to the b-channel socket. If there's less than N-bytes left in the pipe, we fill the remaining buffer with silence to avoid buffer underflows. B-Channel handling overview: - misdn_wait(FTDM_WRITE) on audio pipe - misdn_write() put audio data into pipe - misdn_wait(FTDM_READ) for next incoming mISDN message on b-channel socket - misdn_read() handle mISDN event, for PH_DATA_IND: - Write data into channel buffer and convert to a/u-law using misdn_convert_audio_bits() - Try to fetch N-bytes from audio pipe - If not enough bytes in pipe: fill remaining space with silence - Convert audio to raw format - Send to b-channel (PH_DATA_REQ) Known problems / bugs / further investigation: 1. Bridge aborted by "Write Buffer 0 bytes Failed!" error from switch_core_io.c. This is "fixed" by _not_ setting the b-channel sockfd to non-blocking mode. 2. Audio glitches (maybe caused by FTDM_WRITE misdn_wait() handling or blocking I/O on sockfd?) 3. misdn_read() EBUSY error messages from sending data to b-channel sockfd after enabling channel. Signed-off-by: Stefan Knoblich <stkn@openisdn.net> |
||
---|---|---|
.. | ||
build | ||
conf | ||
docs | ||
mod_freetdm | ||
msvc | ||
sample | ||
src | ||
.gitignore | ||
.update | ||
AUTHORS | ||
CMakeLists.txt | ||
ChangeLog | ||
Makefile.am | ||
NEWS | ||
README | ||
TODO | ||
acinclude.m4 | ||
bootstrap | ||
configure.ac | ||
configure.gnu | ||
cyginstall.sh | ||
freetdm.2008.sln | ||
freetdm.2010.sln | ||
freetdm.pc.in | ||
mkrelease.sh | ||
ozrename.sh | ||
ozreplace.sh |
README
FreeTDM http://wiki.freeswitch.org/wiki/FreeTDM