« 非安定マルチバイブレータでネギ振り | トップページ | FRマイコン基板でMIDI実装&SX-150を演奏(その1) »

2008年10月 6日 (月曜日)

AIR(HTML+JavaScript)でエンディアンの違いを吸収するには

唐突ですが、途中まで書いて放置していたエントリがあったので晒しておきます。ΔΣ型D-Aコンバータを作ってみる(その2.5)で紹介したAIRアプリを作る時なんですが、WAVEファイル(リトルエンディアン)のヘッダ情報がどうしても上手く読みこめない(ビッグエンディアンになってしまう)と言う現象に悩まされました。

ちなみに、

AIR+JavaScriptでファイルを開くサンプルはここを参考にしました。

エンディアンの処理はちょっと調べたら

「ByteArrayに対してair.Endian.LITTLE_ENDIAN;を適用するっぽい」

と言うのは分かったのですが適用方法がイマイチピンと来ない。思いついたものをいくつか試してみてもどうも上手く行かない。

色々彷徨い歩いた結果、初めてのAIRアプリケーションの作成の後半で紹介されているZipExtract.jsのこの部分

var zfile = new air.File(dir + basename);
zStream.open(zfile, air.FileMode.READ);
bytes.endian = air.Endian.LITTLE_ENDIAN;
while (zStream.position < zfile.size) {
// read fixed metadata portion of local file header
zStream.readBytes(bytes, 0, 30);
bytes.position = 0;
signature = bytes.readInt();

でやっと謎がとけました。
結果的に

waveheader = new Object();  // WAVEファイルのヘッダ情報オブジェクト
bindata = new air.ByteArray();    // バイナリデータ読み込みバイト配列オブジェクト
bindata.endian = air.Endian.LITTLE_ENDIAN; // バイト配列オブジェクトの設定をリトルエンディアンに
fstream.readBytes(bindata,0,4);  // ファイルからバイナリデータ読み込み
waveheader.nFileSize = bindata.readInt();  // バイナリデータをintで読み取ってヘッダ情報オブジェクトへ

でやっと「RIFF」が読み出せました。それまでは

bindata = new air.ByteArray();
bindata.endian = air.Endian.LITTLE_ENDIAN;
bindata = fsteam.readInt();
waveheader.nFileSize = bindata;

とかやってて、なんだかなぁって感じ。

|

« 非安定マルチバイブレータでネギ振り | トップページ | FRマイコン基板でMIDI実装&SX-150を演奏(その1) »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2790/42707266

この記事へのトラックバック一覧です: AIR(HTML+JavaScript)でエンディアンの違いを吸収するには:

« 非安定マルチバイブレータでネギ振り | トップページ | FRマイコン基板でMIDI実装&SX-150を演奏(その1) »