我是否正确地将此C代码转换为AS3?

时间:2013-04-07 21:49:06

标签: c actionscript-3 wav pcm compression

所以我找到了一些C代码来解压缩某些PCM样本,我想在AS3中做同样的事情。我试过这样做,但它似乎没有起作用。我知道很少甚至没有C,虽然我对AS3非常流利,所以我可能会错误地翻译它。

这是C代码:

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);
}

Output()是一个占位符,用于对解压缩的样本值执行操作。)

这是我在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文件播放,但我听到的都是静态的。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

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

  1. C中的“短”数据类型通常为16位宽。
  2. AS3中的“int”数据类型为32位宽。
  3. 现在看看这些C:

    char *inputBuffer[dwSize];
    

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

    第一个说我们有一个字节流(你的Delta PCM编码波形)。

    第二个告诉计算机将这些视为16位值。为什么?因为您的C代码可能假定为16位样本大小。您的AS3代码不执行此部分(将字节数组解释为短数组)。

    如果我这样做,我会改变

    iCurValue += input[i];
    

    类似于:

    iCurValue += input.readShort();
    

    所以你一直在读取字节流,好像它是int s,从而读取垃圾(解释了你所听到的内容)。

    希望有所帮助!