ActionScript 3.0 사운드 아키텍처는 강력하지만 복잡합니다. 기본적인 사운드 로드와 재생 기능만 필요한 응용 프로그램은 간단한 메서드 호출 및 이벤트 집합을 제공하여 일부 복잡한 기능을 숨기는 클래스를 사용할 수 있습니다. 이러한 클래스는 소프트웨어 디자인 패턴 분야에서
facade
라고 합니다.
SoundFacade 클래스는 다음과 같은 작업을 수행하는 단일 인터페이스를 제공합니다.
-
Sound 객체, SoundLoaderContext 객체 및 SoundMixer 클래스를 사용하여 사운드 파일 로드
-
Sound 객체 및 SoundChannel 객체를 사용하여 사운드 파일 재생
-
재생 진행률 이벤트 전달
-
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 객체의 속성을 선언합니다. 이 클래스는 사운드를 스트리밍할 때 사용할
bufferTime
속성과 사운드 파일의 URL 값도 저장합니다. 또한 로딩 및 재생 비헤이비어에 영향을 미치는 다음과 같은 몇 가지 부울 매개 변수 값을 받습니다.
-
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 객체를 생성한 후 모든 중요 사운드 이벤트에 대한 리스너를 추가합니다. 그런 다음 Sound 객체에 사운드 파일 로드를 지시하고 SoundLoaderContext 객체를 사용하여
bufferTime
값을 전달하도록 합니다.
url
속성은 변경 가능하므로, SoundFacade 인스턴스를 사용하여 여러 사운드 파일을 연속적으로 재생할 수 있습니다.
url
속성을 변경하고
load()
메서드를 호출하기만 하면 새 사운드 파일이 로드됩니다.
다음 세 가지 이벤트 리스너 메서드는 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 객체를 만듭니다.