Я пытаюсь сделать что-то простое:
отправьте 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