Package com.allen_sauer.gwt.voices.client.ui

Source Code of com.allen_sauer.gwt.voices.client.ui.VoicesMovie

/*
* Copyright 2010 Fred Sauer
*
* 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.allen_sauer.gwt.voices.client.ui;

import static com.allen_sauer.gwt.voices.client.Sound.LoadState.LOAD_STATE_NOT_SUPPORTED;
import static com.allen_sauer.gwt.voices.client.SoundController.MimeTypeSupport.MIME_TYPE_NOT_SUPPORTED;
import static com.allen_sauer.gwt.voices.client.SoundController.MimeTypeSupport.MIME_TYPE_SUPPORT_NOT_READY;
import static com.allen_sauer.gwt.voices.client.SoundController.MimeTypeSupport.MIME_TYPE_SUPPORT_READY;
import static com.allen_sauer.gwt.voices.client.SoundController.MimeTypeSupport.MIME_TYPE_SUPPORT_UNKNOWN;

import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;

import com.allen_sauer.gwt.voices.client.FlashSound;
import com.allen_sauer.gwt.voices.client.Sound;
import com.allen_sauer.gwt.voices.client.SoundController.MimeTypeSupport;
import com.allen_sauer.gwt.voices.client.util.StringUtil;

import java.util.ArrayList;
import java.util.Iterator;

// CHECKSTYLE_JAVADOC_OFF
public class VoicesMovie extends FlashMovie {

  @SuppressWarnings("deprecation")
  private static final String[] FLASH_SUPPORTED_MIME_TYPES = {
      Sound.MIME_TYPE_AUDIO_MPEG, Sound.MIME_TYPE_AUDIO_MPEG_MP3,};
  private static final String GWT_VOICES_SWF = "gwt-voices.swf";


  private MimeTypeSupport flashSupport = MIME_TYPE_SUPPORT_UNKNOWN;
  private final ArrayList<FlashSound> unitializedSoundList = new ArrayList<FlashSound>();

  public VoicesMovie(String id, String gwtVoicesSwfBaseUrl) {
    super(id, gwtVoicesSwfBaseUrl + GWT_VOICES_SWF);
    installFlashCallbackHooks(id);

    // Flash Player version check for ExternalInterface support
    if (isExternalInterfaceSupported()) {
      flashSupport = MIME_TYPE_SUPPORT_NOT_READY;
    } else {
      flashSupport = MIME_TYPE_NOT_SUPPORTED;
      Scheduler.get().scheduleDeferred(new ScheduledCommand() {
        @Override
        public void execute() {
          movieUnsupported();
        }
      });
    }
  }

  public MimeTypeSupport getMimeTypeSupport(String mimeType) {
    switch (flashSupport) {
      case MIME_TYPE_SUPPORT_READY:
      case MIME_TYPE_SUPPORT_NOT_READY:
        return StringUtil.contains(FLASH_SUPPORTED_MIME_TYPES, mimeType) ? MIME_TYPE_SUPPORT_READY
            : MIME_TYPE_NOT_SUPPORTED;
      case MIME_TYPE_SUPPORT_UNKNOWN:
      case MIME_TYPE_NOT_SUPPORTED:
        return flashSupport;
      default:
        throw new RuntimeException("Unhandled flash support value " + flashSupport);
    }
  }

  public boolean playSound(int id) {
    if (flashSupport == MIME_TYPE_SUPPORT_READY) {
      return callPlaySound(id);
    }
    // the sound was not played, return false
    return false;
  }

  public void registerSound(FlashSound flashSound) {
    if (flashSupport == MIME_TYPE_SUPPORT_READY) {
      doCreateSound(flashSound);
    } else {
      unitializedSoundList.add(flashSound);
    }
  }

  public void setBalance(int id, int balance) {
    assert balance >= -100;
    assert balance <= 100;
    if (flashSupport == MIME_TYPE_SUPPORT_READY) {
      callSetPanning(id, balance / 100f);
    }
  }

  public void setLooping(int id, boolean looping) {
    if (flashSupport == MIME_TYPE_SUPPORT_READY) {
      callSetLooping(id, looping ? Integer.MAX_VALUE : 0);
    }
  }

  public void setVolume(int id, int volume) {
    assert volume >= 0;
    assert volume <= 100;
    if (flashSupport == MIME_TYPE_SUPPORT_READY) {
      callSetVolume(id, volume / 100f);
    }
  }

  public void stopSound(int id) {
    if (flashSupport == MIME_TYPE_SUPPORT_READY) {
      callStopSound(id);
    }
  }

  protected void debug(String text) {
    System.out.println(text);
    if (!GWT.isProdMode()) {
      consoleDebug(text);
    }
  }

  private native void callCreateSound(int id, String soundURL, boolean checkPolicyFile) /*-{
    var elem = this.@com.allen_sauer.gwt.voices.client.ui.FlashMovie::element;
    elem.createSound(id, soundURL, checkPolicyFile);
  }-*/;

  private native boolean callPlaySound(int id) /*-{
    var elem = this.@com.allen_sauer.gwt.voices.client.ui.FlashMovie::element;
    return elem.playSound(id);
  }-*/;

  private native void callSetLooping(int id, int looping) /*-{
    var elem = this.@com.allen_sauer.gwt.voices.client.ui.FlashMovie::element;
    elem.setLooping(id, looping);
  }-*/;

  private native void callSetPanning(int id, float panning) /*-{
    var elem = this.@com.allen_sauer.gwt.voices.client.ui.FlashMovie::element;
    elem.setPanning(id, panning);
  }-*/;

  private native void callSetVolume(int id, float volume) /*-{
    var elem = this.@com.allen_sauer.gwt.voices.client.ui.FlashMovie::element;
    elem.setVolume(id, volume);
  }-*/;

  private native void callStopSound(int id) /*-{
    var elem = this.@com.allen_sauer.gwt.voices.client.ui.FlashMovie::element;
    elem.stopSound(id);
  }-*/;

  private native void consoleDebug(String text) /*-{
    console.log(text);
  }-*/;

  private void doCreateSound(FlashSound flashSound) {
    callCreateSound(flashSound.getSoundNumber(), flashSound.getUrl(), flashSound.isCrossOrigin());
  }

  private native void installFlashCallbackHooks(String id) /*-{
    if ($doc.VoicesMovie === undefined) {
      $doc.VoicesMovie = {};
    }
    var self = this;
    $doc.VoicesMovie[id] = {};

    $doc.VoicesMovie[id].ready = function() {
      self.@com.allen_sauer.gwt.voices.client.ui.VoicesMovie::movieReady()();
    }

    $doc.VoicesMovie[id].soundLoaded = function(id) {
      @com.allen_sauer.gwt.voices.client.FlashSound::soundLoaded(I)(id);
      return true;
    }

    $doc.VoicesMovie[id].playbackCompleted = function(id) {
      @com.allen_sauer.gwt.voices.client.FlashSound::playbackCompleted(I)(id);
    }

    $doc.VoicesMovie[id].log = function(text) {
      self.@com.allen_sauer.gwt.voices.client.ui.VoicesMovie::debug(Ljava/lang/String;)("FLASH[" + id + "]: " + text);
    }
  }-*/;

  private void movieReady() {
    flashSupport = MIME_TYPE_SUPPORT_READY;
    for (Iterator<FlashSound> iterator = unitializedSoundList.iterator(); iterator.hasNext();) {
      FlashSound flashSound = iterator.next();
      doCreateSound(flashSound);
      iterator.remove();
    }
  }

  private void movieUnsupported() {
    for (FlashSound flashSound : unitializedSoundList) {
      flashSound.setLoadState(LOAD_STATE_NOT_SUPPORTED);
      // Flash plug-in may become available later; do not call iterator.remove()
    }
  }

}
TOP

Related Classes of com.allen_sauer.gwt.voices.client.ui.VoicesMovie

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.