2013-04-07 85 views
0

所以我发现了一些C代码来解压缩某些PCM样本,我想在AS3中做同样的事情。我试图这样做,但似乎没有工作。我对C没有多少了解,尽管我在AS3中很流利,所以我可能会错误地翻译它。我是否将此C代码正确转换为AS3?

下面是C语言代码:(Output()是用于动作,以在所述解压缩样本值做一个占位符)

BYTE bShift; // shift value 
char *inputBuffer[dwSize]; 

SHORT iCurValue; 
DWORD i; 

iCurValue=0x0000; 

for (i=0;i<dwSize;i++) 
{ 
    iCurValue+=(signed short)inputBuffer[i]; 
    Output(iCurValue<<bShift); 
} 

这里是我在AS3制成的功能这是为了做同样的事情:

private function pcmDecompress(pcmBytes:ByteArray, shift:int):ByteArray 
{ 
    var input:ByteArray = pcmBytes; 
    var output:ByteArray = new ByteArray(); 
    output.endian = Endian.LITTLE_ENDIAN; 

    var iCurValue:int = 0x0000; 

    for (var i:int = 0; i < input.length; i++) 
    { 
     iCurValue += input[i]; 
     output.writeShort(iCurValue << shift); 
    } 

    return output; 
} 

后来我编码的WAV文件并保存,使用output含有样本的数据部分。 WAV文件播放,但我听到的是很多静态。

任何帮助将不胜感激。

回答

0

取决于平台的不同,但在32位的系统上:

  1. C中的“短”的数据类型通常为16个位宽。
  2. AS3中的“int”数据类型是32位宽。

看看现在的C这些行:

char *inputBuffer[dwSize]; 

iCurValue+=(signed short)inputBuffer[i]; 

首先说,我们有一个字节流(您三角洲PCM编码波形)。

第二个告诉电脑把这些视为一个16位值的流。为什么?因为你的C代码可能会假设一个16位的样本大小。您的AS3代码不会执行此部分(将字节数组解释为短阵列)。

如果我这样做,我会改变

iCurValue += input[i]; 

是这样的:

iCurValue += input.readShort(); 

所以,你一直在读的字节流,就好像它是int秒,因此,阅读垃圾(解释你在听什么)。

希望有帮助!

+0

现在看起来很明显。我尝试了它(用'while'循环替换'for'循环),但我仍然是静态的。另外,'input'中有奇数个字节,所以我得到一个“文件结束”错误,除非在剩余1个字节时我跳出循环。不过,我在64位系统上,这会有所作为吗? – puggsoy 2013-04-08 15:26:20