2013-04-07 2 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. Тип данных «int» в AS3 имеет ширину 32 бит.

Теперь посмотрим на эти строки C:

char *inputBuffer[dwSize]; 

и

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

Первый говорит, что мы имеем поток байтов (ваш Delta PCM-закодирован сигнала).

Второе указывает компьютеру на рассматривать их как поток из 16-разрядных значений. Зачем? Потому что ваш C-код, вероятно, предполагает 16-разрядный размер выборки. Ваш код AS3 не выполняет эту часть (интерпретация массива байтов как короткого массива).

Если бы я делал это, я хотел бы изменить

iCurValue += input[i]; 

быть что-то вроде:

iCurValue += input.readShort(); 

Итак, вы читали в потоковый, как если бы это было int s, и, таким образом, чтение мусор (который объясняет, что вы слышите).

Надеюсь, что это поможет!

+0

Это кажется таким очевидным сейчас. Я попробовал это, хотя (заменяя цикл 'for' циклом' while'), но я все равно становлюсь статичным. Кроме того, в 'input' есть нечетное количество байтов, поэтому я получаю ошибку« конец файла », если я не вырвусь из цикла, когда осталось 1 байт. Я на 64-битной системе, хотя это будет иметь значение? – puggsoy