From 5ef2bd18d2058a57b90c44f77eb83a5b9d3c81f3 Mon Sep 17 00:00:00 2001 From: paulc Date: Tue, 3 Nov 2020 16:36:51 +0000 Subject: [PATCH] Fixed the .au header to contain the optional annotation required by some tools. Added support for handling G.722 files. git-svn-id: http://yate.null.ro/svn/yate/trunk@6453 acf43c95-373e-0410-b603-e72c3f656dc1 --- modules/wavefile.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/modules/wavefile.cpp b/modules/wavefile.cpp index b7199f7e..d2dbe04b 100644 --- a/modules/wavefile.cpp +++ b/modules/wavefile.cpp @@ -168,6 +168,8 @@ typedef struct { uint32_t chan; } AuHeader; +const char AuInfo[8] = "By YATE"; + #define ILBC_HEADER_LEN 9 static const char* ilbcFormat(Stream& stream) @@ -247,6 +249,11 @@ void WaveSource::init(const String& file, bool autorepeat) m_format = "ilbc30"; else if (file.endsWith(".g729")) m_format = "g729"; + else if (file.endsWith(".g722")) { + m_rate = 16000; + m_brate = 8000; + m_format = "g722/16000"; + } else if (file.endsWith(".au")) detectAuFormat(); else if (file.endsWith(".wav")) @@ -316,6 +323,10 @@ void WaveSource::detectAuFormat() case 27: m_format = "alaw"; break; + case 24: + m_format = "g722"; + m_brate /= 2; + break; case 3: m_brate *= 2; m_swap = true; @@ -558,6 +569,8 @@ WaveConsumer::WaveConsumer(const String& file, CallEndpoint* chan, unsigned maxl m_format = "ilbc30"; else if (file.endsWith(".g729")) m_format = "g729"; + else if (file.endsWith(".g722")) + m_format = "g722/16000"; else if (file.endsWith(".lbc")) { m_header = Ilbc; if (!m_format.startsWith("ilbc")) @@ -614,8 +627,8 @@ WaveConsumer::~WaveConsumer() } if (m_stream && (Au == m_header)) { int64_t len = m_stream->length(); - if ((len >= (int64_t)sizeof(AuHeader)) && (m_stream->seek(8) == 8)) { - uint32_t bytes = htonl(len - sizeof(AuHeader)); + if ((len >= (int64_t)(sizeof(AuHeader) + sizeof(AuInfo))) && (m_stream->seek(8) == 8)) { + uint32_t bytes = htonl(len - sizeof(AuHeader) - sizeof(AuInfo)); m_stream->writeData(&bytes,sizeof(bytes)); } } @@ -658,16 +671,19 @@ void WaveConsumer::writeAuHeader() header.form = htonl(1); else if (fmt == "alaw") header.form = htonl(27); + else if (fmt == "g722") + header.form = htonl(24); else { Debug(DebugMild,"Invalid au format '%s', not writing header",m_format.c_str()); return; } header.sign = htonl(0x2E736E64); - header.offs = htonl(sizeof(header)); + header.offs = htonl(sizeof(header) + sizeof(AuInfo)); header.freq = htonl(rate); header.chan = htonl(chans); header.len = 0xFFFFFFFF; m_stream->writeData(&header,sizeof(header)); + m_stream->writeData(AuInfo,sizeof(AuInfo)); } bool WaveConsumer::setFormat(const DataFormat& format)