flexPartyPlayer 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +6 -0
- data/README +45 -0
- data/lib/corelib-08.30.2007.swc +0 -0
- data/lib/flexPartyPlayer.rb +42 -0
- data/lib/flexunit-08.30.2007.swc +0 -0
- data/sample.json +1 -0
- data/script/destroy +14 -0
- data/script/flex_compile +2 -0
- data/script/generate +14 -0
- data/src/FlexPlayer.mxml +34 -0
- data/src/assets/app_icons/icon_128.png +0 -0
- data/src/cc/varga/mvc/ApplicationContext.as +120 -0
- data/src/cc/varga/mvc/commands/data/LoadArtistDataCommand.as +61 -0
- data/src/cc/varga/mvc/commands/playlist/AddItemToPlaylist.as +13 -0
- data/src/cc/varga/mvc/commands/playlist/LoadPlaylistCommand.as +109 -0
- data/src/cc/varga/mvc/commands/system/DrawPlaylist.as +40 -0
- data/src/cc/varga/mvc/commands/system/Shutdown.as +51 -0
- data/src/cc/varga/mvc/commands/system/Startup.as +57 -0
- data/src/cc/varga/mvc/commands/video/AddVideoCommand.as +55 -0
- data/src/cc/varga/mvc/events/appBar/AppBarEvent.as +16 -0
- data/src/cc/varga/mvc/events/blipfm/feedloader/FeedLoaderEvent.as +17 -0
- data/src/cc/varga/mvc/events/controllers/ControllersEvent.as +59 -0
- data/src/cc/varga/mvc/events/menu/MenuEvent.as +13 -0
- data/src/cc/varga/mvc/events/player/PlayerEvent.as +29 -0
- data/src/cc/varga/mvc/events/playlist/PlaylistEvent.as +16 -0
- data/src/cc/varga/mvc/events/playlist/PlaylistURLEvent.as +57 -0
- data/src/cc/varga/mvc/events/playlist/controller/PlaylistControllerEvent.as +59 -0
- data/src/cc/varga/mvc/events/search/SearchEvent.as +17 -0
- data/src/cc/varga/mvc/events/serveradmin/ServerAdminEvent.as +15 -0
- data/src/cc/varga/mvc/events/sound/SoundEvent.as +16 -0
- data/src/cc/varga/mvc/events/system/SystemEvent.as +24 -0
- data/src/cc/varga/mvc/models/data/AppDataModel.as +17 -0
- data/src/cc/varga/mvc/models/player/PlayerModel.as +76 -0
- data/src/cc/varga/mvc/models/playlist/PlaylistModel.as +118 -0
- data/src/cc/varga/mvc/models/sound/ISound.as +12 -0
- data/src/cc/varga/mvc/models/sound/SoundModel.as +284 -0
- data/src/cc/varga/mvc/models/sound/SoundModelPlayer.as +8 -0
- data/src/cc/varga/mvc/services/KeyboardControl.as +60 -0
- data/src/cc/varga/mvc/views/blipfm/feedloader/FeedLoader.mxml +34 -0
- data/src/cc/varga/mvc/views/blipfm/feedloader/FeedLoaderMediator.as +68 -0
- data/src/cc/varga/mvc/views/controllers/Controllers.mxml +36 -0
- data/src/cc/varga/mvc/views/controllers/ControllersMediator.as +107 -0
- data/src/cc/varga/mvc/views/infoDisplay/InfoDisplay.mxml +20 -0
- data/src/cc/varga/mvc/views/infoDisplay/InfoDisplayMediator.as +51 -0
- data/src/cc/varga/mvc/views/menu/Menu.mxml +28 -0
- data/src/cc/varga/mvc/views/menu/MenuMediator.as +30 -0
- data/src/cc/varga/mvc/views/player/PlayerItem.mxml +11 -0
- data/src/cc/varga/mvc/views/player/PlayerWindow.mxml +73 -0
- data/src/cc/varga/mvc/views/player/PlayerWindowMediator.as +136 -0
- data/src/cc/varga/mvc/views/playlist/Playlist.mxml +22 -0
- data/src/cc/varga/mvc/views/playlist/PlaylistMediator.as +117 -0
- data/src/cc/varga/mvc/views/playlist/PlaylistStates.as +10 -0
- data/src/cc/varga/mvc/views/playlistItem/PlaylistItem.mxml +94 -0
- data/src/cc/varga/mvc/views/playlistItem/PlaylistItemMediator.as +87 -0
- data/src/cc/varga/mvc/views/playlistManager/PlaylistManager.mxml +7 -0
- data/src/cc/varga/mvc/views/playlistManager/PlaylistManagerMediator.as +15 -0
- data/src/cc/varga/mvc/views/playlisturl/PlaylistURL.mxml +41 -0
- data/src/cc/varga/mvc/views/playlisturl/PlaylistURLMediator.as +87 -0
- data/src/cc/varga/mvc/views/playlisturl/controller/PlaylistController.mxml +37 -0
- data/src/cc/varga/mvc/views/playlisturl/controller/PlaylistControllerMediator.as +79 -0
- data/src/cc/varga/mvc/views/search/Search.mxml +26 -0
- data/src/cc/varga/mvc/views/search/SearchMediator.as +31 -0
- data/src/cc/varga/mvc/views/server/administration/ServerAdmin.mxml +26 -0
- data/src/cc/varga/mvc/views/server/administration/ServerAdminMediator.as +51 -0
- data/src/cc/varga/mvc/views/visualisation/Visualisation.mxml +8 -0
- data/src/cc/varga/mvc/views/visualisation/VisualisationMediator.as +51 -0
- data/src/cc/varga/utils/URLHelper.as +52 -0
- data/src/cc/varga/utils/logging/Logger.as +94 -0
- data/src/com/automatastudios/audio/audiodecoder/AudioDecoder.as +84 -0
- data/src/com/automatastudios/audio/audiodecoder/decoders/AudioInfo.as +52 -0
- data/src/com/automatastudios/audio/audiodecoder/decoders/IDecoder.as +13 -0
- data/src/com/automatastudios/audio/audiodecoder/decoders/OggVorbisDecoder.as +221 -0
- data/src/com/automatastudios/audio/audiodecoder/decoders/WAVDecoder.as +325 -0
- data/src/com/automatastudios/audio/audiodecoder/events/AudioDecoderEvent.as +13 -0
- data/src/com/automatastudios/data/riff/RIFFChunkInfo.as +6 -0
- data/src/com/automatastudios/data/riff/RIFFParser.as +175 -0
- data/src/libs/appinf/appinf.json +0 -0
- data/src/libs/appinf/config.json +0 -0
- data/src/libs/appinf/sample.json +1 -0
- data/src/libs/appinf/server.json +0 -0
- data/src/nl/flexcoders/controls/YouTubePlayer.as +317 -0
- data/test/Test-app.xml +40 -0
- data/test/Test.mxml +35 -0
- data/views/jukebox.haml +30 -0
- metadata +157 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
2
|
+
//
|
|
3
|
+
//Authors: Franics Varga
|
|
4
|
+
//eMail: fv@varga-multimedia.com
|
|
5
|
+
//homepage: http://www.varga-multimedia.com
|
|
6
|
+
//
|
|
7
|
+
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
8
|
+
//<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/'>Creative Commons License<a\>
|
|
9
|
+
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
10
|
+
//
|
|
11
|
+
//You are free:
|
|
12
|
+
//
|
|
13
|
+
//to Share — to copy, distribute and transmit the work
|
|
14
|
+
//to Remix — to adapt the work
|
|
15
|
+
//Under the following conditions:
|
|
16
|
+
//
|
|
17
|
+
//Attribution — You must attribute the work in the manner specified by the author or licensor
|
|
18
|
+
//(but not in any way that suggests that they endorse you or your use of the work).
|
|
19
|
+
//
|
|
20
|
+
//Noncommercial — You may not use this work for commercial purposes.
|
|
21
|
+
//
|
|
22
|
+
//Share Alike — If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.
|
|
23
|
+
//
|
|
24
|
+
//With the understanding that:
|
|
25
|
+
//
|
|
26
|
+
//Waiver — Any of the above conditions can be waived if you get permission from the copyright holder.
|
|
27
|
+
//Public Domain — Where the work or any of its elements is in the public domain under applicable law, that status is in no way affected by the license.
|
|
28
|
+
//Other Rights — In no way are any of the following rights affected by the license:
|
|
29
|
+
//
|
|
30
|
+
//Your fair dealing or fair use rights, or other applicable copyright exceptions and limitations; The author's moral rights;
|
|
31
|
+
//
|
|
32
|
+
//Rights other persons may have either in the work itself or in how the work is used, such as publicity or privacy rights.
|
|
33
|
+
//Notice — For any reuse or distribution, you must make clear to others the license terms of this work.
|
|
34
|
+
//The best way to do this is with a link to this web page.
|
|
35
|
+
//
|
|
36
|
+
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
37
|
+
package cc.varga.utils
|
|
38
|
+
{
|
|
39
|
+
public class URLHelper
|
|
40
|
+
{
|
|
41
|
+
public function URLHelper()
|
|
42
|
+
{
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public static function getFileURL(host:String, docID:String):String{
|
|
46
|
+
return host + "" + docID;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public function toString():String{ return "cc.varga.utils.logging.URLHelper"}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
2
|
+
//
|
|
3
|
+
//Authors: Franics Varga
|
|
4
|
+
//eMail: fv@varga-multimedia.com
|
|
5
|
+
//homepage: http://www.varga-multimedia.com
|
|
6
|
+
//
|
|
7
|
+
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
8
|
+
//<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/'>Creative Commons License<a\>
|
|
9
|
+
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
10
|
+
//
|
|
11
|
+
//You are free:
|
|
12
|
+
//
|
|
13
|
+
//to Share — to copy, distribute and transmit the work
|
|
14
|
+
//to Remix — to adapt the work
|
|
15
|
+
//Under the following conditions:
|
|
16
|
+
//
|
|
17
|
+
//Attribution — You must attribute the work in the manner specified by the author or licensor
|
|
18
|
+
//(but not in any way that suggests that they endorse you or your use of the work).
|
|
19
|
+
//
|
|
20
|
+
//Noncommercial — You may not use this work for commercial purposes.
|
|
21
|
+
//
|
|
22
|
+
//Share Alike — If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.
|
|
23
|
+
//
|
|
24
|
+
//With the understanding that:
|
|
25
|
+
//
|
|
26
|
+
//Waiver — Any of the above conditions can be waived if you get permission from the copyright holder.
|
|
27
|
+
//Public Domain — Where the work or any of its elements is in the public domain under applicable law, that status is in no way affected by the license.
|
|
28
|
+
//Other Rights — In no way are any of the following rights affected by the license:
|
|
29
|
+
//
|
|
30
|
+
//Your fair dealing or fair use rights, or other applicable copyright exceptions and limitations; The author's moral rights;
|
|
31
|
+
//
|
|
32
|
+
//Rights other persons may have either in the work itself or in how the work is used, such as publicity or privacy rights.
|
|
33
|
+
//Notice — For any reuse or distribution, you must make clear to others the license terms of this work.
|
|
34
|
+
//The best way to do this is with a link to this web page.
|
|
35
|
+
//
|
|
36
|
+
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
37
|
+
package cc.varga.utils.logging
|
|
38
|
+
{
|
|
39
|
+
// import flash.filesystem.File;
|
|
40
|
+
// import flash.filesystem.FileMode;
|
|
41
|
+
// import flash.filesystem.FileStream;
|
|
42
|
+
import cc.varga.mvc.ApplicationContext;
|
|
43
|
+
|
|
44
|
+
import flash.utils.getTimer;
|
|
45
|
+
|
|
46
|
+
public class Logger
|
|
47
|
+
{
|
|
48
|
+
|
|
49
|
+
private static var traceingStr : String = "";
|
|
50
|
+
//private static var tracingFile : File = new File(File.applicationDirectory.resolvePath("libs/logs/trace.log").toString());
|
|
51
|
+
|
|
52
|
+
private static var errorStr : String = "";
|
|
53
|
+
//private static var errorFile : File = new File(File.applicationDirectory.resolvePath("libs/logs/error.log").toString());
|
|
54
|
+
|
|
55
|
+
private static var debugStr : String = "";
|
|
56
|
+
//private static var debugFile : File = new File(File.applicationDirectory.resolvePath("libs/logs/debug.log").toString());
|
|
57
|
+
|
|
58
|
+
public function Logger(){}
|
|
59
|
+
|
|
60
|
+
public static function tracing(message:String, classpath : String):void{
|
|
61
|
+
traceingStr = "["+getTimer()+"].[TRACING].["+classpath+"] --> " + message;
|
|
62
|
+
trace(traceingStr);
|
|
63
|
+
(ApplicationContext.INSTANCE.contextView as FlexPlayer).debug.text += traceingStr + "\n";
|
|
64
|
+
//writeToFile(tracingFile, traceingStr);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public static function errorTracing(message:String, classpath : String):void{
|
|
68
|
+
errorStr = "["+getTimer()+"].[ERROR].["+classpath+"]--> " + message;
|
|
69
|
+
trace(errorStr);
|
|
70
|
+
(ApplicationContext.INSTANCE.contextView as FlexPlayer).debug.text += traceingStr + "\n";
|
|
71
|
+
//writeToFile(errorFile, errorStr);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public static function debugTracing(message:String, classpath : String):void{
|
|
75
|
+
debugStr= "["+getTimer()+"].[DEBUG].["+classpath+"]--> " + message;
|
|
76
|
+
trace(debugStr);
|
|
77
|
+
(ApplicationContext.INSTANCE.contextView as FlexPlayer).debug.text += traceingStr + "\n";
|
|
78
|
+
//writeToFile(debugFile, debugStr);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/*
|
|
82
|
+
private static function writeToFile(type:File, message:String):void{
|
|
83
|
+
|
|
84
|
+
var fileStream : FileStream = new FileStream();
|
|
85
|
+
fileStream.openAsync(type, FileMode.WRITE);
|
|
86
|
+
fileStream.writeUTFBytes(message);
|
|
87
|
+
fileStream.close();
|
|
88
|
+
|
|
89
|
+
}
|
|
90
|
+
*/
|
|
91
|
+
public function toString():String{ return "cc.varga.utils.logging.Logger"}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
package com.automatastudios.audio.audiodecoder {
|
|
2
|
+
import com.automatastudios.audio.audiodecoder.decoders.AudioInfo;
|
|
3
|
+
import com.automatastudios.audio.audiodecoder.decoders.IDecoder;
|
|
4
|
+
|
|
5
|
+
import flash.events.EventDispatcher;
|
|
6
|
+
import flash.events.Event;
|
|
7
|
+
import flash.events.IOErrorEvent;
|
|
8
|
+
import flash.events.ProgressEvent;
|
|
9
|
+
import flash.errors.EOFError;
|
|
10
|
+
import flash.net.URLStream;
|
|
11
|
+
import flash.utils.ByteArray;
|
|
12
|
+
import flash.utils.Endian;
|
|
13
|
+
import flash.utils.IDataInput;
|
|
14
|
+
import flash.media.Sound;
|
|
15
|
+
import flash.media.SoundChannel;
|
|
16
|
+
import flash.net.Socket;
|
|
17
|
+
|
|
18
|
+
public class AudioDecoder extends EventDispatcher {
|
|
19
|
+
private var _decoder:IDecoder;
|
|
20
|
+
private var _sound:Sound;
|
|
21
|
+
private var _soundChannel:SoundChannel;
|
|
22
|
+
|
|
23
|
+
public function AudioDecoder():void {
|
|
24
|
+
_sound = new Sound();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public function load(data:IDataInput, decoder:Class, bufferSize:uint = 1000, progressEventName:String = null):void {
|
|
28
|
+
if (progressEventName == null) {
|
|
29
|
+
if (data is URLStream) {
|
|
30
|
+
progressEventName = ProgressEvent.PROGRESS;
|
|
31
|
+
} else if (data is Socket) {
|
|
32
|
+
progressEventName = ProgressEvent.SOCKET_DATA;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
_sound.addEventListener("sampleData", onSamplesRequest);
|
|
37
|
+
|
|
38
|
+
_decoder = (new decoder() as IDecoder);
|
|
39
|
+
_decoder.addEventListener(Event.INIT, onDecoderInit);
|
|
40
|
+
_decoder.addEventListener(Event.COMPLETE, onDecoderComplete);
|
|
41
|
+
_decoder.addEventListener(IOErrorEvent.IO_ERROR, onDecoderIOError);
|
|
42
|
+
|
|
43
|
+
_decoder.init(data, bufferSize, progressEventName);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public function play():SoundChannel {
|
|
47
|
+
_soundChannel = _sound.play();
|
|
48
|
+
return _soundChannel;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public function get sound():Sound {
|
|
52
|
+
return _sound;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public function get audioInfo():AudioInfo {
|
|
56
|
+
return _decoder.getAudioInfo();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public function getTotalTime():Number {
|
|
60
|
+
return _decoder.getTotalTime();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public function getPosition():Number {
|
|
64
|
+
return _decoder.getPosition();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
private function onDecoderInit(event:Event):void {
|
|
68
|
+
dispatchEvent(event);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
private function onDecoderComplete(event:Event):void {
|
|
72
|
+
dispatchEvent(event);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
private function onDecoderIOError(event:IOErrorEvent):void {
|
|
76
|
+
dispatchEvent(event);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
private function onSamplesRequest(event:*):void {
|
|
80
|
+
_decoder.getSamples(event.position, 4096, event.data);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
package com.automatastudios.audio.audiodecoder.decoders {
|
|
2
|
+
public class AudioInfo {
|
|
3
|
+
|
|
4
|
+
public var decoder:String;
|
|
5
|
+
public var format:String;
|
|
6
|
+
public var channels:uint;
|
|
7
|
+
public var sampleRate:uint;
|
|
8
|
+
public var bitRateUpper:uint;
|
|
9
|
+
public var bitRateLower:uint;
|
|
10
|
+
public var bitRateNominal:uint;
|
|
11
|
+
public var blockAlign:uint;
|
|
12
|
+
public var bitsPerSample:uint;
|
|
13
|
+
public var sampleMultiplier:uint;
|
|
14
|
+
public var commentList:Array;
|
|
15
|
+
public var commentTable:Object;
|
|
16
|
+
|
|
17
|
+
public function AudioInfo():void {
|
|
18
|
+
commentList = new Array();
|
|
19
|
+
commentTable = new Object();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public function toString():String {
|
|
23
|
+
var result:String = "";
|
|
24
|
+
var i:uint;
|
|
25
|
+
var p:String;
|
|
26
|
+
var max:uint = commentList.length;
|
|
27
|
+
|
|
28
|
+
result += "decoder: " + decoder + "\n";
|
|
29
|
+
result += "format: " + format + "\n";
|
|
30
|
+
result += "channels: " + channels + "\n";
|
|
31
|
+
result += "sampleRate: " + sampleRate + "\n";
|
|
32
|
+
result += "bitRateUpper: " + bitRateUpper + "\n";
|
|
33
|
+
result += "bitRateLower: " + bitRateLower + "\n";
|
|
34
|
+
result += "bitRateNominal: " + bitRateNominal + "\n";
|
|
35
|
+
result += "blockAlign: " + blockAlign + "\n";
|
|
36
|
+
result += "bitsPerSample: " + bitsPerSample + "\n";
|
|
37
|
+
result += "sampleMultiplier: " + sampleMultiplier + "\n";
|
|
38
|
+
|
|
39
|
+
result += "commentList: \n";
|
|
40
|
+
for (i=0; i<max; ++i) {
|
|
41
|
+
result += "\t" + i + ": " + commentList[i] + "\n";
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
result += "commentTable: \n";
|
|
45
|
+
for (p in commentTable) {
|
|
46
|
+
result += "\t" + p + ": " + commentTable[p] + "\n";
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
package com.automatastudios.audio.audiodecoder.decoders {
|
|
2
|
+
import flash.events.IEventDispatcher;
|
|
3
|
+
import flash.utils.IDataInput;
|
|
4
|
+
import flash.utils.ByteArray;
|
|
5
|
+
|
|
6
|
+
public interface IDecoder extends IEventDispatcher {
|
|
7
|
+
function init(data:IDataInput, buffer:uint, progressEventName:String):void;
|
|
8
|
+
function getSamples(position:Number, numSamples:uint, sampleData:ByteArray):void;
|
|
9
|
+
function getAudioInfo():AudioInfo;
|
|
10
|
+
function getTotalTime():Number;
|
|
11
|
+
function getPosition():Number;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
package com.automatastudios.audio.audiodecoder.decoders {
|
|
2
|
+
import cmodule.oggvorbis.CLibInit;
|
|
3
|
+
|
|
4
|
+
import flash.errors.EOFError;
|
|
5
|
+
import flash.events.EventDispatcher;
|
|
6
|
+
import flash.events.Event;
|
|
7
|
+
import flash.events.IOErrorEvent;
|
|
8
|
+
import flash.events.ProgressEvent;
|
|
9
|
+
import flash.errors.EOFError;
|
|
10
|
+
import flash.net.URLStream;
|
|
11
|
+
import flash.utils.ByteArray;
|
|
12
|
+
import flash.utils.Endian;
|
|
13
|
+
import flash.utils.IDataInput;
|
|
14
|
+
|
|
15
|
+
public class OggVorbisDecoder extends EventDispatcher implements IDecoder{
|
|
16
|
+
private static const READ_ERROR:int = -128;
|
|
17
|
+
private static const READ_NOT_VORBIS:int = -132;
|
|
18
|
+
private static const READ_VERSION:int = -134;
|
|
19
|
+
private static const READ_BAD_HEADER:int = -133;
|
|
20
|
+
private static const READ_FAULT:int = -129;
|
|
21
|
+
|
|
22
|
+
private static var decoder:*;
|
|
23
|
+
private var _rawData:IDataInput;
|
|
24
|
+
private var _data:ByteArray;
|
|
25
|
+
private var _bufferSize:uint;
|
|
26
|
+
private var _vorbisFileId:int;
|
|
27
|
+
|
|
28
|
+
private var _position:uint
|
|
29
|
+
private var _bytesTotal:uint;
|
|
30
|
+
|
|
31
|
+
private var _audioInfo:AudioInfo;
|
|
32
|
+
private var _convertMethod:Function;
|
|
33
|
+
|
|
34
|
+
private var _nextMethod:Function;
|
|
35
|
+
|
|
36
|
+
public function OggVorbisDecoder():void {
|
|
37
|
+
// do nothing, wait for init
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public function init(data:IDataInput, bufferSize:uint, progressEventName:String):void {
|
|
41
|
+
var libInit:CLibInit;
|
|
42
|
+
|
|
43
|
+
_nextMethod = setupDecoder;
|
|
44
|
+
|
|
45
|
+
_rawData = data;
|
|
46
|
+
_data = new ByteArray();
|
|
47
|
+
_bufferSize = bufferSize;
|
|
48
|
+
|
|
49
|
+
if (decoder == null) {
|
|
50
|
+
libInit = new CLibInit();
|
|
51
|
+
decoder = libInit.init();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
if (_rawData is ByteArray) {
|
|
56
|
+
_bytesTotal = (_rawData as ByteArray).length;
|
|
57
|
+
_data.length = _bytesTotal;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (progressEventName != null) {
|
|
61
|
+
(data as EventDispatcher).addEventListener(progressEventName, onDataProgress);
|
|
62
|
+
} else {
|
|
63
|
+
_nextMethod();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public function getSamples(position:Number, numSamples:uint, sampleData:ByteArray):void {
|
|
68
|
+
var numBytes:uint = numSamples * _audioInfo.blockAlign / _audioInfo.sampleMultiplier;
|
|
69
|
+
var dataReadSize:int;
|
|
70
|
+
var sampleReadSize:int;
|
|
71
|
+
var rawSampleData:ByteArray = new ByteArray();
|
|
72
|
+
var i:uint;
|
|
73
|
+
|
|
74
|
+
rawSampleData.endian = Endian.LITTLE_ENDIAN;
|
|
75
|
+
|
|
76
|
+
dataReadSize = decoder.getSampleData(_vorbisFileId, numBytes, rawSampleData);
|
|
77
|
+
|
|
78
|
+
sampleReadSize = dataReadSize/_audioInfo.blockAlign;
|
|
79
|
+
|
|
80
|
+
if (dataReadSize == -1) {
|
|
81
|
+
dispatchEvent(new Event(Event.COMPLETE));
|
|
82
|
+
} else {
|
|
83
|
+
_position += dataReadSize;
|
|
84
|
+
rawSampleData.position = 0;
|
|
85
|
+
|
|
86
|
+
_convertMethod(sampleReadSize, rawSampleData, sampleData);
|
|
87
|
+
// pad with extra 0s as needed
|
|
88
|
+
for (i=sampleReadSize * _audioInfo.sampleMultiplier; i<numSamples; ++i) {
|
|
89
|
+
sampleData.writeFloat(0);
|
|
90
|
+
sampleData.writeFloat(0);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
public function getAudioInfo():AudioInfo {
|
|
96
|
+
return _audioInfo;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
public function getTotalTime():Number {
|
|
100
|
+
return decoder.getLength(_vorbisFileId);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
public function getPosition():Number {
|
|
104
|
+
return decoder.getPosition(_vorbisFileId);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private function onDataProgress(event:ProgressEvent):void {
|
|
108
|
+
var size:uint
|
|
109
|
+
|
|
110
|
+
// need to move the data into a proper ByteArray
|
|
111
|
+
// FlaCC only works with ByteArrays at this timessss
|
|
112
|
+
_rawData.readBytes(_data, _data.length, _rawData.bytesAvailable);
|
|
113
|
+
|
|
114
|
+
_bytesTotal = event.bytesTotal;
|
|
115
|
+
|
|
116
|
+
_position += size;
|
|
117
|
+
|
|
118
|
+
if (_nextMethod != null) {
|
|
119
|
+
if (_bytesTotal > 0 && _data.bytesAvailable >= _bufferSize || _data.length == _bytesTotal) {
|
|
120
|
+
|
|
121
|
+
_nextMethod();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private function setupDecoder():void {
|
|
127
|
+
var result:int
|
|
128
|
+
|
|
129
|
+
result = decoder.setupDecoder(_data, _bytesTotal);
|
|
130
|
+
|
|
131
|
+
if (result > 0) {
|
|
132
|
+
_vorbisFileId = result;
|
|
133
|
+
_nextMethod = getHeaders;
|
|
134
|
+
_nextMethod();
|
|
135
|
+
} else {
|
|
136
|
+
_nextMethod = null;
|
|
137
|
+
dispatchEvent(new IOErrorEvent(IOErrorEvent.IO_ERROR, false, false, "Bad audio format"));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
private function getHeaders():void {
|
|
142
|
+
var infoObj:Object = decoder.getHeader(_vorbisFileId);
|
|
143
|
+
var p:String;
|
|
144
|
+
var i:uint;
|
|
145
|
+
var max:uint = infoObj.commentList.length;
|
|
146
|
+
var comment:String;
|
|
147
|
+
var equalIndex:int;
|
|
148
|
+
|
|
149
|
+
_audioInfo = new AudioInfo();
|
|
150
|
+
_audioInfo.decoder = "com.automatastudios.audio.audiodecoder.decoders.OggVorbisDecoder";
|
|
151
|
+
_audioInfo.format = "PCM";
|
|
152
|
+
_audioInfo.channels = infoObj.channels;
|
|
153
|
+
_audioInfo.sampleRate = infoObj.sampleRate;
|
|
154
|
+
_audioInfo.sampleMultiplier = 44100 / infoObj.sampleRate;
|
|
155
|
+
_audioInfo.bitRateUpper = infoObj.bitRateUpper;
|
|
156
|
+
_audioInfo.bitRateLower = infoObj.bitRateLower;
|
|
157
|
+
_audioInfo.bitRateNominal = infoObj.bitRateNominal;
|
|
158
|
+
_audioInfo.bitsPerSample = 16;
|
|
159
|
+
|
|
160
|
+
for (i=0; i<max; ++i) {
|
|
161
|
+
comment = infoObj.commentList[i];
|
|
162
|
+
_audioInfo.commentList.push(comment);
|
|
163
|
+
|
|
164
|
+
equalIndex = comment.indexOf("=");
|
|
165
|
+
if (equalIndex > -1) {
|
|
166
|
+
_audioInfo.commentTable[comment.substring(0, equalIndex)] = comment.substring(equalIndex + 1);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// hardcode 2 bytes-per-sample
|
|
171
|
+
_audioInfo.blockAlign = _audioInfo.channels * 2;
|
|
172
|
+
|
|
173
|
+
_nextMethod = null;
|
|
174
|
+
|
|
175
|
+
if (_audioInfo.sampleRate != 44100 && _audioInfo.sampleRate != 22050 && _audioInfo.sampleRate != 11025) {
|
|
176
|
+
dispatchEvent(new IOErrorEvent(IOErrorEvent.IO_ERROR, false, false, "Bad sample rate"));
|
|
177
|
+
} else {
|
|
178
|
+
|
|
179
|
+
if (_audioInfo.channels == 1) {
|
|
180
|
+
_convertMethod = convertMono;
|
|
181
|
+
} else {
|
|
182
|
+
_convertMethod = convertStereo;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
dispatchEvent(new Event(Event.INIT));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
private function convertMono(numSamples:uint, inputData:ByteArray, outputData:ByteArray):void {
|
|
190
|
+
var i:uint;
|
|
191
|
+
var j:uint;
|
|
192
|
+
var sample:Number;
|
|
193
|
+
|
|
194
|
+
for (i=0; i<numSamples; ++i) {
|
|
195
|
+
sample = inputData.readShort() / 32767;
|
|
196
|
+
for (j=0; j< _audioInfo.sampleMultiplier; ++j) {
|
|
197
|
+
outputData.writeFloat(sample);
|
|
198
|
+
outputData.writeFloat(sample);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
private function convertStereo(numSamples:uint, inputData:ByteArray, outputData:ByteArray):void {
|
|
204
|
+
var i:uint;
|
|
205
|
+
var j:uint;
|
|
206
|
+
var sample:Number;
|
|
207
|
+
|
|
208
|
+
for (i=0; i<numSamples; ++i) {
|
|
209
|
+
sample = inputData.readShort() / 32767;
|
|
210
|
+
for (j=0; j< _audioInfo.sampleMultiplier; ++j) {
|
|
211
|
+
outputData.writeFloat(sample);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
sample = inputData.readShort() / 32767;
|
|
215
|
+
for (j=0; j< _audioInfo.sampleMultiplier; ++j) {
|
|
216
|
+
outputData.writeFloat(sample);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|