<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://sudoroom.org/mediawiki/index.php?action=history&amp;feed=atom&amp;title=SudoPod</id>
	<title>SudoPod - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://sudoroom.org/mediawiki/index.php?action=history&amp;feed=atom&amp;title=SudoPod"/>
	<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=SudoPod&amp;action=history"/>
	<updated>2026-05-13T22:50:12Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.2</generator>
	<entry>
		<id>https://sudoroom.org/mediawiki/index.php?title=SudoPod&amp;diff=4463&amp;oldid=prev</id>
		<title>Thex: Created page with &quot;File:SudoPod-snap.jpgFile:SudoPod-web.jpg  A basic streaming audio player with integrated API.  &lt;pre&gt; package { 	import flash.events.Event; 	import flash.events.MouseE...&quot;</title>
		<link rel="alternate" type="text/html" href="https://sudoroom.org/mediawiki/index.php?title=SudoPod&amp;diff=4463&amp;oldid=prev"/>
		<updated>2013-05-24T18:50:37Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;a href=&quot;/wiki/File:SudoPod-snap.jpg&quot; title=&quot;File:SudoPod-snap.jpg&quot;&gt;File:SudoPod-snap.jpg&lt;/a&gt;&lt;a href=&quot;/wiki/File:SudoPod-web.jpg&quot; title=&quot;File:SudoPod-web.jpg&quot;&gt;File:SudoPod-web.jpg&lt;/a&gt;  A basic streaming audio player with integrated API.  &amp;lt;pre&amp;gt; package { 	import flash.events.Event; 	import flash.events.MouseE...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[File:SudoPod-snap.jpg]][[File:SudoPod-web.jpg]]&lt;br /&gt;
&lt;br /&gt;
A basic streaming audio player with integrated API.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package&lt;br /&gt;
{&lt;br /&gt;
	import flash.events.Event;&lt;br /&gt;
	import flash.events.MouseEvent;&lt;br /&gt;
	import flash.media.SoundTransform;&lt;br /&gt;
	import flash.display.Sprite;&lt;br /&gt;
	import flash.media.SoundMixer;&lt;br /&gt;
	import flash.display.MovieClip;&lt;br /&gt;
	import flash.net.URLRequest;&lt;br /&gt;
	import flash.media.Sound;&lt;br /&gt;
	import flash.events.ProgressEvent;&lt;br /&gt;
	import flash.media.SoundChannel;&lt;br /&gt;
	import flash.utils.ByteArray;&lt;br /&gt;
	import flash.display.Graphics;&lt;br /&gt;
	import flash.events.IOErrorEvent;&lt;br /&gt;
	import flash.display.NativeWindow;&lt;br /&gt;
	import flash.events.ServerSocketConnectEvent;&lt;br /&gt;
	import flash.net.Socket;&lt;br /&gt;
	import flash.events.OutputProgressEvent;&lt;br /&gt;
	import flash.net.ServerSocket;&lt;br /&gt;
	&lt;br /&gt;
	public class sudoPod extends MovieClip&lt;br /&gt;
	{&lt;br /&gt;
		public var volumeDial:Sprite;&lt;br /&gt;
		&lt;br /&gt;
		private var _volume:Number = 0.5;&lt;br /&gt;
		&lt;br /&gt;
		private var window:NativeWindow;&lt;br /&gt;
		&lt;br /&gt;
		private var audioPath:String = &amp;quot;http://sudoradio.com:8000/&amp;quot;;&lt;br /&gt;
		private var sound:Sound;&lt;br /&gt;
		private var soundChannel:SoundChannel;&lt;br /&gt;
		&lt;br /&gt;
		private var playbackActive:Boolean;&lt;br /&gt;
		&lt;br /&gt;
		private var localhostSocket:ServerSocket;&lt;br /&gt;
		// TODO: Update to custom class using vectors&lt;br /&gt;
		private var localhostClients:Object;&lt;br /&gt;
		&lt;br /&gt;
		private var lastX:Number;&lt;br /&gt;
&lt;br /&gt;
		public function sudoPod() &lt;br /&gt;
		{&lt;br /&gt;
			initUI();&lt;br /&gt;
			initSound();&lt;br /&gt;
			initLocalhost();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		public function get volume():Number&lt;br /&gt;
		{&lt;br /&gt;
			return _volume;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		public function set volume(level:Number):void&lt;br /&gt;
		{&lt;br /&gt;
			_volume = Math.max(0, Math.min(1, level));&lt;br /&gt;
			&lt;br /&gt;
			// Add SO for remembering last volume on restart&lt;br /&gt;
			// Add volume tween/fader&lt;br /&gt;
			&lt;br /&gt;
			var t:SoundTransform = SoundMixer.soundTransform;&lt;br /&gt;
			t.volume = _volume;&lt;br /&gt;
			SoundMixer.soundTransform = t;&lt;br /&gt;
			&lt;br /&gt;
			volumeDial.rotation = _volume * 120.0;			&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function update():void&lt;br /&gt;
		{&lt;br /&gt;
			drawSpectrum();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function initUI():void&lt;br /&gt;
		{&lt;br /&gt;
			volumeDial.rotation = _volume * 120.0;&lt;br /&gt;
			&lt;br /&gt;
			volumeDial.addEventListener(MouseEvent.MOUSE_DOWN, dialHandler);&lt;br /&gt;
			&lt;br /&gt;
			window = stage.nativeWindow;&lt;br /&gt;
			window.stage.addEventListener(MouseEvent.MOUSE_DOWN, downHandler);&lt;br /&gt;
			&lt;br /&gt;
			this.addEventListener(MouseEvent.MOUSE_WHEEL, wheelHandler);&lt;br /&gt;
			this.addEventListener(Event.ENTER_FRAME, frameHandler);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function initSound():void&lt;br /&gt;
		{&lt;br /&gt;
			sound = new Sound();&lt;br /&gt;
			sound.addEventListener(Event.COMPLETE, completeHandler);&lt;br /&gt;
			sound.addEventListener(Event.ID3, id3Handler);&lt;br /&gt;
			sound.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);&lt;br /&gt;
			sound.addEventListener(ProgressEvent.PROGRESS, progressHandler);&lt;br /&gt;
			&lt;br /&gt;
			volume = _volume;&lt;br /&gt;
			&lt;br /&gt;
			playbackActive = true;&lt;br /&gt;
			loadSound(audioPath);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function initLocalhost():void&lt;br /&gt;
		{&lt;br /&gt;
			localhostClients = new Object();&lt;br /&gt;
			&lt;br /&gt;
			localhostSocket = new ServerSocket();&lt;br /&gt;
			localhostSocket.addEventListener(Event.CONNECT, localhostConnect);&lt;br /&gt;
			localhostSocket.addEventListener(Event.CLOSE, localhostClose);&lt;br /&gt;
			localhostSocket.bind(21337, &amp;quot;0.0.0.0&amp;quot;);&lt;br /&gt;
			localhostSocket.listen();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function startPlayback():void&lt;br /&gt;
		{&lt;br /&gt;
			if (!playbackActive)&lt;br /&gt;
			{&lt;br /&gt;
				playbackActive = true;&lt;br /&gt;
				initSound();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function stopPlayback():void&lt;br /&gt;
		{&lt;br /&gt;
			if (playbackActive)&lt;br /&gt;
			{&lt;br /&gt;
				playbackActive = false;&lt;br /&gt;
				soundChannel.stop();&lt;br /&gt;
				&lt;br /&gt;
				sound.removeEventListener(Event.COMPLETE, completeHandler);&lt;br /&gt;
				sound.removeEventListener(Event.ID3, id3Handler);&lt;br /&gt;
				sound.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);&lt;br /&gt;
				sound.removeEventListener(ProgressEvent.PROGRESS, progressHandler);&lt;br /&gt;
				sound.close();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function loadSound(path:String):void&lt;br /&gt;
		{&lt;br /&gt;
			audioPath = path;&lt;br /&gt;
			sound.load(new URLRequest(audioPath));&lt;br /&gt;
			&lt;br /&gt;
			soundChannel = sound.play();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function drawSpectrum():void&lt;br /&gt;
		{&lt;br /&gt;
			var bytes:ByteArray = new ByteArray();&lt;br /&gt;
			&lt;br /&gt;
			var g:Graphics = spectrumGraph.graphics;&lt;br /&gt;
			g.clear();&lt;br /&gt;
			&lt;br /&gt;
			SoundMixer.computeSpectrum(bytes, true, 4);&lt;br /&gt;
			renderBytes(g, [0x0066CC, 0x00CC66], bytes);&lt;br /&gt;
			&lt;br /&gt;
			 SoundMixer.computeSpectrum(bytes, false, 0);&lt;br /&gt;
			renderBytes(g, [0x6600CC, 0xCC0066], bytes);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function renderBytes(g:Graphics, c:Array, bytes:ByteArray):void&lt;br /&gt;
		{&lt;br /&gt;
			const PLOT_WIDTH:int = 200;&lt;br /&gt;
            const CHANNEL_LENGTH:int = 256;&lt;br /&gt;
			&lt;br /&gt;
			const L_OFF = -0;&lt;br /&gt;
			const R_OFF = 0;&lt;br /&gt;
            &lt;br /&gt;
            g.lineStyle(0, c[0], 0.8);&lt;br /&gt;
            g.beginFill(c[0], 0.5);&lt;br /&gt;
            g.moveTo(L_OFF, CHANNEL_LENGTH * 2);&lt;br /&gt;
            &lt;br /&gt;
            var n:Number = 0;&lt;br /&gt;
            &lt;br /&gt;
            for (var i:int = 0; i &amp;lt; CHANNEL_LENGTH; i++) {&lt;br /&gt;
                n = (bytes.readFloat() * PLOT_WIDTH);&lt;br /&gt;
                g.lineTo(-n + L_OFF, (CHANNEL_LENGTH * 2) - (i * 2));&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            g.lineTo(L_OFF, 0);&lt;br /&gt;
            g.endFill();&lt;br /&gt;
 &lt;br /&gt;
 			&lt;br /&gt;
            g.lineStyle(0, c[1], 0.8);&lt;br /&gt;
            g.beginFill(c[1], 0.5);&lt;br /&gt;
            g.moveTo(R_OFF, CHANNEL_LENGTH * 2);&lt;br /&gt;
            &lt;br /&gt;
            for (i = CHANNEL_LENGTH; i &amp;gt; 0; i--) {&lt;br /&gt;
                n = (bytes.readFloat() * PLOT_WIDTH);&lt;br /&gt;
                g.lineTo(n + R_OFF, i * 2);&lt;br /&gt;
            }&lt;br /&gt;
  &lt;br /&gt;
            g.lineTo(R_OFF, 0);&lt;br /&gt;
            g.endFill();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function frameHandler(e:Event):void&lt;br /&gt;
		{&lt;br /&gt;
			update();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function downHandler(e:MouseEvent):void&lt;br /&gt;
		{&lt;br /&gt;
			window.startMove();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function dialHandler(e:MouseEvent):void&lt;br /&gt;
		{&lt;br /&gt;
			e.stopPropagation();&lt;br /&gt;
			&lt;br /&gt;
			lastX = mouseX;&lt;br /&gt;
			&lt;br /&gt;
			volumeDial.addEventListener(MouseEvent.MOUSE_MOVE, dialMoveHandler);&lt;br /&gt;
			this.addEventListener(MouseEvent.MOUSE_UP, upHandler);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function upHandler(e:MouseEvent):void&lt;br /&gt;
		{&lt;br /&gt;
			volumeDial.removeEventListener(MouseEvent.MOUSE_MOVE, dialMoveHandler);&lt;br /&gt;
			this.removeEventListener(MouseEvent.MOUSE_UP, upHandler);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function dialMoveHandler(e:MouseEvent):void&lt;br /&gt;
		{&lt;br /&gt;
			volume += (mouseX - lastX) / 100.0;&lt;br /&gt;
			lastX = mouseX;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function wheelHandler(e:MouseEvent):void&lt;br /&gt;
		{&lt;br /&gt;
			volume += e.delta / 100.0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function completeHandler(e:Event):void&lt;br /&gt;
		{&lt;br /&gt;
			trace(&amp;quot;Complete:&amp;quot;, e);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function id3Handler(e:Event):void&lt;br /&gt;
		{&lt;br /&gt;
			trace(&amp;quot;ID3:&amp;quot;, e);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function ioErrorHandler(e:Event):void&lt;br /&gt;
		{&lt;br /&gt;
			trace(&amp;quot;IO Error:&amp;quot;, e);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function progressHandler(e:ProgressEvent):void&lt;br /&gt;
		{&lt;br /&gt;
			// trace(&amp;quot;Progress:&amp;quot;, e);&lt;br /&gt;
			/*&lt;br /&gt;
			bytesLoadedText.text = e.bytesLoaded.toString();&lt;br /&gt;
			bytesTotalText.text = e.bytesTotal.toString();&lt;br /&gt;
			&lt;br /&gt;
			var p:Number = e.bytesLoaded / e.bytesTotal;&lt;br /&gt;
			percentLoadedText.text = Math.round(p * 100.0).toString() + &amp;quot;%&amp;quot;;&lt;br /&gt;
			*/&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		/////////////////////////////////////////////////////////////&lt;br /&gt;
		/////////////////// localhost server ////////////////////////&lt;br /&gt;
		/////////////////////////////////////////////////////////////&lt;br /&gt;
		&lt;br /&gt;
		private function localhostConnect(e:ServerSocketConnectEvent):void&lt;br /&gt;
		{&lt;br /&gt;
			var socket:Socket = e.socket as Socket;&lt;br /&gt;
			localhostClients[socket.remoteAddress + socket.remotePort] = socket;&lt;br /&gt;
			&lt;br /&gt;
			socket.addEventListener(ProgressEvent.SOCKET_DATA, localhostSocketData);&lt;br /&gt;
			socket.addEventListener(Event.CLOSE, localhostClientClose);&lt;br /&gt;
			socket.addEventListener(IOErrorEvent.IO_ERROR, localhostIOError);&lt;br /&gt;
			socket.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, localhostProgress);&lt;br /&gt;
			&lt;br /&gt;
			trace(&amp;quot;Connect: &amp;quot; + socket.remoteAddress + &amp;quot;:&amp;quot; + socket.remotePort);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function closeLocalhostSocket(socket:Socket):void&lt;br /&gt;
		{&lt;br /&gt;
			trace(&amp;quot;Close: &amp;quot; + socket.remoteAddress + &amp;quot;:&amp;quot; + socket.remotePort);&lt;br /&gt;
			&lt;br /&gt;
			socket.removeEventListener(ProgressEvent.SOCKET_DATA, localhostSocketData);&lt;br /&gt;
			socket.removeEventListener(Event.CLOSE, localhostClientClose);&lt;br /&gt;
			socket.removeEventListener(IOErrorEvent.IO_ERROR, localhostIOError);&lt;br /&gt;
			socket.removeEventListener(OutputProgressEvent.OUTPUT_PROGRESS, localhostProgress);&lt;br /&gt;
			&lt;br /&gt;
			localhostClients[socket.remoteAddress + socket.remotePort] = null;&lt;br /&gt;
			&lt;br /&gt;
			if (socket.connected)&lt;br /&gt;
				socket.close();&lt;br /&gt;
			&lt;br /&gt;
			socket = null;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function localhostProgress(e:OutputProgressEvent):void&lt;br /&gt;
		{&lt;br /&gt;
			if (e.bytesPending == 0)&lt;br /&gt;
			{&lt;br /&gt;
				var socket:Socket = e.target as Socket;&lt;br /&gt;
				closeLocalhostSocket(socket);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function genHTML():String&lt;br /&gt;
		{&lt;br /&gt;
			var html:String = &amp;quot;&amp;quot;;&lt;br /&gt;
			html += &amp;quot;&amp;lt;html&amp;gt;\n&amp;quot;&lt;br /&gt;
			html += &amp;quot;  &amp;lt;head&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;    &amp;lt;title&amp;gt;sudoPod API&amp;lt;/title&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;  &amp;lt;/head&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;  &amp;lt;body&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;    &amp;lt;h1&amp;gt;sudoPod&amp;lt;/h1&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;    &amp;lt;p&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;      &amp;lt;button onclick='window.location = \&amp;quot;/volumeUp\&amp;quot;'&amp;gt;Volume +&amp;lt;/button&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;      Volume: &amp;quot; + Math.round(volume * 100.0).toString() + &amp;quot;%&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;      &amp;lt;button onclick='window.location = \&amp;quot;/volumeDown\&amp;quot;'&amp;gt;Volume -&amp;lt;/button&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;    &amp;lt;/p&amp;gt;&amp;lt;br/&amp;lt;br/&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;    &amp;lt;p&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;      &amp;lt;button onclick='window.location = \&amp;quot;/start\&amp;quot;'&amp;gt;start&amp;lt;/button&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;      &amp;lt;button onclick='window.location = \&amp;quot;/stop\&amp;quot;'&amp;gt;stop&amp;lt;/button&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;    &amp;lt;/p&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;    &amp;lt;p&amp;gt;status&amp;lt;/p&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;    &amp;lt;p&amp;gt;Playing: &amp;quot; + (playbackActive ? &amp;quot;true&amp;quot; : &amp;quot;false&amp;quot;) + &amp;quot;&amp;lt;/p&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;    &amp;lt;p&amp;gt;Path: &amp;quot; + audioPath + &amp;quot;&amp;lt;/p&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;    &amp;lt;p&amp;gt;Position: &amp;quot; + Math.round(soundChannel.position / 1000.0) + &amp;quot; seconds&amp;lt;/p&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;    &amp;lt;p&amp;gt;Volume: &amp;quot; + Math.round(volume * 100.0).toString() + &amp;quot;%&amp;lt;/p&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;    &amp;lt;p&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;      &amp;lt;button onclick='window.location = \&amp;quot;/\&amp;quot;'&amp;gt;Refresh&amp;lt;/button&amp;gt;&amp;lt;br/&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;    &amp;lt;/p&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;  &amp;lt;/body&amp;gt;\n&amp;quot;;&lt;br /&gt;
			html += &amp;quot;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
			return html;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function localhostSocketData(e:ProgressEvent):void&lt;br /&gt;
		{&lt;br /&gt;
			var socket:Socket = e.target as Socket;&lt;br /&gt;
			var msg:String = socket.readUTFBytes(socket.bytesAvailable);&lt;br /&gt;
			&lt;br /&gt;
			var html:String = &amp;quot;&amp;lt;!DOCTYPE html&amp;gt;\n&amp;quot;;&lt;br /&gt;
			&lt;br /&gt;
			trace(socket.remoteAddress + &amp;quot;:&amp;quot; + socket.remotePort + &amp;quot;&amp;lt;&amp;quot; + msg.substr(0, msg.indexOf(&amp;quot;\n&amp;quot;)));&lt;br /&gt;
			&lt;br /&gt;
			// check for http GET /&lt;br /&gt;
			if (msg.substr(0, 11) == &amp;quot;GET /hello &amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				html += &amp;quot;&amp;lt;html&amp;gt;\n&amp;lt;head&amp;gt;\n&amp;lt;title&amp;gt;Hello HTML&amp;lt;/title&amp;gt;\n&amp;lt;/head&amp;gt;\n&amp;lt;body&amp;gt;\n&amp;lt;p&amp;gt;sudoPod API!&amp;lt;/p&amp;gt;\n&amp;lt;/body&amp;gt;\n&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
				socket.writeUTFBytes(html);&lt;br /&gt;
				socket.flush();&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg.substr(0, 6) == &amp;quot;GET / &amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				html += genHTML();&lt;br /&gt;
				&lt;br /&gt;
				socket.writeUTFBytes(html);&lt;br /&gt;
				socket.flush();&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg.substr(0, 11) == &amp;quot;GET /start &amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				startPlayback();&lt;br /&gt;
				&lt;br /&gt;
				html += genHTML();&lt;br /&gt;
				&lt;br /&gt;
				socket.writeUTFBytes(html);&lt;br /&gt;
				socket.flush();&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg.substr(0, 10) == &amp;quot;GET /stop &amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				stopPlayback();&lt;br /&gt;
				&lt;br /&gt;
				html += genHTML();&lt;br /&gt;
				&lt;br /&gt;
				socket.writeUTFBytes(html);&lt;br /&gt;
				socket.flush();&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg.substr(0, 14) == &amp;quot;GET /volumeUp &amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				volume += 0.1;&lt;br /&gt;
				&lt;br /&gt;
				html += genHTML();&lt;br /&gt;
				&lt;br /&gt;
				socket.writeUTFBytes(html);&lt;br /&gt;
				socket.flush();&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg.substr(0, 16) == &amp;quot;GET /volumeDown &amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				volume -= 0.1;&lt;br /&gt;
				&lt;br /&gt;
				html += genHTML();&lt;br /&gt;
				&lt;br /&gt;
				socket.writeUTFBytes(html);&lt;br /&gt;
				socket.flush();&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg.substr(0, 17) == &amp;quot;GET /favicon.ico &amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				// Noisebridge icon (w/counterfit header)&lt;br /&gt;
				var bytes:Array = [0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, &lt;br /&gt;
					0x20, 0x33, 0x30, 0x32, 0x20, 0x46, 0x6f, 0x75, &lt;br /&gt;
					0x6e, 0x64, 0x0d, 0x0a, 0x44, 0x61, 0x74, 0x65, &lt;br /&gt;
					0x3a, 0x20, 0x54, 0x75, 0x65, 0x2c, 0x20, 0x30, &lt;br /&gt;
					0x39, 0x20, 0x41, 0x70, 0x72, 0x20, 0x32, 0x30, &lt;br /&gt;
					0x31, 0x33, 0x20, 0x30, 0x36, 0x3a, 0x30, 0x30, &lt;br /&gt;
					0x3a, 0x33, 0x38, 0x20, 0x47, 0x4d, 0x54, 0x0d, &lt;br /&gt;
					0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, &lt;br /&gt;
					0x20, 0x41, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2f, &lt;br /&gt;
					0x32, 0x2e, 0x32, 0x2e, 0x32, 0x32, 0x20, 0x28, &lt;br /&gt;
					0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x29, 0x0d, &lt;br /&gt;
					0x0a, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, &lt;br /&gt;
					0x6e, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, &lt;br /&gt;
					0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6e, &lt;br /&gt;
					0x6f, 0x69, 0x73, 0x65, 0x62, 0x72, 0x69, 0x64, &lt;br /&gt;
					0x67, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x66, &lt;br /&gt;
					0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, &lt;br /&gt;
					0x63, 0x6f, 0x0d, 0x0a, 0x56, 0x61, 0x72, 0x79, &lt;br /&gt;
					0x3a, 0x20, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, &lt;br /&gt;
					0x2d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, &lt;br /&gt;
					0x67, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, &lt;br /&gt;
					0x6e, 0x74, 0x2d, 0x45, 0x6e, 0x63, 0x6f, 0x64, &lt;br /&gt;
					0x69, 0x6e, 0x67, 0x3a, 0x20, 0x67, 0x7a, 0x69, &lt;br /&gt;
					0x70, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, &lt;br /&gt;
					0x6e, 0x74, 0x2d, 0x4c, 0x65, 0x6e, 0x67, 0x74, &lt;br /&gt;
					0x68, 0x3a, 0x20, 0x31, 0x39, 0x37, 0x0d, 0x0a, &lt;br /&gt;
					0x4b, 0x65, 0x65, 0x70, 0x2d, 0x41, 0x6c, 0x69, &lt;br /&gt;
					0x76, 0x65, 0x3a, 0x20, 0x74, 0x69, 0x6d, 0x65, &lt;br /&gt;
					0x6f, 0x75, 0x74, 0x3d, 0x35, 0x2c, 0x20, 0x6d, &lt;br /&gt;
					0x61, 0x78, 0x3d, 0x31, 0x30, 0x30, 0x0d, 0x0a, &lt;br /&gt;
					0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, &lt;br /&gt;
					0x6f, 0x6e, 0x3a, 0x20, 0x4b, 0x65, 0x65, 0x70, &lt;br /&gt;
					0x2d, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x0d, 0x0a, &lt;br /&gt;
					0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, &lt;br /&gt;
					0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, &lt;br /&gt;
					0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, &lt;br /&gt;
					0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, &lt;br /&gt;
					0x3d, 0x69, 0x73, 0x6f, 0x2d, 0x38, 0x38, 0x35, &lt;br /&gt;
					0x39, 0x2d, 0x31, 0x0d, 0x0a, 0x0d, 0x0a, 0x1f, &lt;br /&gt;
					0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, &lt;br /&gt;
					0x03, 0x2d, 0x8e, 0x3b, 0x0f, 0xc2, 0x30, 0x0c, &lt;br /&gt;
					0x84, 0xf7, 0xfe, 0x0a, 0xd3, 0x9d, 0x98, 0xc7, &lt;br /&gt;
					0x86, 0x4c, 0x06, 0x68, 0x11, 0x48, 0x3c, 0x3a, &lt;br /&gt;
					0x84, 0x81, 0x31, 0x10, 0x43, 0x2a, 0xd1, 0xa4, &lt;br /&gt;
					0x6a, 0xd3, 0x56, 0xfc, 0x7b, 0xda, 0xc2, 0x72, &lt;br /&gt;
					0xb2, 0xef, 0x6c, 0x7d, 0x47, 0x93, 0xe4, 0xb2, &lt;br /&gt;
					0x55, 0xb7, 0x2c, 0x85, 0xbd, 0x3a, 0x1d, 0x21, &lt;br /&gt;
					0xbb, 0x6e, 0x8e, 0x87, 0x2d, 0xc4, 0x53, 0xc4, &lt;br /&gt;
					0x43, 0xaa, 0x76, 0x88, 0x89, 0x4a, 0x7e, 0xc9, &lt;br /&gt;
					0x42, 0xcc, 0x10, 0xd3, 0x73, 0x2c, 0x23, 0xb2, &lt;br /&gt;
					0xa1, 0x78, 0x4b, 0xb2, 0xac, 0x4d, 0xbf, 0x84, &lt;br /&gt;
					0x3c, 0xbc, 0x59, 0x2e, 0x67, 0x0b, 0xd8, 0xf9, &lt;br /&gt;
					0xc6, 0x19, 0xc2, 0x9f, 0x11, 0x11, 0x8e, 0x07, &lt;br /&gt;
					0x74, 0xf7, 0xe6, 0x33, 0xfc, 0xcc, 0xe5, 0x3f, &lt;br /&gt;
					0xef, 0xa7, 0x88, 0x4a, 0xa9, 0x2c, 0x83, 0xf1, &lt;br /&gt;
					0x8f, 0xa6, 0x60, 0x17, 0xc0, 0xea, 0x1a, 0x0a, &lt;br /&gt;
					0xdf, 0xb2, 0x01, 0xd2, 0x60, 0x2b, 0x7e, 0xae, &lt;br /&gt;
					0x63, 0x1b, 0x42, 0x59, 0xaf, 0x10, 0xbb, 0xae, &lt;br /&gt;
					0x13, 0xce, 0xe7, 0x35, 0xdf, 0xab, 0xdc, 0xbc, &lt;br /&gt;
					0x58, 0x38, 0x0e, 0xf8, 0xd4, 0x6d, 0xfe, 0xf0, &lt;br /&gt;
					0x4e, 0xf4, 0x12, 0x4b, 0xcb, 0x15, 0x13, 0x6a, &lt;br /&gt;
					0x29, 0x08, 0xcb, 0x01, 0x3b, 0x02, 0x7b, 0xcc, &lt;br /&gt;
					0x50, 0x32, 0xfa, 0x02, 0x4c, 0x97, 0xdc, 0x16, &lt;br /&gt;
					0xdf, 0x00, 0x00, 0x00];&lt;br /&gt;
				for (var i:int = 0; i &amp;lt; bytes.length; i++)&lt;br /&gt;
				{&lt;br /&gt;
					socket.writeByte(bytes[i]);&lt;br /&gt;
				}&lt;br /&gt;
				socket.flush();&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				closeLocalhostSocket(socket);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function localhostClientClose(e:Event):void&lt;br /&gt;
		{&lt;br /&gt;
			var socket:Socket = e.target as Socket;&lt;br /&gt;
			closeLocalhostSocket(socket);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function localhostIOError(e:IOErrorEvent):void&lt;br /&gt;
		{&lt;br /&gt;
			// TODO: Add error handling and recover&lt;br /&gt;
			trace(&amp;quot;ERROR: &amp;quot; + e.text);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private function localhostClose(e:Event):void&lt;br /&gt;
		{&lt;br /&gt;
			// TODO: Add error handling and recover&lt;br /&gt;
			trace(&amp;quot;localhost Server socket closed.&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thex</name></author>
	</entry>
</feed>