私は簡単なことをしようとしています:
byteArray を C ライブラリに送信し、バッファをいっぱいにしてメモリを読み取りますが、float 変換の問題があると思います。
私が 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: パラメータの 1 つが無効です。flash.media::Sound/play() で
バッファに書き込むと、メモリは正しく増加するようです.4096 * 8の場合は32768(フロートの場合は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に堪能ではありません.何が起こっているのか分かりますか?
読んでくれてありがとう。
ロム