サウンドでは主に,
mp3の実体を扱うSoundクラス,
Soundクラスで再生を開始した音楽を制御するSoundChannelクラス
の2つが必要.
また,音量の調整,左右のスピーカーに流す割合を設定するには,SoundTransformクラスが必要.
SoundTransformクラスはSoundクラス専用というわけではなく,
Flash全体のサウンド(flvファイルのサウンドとかも)の設定にも使われるクラス.
最初は,↑の各クラスの役割をはっきり認識していなかったので,
一時停止をやっても2重再生とかのバグが起こって困った.
ソースはこんな感じ.
var sound:Sound = new Sound();
var soundCh:SoundChannel;
// サウンドの再生位置
var _currentPos:Number;
// 通常時のサウンドボリューム
var _soundVol:Number = 1.0;
var url:URLRequest = new URLRequest(mp3ファイル名);
// ロード開始
sound.load(url);
// サウンドのロード完了のイベントリスナー登録
sound.removeEventListener(Event.COMPLETE,
SoundCompleteHandler);
// サウンドのロード完了
function SoundCompleteHandler(event:Event) {
// 位置0から再生開始
soundCh = sound.play(0, 1);
// 音量設定
changeSoundVolume(_soundVol);
// mp3の読み込み完了メソッド解除
sound.removeEventListener(Event.COMPLETE,
SoundCompleteHandler);
// 再生終了のイベントリスナー登録
soundCh.addEventListener(Event.SOUND_COMPLETE,
SoundChannelCompleteHandler);
}
// サウンドの一時停止
function pauseMusic():void {
// 再生位置を保存
_currentPos = soundCh.position;
// ストップ
soundCh.stop();
// SoundChannelの開放
soundCh.removeEventListener(Event.SOUND_COMPLETE,
SoundChannelCompleteHandler);
soundCh = null;
}
// サウンドの再生
function restartMusic():void {
// 保存した再生位置から再生
soundCh = sound.play(_currentPos, 1);
soundCh.addEventListener(Event.SOUND_COMPLETE,
SoundChannelCompleteHandler);
// 音量設定
changeSoundVolume(_soundVol);
}
// 音量調整
function changeSoundVolume(setVol:Number):void {
// 音量の制御用クラス
var soundTrans:SoundTransform;
soundTrans = soundCh.soundTransform;
soundTrans.volume = setVol;
soundCh.soundTransform = soundTrans;
}
// サウンド再生の終了イベント(ループ再生用)
function SoundChannelCompleteHandler(evt:Event):void {
// 安全のため開放
soundCh.removeEventListener(Event.SOUND_COMPLETE,
SoundChannelCompleteHandler);
soundCh = null;
// 最初から再生
soundCh = sound.play(0, 1);
soundCh.addEventListener(Event.SOUND_COMPLETE,
SoundChannelCompleteHandler);
// 音量設定
changeSoundVolume(_soundVol);
}
Soundクラスのstartメソッドの返り値がSoundChannelクラス.
以後,得られたSoundChannelを使ってサウンドを制御する.
サウンドの一時停止は,flvの場合と違ってpauseメソッドがない.
なので,再生位置を予め保存しておいて,SoundChannelクラスを破棄する.
ここで,SoundChannelクラスがちゃんと破棄されていないと後で再生をしたときに2重再生の原因となるので注意.
再生時は,保存しておいた再生位置をstartメソッドの第1引数に指定でおk.
ループ再生自体は,Soundクラスのstartメソッドの第2引数でリピート回数を指定すればいいんだけど,これじゃリピートが有限になっていつかは止まってしまう.
なので,常に自動的にループさせるには,1回の再生にしておいて,再生終了後のイベントが起きたときに,再び最初から再生させればいい.
上のソースをクラスとして作っておいて, さらに再生位置の移動,ボリューム設定を追加した結果,こんな感じのFlashができました.
ちなみに,今回使用させていただいた音楽はこちら.
0 件のコメント:
コメントを投稿