diff --git a/src/audio/alaw.cpp b/src/audio/alaw.cpp index 680590d05a0ea935bde25e6c26a1bb21ebc914b3..71490076edca91712cc98a97f59215aac8061d0a 100644 --- a/src/audio/alaw.cpp +++ b/src/audio/alaw.cpp @@ -23,100 +23,98 @@ class Alaw : public AudioCodec { public: - -// 8 PCMA A 8000 1 [RFC3551] - Alaw(int payload=0) - : AudioCodec(payload, "PCMA") -{ - //_description = "G711a"; - - _clockRate = 8000; - _channel = 1; -} - - -virtual int codecDecode (short *dst, unsigned char *src, unsigned int size) -{ - int16* end = dst+size; - while(dst<end) - *dst++ = ALawDecode(*src++); - return size<<1; -} - -int ALawDecode(uint8 alaw) -{ - alaw ^= 0x55; // A-law has alternate bits inverted for transmission - - uint sign = alaw&0x80; - - int linear = alaw&0x1f; - linear <<= 4; - linear += 8; // Add a 'half' bit (0x08) to place PCM value in middle of range - - alaw &= 0x7f; - if(alaw>=0x20) - { - linear |= 0x100; // Put in MSB - uint shift = (alaw>>4)-1; - linear <<= shift; - } - - if(!sign) - return -linear; - else - return linear; -} - -virtual int codecEncode (unsigned char *dst, short *src, unsigned int size) -{ - size >>= 1; - uint8* end = dst+size; - while(dst<end) - *dst++ = ALawEncode(*src++); - return size; -} - - -uint8 ALawEncode (int16 pcm16) -{ - int p = pcm16; - uint u; // u-law value we are forming - - if(p<0) - { - p = ~p; - u = 0x80^0x10^0xff; // Sign bit = 1 (^0x10 because this will get inverted later) ^0xff ^0xff to invert final u-Law code - } - else - { - //+ve value - u = 0x00^0x10^0xff; - } - - p += 0x84; // Add uLaw bias - - if(p>0x7f00) - p = 0x7f00; // Clip to 15 bits - p >>= 3; // Shift down to 13bit - if(p>=0x100) + // 8 PCMA A 8000 1 [RFC3551] + Alaw(int payload=0) + : AudioCodec(payload, "PCMA") + { + _clockRate = 8000; + _channel = 1; + } + + + virtual int codecDecode (short *dst, unsigned char *src, unsigned int size) + { + int16* end = dst+size; + while(dst<end) + *dst++ = ALawDecode(*src++); + return size<<1; + } + + virtual int codecEncode (unsigned char *dst, short *src, unsigned int size) + { + size >>= 1; + uint8* end = dst+size; + while(dst<end) + *dst++ = ALawEncode(*src++); + return size; + } + + + + int ALawDecode(uint8 alaw) + { + alaw ^= 0x55; // A-law has alternate bits inverted for transmission + uint sign = alaw&0x80; + int linear = alaw&0x1f; + linear <<= 4; + linear += 8; // Add a 'half' bit (0x08) to place PCM value in middle of range + + alaw &= 0x7f; + if(alaw>=0x20) + { + linear |= 0x100; // Put in MSB + uint shift = (alaw>>4)-1; + linear <<= shift; + } + + if(!sign) + return -linear; + else + return linear; + } + + + uint8 ALawEncode (int16 pcm16) + { + int p = pcm16; + uint a; // u-law value we are forming + + if(p<0) + { + p = ~p; + a = 0x00; // sign = 0 + } + else + { + //+ve value + a = 0x80; //sign = 1 + } + //calculate segment and interval numbers + p >>= 4; + if(p>=0x20) { - p >>= 4; - u ^= 0x40; + if(p>=0x100) + { + p >>= 4; + a += 0x40; + } + if(p>=0x40) + { + p >>= 2; + a += 0x20; + } + if(p>=0x20) + { + p >>= 1; + a += 0x10; + } } - if(p>=0x40) - { - p >>= 2; - u ^= 0x20; - } - if(p>=0x20) - { - p >>= 1; - u ^= 0x10; - } - u ^= p; // u now equal to encoded u-law value (with all bits inverted) + // a&0x70 now holds segment value and 'p' the interval number + a += p; // a now equal to encoded A-law value + + return a^0x55; // A-law has alternate bits inverted for transmission + } - return u; -} }; // the class factories diff --git a/src/audio/alaw.h b/src/audio/alaw.h deleted file mode 100644 index 5952da08f1baa48c156fb98bc89435e758c1ed97..0000000000000000000000000000000000000000 --- a/src/audio/alaw.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2004-2005-2006 Savoir-Faire Linux inc. - * Author: Yan Morin <yan.morin@savoirfairelinux.com> - * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __ALAW_H__ -#define __ALAW_H__ - -#include "audiocodec.h" - -/** - * Alaw audio codec (payload is 8) - */ -class Alaw : public AudioCodec { -public: - // payload should be 8 - Alaw (int payload=8); - ~Alaw (void); - - int codecDecode (short *, unsigned char *, unsigned int); - int codecEncode (unsigned char *, short *, unsigned int); - void test () ; -}; - -#endif // __ULAW_H__ diff --git a/src/audio/ulaw.cpp b/src/audio/ulaw.cpp index 594b64e9cdac95d4328fc738c96d0574d6aaf008..32d03ef6d54da132e50530ae1d5f2bc4cf2eb19d 100644 --- a/src/audio/ulaw.cpp +++ b/src/audio/ulaw.cpp @@ -1,3 +1,25 @@ +/** + * Copyright (C) 2004-2005 Savoir-Faire Linux inc. + * Author: Yan Morin <yan.morin@savoirfairelinux.com> + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + **/ + + + #include "common.h" #include "audiocodec.h" @@ -11,7 +33,6 @@ public: _channel = 1; } - virtual int codecDecode (short *dst, unsigned char *src, unsigned int size) { int16* end = dst+size; while(dst<end)