AS3 Alchemy byteArray从声音提取中浮动转换

时间:2011-04-06 16:36:15

标签: actionscript-3 floating-point bytearray byte alchemy

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

将一个byteArray发送到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::Sound/play()

当我在缓冲区写入时,内存似乎正确增加,32768代表4096 * 8(4代表浮动时间2代表左右声道)。

当我在发送byteArray之前跟踪闪存中的字节时,我得到一些这样的数字(在1421的特定位置进行比较):

soundBytes.position = 1421 * 8;
trace(soundBytes.readFloat()); // trace -0.000030517578125 (left)
trace(soundBytes.readFloat()); // trace 0.000030517578125 (right)

我可以在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

0 个答案:

没有答案