外部のサウンドファイルの読み込み

Sound クラスの各インスタンスは、特定のサウンドリソースを読み込んで再生をトリガーするために存在します。アプリケーションは、1 つの Sound オブジェクトを再利用して複数のサウンドを読み込むことはできません。新しいサウンドリソースを読み込むには、アプリケーションで別の Sound オブジェクトを作成する必要があります。

サウンドオブジェクトの作成

ボタンに関連付けるクリック音のような小さいサウンドファイルを読み込む場合、アプリケーションでは、次の例のように Sound オブジェクトを作成して、サウンドファイルを自動的に読み込ませることができます。

var req = new air.URLRequest("click.mp3"); 
var s = new air.Sound(req);

Sound() コンストラクターは、最初のパラメーターとして URLRequest オブジェクトを受け取ります。URLRequest パラメーターに値が渡ると、新しい Sound オブジェクトは指定されたサウンドリソースの読み込みを自動的に開始します。

最も単純なケースを除いて、アプリケーションではサウンドの読み込みの進行状況に注意し、読み込み中のエラーを監視する必要があります。例えば、クリック音がかなり大きい場合、そのサウンドをトリガーするボタンをユーザーがクリックするまでに、読み込みが完了してない可能性があります。読み込まれていないサウンドを再生しようとすると、ランタイムエラーが発生する場合があります。サウンドが完全に読み込まれるのを待ってから、サウンドの再生を開始するアクションをユーザーが実行できるようにする方が安全です。

サウンドのイベントについて

Sound オブジェクトは、サウンド読み込みプロセスの間に、複数の種類のイベントを送出します。アプリケーションは、これらのイベントをリッスンして読み込みの進行状況を追跡し、サウンドが完全に読み込まれたのを確認してから再生できます。次の表は、Sound オブジェクトから送出できるイベントをまとめたものです。

イベント

説明

open

( air.Event.OPEN

サウンド読み込み操作の開始直前に送出されます。

progress

( air.ProgressEvent.PROGRESS

データをファイルまたはストリームから受け取るとき、サウンド読み込み処理の間に定期的に送出されます。

id3

( air.Event.ID3

ID3 データが MP3 サウンドで使用できるようになると送出されます。

complete

( air.Event.COMPLETE

サウンドリソースの全データが読み込まれると送出されます。

ioError

( air.IOErrorEvent.IO_ERROR

サウンドファイルを読み込むことができない場合、または全サウンドデータを受け取る前に読み込み処理が中断された場合に送出されます。

次のコードは、読み込みが終了した後でサウンドを再生する方法を示しています。

var s = new air.Sound(); 
s.addEventListener(air.Event.COMPLETE, onSoundLoaded); 
var req = new air.URLRequest("bigSound.mp3"); 
s.load(req); 
 
function onSoundLoaded(event) 
{ 
    var localSound = event.target; 
    localSound.play(); 
}

まず、URLRequest パラメーターの初期値を指定せずに新しい Sound オブジェクトを作成します。次に、Sound オブジェクトからの complete イベントをリッスンし、すべてのサウンドデータが読み込まれると onSoundLoaded() メソッドを実行します。次に、サウンドファイルの新しい URLRequest 値を指定して Sound.load() メソッドを呼び出します。

サウンドの読み込みが完了すると、 onSoundLoaded() メソッドを実行します。Event オブジェクトの target プロパティは、Sound オブジェクトへの参照です。Sound オブジェクトの play() メソッドを呼び出すと、サウンドの再生が開始されます。

サウンド読み込み処理の監視

サウンドファイルは、大きくて読み込みに長い時間がかかる場合があります。インターネットから読み込む場合は特にその可能性があります。アプリケーションでは読み込みが完了する前にサウンドを再生できます。読み込まれたサウンドの量、および既に再生されたサウンドの量を、ユーザーに示したい場合があります。

Sound クラスが送出する 2 つのイベント、 progress complete を使用すると、サウンドの読み込みの進行状況を比較的簡単に表示できます。次の例では、これらのイベントを使用して読み込み中のサウンドに関する進行状況の情報を表示する方法を示します。

var s = new Sound(); 
s.addEventListener(air.ProgressEvent.PROGRESS, 
    onLoadProgress); 
s.addEventListener(air.Event.COMPLETE,  
    onLoadComplete); 
s.addEventListener(air.IOErrorEvent.IO_ERROR,  
    onIOError); 
 
var req = new air.URLRequest("bigSound.mp3"); 
s.load(req); 
 
function onLoadProgress(event) 
{ 
    var loadedPct = Math.round(100 * (event.bytesLoaded / event.bytesTotal)); 
    air.trace("The sound is " + loadedPct + "% loaded."); 
} 
 
function onLoadComplete(event) 
{ 
    var localSound = event.target; 
    localSound.play(); 
} 
function onIOError(event) 
{ 
    air.trace("The sound could not be loaded: " + event.text); 
}

このコードでは最初に Sound オブジェクトを作成し、 progress イベントと complete イベントのリスナーをこのオブジェクトに追加します。 Sound.load() メソッドを呼び出して、サウンドファイルから最初のデータを受け取ると、 progress イベントが発生し、 onSoundLoadProgress() メソッドがトリガーされます。

読み込みが完了したサウンドデータの割合は、ProgressEvent オブジェクトの bytesLoaded プロパティの値を bytesTotal プロパティの値で割って得られます。同じ bytesLoaded プロパティと bytesTotal プロパティは、Sound オブジェクトでも使用できます。

この例では、アプリケーションでサウンドファイル読み込み中のエラーを検出して対応する方法も示されています。例えば、指定ファイル名のサウンドファイルが見つからない場合、Sound オブジェクトは ioError イベントを送出します。前述のコードでは、エラーが発生すると onIOError() メソッドを実行して簡単なエラーメッセージを表示します。