asterisk-11.x-chan-dongle: fix audio endianess problem

Github user @ljakob supplied a patch in
https://github.com/openwrt/telephony/issues/7
--
Hi, I've solved the problem myself - it was an endianness bug:

Here what gave me the correct clue:

    audio is broken in one direction only
    audio is fine if you disable any timing-source within asterisk (no good idea if you want to use IAX)
    audio was fine on my x86 box
    I had a long look into the code :)

The bug is in the audio handling of timing_write in channel.c, the data sent to the socket is not changed to the correct endianness if a timing device is used.

Here is my patch, it's untested (just one call yet) but it's trivial enough:
http://www.hugo.weite-welt.com/asterisk13_chan_dongle_endianess.patch
it is against asterisk13 branch in
https://github.com/oleg-krv/asterisk-chan-dongle.git
but should fit into other asterisk versions nicely
--
This commit imports the patch above to asterisk-11.x-chan-dongle.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
This commit is contained in:
Daniel Golle 2015-06-24 20:50:09 +02:00
parent 2a342cd5bf
commit f0bb800287
2 changed files with 49 additions and 1 deletions

View file

@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=asterisk11-chan-dongle
PKG_VERSION:=1.1r35
PKG_REV:=28a46567a88cebdc365db6f294e682246fd2dd7b
PKG_RELEASE:=3
PKG_RELEASE:=5
PKG_SOURCE_SUBDIR:=asterisk11-chan-dongle-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz

View file

@ -0,0 +1,48 @@
Index: asterisk11-chan-dongle-1.1r35/channel.c
===================================================================
--- asterisk11-chan-dongle-1.1r35.orig/channel.c
+++ asterisk11-chan-dongle-1.1r35/channel.c
@@ -495,6 +495,19 @@ again:
}
}
+// see https://github.com/openwrt/telephony/issues/7
+static inline void change_audio_endianness_to_le(struct iovec *iov, int iovcnt)
+{
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ return; // nothing to do
+#else
+ for(;iovcnt-->0;iov++)
+ {
+ ast_swapcopy_samples(iov->iov_base, iov->iov_base, iov->iov_len/2);
+ }
+#endif
+}
+
#/* */
static void timing_write (struct pvt* pvt)
{
@@ -522,6 +535,7 @@ static void timing_write (struct pvt* pv
iovcnt = mixb_read_n_iov (&pvt->a_write_mixb, iov, FRAME_SIZE);
mixb_read_n_iov (&pvt->a_write_mixb, iov, FRAME_SIZE);
mixb_read_upd (&pvt->a_write_mixb, FRAME_SIZE);
+ change_audio_endianness_to_le(iov, iovcnt);
}
else if (used > 0)
{
@@ -535,6 +549,7 @@ static void timing_write (struct pvt* pv
iov[iovcnt].iov_base = silence_frame;
iov[iovcnt].iov_len = FRAME_SIZE - used;
iovcnt++;
+ change_audio_endianness_to_le(iov, iovcnt);
}
else
{
@@ -544,6 +559,7 @@ static void timing_write (struct pvt* pv
iov[0].iov_base = silence_frame;
iov[0].iov_len = FRAME_SIZE;
iovcnt = 1;
+ // ignore endianness for zeros
// continue;
}