/* * Copyright 2011 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dom.client; import com.google.gwt.media.dom.client.MediaError; import com.google.gwt.media.dom.client.TimeRanges; /** * Common superclass for Audio and Video elements. * * See {@link <a href="http://www.w3.org/TR/html5/video.html">W3C HTML5 Video and Audio</a>} */ public class MediaElement extends Element { /** * Constant returned from {@link #canPlayType(String)}. */ public static final String CAN_PLAY_PROBABLY = "probably"; /** * Constant returned from {@link #canPlayType(String)}. */ public static final String CAN_PLAY_MAYBE = "maybe"; /** * Constant returned from {@link #canPlayType(String)}. */ public static final String CANNOT_PLAY = ""; /** * Constant returned from {@link #getReadyState()}. */ public static final int HAVE_NOTHING = 0; /** * Constant returned from {@link #getReadyState()}. */ public static final int HAVE_METADATA = 1; /** * Constant returned from {@link #getReadyState()}. */ public static final int HAVE_CURRENT_DATA = 2; /** * Constant returned from {@link #getReadyState()}. */ public static final int HAVE_FUTURE_DATA = 3; /** * Constant returned from {@link #getReadyState()}. */ public static final int HAVE_ENOUGH_DATA = 4; /** * Constant returned from {@link #getNetworkState}. */ public static final int NETWORK_EMPTY = 0; /** * Constant returned from {@link #getNetworkState}. */ public static final int NETWORK_IDLE = 1; /** * Constant returned from {@link #getNetworkState}. */ public static final int NETWORK_LOADING = 2; /** * Constant returned from {@link #getNetworkState}. */ public static final int NETWORK_NO_SOURCE = 3; /** * Constant used by {@link #getPreload()} and {@link #setPreload(String)}. */ public static final String PRELOAD_AUTO = "auto"; /** * Constant used by {@link #getPreload()} and {@link #setPreload(String)}. */ public static final String PRELOAD_METADATA = "metadata"; /** * Constant used by {@link #getPreload()} and {@link #setPreload(String)}. */ public static final String PRELOAD_NONE = "none"; protected MediaElement() { } /** * Returns {@code true} if the native player is capable of playing content of * the given MIME type. * * @param type a String representing a MIME type * @return one of {@link #CAN_PLAY_PROBABLY}, {@link #CAN_PLAY_MAYBE}, or * {@link #CANNOT_PLAY} */ public final native String canPlayType(String type) /*-{ var canPlayType = this.canPlayType(type); // Some browsers report "no" instead of the empty string. // See http://gwt-voices.appspot.com/ return canPlayType == "no" ? @com.google.gwt.dom.client.MediaElement::CANNOT_PLAY : canPlayType; }-*/; /** * Returns a {@link TimeRanges} object indicating which portions of the * source have been buffered locally. * * @return a {@link TimeRanges} instance, or {@code null}. */ public final native TimeRanges getBuffered() /*-{ return this.buffered; }-*/; /** * Returns the URL of the current media source, or the empty String * if no source is set. * * @return a String URL */ public final native String getCurrentSrc() /*-{ return this.currentSrc; }-*/; /** * Returns the current time within the source media stream. * * @return the time, in seconds, as a double * * @see #setCurrentTime(double) */ public final native double getCurrentTime() /*-{ return this.currentTime; }-*/; /** * Returns the default playback rate, where 1.0 corresponds to normal * playback. If no rate has been set, 1.0 is returned. * * @return the current default playback rate, or 1.0 if it has not been set * * @see #setDefaultPlaybackRate(double) */ public final double getDefaultPlaybackRate() { return getDoubleAttr("defaultPlaybackRate", 1.0); } /** * Returns the duration of the source media stream, in seconds. If the * duration is unknown, {@link Double#NaN} is returned. For unbounded media * streams, {@link Double#POSITIVE_INFINITY} is returned. * * @return a positive duration in seconds, NaN, or Infinity */ public final native double getDuration() /*-{ return this.duration; }-*/; /** * Returns the type of error that has occurred while attempting to load * and play the media. If no error has occurred, {@code null} is returned. * * @return a {@link MediaError} instance, or {@code null} */ public final native MediaError getError() /*-{ return this.error || null; }-*/; /** * Returns the time to which the media stream was seeked at the time it was * loaded, in seconds, or 0.0 if the position is unknown. * * @return the initial time, or 0.0 if unknown */ public final double getInitialTime() { return getDoubleAttr("initialTime", 0.0); } /** * Returns the network state, one of {@link #NETWORK_EMPTY}, * {@link #NETWORK_IDLE}, {@link #NETWORK_LOADING}, or * {@link #NETWORK_NO_SOURCE}. * * @return an integer constant indicating the network state * * @see #NETWORK_EMPTY * @see #NETWORK_IDLE * @see #NETWORK_LOADING * @see #NETWORK_NO_SOURCE */ public final native int getNetworkState() /*-{ return this.networkState; }-*/; /** * Returns the playback rate, where 1.0 corresponds to normal * playback. If the rate has not been set, 1.0 is returned. * * @return the playback rate, if known, otherwise 1.0 * * @see #setPlaybackRate(double) */ public final native double getPlaybackRate() /*-{ var rate = this.playbackRate; if (rate != null && typeof(rate) == 'number') { return rate; } return 1.0; }-*/; /** * Returns a {@link TimeRanges} object indicating which portions of the * source have been played. * * @return a {@link TimeRanges} instance, or {@code null}. */ public final native TimeRanges getPlayed() /*-{ return this.played; }-*/; /** * Returns the preload setting, one of {@link #PRELOAD_AUTO}, * {@link #PRELOAD_METADATA}, or {@link #PRELOAD_NONE}. * * @return the preload setting * * @see #setPreload(String) * @see #PRELOAD_AUTO * @see #PRELOAD_METADATA * @see #PRELOAD_NONE */ public final native String getPreload() /*-{ return this.preload; }-*/; /** * Returns the current state of the media with respect to rendering the * current playback position, as one of the constants * {@link #HAVE_CURRENT_DATA}, {@link #HAVE_ENOUGH_DATA}, * {@link #HAVE_FUTURE_DATA}, {@link #HAVE_METADATA}, or {@link #HAVE_NOTHING} * . * * @return an integer constant indicating the ready state * * @see #HAVE_CURRENT_DATA * @see #HAVE_ENOUGH_DATA * @see #HAVE_FUTURE_DATA * @see #HAVE_METADATA * @see #HAVE_NOTHING */ public final native int getReadyState() /*-{ return this.readyState; }-*/; /** * Returns a {@link TimeRanges} object indicating which portions of the * source are seekable. * * @return a {@link TimeRanges} instance, or {@code null}. */ public final native TimeRanges getSeekable() /*-{ return this.seekable; }-*/; /** * Returns the source URL for the media, or {@code null} if none is set. * * @return a String URL or {@code null} * * @see #setSrc(String) */ public final native String getSrc() /*-{ return this.getAttribute('src'); }-*/; /** * Returns the time corresponding to the zero time in the media timeline, * measured in seconds since midnight, January 1 1970 UTC, or * {@link Double#NaN} if none is specified. * * @return the start time */ public final double getStartOffsetTime() { return getDoubleAttr("startOffsetTime", Double.NaN); } /** * Returns the current audio volume setting for the media, as a number * between 0.0 and 1.0. * * @return a number between 0.0 (silent) and 1.0 (loudest) * * @see #setVolume(double) */ public final native double getVolume() /*-{ return this.volume; }-*/; /** * Returns {@code true} if the media player should display interactive * controls (for example, to control play/pause, seek position, and volume), * {@code false} otherwise. * * @return whether controls should be displayed * * @see #setControls(boolean) */ public final native boolean hasControls() /*-{ return this.hasAttribute('controls'); }-*/; /** * Returns {@code true} if playback has reached the end of the media, {@code * false} otherwise. * * @return whether playback has ended */ public final native boolean hasEnded() /*-{ return this.ended; }-*/; /** * Returns {@code true} if autoplay is enabled, {@code false} otherwise. When * autoplay is enabled, the user agent will begin playback automatically as * soon as it can do so without stopping. * * @return the autoplay setting * * @see #setAutoplay(boolean) */ public final native boolean isAutoplay() /*-{ return this.hasAttribute('autoplay'); }-*/; /** * Returns {@code true} if the user agent is to seek back to the start of the * media once playing has ended, {@code false} otherwise. * * @return the loop setting * * @see #setLoop(boolean) */ public final native boolean isLoop() /*-{ return this.hasAttribute('loop'); }-*/; /** * Returns {@code true} if the volume is to be muted (overriding the normal * volume setting), {@code false} otherwise. * * @return the muting setting * * @see #setMuted(boolean) * @see #getVolume() * @see #setVolume(double) */ public final native boolean isMuted() /*-{ return !!this.muted; }-*/; /** * Returns {@code true} if playback is paused, {@code false} otherwise. * * @return the paused setting * * @see #pause() * @see #play() */ public final native boolean isPaused() /*-{ return !!this.paused; }-*/; /** * Returns {@code true} if the playback position is in the process of changing * discontinuously, e.g., by use of the interactive controls, {@code false} * otherwise. * * @return the seeking status * * @see #setControls(boolean) * @see #hasControls() */ public final native boolean isSeeking() /*-{ return !!this.seeking; }-*/; /** * Causes the resource to be loaded. */ public final native void load() /*-{ this.load(); }-*/; /** * Causes playback of the resource to be paused. */ public final native void pause() /*-{ this.pause(); }-*/; /** * Causes playback of the resource to be started or resumed. */ public final native void play() /*-{ this.play(); }-*/; /** * Enables or disables autoplay of the resource. * * @param autoplay if {@code true}, enable autoplay * * @see #isAutoplay() */ public final void setAutoplay(boolean autoplay) { setBooleanAttr("autoplay", autoplay); } /** * Enables or disables interactive controls. * * @param controls if {@code true}, enable controls * * @see #hasControls() */ public final void setControls(boolean controls) { setBooleanAttr("controls", controls); } /** * Sets the current playback time within the media stream, in seconds. * * @param time a number within the ranges given by {@link #getSeekable()} * * @see #getCurrentTime() */ public final native void setCurrentTime(double time) /*-{ this.currentTime = time; }-*/; /** * Sets the default playback rate. * * @param rate a double value * * @see #getDefaultPlaybackRate() */ public final native void setDefaultPlaybackRate(double rate) /*-{ this.defaultPlaybackRate = rate; }-*/; /** * Enables or disables looping. * * @param loop if {@code true}, enable looping * * @see #isLoop() */ public final void setLoop(boolean loop) { setBooleanAttr("loop", loop); } /** * Enables or disables muting. * * @param muted if {@code true}, enable muting * * @see #isMuted() */ public final native void setMuted(boolean muted) /*-{ this.muted = muted; }-*/; /** * Sets the playback rate. * * @param rate a double value * * @see #getPlaybackRate() */ public final native void setPlaybackRate(double rate) /*-{ this.playbackRate = rate; }-*/; /** * Changes the preload setting to one of {@link #PRELOAD_AUTO}, * {@link #PRELOAD_METADATA}, or {@link #PRELOAD_NONE}. * * @param preload a String constants * * @see #getPreload() * @see #setPreload(String) * @see #PRELOAD_AUTO * @see #PRELOAD_METADATA * @see #PRELOAD_NONE */ public final native void setPreload(String preload) /*-{ this.preload = preload; }-*/; /** * Sets the source URL for the media. * * @param url a String URL * * @see #getSrc() */ public final native void setSrc(String url) /*-{ this.src = url; }-*/; /** * Sets the playback volume. * * @param volume a value between 0.0 (silent) and 1.0 (loudest) * * @see #getVolume() */ public final native void setVolume(double volume) /*-{ this.volume = volume }-*/; private native double getDoubleAttr(String name, double def) /*-{ var value = this.getAttribute(name); if (value == null || typeof(value) == 'undefined') { return def; } return value; }-*/; private void setBooleanAttr(String name, boolean value) { if (value) { setAttribute(name, ""); } else { removeAttribute(name); } } }