akihiro kamijo: August 2008 Archives

« July 2008 | Main | September 2008 »

August 28, 2008

Flash Player 10 の動的サウンド生成機能 (Sound クラス)

Flash Player 10 から動的に生成したサウンドを再生する機能がサポートされています。ベータ 2 で変更された点などもありますので遅ればせながらご紹介します。

まず、この機能を使うには Sound オブジェクトに Event.SAMPLE_DATA のイベントハンドラを設定します。そうすると Sound オブジェクトの動作が通常と変わり、定期的にイベントハンドラを呼び出しては再生するデータを読み込むようになります。このとき SoundChannel は読み込まれたデータを一連のオーディオデータストリームとして再生します。

var mySound:Sound = new Sound();
mySound.addEventListener(Event.SAMPLE_DATA, onSampleData);
var myChannel:SoundChannel = mySound.play();
 
function onSampleData(event:SampleDataEvent):void 
{
  // この中で SoundChannel にデータを書き込む
}
 

SAMPLE_DATA 用イベントハンドラ内では、イベントオブジェクトから渡される ByteArray オブジェクトにオーディオデータを書き込みます。イベントオブジェクトの型は Flash Player 10 から新しく追加された sampleDataEvent で、以下の属性が利用できます。

public data : ByteArray   // オーディオストリーム内のデータ
public position : Number  // オーディオストリーム内の位置
 

ByteArray オブジェクト (event.data) に書き込む値は 32 ビット big endian 浮動小数点数形式の 44.1KHz ステレオデータです。従って一つのサンプルデータの大きさは 8 バイト (4 バイトのデータが左右それぞれ) になります。

下は sampleData イベントハンドラの例です。単純なサイン波形をデータとして書き込んでいます。再生すると聴覚検査で聴くような音がすると思います 。

function onSampleData(event:SampleDataEvent):void {
  for (var c:int=0; c<8192; c++) {
    var rad:Number = Number(c+event.position)/Math.PI/2;
    var amp:Number = Math.sin(rad) / 4;  // -1 から 1 の間の値なら OK
    event.data.writeFloat(amp);  // 左チャネルの音
    event.data.writeFloat(amp);  // 右チャネルの音
  }
}
 

データの計算式を変えると音色が変わると思いますので試してみてください。その際、サンプルデータの値が -1 から 1 の範囲を超えないようにご注意を。

さて、イベントハンドラ内では 2048 以上 8192 以下のサンプルデータを書き込みます。パフォーマンス上はできるだけ多くのサンプルデータを (つまり 8192 個) 書くのが有利と考えられます。

書き込まれたデータが 2048 以下の場合には、データを全て再生した時点で SoundChannel は再生を停止し soundComplete イベントを生成します。明示的に再生を停止したいときには SoundChannel.stop() を呼ぶこともできます。

sampleData イベントにより書き込みを求められている場所と再生中の箇所との時間差は以下の式で求めることができます。ここでの単位は ms になります。

event.position/44.1 - myChannel.position
 

あとは、Sound オブジェクトからオーディオデータを取得するために extract() というメソッドが用意されています。ある音源を読み込んだ Sound オブジェクトからオーディオデータを取り出して他の Sound オブジェクトで動的に再生したりするのに使えます。メソッドの定義は以下のようになっています。

public extract(target:ByteArray, length:Number, startPosition:Number = -1):Number // 
 

extract() は target で指定した ByteArray に length 分のサンプルデータを抽出します。startPosition は読み込みを開始するポジションの指定ですが、明示的に指定しないと、一回目はデータの先頭から、それ以降は続きから順番に読み込みます。

なお、Sound オブジェクトに sampleDataEvent 用のイベントハンドラを設定すると load() 等のメソッドは使えなくなります。

sampleDataEvent.data に書き込むのは 32 ビット big endian なので ShaderJob の結果がそのまま使えそうですね。

Posted by ackie at 06:53 PM | Comments (0)

August 20, 2008

Flash Player 10 におけるセキュリティ変更

Flash Player 10 のリリース候補版が Adobe Labs に公開されています。(Flash Player 10@Labs) 何も無ければこのまま公開されるものですので、既存のコンテンツが正しく再生されるか、コンテンツ制作者やサイト管理者のみなさま検証よろしくお願いします。

さて、Flash Player 10 ではいくつかセキュリティ面での変更が行われています。これらは仕様ですので、こちらが原因で動作しなくなった場合にはコンテンツ側を修正することが必要です。以下、 3 + 1 点が変更された項目です。

1. メタポリシーが必須に

昨年公開された 9.0.115.0 からサポートされたメタポリシーファイルが、Flash Player 10 以降では必須になります。ポリシーファイル (crossdomain.xml) をサイトのルート以外に置いている環境では影響を受けます。

自サーバから配信される全てのコンテンツのコントロールが可能な (勝手にポリシーファイルを配信されたりしない) 環境では、サイトルートのポリシーファイル (マスターポリシーファイル) にメタポリシーとして下のように all を設定するだけでよいと思います。

<cross-domain-policy>
  <site-control permitted-cross-domain-policies="all"/>
</cross-domain-policy>
 

詳細な管理が必要な環境では、要件に応じてメタポリシーを選択することができます。例えば、メタポリシーとして by-content-type を指定すると content-type が text/x-cross-domain-policy のファイルのみがポリシーファイルとして使用されるよう制限することができます。

<cross-domain-policy>
  <site-control permitted-cross-domain-policies="by-content-type"/>
</cross-domain-policy>
 

メタポリシーについては以前の記事 (メタポリシーを使った Flash Player セキュリティ管理) もご覧ください。

2. ソケット接続のタイムアウト

Socket および XMLSocket のオブジェクトに対して securityError イベントが connect() を呼んでから一定時間経過後にディスパッチされるようになります。この仕様変更により、直後にイベントが発生していたケースでも一定時間待つことになりますし、ネットワーク遅延等により接続に時間がかかった結果として securityError がディスパッチされるというケースも発生します。

待ち時間は timeout という属性に設定します。デフォルト値は 20,000 (20 秒) です。

AIR アプリケーションに関しては、Flash Player 10 の機能が統合されてもこの変更の影響は受けない予定のようです。

3. ファイルアップロード/ダウンロードの呼び出し制限

FileReference.browse() と FileReference.download() の呼び出しが、ユーザ操作により発生したイベント内に制限されるようになります。Flsh Player 10 以降、これらのメソッドを使用するには、マウスのクリックやキーの押下等によるイベントから呼び出すよう記述する必要があります。

この件も AIR アプリケーションは影響を受けない予定です。

4. フルスクリーンモードでのキーボードの使用

この点に関してはセキュリティが少し緩和されます。Flash Player 10 からは、フルスクリーンモードで、タブ・スペース・上下左右の矢印が利用できるようになります。

AIR では stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE と設定することでこの機能が使えます。

Posted by ackie at 05:58 PM | Comments (1)

August 19, 2008

Flex Builder 3.0.1 公開

Flex 3.1 SDK 公開に合わせて Flex Builder 3.0.1 が公開されています。Flex 3.1 SDK、Ganymade 対応など、修正項目は Flex バグサイトにリストがありますのでご覧ください。(3.0.1 FBFixedBugs

FB 3.0.1 は Adobe アップデータからもインストールできます。3.1 SDK を追加ではなく置き換えますのでご注意ください。

Posted by ackie at 06:09 PM | Comments (0)

August 18, 2008

Adobe MAX Japan 2009 と 30onMAX

既報のとおり、MAX Japan 2009 が 2009 年 1 月 29 (木)、30 (金) の両日にホテルグランパシフィック LE DAIBA にて開催されます。(Adobe MAX Japan 2009 :読み難くってごめんなさい)

ユーザコミュニティの MAX への参加実現の一環として、30onMAX というプロジェクトが開始されました。これは、MAX 用に作成されたビデオを Youtube に投稿すると、MAX チームがキーノートスピーチをはじめとしてイベント中のいろいろな場所でそれらを使用するというものです。ビデオはアメリカ・ヨーロッパ・日本それぞれの MAX で使用されます。

30onMAX への参加方法は以下のとおりです。

  • ”Why MAX?" (なぜ MAX?) というテーマでビデオを制作
  • それを Youtube にアップロード
  • ビデオに 30onMAX というタグを付ける

ふるってご参加ください。(既にいくつかアップされているとかいないとか)

Posted by ackie at 06:56 PM | Comments (0)

ECMAScript Harmony/ES3.1 と ActionScript

既に一部で伝えられているように、先週 ECMA TC39 から次期 ECMAScript 標準に関するアナウンスがありました。

Flash Player 9 の発表以来、Adobe は ActionScript を ECMAScript 標準第 4 版として提案された ECMA-262 Edition 4 (ES4) に完全準拠させるという目標を公にしてきました。この ES4 は、Adobe, Mozilla, Opera, それから Google を主要なサポーターとして標準化が進められていましたが、一年ほど前に Microsoft と Yahoo! 主導で ECMA-262 Edition 3.1 (ES3.1) のワーキンググループが開始されて以来、2 つの異なる ES3 後継仕様案が並存する状況が続いていました。

先週の発表は、ES4 に関する標準化作業を中止し ES3.1 に集中することが決定されたというもので ECMAScript Harmony プロジェクトと名付けられています。ES3.1 は ES4 のサブセットではありません。つまり AS3.0 は ES3.1 非互換になるということです。例えば ES3.1 の仕様には namespace や package は含まれません。これらの機能は ES3.1 以降の拡張に際しても含まれないことがはっきりと述べられています。また、型指定や継承といった機能の採用については (そもそも class の定義自体が異なるのですが) 今後の議論を待つことになります。JS1.7 や JS1.8 として Firefox 2, 3 に追加された機能も Harmony 路線では見直されるようです。

この件に関して Adobe からの正式なコメントはまだありませんが、Adobe のオープンソースチームのディレクターである Dave がコメントを blog に公開しています。(Standards, ECMAScript and representing the past

要約すると、

  • ECMAScript 標準化委員会参加企業の利害の不一致により仕様の一本化が難しい状況になっていた
  • Web に共通の言語を持つことが必要という観点から Harmony に賛同する
  • その上で、Web の革新を更に進めるため ActionScript の拡張は続ける
  • オープンソースコミュニティ活動の継続・発展も標準化委員会との活動と同様に重要

ということで、ECMAScript の標準化には引き続き参加する一方 ES3.1 のレベルまで AS3 の機能を戻すということは考えられていないようです。(blog 記事に対するコメントには、これを機会に ECMAScript 準拠をやめちゃえというものもいくつか見られました - 例えば private コンストラクタや関数オーバーロード機能の実装など...) 既に多くのユーザに使用されている言語を、その可能性を制限する方向で変更するのは Adobe の理念に反すると Dave としては思っている様。

いましばらく、正式なコメントの発表はお待ちください。

Posted by ackie at 09:47 AM | Comments (1)

August 16, 2008

Flex 3.1 SDK オープンソースサイトに公開

Flex 3.1 SDK が公開されました。AIR 1.1 を正式にサポートするマイルストーンリリースです。Adobe オープンソースサイトからダウンロードできます。(Flex 3 SDK Downloads) ビルド番号は 3.1.0.2710 です。

Flex 3.1 はメジャーリリースですので、今回は Flex Builder のパッチとしても提供されることになると思います。(たぶん)

この発表が行われたことで Flex 3.0.3 SDK への暫定 AIR 1.1 サポートは近々終了することになると思われます。お手数ですが Flex 3.0.3 ベースの AIR アプリケーションは Flex 3.1 への移行をご検討ください。いくつかのバグフィックスも行われていますので可能であれば Web アプリケーションについても移行をお勧めします。修正されたバグのリストは Flex バグ管理サイトから確認できます。(SDK: Fixed Bugs in 3.1 : 要ユーザ ID)

今後は、以前の記事 (Flex 3.0.3 SDK 公開と今後のロードマップ) にも書きましたが、今秋に Flex 3.2 のリリースが予定されています。

Posted by ackie at 05:31 PM | Comments (0)