Actionscript 3 AS3炼金术由声音提取的数组浮动转换

Actionscript 3 AS3炼金术由声音提取的数组浮动转换,actionscript-3,floating-point,bytearray,byte,alchemy,Actionscript 3,Floating Point,Bytearray,Byte,Alchemy,我正在尝试做一些简单的事情: 将字节数组发送到C库,填充缓冲区并读取内存,但我认为我有浮点转换问题 以下是我在AS中的工作: var memory:ByteArray = gstate.ds; // get sound var soundBytes:ByteArray = new ByteArray(); _source.extract(soundBytes, 4096); soundBytes.position = 0; // send sound _lib.processSound(soun

我正在尝试做一些简单的事情:

将字节数组发送到C库,填充缓冲区并读取内存,但我认为我有浮点转换问题

以下是我在AS中的工作:

var memory:ByteArray = gstate.ds;
// get sound
var soundBytes:ByteArray = new ByteArray();
_source.extract(soundBytes, 4096);
soundBytes.position = 0;
// send sound
_lib.processSound(soundBytes);
// get sound back to play it
memory.position = _dataPosition
event.data.writeBytes(memory);
C代码:

我的缓冲区变量:

float *buffer;
缓冲区在开始时初始化:

static AS3_Val initByteArray(void* self, AS3_Val args) {
    AS3_ArrayValue(args, "IntType", &bufferSize);
    buffer = (float*)malloc(bufferSize*sizeof(float));
    return AS3_Int((int)buffer);
}
我处理声音:

AS3_Val src = AS3_Undefined();
AS3_ArrayValue( args,"AS3ValType", &src );
// get length
AS3_Val lengthOfArgs = AS3_GetS(src,"length");
int len = AS3_IntValue(lengthOfArgs);
// set position to 0 and write the buffer
AS3_ByteArray_seek(src, 0, SEEK_SET);
AS3_Trace(AS3_GetS(src, "bytesAvailable"));
AS3_ByteArray_readBytes(buffer, src, len);
现在我得到一个错误:

异常错误:RangeError:错误#2004:其中一个参数无效。 在flash.media::声音/播放()

当我在缓冲区中写入时,内存似乎正确地增加了,32768代表4096*8(4代表浮点乘以2代表左通道和右通道)

当我在发送byteArray之前跟踪flash中的字节时,我会得到如下数字(具体位置为1421以进行比较):

我可以在C中跟踪相同的数字:

AS3_ByteArray_seek(src, 1421*8, SEEK_SET);
AS3_Val emptyParams = AS3_Array("");
AS3_Val readFloat = AS3_GetS(src, "readFloat");
AS3_Trace(readFloat);
AS3_Val left = AS3_Call(readFloat, src, emptyParams);
AS3_Trace(left); // trace -0.000030517578125 (left)
AS3_Val right = AS3_Call(readFloat, src, emptyParams);
AS3_Trace(right); // trace 0.000030517578125 (right)
但当我跟踪缓冲区时:

AS3_Trace(AS3_Number(buffer[1421*2])); // trace 2.5783891743576634e-43
AS3_Trace(AS3_Number(buffer[(1421*2)+1])); trace 7.847271400218976e-44
调用lib后在flash中:

soundBytes.position = 1421 * 8;
trace(soundBytes.readFloat()); // trace 2.5783891743576634e-43
trace(soundBytes.readFloat()); // trace 7.847271400218976e-44
我看起来该号码已被转换或具有不同的类型/格式:

-0.000030517578125 vs 2.5783891743576634e-43

我的C语言不是很流利,知道发生了什么吗

谢谢你的阅读


Romu

我相信你没有正确地在炼金术和闪光之间传递数据。我希望我现在有更多的时间发布更多的代码,但是看看这个源代码,看看他们是怎么做的:下面是答案(endian就是问题所在):呵呵,是的,让所有字节都倒过来会是个问题:-)也请看:
soundBytes.position = 1421 * 8;
trace(soundBytes.readFloat()); // trace 2.5783891743576634e-43
trace(soundBytes.readFloat()); // trace 7.847271400218976e-44