소스코드만 더 길어졌네.
어쨌든 저의 삽질의 결정체를 공개할랍니다-_-; 나름 열심히 만든거라...ㅠㅠ
보시면 이것저것 신경을 많이 쓴걸(?) 볼 수 있을겁니다-_-;
타이머의 zerofill...-_-;
이걸 분석하면 Mate Flex Framework에서 제공하는 Injector에 대해서 이해하실 수 있을겁니다.
소스파일입니다.
설치가 안되신다면 http://www.adobe.com/go/getair/ 여기서 AIR를 다운로드하세요.
소스파일입니다.
http://labs.adobe.com/ 여기에 가면 어도비에서 어떤 것을 삽질하고 있는지 한눈에 알 수 있죠.
지금 삽질한 것 리스트 중에 Adobe AIR for Linux라는것이 있는데 Linux에서도 AIR를 가능하게 하는 것이죠.
AIR는 원래 2개의 OS만 지원을 합니다. OSX랑 WINDOWS죠.
근데 리눅스에서도 지원이 되게 삽질하려는가봅니다.
그래서 이번에 우분투를 새로 설치를 해봐서 거기다가 AIR 런타임을 한번 설치해봤습니다.
설치를 하고 제가 만든 MP3플레이어를 실행했는데 너무 잘 돌아가는군요.
AIR로 사운드 재생이 가능한 것을 알았습니다-_-;
초초초초초간단한 MP3플레이어를 만들어봤습니다.
사운드 컨트롤하기 참 쉽게 되어있군요.
아래는 대략 소스입니다.
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" width="400" height="300" viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
private var file:File = new File();
private var req:URLRequest;
private var sound:Sound;
private var channel:SoundChannel;
private var pausePosition:int;
public function findFile():void {
try {
file.addEventListener(Event.SELECT, selectFileHandler);
file.browse();
} catch (error:Error) {
Alert.show("파일열기 실패했습니다.");
}
}
public function selectFileHandler(event:Event):void {
if (channel != null) {
channel.stop();
}
sound = new Sound();
sound.addEventListener(Event.COMPLETE, onSoundLoaded);
sound.addEventListener(ProgressEvent.PROGRESS, onLoadProgress);
sound.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
pausePosition = 0;
textFileName.text = event.currentTarget.nativePath;
sound.load(new URLRequest(event.currentTarget.nativePath));
btnPlay.enabled = true;
}
public function onLoadProgress(event:ProgressEvent):void {
var loadedPct:Number = Math.round(100 * (event.bytesLoaded / event.bytesTotal));
trace("The sound is " + loadedPct + "% loaded.");
fileLoadingPB.setProgress(loadedPct, 100);
}
public function onSoundLoaded(event:Event):void {
var localSound:Sound = event.target as Sound;
textArtist.text = localSound.id3.artist;
textSongName.text = localSound.id3.songName;
}
public function onIOError(event:IOErrorEvent):void {
Alert.show("The sound could not be loaded: " + event.text);
trace("The sound could not be loaded: " + event.text);
}
public function btnPlayClickHandler(event:Event):void {
btnPlay.enabled = false;
btnStop.enabled = true;
channel = sound.play(pausePosition);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
}
private function onEnterFrame(event:Event):void {
var estimatedLength:int =
Math.ceil(sound.length / (sound.bytesLoaded / sound.bytesTotal));
var playbackPercent:uint =
Math.round(100 * (channel.position / estimatedLength));
playPB.setProgress(playbackPercent, 100);
trace("Sound playback is " + playbackPercent + "% complete.");
}
private function onPlaybackComplete(event:Event):void {
btnPlay.enabled = false;
btnStop.enabled = false;
trace("The sound has finished playing.");
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function btnStopClickHandler(event:Event):void {
btnPlay.enabled = true;
btnStop.enabled = false;
pausePosition = channel.position;
channel.stop();
}
]]>
</mx:Script>
<mx:ProgressBar id="fileLoadingPB" x="125.5" y="160" mode="manual"/>
<mx:ProgressBar id="playPB" x="125.5" y="196" mode="manual" label="PLAYING %1%"/>
<mx:Label x="72.5" y="196" text="재생바" height="28" width="45" textAlign="right"/>
<mx:Label x="72.5" y="160" text="파일읽기" height="28" textAlign="right"/>
<mx:Label x="82.5" y="35" text="제목 :" width="44" textAlign="right"/>
<mx:Label x="82.5" y="61" text="가수명 :" textAlign="right"/>
<mx:Label x="82.5" y="87" text="파일명 :" textAlign="right"/>
<mx:Button id="btnPlay" x="91.5" y="248" label="플레이" click="btnPlayClickHandler(event);" enabled="false"/>
<mx:Button id="btnStop" x="158.5" y="248" label="일시정지" click="btnStopClickHandler(event);" enabled="false"/>
<mx:Button x="236.5" y="248" label="파일열기" click="findFile();"/>
<mx:Text id="textSongName" x="134.5" y="35" text="KHJ 바보" width="191"/>
<mx:Text id="textArtist" x="134.5" y="61" text="KHJ 돼지" width="191"/>
<mx:Text id="textFileName" x="134.5" y="87" text="KHJ 멍충이" width="191"/>
</mx:WindowedApplication>
[/code]
소스를 보면 그리 어렵지 않습니다.
Sound라는 클래스가 있습니다.
사운드객체를 하나 선언하고, 파일명으로 URLRequest를 이용해 객체를 생성해서 그걸 Sound객체의 load메소드를 통해서 로드를 한 다음에, play만 해주면됩니다.
게다가 이것저것 자체적으로 지원해주는게 많습니다. 일시정지를 할 수 있게 stop을 하기전에 channal이라는 클래스를 통해 현재 position을 얻어오면 stop한다음에 그 포지션으로부터 다시 시작할 수 있습니다.
재생완료시 이벤트를 추가할 수 있고, 파일이 로드될 때 이벤트 등의 이벤트를 지원하는군요.
PS. AIR로 MP3플레이어만들면 더 멋있을 것 같은데-_-;