/*
* File : EventSoundsElement.java
* Created : 26-sep-2001 12:40
* By : fbusquets
*
* JClic - Authoring and playing system for educational activities
*
* Copyright (C) 2000 - 2005 Francesc Busquets & Departament
* d'Educacio de la Generalitat de Catalunya
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details (see the LICENSE file).
*/
package edu.xtec.jclic.media;
import edu.xtec.jclic.Constants;
import edu.xtec.jclic.bags.MediaBag;
import edu.xtec.util.Domable;
import edu.xtec.util.JDomUtility;
import edu.xtec.util.Options;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.08.28
*/
public class EventSoundsElement extends Object implements Domable, Cloneable{
protected String fileName;
protected int enabled;
protected AudioPlayer player;
protected String id;
/** Creates new EventSoundsElement */
public EventSoundsElement(String id){
this.id=id;
enabled=JDomUtility.DEFAULT;
fileName=null;
player=null;
}
public String getId(){
return id;
}
public static final String ELEMENT_NAME="sound", ID="id", FILE="file";
public org.jdom.Element getJDomElement(){
if(id==null || (enabled==JDomUtility.DEFAULT && fileName==null)) return null;
org.jdom.Element e=new org.jdom.Element(ELEMENT_NAME);
e.setAttribute(ID, id);
if(enabled!=JDomUtility.DEFAULT)
e.setAttribute(EventSounds.ENABLED, JDomUtility.triStateString(enabled));
if(fileName!=null)
e.setAttribute(FILE, fileName);
return e;
}
public static EventSoundsElement getEventSoundsElement(org.jdom.Element e) throws Exception{
String id=JDomUtility.getStringAttr(e, ID, e.getName(), false);
if(id==null || id.length()<1 || ELEMENT_NAME.equals(id))
throw new Exception("Invalid event sound element id: "+id);
EventSoundsElement ev=new EventSoundsElement(id);
ev.setProperties(e, null);
return ev;
}
public void setProperties(org.jdom.Element e, Object aux) throws Exception{
enabled=JDomUtility.getTriStateAttr(e, EventSounds.ENABLED, enabled);
fileName=JDomUtility.getStringAttr(e, FILE, fileName, false);
}
public void setFileName(String fName){
if(player!=null)
player.close();
fileName=fName;
}
public String getFileName(){
return fileName;
}
public void setEnabled(int v){
if(JDomUtility.checkTriState(v)){
enabled=v;
if(player!=null)
player.stop();
}
}
public int getEnabled(){
return enabled;
}
private void buildPlayer(Options options) {
close();
String s=options.getString(Constants.MEDIA_SYSTEM);
try{
Class c=Class.forName("edu.xtec.jclic.media.JavaSoundAudioPlayer");
player=(AudioPlayer)c.newInstance();
} catch(Exception ex){
System.err.println("Error building audio player:\n"+ex);
}
}
public boolean setDataSource(Object source, Options options) throws Exception{
buildPlayer(options);
return player==null ? false : player.setDataSource(source);
}
public void realize(Options options, MediaBag mediaBag) throws Exception{
if(player==null)
buildPlayer(options);
player.realize(fileName, mediaBag);
}
public void close(){
if(player!=null){
player.close();
player=null;
}
}
public void play(){
if(player!=null && enabled!=edu.xtec.util.JDomUtility.FALSE && EventSounds.globalEnabled==true)
player.play();
}
public void stop(){
if(player!=null)
player.stop();
}
@Override
protected void finalize() throws Throwable{
close();
super.finalize();
}
@Override
public Object clone(){
EventSoundsElement evs=new EventSoundsElement(id);
evs.fileName=fileName;
evs.enabled=enabled;
evs.player=player;
return evs;
}
}