ActionScript 3.0 のサウンドアーキテクチャは強力ですが、複雑でもあります。 サウンドの基本的なロード機能と再生機能しか必要としないアプリケーションでは、シンプルなメソッド呼び出しとイベントによって複雑さを隠すことができるクラスを使用することができます。 ソフトウェア設計パターンの分野で、このようなクラスはファサードと呼ばれます。
SoundFacade クラスは、次のタスクを実行するために単一のインターフェイスを提供します。
-
Sound オブジェクト、SoundLoaderContext オブジェクト、および SoundMixer クラスを使用したサウンドファイルのロード
-
Sound オブジェクトと SoundChannel オブジェクトを使用したサウンドファイルの再生
-
playback progress イベントの送出
-
Sound オブジェクトと SoundChannel オブジェクトを使用したサウンド再生の一時停止と再開
SoundFacade クラスは、ActionScript サウンドクラスの大半の機能を、複雑さを軽減した形で提供します。
次のコードは、クラス宣言、クラスプロパティおよび
SoundFacade()
コンストラクターメソッドを示します。
public class SoundFacade extends EventDispatcher
{
public var s:Sound;
public var sc:SoundChannel;
public var url:String;
public var bufferTime:int = 1000;
public var isLoaded:Boolean = false;
public var isReadyToPlay:Boolean = false;
public var isPlaying:Boolean = false;
public var isStreaming:Boolean = true;
public var autoLoad:Boolean = true;
public var autoPlay:Boolean = true;
public var pausePosition:int = 0;
public static const PLAY_PROGRESS:String = "playProgress";
public var progressInterval:int = 1000;
public var playTimer:Timer;
public function SoundFacade(soundUrl:String, autoLoad:Boolean = true,
autoPlay:Boolean = true, streaming:Boolean = true,
bufferTime:int = -1):void
{
this.url = soundUrl;
// Sets Boolean values that determine the behavior of this object
this.autoLoad = autoLoad;
this.autoPlay = autoPlay;
this.isStreaming = streaming;
// Defaults to the global bufferTime value
if (bufferTime < 0)
{
bufferTime = SoundMixer.bufferTime;
}
// Keeps buffer time reasonable, between 0 and 30 seconds
this.bufferTime = Math.min(Math.max(0, bufferTime), 30000);
if (autoLoad)
{
load();
}
}
SoundFacade クラスは、独自のイベントを送出できるよう EventDispatcher クラスを拡張します。 クラスコードは、まず Sound オブジェクトと SoundChannel オブジェクトのプロパティを宣言します。 このクラスは、サウンドをストリーミングするときに使用する、サウンドファイルの URL の値と
bufferTime
プロパティも格納します。さらに、ロードおよび再生の動作に影響するブールパラメーター値のいくつかを受け取ります。
-
autoLoad
パラメーターは、オブジェクトが作成されると同時にサウンドのロードを開始するようオブジェクトに指示します。
-
autoPlay
パラメーターは、十分な量のサウンドデータがロードされると同時に、サウンドの再生を開始するよう指示します。ストリーミングサウンドであれば、
bufferTime
プロパティで指定されるデータ量がロードされると再生が開始されます。
-
streaming
パラメーターは、ロードが完了する前にサウンドファイルの再生を開始できることを示します。
bufferTime
パラメーターのデフォルト値は -1 です。コンストラクターメソッドが
bufferTime
パラメーターに負の値を検知した場合、
bufferTime
プロパティを
SoundMixer.bufferTime
の値に設定します。これにより、アプリケーションのデフォルト値は、必要に応じてグローバルな
SoundMixer.bufferTime
の値になります。
autoLoad
パラメーターが
true
に設定されている場合、コンストラクターメソッドはすぐに次の
load()
メソッドを呼び出し、サウンドファイルのロードを開始します。
public function load():void
{
if (this.isPlaying)
{
this.stop();
this.s.close();
}
this.isLoaded = false;
this.s = new Sound();
this.s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress);
this.s.addEventListener(Event.OPEN, onLoadOpen);
this.s.addEventListener(Event.COMPLETE, onLoadComplete);
this.s.addEventListener(Event.ID3, onID3);
this.s.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
this.s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onIOError);
var req:URLRequest = new URLRequest(this.url);
var context:SoundLoaderContext = new SoundLoaderContext(this.bufferTime, true);
this.s.load(req, context);
}
load()
メソッドは新しい Sound オブジェクトを作成し、すべての重要なサウンドイベントのリスナーを追加します。その後、
bufferTime
値に渡す SoundLoaderContext オブジェクトを使用して、Sound オブジェクトにサウンドファイルをロードするよう指示します。
url
プロパティは変更することができるので、SoundFacade インスタンスを使用して異なるサウンドファイルを連続して再生することができます。
url
プロパティを変更して
load()
メソッドを呼び出すだけで、新しいサウンドファイルがロードされます。
次の 3 つのイベントリスナーメソッドは、SoundFacade オブジェクトがどのようにロードの進行状況をトラッキングし、サウンドを再生するタイミングを決定するかを示します。
public function onLoadOpen(event:Event):void
{
if (this.isStreaming)
{
this.isReadyToPlay = true;
if (autoPlay)
{
this.play();
}
}
this.dispatchEvent(event.clone());
}
public function onLoadProgress(event:ProgressEvent):void
{
this.dispatchEvent(event.clone());
}
public function onLoadComplete(event:Event):void
{
this.isReadyToPlay = true;
this.isLoaded = true;
this.dispatchEvent(evt.clone());
if (autoPlay && !isPlaying)
{
play();
}
}
サウンドのロードが開始すると、
onLoadOpen()
メソッドが実行されます。サウンドをストリーミングモードで再生できる場合、
onLoadComplete()
メソッドは
isReadyToPlay
フラグをすぐに
true
に設定します。
isReadyToPlay
フラグは、「再生」ボタンをクリックするなどのユーザーアクションに反応して、アプリケーションがサウンドの再生を開始できるかどうかを決定します。SoundChannel クラスはサウンドデータのバッファリングを管理するので、
play()
メソッドを呼び出す前に十分なデータ量がロードされたかどうかを明示的に確認する必要はありません。
ロードプロセス中は、
onLoadProgress()
メソッドが定期的に実行されます。このメソッドは、SoundFacade オブジェクトを使用するコードによって使用される ProgressEvent オブジェクトのクローンを送出するだけです。
サウンドデータが完全にロードされると、
onLoadComplete()
メソッドが実行されます。必要であれば、非ストリーミングサウンドのために
play()
メソッドを呼び出します。
play()
メソッドを以下に示します。
public function play(pos:int = 0):void
{
if (!this.isPlaying)
{
if (this.isReadyToPlay)
{
this.sc = this.s.play(pos);
this.sc.addEventListener(Event.SOUND_COMPLETE, onPlayComplete);
this.isPlaying = true;
this.playTimer = new Timer(this.progressInterval);
this.playTimer.addEventListener(TimerEvent.TIMER, onPlayTimer);
this.playTimer.start();
}
}
}
サウンドが再生できる状態になると、
play()
メソッドは
Sound.play()
メソッドを呼び出します。生成される SoundChannel オブジェクトは、
sc
プロパティに格納されます。その後、
play()
メソッドは Timer オブジェクトを作成します。これを使用すると、playback progress イベントを定期的に送出することができます。