PageRenderTime 27ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/mod3Airway/js/Jplayer.as

https://github.com/davemerwin/orcas-firstaid-animations
ActionScript | 380 lines | 322 code | 35 blank | 23 comment | 46 complexity | a3b65501ef9eb2a8ba1f4d2235702412 MD5 | raw file
  1. /*
  2. * jPlayer Plugin for jQuery JavaScript Library
  3. * http://www.happyworm.com/jquery/jplayer
  4. *
  5. * Copyright (c) 2009 - 2010 Happyworm Ltd
  6. * Dual licensed under the MIT and GPL licenses.
  7. * - http://www.opensource.org/licenses/mit-license.php
  8. * - http://www.gnu.org/copyleft/gpl.html
  9. *
  10. * Author: Mark J Panaghiston
  11. * Version: 2.0.0
  12. * Date: 20th December 2010
  13. *
  14. * FlashVars expected: (AS3 property of: loaderInfo.parameters)
  15. * id: (URL Encoded) Id of jPlayer instance
  16. * vol: (Number) Sets the initial volume
  17. * muted: (Boolean) Sets the initial muted state
  18. *
  19. * Compiled using: Adobe Flash CS4 Professional
  20. * Jplayer.fla
  21. */
  22. package {
  23. import flash.system.Security;
  24. import flash.external.ExternalInterface;
  25. import flash.utils.Timer;
  26. import flash.events.TimerEvent;
  27. import flash.text.TextField;
  28. import flash.text.TextFormat;
  29. import flash.events.KeyboardEvent;
  30. import flash.display.Sprite;
  31. import happyworm.jPlayer.*;
  32. import flash.display.StageAlign;
  33. import flash.display.StageScaleMode;
  34. import flash.events.Event;
  35. public class Jplayer extends Sprite {
  36. private var jQuery:String;
  37. private var sentNumberFractionDigits:uint = 2;
  38. public var commonStatus:JplayerStatus = new JplayerStatus(); // Used for inital ready event so volume is correct.
  39. private var myInitTimer:Timer = new Timer(100, 0);
  40. private var myMp3Player:JplayerMp3;
  41. private var myMp4Player:JplayerMp4;
  42. private var isMp3:Boolean = false;
  43. private var isVideo:Boolean = false;
  44. private var txLog:TextField;
  45. private var debug:Boolean = false; // Set debug to false for release compile!
  46. public function Jplayer() {
  47. flash.system.Security.allowDomain("*");
  48. jQuery = "jQuery('#" + loaderInfo.parameters.id + "').jPlayer";
  49. commonStatus.volume = Number(loaderInfo.parameters.vol);
  50. commonStatus.muted = Boolean(loaderInfo.parameters.muted);
  51. commonStatus.muted = loaderInfo.parameters.muted == "true";
  52. stage.scaleMode = StageScaleMode.NO_SCALE;
  53. stage.align = StageAlign.TOP_LEFT;
  54. stage.addEventListener(Event.RESIZE, resizeHandler);
  55. var initialVolume:Number = commonStatus.volume;
  56. if(commonStatus.muted) {
  57. initialVolume = 0;
  58. }
  59. myMp3Player = new JplayerMp3(initialVolume);
  60. addChild(myMp3Player);
  61. myMp4Player = new JplayerMp4(initialVolume);
  62. addChild(myMp4Player);
  63. setupListeners(!isMp3, isMp3); // Set up the listeners to the default isMp3 state.
  64. // Log console for dev compile option: debug
  65. if(debug) {
  66. txLog = new TextField();
  67. txLog.x = 5;
  68. txLog.y = 5;
  69. txLog.width = 540;
  70. txLog.height = 390;
  71. txLog.border = true;
  72. txLog.background = true;
  73. txLog.backgroundColor = 0xEEEEFF;
  74. txLog.multiline = true;
  75. txLog.text = "jPlayer " + JplayerStatus.VERSION;
  76. txLog.visible = false;
  77. this.addChild(txLog);
  78. this.stage.addEventListener(KeyboardEvent.KEY_UP, keyboardHandler);
  79. myMp3Player.addEventListener(JplayerEvent.DEBUG_MSG, debugMsgHandler);
  80. myMp4Player.addEventListener(JplayerEvent.DEBUG_MSG, debugMsgHandler);
  81. }
  82. // Delay init() because Firefox 3.5.7+ developed a bug with local testing in Firebug.
  83. myInitTimer.addEventListener(TimerEvent.TIMER, init);
  84. myInitTimer.start();
  85. }
  86. private function init(e:TimerEvent):void {
  87. myInitTimer.stop();
  88. if(ExternalInterface.available) {
  89. ExternalInterface.addCallback("fl_setAudio_mp3", fl_setAudio_mp3);
  90. ExternalInterface.addCallback("fl_setAudio_m4a", fl_setAudio_m4a);
  91. ExternalInterface.addCallback("fl_setVideo_m4v", fl_setVideo_m4v);
  92. ExternalInterface.addCallback("fl_clearMedia", fl_clearMedia);
  93. ExternalInterface.addCallback("fl_load", fl_load);
  94. ExternalInterface.addCallback("fl_play", fl_play);
  95. ExternalInterface.addCallback("fl_pause", fl_pause);
  96. ExternalInterface.addCallback("fl_play_head", fl_play_head);
  97. ExternalInterface.addCallback("fl_volume", fl_volume);
  98. ExternalInterface.addCallback("fl_mute", fl_mute);
  99. ExternalInterface.call(jQuery, "jPlayerFlashEvent", JplayerEvent.JPLAYER_READY, extractStatusData(commonStatus)); // See JplayerStatus() class for version number.
  100. }
  101. }
  102. private function setupListeners(oldMP3:Boolean, newMP3:Boolean):void {
  103. if(oldMP3 != newMP3) {
  104. if(newMP3) {
  105. listenToMp3(true);
  106. listenToMp4(false);
  107. } else {
  108. listenToMp3(false);
  109. listenToMp4(true);
  110. }
  111. }
  112. }
  113. private function listenToMp3(active:Boolean):void {
  114. if(active) {
  115. myMp3Player.addEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent);
  116. myMp3Player.addEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent);
  117. myMp3Player.addEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent);
  118. myMp3Player.addEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent);
  119. myMp3Player.addEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent);
  120. myMp3Player.addEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent);
  121. myMp3Player.addEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent);
  122. myMp3Player.addEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent);
  123. myMp3Player.addEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent);
  124. } else {
  125. myMp3Player.removeEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent);
  126. myMp3Player.removeEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent);
  127. myMp3Player.removeEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent);
  128. myMp3Player.removeEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent);
  129. myMp3Player.removeEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent);
  130. myMp3Player.removeEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent);
  131. myMp3Player.removeEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent);
  132. myMp3Player.removeEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent);
  133. myMp3Player.removeEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent);
  134. }
  135. }
  136. private function listenToMp4(active:Boolean):void {
  137. if(active) {
  138. myMp4Player.addEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent);
  139. myMp4Player.addEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent);
  140. myMp4Player.addEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent);
  141. myMp4Player.addEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent);
  142. myMp4Player.addEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent);
  143. myMp4Player.addEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent);
  144. myMp4Player.addEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent);
  145. myMp4Player.addEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent);
  146. myMp4Player.addEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent);
  147. myMp4Player.addEventListener(JplayerEvent.JPLAYER_LOADEDMETADATA, jPlayerMetaDataHandler); // Note the unique handler
  148. } else {
  149. myMp4Player.removeEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent);
  150. myMp4Player.removeEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent);
  151. myMp4Player.removeEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent);
  152. myMp4Player.removeEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent);
  153. myMp4Player.removeEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent);
  154. myMp4Player.removeEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent);
  155. myMp4Player.removeEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent);
  156. myMp4Player.removeEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent);
  157. myMp4Player.removeEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent);
  158. myMp4Player.removeEventListener(JplayerEvent.JPLAYER_LOADEDMETADATA, jPlayerMetaDataHandler); // Note the unique handler
  159. }
  160. }
  161. private function fl_setAudio_mp3(src:String):Boolean {
  162. if (src != null) {
  163. log("fl_setAudio_mp3: "+src);
  164. setupListeners(isMp3, true);
  165. isMp3 = true;
  166. isVideo = false;
  167. myMp4Player.clearFile();
  168. myMp3Player.setFile(src);
  169. return true;
  170. } else {
  171. log("fl_setAudio_mp3: null");
  172. return false;
  173. }
  174. }
  175. private function fl_setAudio_m4a(src:String):Boolean {
  176. if (src != null) {
  177. log("fl_setAudio_m4a: "+src);
  178. setupListeners(isMp3, false);
  179. isMp3 = false;
  180. isVideo = false;
  181. myMp3Player.clearFile();
  182. myMp4Player.setFile(src);
  183. return true;
  184. } else {
  185. log("fl_setAudio_m4a: null");
  186. return false;
  187. }
  188. }
  189. private function fl_setVideo_m4v(src:String):Boolean {
  190. if (src != null) {
  191. log("fl_setVideo_m4v: "+src);
  192. setupListeners(isMp3, false);
  193. isMp3 = false;
  194. isVideo = true;
  195. myMp3Player.clearFile();
  196. myMp4Player.setFile(src);
  197. return true;
  198. } else {
  199. log("fl_setVideo_m4v: null");
  200. return false;
  201. }
  202. }
  203. private function fl_clearMedia():void {
  204. log("clearMedia.");
  205. myMp3Player.clearFile();
  206. myMp4Player.clearFile();
  207. }
  208. private function fl_load():Boolean {
  209. log("load.");
  210. if(isMp3) {
  211. return myMp3Player.load();
  212. } else {
  213. return myMp4Player.load();
  214. }
  215. }
  216. private function fl_play(time:Number = NaN):Boolean {
  217. log("play: time = " + time);
  218. if(isMp3) {
  219. return myMp3Player.play(time * 1000); // Flash uses milliseconds
  220. } else {
  221. return myMp4Player.play(time * 1000); // Flash uses milliseconds
  222. }
  223. }
  224. private function fl_pause(time:Number = NaN):Boolean {
  225. log("pause: time = " + time);
  226. if(isMp3) {
  227. return myMp3Player.pause(time * 1000); // Flash uses milliseconds
  228. } else {
  229. return myMp4Player.pause(time * 1000); // Flash uses milliseconds
  230. }
  231. }
  232. private function fl_play_head(percent:Number):Boolean {
  233. log("play_head: "+percent+"%");
  234. if(isMp3) {
  235. return myMp3Player.playHead(percent);
  236. } else {
  237. return myMp4Player.playHead(percent);
  238. }
  239. }
  240. private function fl_volume(v:Number):void {
  241. log("volume: "+v);
  242. commonStatus.volume = v;
  243. if(!commonStatus.muted) {
  244. myMp3Player.setVolume(v);
  245. myMp4Player.setVolume(v);
  246. }
  247. }
  248. private function fl_mute(mute:Boolean):void {
  249. log("mute: "+mute);
  250. commonStatus.muted = mute;
  251. if(mute) {
  252. myMp3Player.setVolume(0);
  253. myMp4Player.setVolume(0);
  254. } else {
  255. myMp3Player.setVolume(commonStatus.volume);
  256. myMp4Player.setVolume(commonStatus.volume);
  257. }
  258. }
  259. private function jPlayerFlashEvent(e:JplayerEvent):void {
  260. log("jPlayer Flash Event: " + e.type + ": " + e.target);
  261. if(ExternalInterface.available) {
  262. ExternalInterface.call(jQuery, "jPlayerFlashEvent", e.type, extractStatusData(e.data));
  263. }
  264. }
  265. private function extractStatusData(data:JplayerStatus):Object {
  266. var myStatus = {
  267. version: JplayerStatus.VERSION,
  268. src: data.src,
  269. paused: !data.isPlaying, // Changing this name requires inverting all assignments and conditional statements.
  270. srcSet: data.srcSet,
  271. seekPercent: data.seekPercent,
  272. currentPercentRelative: data.currentPercentRelative,
  273. currentPercentAbsolute: data.currentPercentAbsolute,
  274. currentTime: data.currentTime / 1000, // JavaScript uses seconds
  275. duration: data.duration / 1000, // JavaScript uses seconds
  276. volume: commonStatus.volume,
  277. muted: commonStatus.muted
  278. };
  279. log("extractStatusData: sp="+myStatus.seekPercent+" cpr="+myStatus.currentPercentRelative+" cpa="+myStatus.currentPercentAbsolute+" ct="+myStatus.currentTime+" d="+myStatus.duration);
  280. return myStatus;
  281. }
  282. private function jPlayerMetaDataHandler(e:JplayerEvent):void {
  283. log("jPlayerMetaDataHandler:" + e.target);
  284. if(ExternalInterface.available) {
  285. resizeHandler(new Event(Event.RESIZE));
  286. ExternalInterface.call(jQuery, "jPlayerFlashEvent", e.type, extractStatusData(e.data));
  287. }
  288. }
  289. private function resizeHandler(e:Event):void {
  290. log("resizeHandler: stageWidth = " + stage.stageWidth + " | stageHeight = " + stage.stageHeight);
  291. var mediaX:Number = 0;
  292. var mediaY:Number = 0;
  293. var mediaWidth:Number = 0;
  294. var mediaHeight:Number = 0;
  295. if(stage.stageWidth > 0 && stage.stageHeight > 0 && myMp4Player.myVideo.width > 0 && myMp4Player.myVideo.height > 0) {
  296. var aspectRatioStage:Number = stage.stageWidth / stage.stageHeight;
  297. var aspectRatioVideo:Number = myMp4Player.myVideo.width / myMp4Player.myVideo.height;
  298. if(aspectRatioStage < aspectRatioVideo) {
  299. mediaWidth = stage.stageWidth;
  300. mediaHeight = stage.stageWidth / aspectRatioVideo;
  301. mediaX = 0;
  302. mediaY = (stage.stageHeight - mediaHeight) / 2;
  303. } else {
  304. mediaWidth = stage.stageHeight * aspectRatioVideo;
  305. mediaHeight = stage.stageHeight;
  306. mediaX = (stage.stageWidth - mediaWidth) / 2;
  307. mediaY = 0;
  308. }
  309. resizeEntity(myMp4Player, mediaX, mediaY, mediaWidth, mediaHeight);
  310. }
  311. if(debug && stage.stageWidth > 20 && stage.stageHeight > 20) {
  312. txLog.width = stage.stageWidth - 10;
  313. txLog.height = stage.stageHeight - 10;
  314. }
  315. }
  316. private function resizeEntity(entity:Sprite, mediaX:Number, mediaY:Number, mediaWidth:Number, mediaHeight:Number):void {
  317. entity.x = mediaX;
  318. entity.y = mediaY;
  319. entity.width = mediaWidth;
  320. entity.height = mediaHeight;
  321. }
  322. private function log(t):void {
  323. if(debug) {
  324. txLog.text = t + "\n" + txLog.text;
  325. }
  326. }
  327. private function debugMsgHandler(e:JplayerEvent):void {
  328. log(e.msg);
  329. }
  330. private function keyboardHandler(e:KeyboardEvent):void {
  331. log("keyboardHandler: e.keyCode = " + e.keyCode);
  332. switch(e.keyCode) {
  333. case 68 : // d
  334. txLog.visible = !txLog.visible;
  335. log("Toggled log display: " + txLog.visible);
  336. break;
  337. case 76 : // l
  338. if(e.ctrlKey && e.shiftKey) {
  339. txLog.text = "Cleared log.";
  340. }
  341. break;
  342. }
  343. }
  344. }
  345. }