diff --git a/net/asterisk-11.x-chan-dongle/Makefile b/net/asterisk-11.x-chan-dongle/Makefile index 7c0b204..5a7ecbc 100644 --- a/net/asterisk-11.x-chan-dongle/Makefile +++ b/net/asterisk-11.x-chan-dongle/Makefile @@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=asterisk11-chan-dongle PKG_VERSION:=1.1r35 PKG_REV:=28a46567a88cebdc365db6f294e682246fd2dd7b -PKG_RELEASE:=4 +PKG_RELEASE:=5 PKG_SOURCE_SUBDIR:=asterisk11-chan-dongle-$(PKG_VERSION) PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz diff --git a/net/asterisk-11.x-chan-dongle/patches/100-fix-audio-on-big-endian-systems.patch b/net/asterisk-11.x-chan-dongle/patches/100-fix-audio-on-big-endian-systems.patch new file mode 100644 index 0000000..3fc546d --- /dev/null +++ b/net/asterisk-11.x-chan-dongle/patches/100-fix-audio-on-big-endian-systems.patch @@ -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; + } +