2008-08-20

【Action Script 3.0】サウンドの一時停止・自動ループ再生

Action Script 3.0でサウンドの一時停止,自動ループ再生ができた.

サウンドでは主に,

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ができました.

test_sound





ちなみに,今回使用させていただいた音楽はこちら.



0 件のコメント: