AS3 Алхимия byteArray преобразование с плавающей точкой из звукового извлечения - PullRequest
1 голос
/ 06 апреля 2011

Я пытаюсь сделать что-то простое:

отправьте 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:

soundBytes.position = 1421 * 8;
trace(soundBytes.readFloat()); // trace 2.5783891743576634e-43
trace(soundBytes.readFloat()); // trace 7.847271400218976e-44

Мне кажется, что число было преобразовано или имеет другой тип / формат:

-0,000030517578125 против 2.5783891743576634e-43

Я не очень хорошо говорю на C, есть идеи о том, что происходит?

Спасибо за чтение.

Romu

...