1

私は簡単なことをしようとしています:

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に堪能ではありません.何が起こっているのか分かりますか?

読んでくれてありがとう。

ロム

4

0 に答える 0