var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; ///<reference path="../../base/BaseClass.ts" /> ///<reference path="../MediaTracker.ts" /> ///<reference path="../IMediaTrackerConfigOptions.ts" /> ///<reference path="../../debug.ts" /> ///<reference path="../../util/DomHelper.ts" /> var econda; (function (econda) { var media; (function (media) { var helper; (function (helper) { var DomHelper = econda.util.DomHelper; var MediaTracker = econda.media.MediaTracker; /** * Helper to setup trackig for html5 audio tag based media playback. * * <h3>Example</h3> * <!-- Our audio --> * <audio id="audioTagId" * controls="controls"> * <source src="./media-files/music/music.mp3"/> * <p>Your Browser does not support the html audio tag.</p> * </audio> * * <!-- setup econda audio tracking --> * <script type="text/javascript"> * * // enable debug output * econda.debug.setEnabled(true); * * // Setup player tracker * var trackingHelper = new econda.media.helper.HtmlAudioTracker({ * player: document.getElementById("audioTagId"), * tracker: {content: "HTML5 Example audio"} * }); * * </script> * * @class econda.media.helper.HtmlAudioTracker * @extends econda.base.BaseClass * @param {Object} cfg Configuration options */ var HtmlAudioTracker = (function (_super) { __extends(HtmlAudioTracker, _super); function HtmlAudioTracker(cfg) { _super.call(this); /** * @cfg {econda.media.MediaTracker/Object} tracker Reference to tracker object or config options for a new tracker object. */ this.tracker = null; /** * @cfg {Object} player Reference to html audio element * @accessor */ this.player = null; // @private this.__defaultProperty = "player"; /** * Reference to element where we can get duration etc... * audio or source tag. * @private * @property {Object} ve */ this.ve = null; /** * True as soon as we could read infos from player object. * (Duration, etc...) * @private * @property {Boolean} playerDataLoaded */ this.playerDataLoaded = false; /** * Data we wrote or have to write to tracker object * @private * @property {Object} trackerData */ this.trackerData = {}; this.cuedSeekedEvent = null; if (cfg instanceof HtmlAudioTracker) { return cfg; } this.initConfig(cfg); } HtmlAudioTracker.prototype.getTracker = function () { return this.tracker; }; HtmlAudioTracker.prototype.setTracker = function (tracker) { this.tracker = new MediaTracker(tracker); // write cached data to tracker object this.updateTrackerData(); return this; }; HtmlAudioTracker.prototype.getPlayer = function () { return this.player; }; HtmlAudioTracker.prototype.setPlayer = function (domNodeOrId) { var domNode; if (!domNodeOrId) { econda.debug.error("No dom node given in HtmlAudioTracker.setPlayer()."); return this; } // get dom node if we've got a string (= element id) domNode = DomHelper.element(domNodeOrId); if (!domNode) { econda.debug.error("No dom node found with given element id: " + domNodeOrId); return this; } // check if it's a html audio element if (typeof domNode.tagName == 'undefined' || domNode.tagName.toLowerCase() != 'audio') { econda.debug.error("Given element is not an html audio tag in HtmlAudioTracker.setPlayer().", domNode); return this; } this.player = domNode; this.ve = domNode; this.addEventListeners(); return this; }; /** * Helper function to update tracker properties. * We can't do this directly because the tracker might be set * at a later time. You can call this function without parameters * to write all stored data to tracker. * * @method * @private * @param {String} property Property name to update * @param {Mixed} value Value to assign */ HtmlAudioTracker.prototype.updateTrackerData = function (property, value) { if (typeof property != 'undefined') { this.trackerData[property] = value; } if (this.tracker !== null) { this.tracker.set(this.trackerData); } return this; }; /** * Add event listeners to assigned audio element * @method * @private */ HtmlAudioTracker.prototype.addEventListeners = function () { var cmp = this; var e = this.player; e.addEventListener("loadeddata", function () { cmp.handleLoadedDataEvent.apply(cmp, arguments); }); e.addEventListener("seeking", function () { cmp.handleSeekingEvent.apply(cmp, arguments); }); e.addEventListener("seeked", function () { cmp.handleSeekedEvent.apply(cmp, arguments); }); e.addEventListener("play", function () { cmp.handlePlayEvent.apply(cmp, arguments); }); e.addEventListener("pause", function () { cmp.handlePauseEvent.apply(cmp, arguments); }); e.addEventListener("ended", function () { cmp.handleEndedEvent.apply(cmp, arguments); }); return this; }; /** * Handles the players loadeddata event * @method * @private * @param {Object} event Event object */ HtmlAudioTracker.prototype.handleLoadedDataEvent = function (event) { econda.debug.log("got loadeddata event"); this.updateTrackerData("duration", this.ve.duration); this.playerDataLoaded = true; // tracker should have all data now, so initialize it. if (this.tracker) { this.tracker.init(); } }; /** * Handle audio "seeking" events * @method * @private * @param {Object} event Event object */ HtmlAudioTracker.prototype.handleSeekingEvent = function (event) { var t = this.tracker; econda.debug.log("got seeking event"); if (this.cuedSeekedEvent !== null) { clearTimeout(this.cuedSeekedEvent); this.cuedSeekedEvent = null; } if (t) { t.setState("paused", this.ve.currentTime); } }; /** * Handle audio "seeked" events * @method * @private * @param {Object} event Event object */ HtmlAudioTracker.prototype.handleSeekedEvent = function (event) { var t = this.tracker; econda.debug.log("got seeked event"); if (t) { var pos = this.ve.currentTime; this.cuedSeekedEvent = setTimeout(function () { t.setState("playing", pos); }, 250); } }; /** * Handle audio "play" events * @method * @private * @param {Object} event Event object */ HtmlAudioTracker.prototype.handlePlayEvent = function (event) { var t = this.tracker; econda.debug.log("got play event"); if (t) { t.setState("playing", this.ve.currentTime); } }; /** * Handle audio "pause" events * @method * @private * @param {Object} event Event object */ HtmlAudioTracker.prototype.handlePauseEvent = function (event) { var t = this.tracker; econda.debug.log("got pause event"); if (t) { t.setState("paused", this.ve.currentTime); } }; /** * Handle audio "ended" events * @method * @private * @param {Object} event Event object */ HtmlAudioTracker.prototype.handleEndedEvent = function (event) { var t = this.tracker; econda.debug.log("got ended event"); if (t) { t.setState("stopped", this.ve.currentTime); } }; return HtmlAudioTracker; }(econda.base.BaseClass)); helper.HtmlAudioTracker = HtmlAudioTracker; })(helper = media.helper || (media.helper = {})); })(media = econda.media || (econda.media = {})); })(econda || (econda = {}));