use of jmri.AudioManager in project JMRI by JMRI.
the class AudioSourceFrame method populateFrame.
/**
* Method to populate the Edit Source frame with current values
*/
@Override
public void populateFrame(Audio a) {
if (!(a instanceof AudioSource)) {
throw new IllegalArgumentException(a.getSystemName() + " is not an AudioSource object");
}
super.populateFrame(a);
AudioSource s = (AudioSource) a;
AudioManager am = InstanceManager.getDefault(jmri.AudioManager.class);
String ab = s.getAssignedBufferName();
Audio b = am.getAudio(ab);
if (b != null) {
assignedBuffer.setSelectedItem(b.getUserName() == null ? ab : b.getUserName());
}
loopInfinite.setSelected((s.getMinLoops() == AudioSource.LOOP_CONTINUOUS));
loopMin.setValue(loopInfinite.isSelected() ? 0 : s.getMinLoops());
loopMax.setValue(loopInfinite.isSelected() ? 0 : s.getMaxLoops());
// loopMinDelay.setValue(s.getMinLoopDelay());
// loopMaxDelay.setValue(s.getMaxLoopDelay());
position.setValue(s.getPosition());
positionRelative.setSelected(s.isPositionRelative());
velocity.setValue(s.getVelocity());
gain.setValue(s.getGain());
pitch.setValue(s.getPitch());
refDistance.setValue(s.getReferenceDistance());
maxDistance.setValue(s.getMaximumDistance());
rollOffFactor.setValue(s.getRollOffFactor());
fadeInTime.setValue(s.getFadeIn());
fadeOutTime.setValue(s.getFadeOut());
this.newSource = false;
}
use of jmri.AudioManager in project JMRI by JMRI.
the class AbstractAudioManagerConfigXML method store.
/**
* Default implementation for storing the contents of a AudioManager
*
* @param o Object to store, of type AudioManager
* @return Element containing the complete info
*/
@Override
public Element store(Object o) {
Element audio = new Element("audio");
setStoreElementClass(audio);
AudioManager am = (AudioManager) o;
if (am != null) {
java.util.Iterator<String> iter = am.getSystemNameList().iterator();
// don't return an element if there are not any audios to include
if (!iter.hasNext()) {
return null;
}
// (no need to store the automatically created Listener object by itself)
if (am.getSystemNameList(Audio.SOURCE).isEmpty() && am.getSystemNameList(Audio.BUFFER).isEmpty()) {
return null;
}
// finally, don't store if the only Sources and Buffers are for the
// virtual sound decoder (VSD)
int vsdObjectCount = 0;
// count all VSD objects
for (String sname : am.getSystemNameList()) {
if (log.isDebugEnabled()) {
log.debug("Check if " + sname + " is a VSD object");
}
if (sname.length() >= 8 && sname.substring(3, 8).equalsIgnoreCase("$VSD:")) {
log.debug("...yes");
vsdObjectCount++;
}
}
if (log.isDebugEnabled()) {
log.debug("Found " + vsdObjectCount + " VSD objects of " + am.getSystemNameList(Audio.SOURCE).size() + am.getSystemNameList(Audio.BUFFER).size() + " objects");
}
// the number of VSD objects - if so, exit.
if (am.getSystemNameList(Audio.SOURCE).size() + am.getSystemNameList(Audio.BUFFER).size() == vsdObjectCount) {
log.debug("Only VSD objects - nothing to store");
return null;
}
// store global information
audio.setAttribute("distanceattenuated", am.getActiveAudioFactory().isDistanceAttenuated() ? "yes" : "no");
// store the audios
while (iter.hasNext()) {
String sname = iter.next();
if (sname == null) {
log.error("System name null during store");
continue;
}
if (log.isDebugEnabled()) {
log.debug("system name is " + sname);
}
if (sname.length() >= 8 && sname.substring(3, 8).equalsIgnoreCase("$VSD:")) {
if (log.isDebugEnabled()) {
log.debug("Skipping storage of VSD object " + sname);
}
continue;
}
Audio a = am.getBySystemName(sname);
// Transient objects for current element and any children
Element e = null;
Element ce = null;
int type = a.getSubType();
if (type == Audio.BUFFER) {
AudioBuffer ab = (AudioBuffer) a;
e = new Element("audiobuffer").setAttribute("systemName", sname);
e.addContent(new Element("systemName").addContent(sname));
// store common part
storeCommon(ab, e);
// store sub-type specific data
String url = ab.getURL();
ce = new Element("url").addContent("" + (url.isEmpty() ? "" : FileUtil.getPortableFilename(url)));
e.addContent(ce);
ce = new Element("looppoint");
ce.setAttribute("start", "" + ab.getStartLoopPoint());
ce.setAttribute("end", "" + ab.getEndLoopPoint());
e.addContent(ce);
ce = new Element("streamed");
ce.addContent("" + (ab.isStreamed() ? "yes" : "no"));
e.addContent(ce);
} else if (type == Audio.LISTENER) {
AudioListener al = (AudioListener) a;
e = new Element("audiolistener").setAttribute("systemName", sname);
e.addContent(new Element("systemName").addContent(sname));
// store common part
storeCommon(al, e);
// store sub-type specific data
ce = new Element("position");
ce.setAttribute("x", "" + al.getPosition().x);
ce.setAttribute("y", "" + al.getPosition().y);
ce.setAttribute("z", "" + al.getPosition().z);
e.addContent(ce);
ce = new Element("velocity");
ce.setAttribute("x", "" + al.getVelocity().x);
ce.setAttribute("y", "" + al.getVelocity().y);
ce.setAttribute("z", "" + al.getVelocity().z);
e.addContent(ce);
ce = new Element("orientation");
ce.setAttribute("atX", "" + al.getOrientation(Audio.AT).x);
ce.setAttribute("atY", "" + al.getOrientation(Audio.AT).y);
ce.setAttribute("atZ", "" + al.getOrientation(Audio.AT).z);
ce.setAttribute("upX", "" + al.getOrientation(Audio.UP).x);
ce.setAttribute("upY", "" + al.getOrientation(Audio.UP).y);
ce.setAttribute("upZ", "" + al.getOrientation(Audio.UP).z);
e.addContent(ce);
ce = new Element("gain");
ce.addContent("" + al.getGain());
e.addContent(ce);
ce = new Element("metersperunit");
ce.addContent("" + al.getMetersPerUnit());
e.addContent(ce);
} else if (type == Audio.SOURCE) {
AudioSource as = (AudioSource) a;
e = new Element("audiosource").setAttribute("systemName", sname);
e.addContent(new Element("systemName").addContent(sname));
// store common part
storeCommon(as, e);
// store sub-type specific data
ce = new Element("position");
ce.setAttribute("x", "" + as.getPosition().x);
ce.setAttribute("y", "" + as.getPosition().y);
ce.setAttribute("z", "" + as.getPosition().z);
e.addContent(ce);
ce = new Element("velocity");
ce.setAttribute("x", "" + as.getVelocity().x);
ce.setAttribute("y", "" + as.getVelocity().y);
ce.setAttribute("z", "" + as.getVelocity().z);
e.addContent(ce);
ce = new Element("assignedbuffer");
if (as.getAssignedBuffer() != null) {
ce.addContent("" + as.getAssignedBufferName());
}
e.addContent(ce);
ce = new Element("gain");
ce.addContent("" + as.getGain());
e.addContent(ce);
ce = new Element("pitch");
ce.addContent("" + as.getPitch());
e.addContent(ce);
ce = new Element("distances");
ce.setAttribute("ref", "" + as.getReferenceDistance());
float f = as.getMaximumDistance();
ce.setAttribute("max", "" + f);
e.addContent(ce);
ce = new Element("loops");
ce.setAttribute("min", "" + as.getMinLoops());
ce.setAttribute("max", "" + as.getMaxLoops());
// ce.setAttribute("mindelay", ""+as.getMinLoopDelay());
// ce.setAttribute("maxdelay", ""+as.getMaxLoopDelay());
e.addContent(ce);
ce = new Element("fadetimes");
ce.setAttribute("in", "" + as.getFadeIn());
ce.setAttribute("out", "" + as.getFadeOut());
e.addContent(ce);
ce = new Element("dopplerfactor");
ce.addContent("" + as.getDopplerFactor());
e.addContent(ce);
ce = new Element("positionrelative");
ce.addContent("" + (as.isPositionRelative() ? "yes" : "no"));
e.addContent(ce);
}
log.debug("store Audio " + sname);
audio.addContent(e);
}
}
return audio;
}
use of jmri.AudioManager in project JMRI by JMRI.
the class AbstractAudioManagerConfigXML method loadAudio.
/**
* Utility method to load the individual Audio objects. If there's no
* additional info needed for a specific Audio type, invoke this with the
* parent of the set of Audio elements.
*
* @param audio Element containing the Audio elements to load.
*/
@SuppressWarnings("unchecked")
public void loadAudio(Element audio) {
AudioManager am = InstanceManager.getDefault(jmri.AudioManager.class);
// Count number of loaded Audio objects
int loadedObjects = 0;
// Load buffers first
List<Element> audioList = audio.getChildren("audiobuffer");
if (log.isDebugEnabled()) {
log.debug("Found " + audioList.size() + " Audio Buffer objects");
}
for (int i = 0; i < audioList.size(); i++) {
Element e = audioList.get(i);
String sysName = getSystemName(e);
if (sysName == null) {
log.warn("unexpected null in systemName " + (e) + " " + (e).getAttributes());
break;
}
String userName = getUserName(e);
if (log.isDebugEnabled()) {
log.debug("create Audio: (" + sysName + ")(" + (userName == null ? "<null>" : userName) + ")");
}
try {
AudioBuffer ab = (AudioBuffer) am.newAudio(sysName, userName);
// load common parts
loadCommon(ab, e);
// load sub-type specific parts
// Transient objects for reading child elements
Element ce;
String value;
if ((ce = e.getChild("url")) != null) {
ab.setURL(ce.getValue());
}
if ((ce = e.getChild("looppoint")) != null) {
if ((value = ce.getAttributeValue("start")) != null) {
ab.setStartLoopPoint(Integer.parseInt(value));
}
if ((value = ce.getAttributeValue("end")) != null) {
ab.setEndLoopPoint(Integer.parseInt(value));
}
}
if ((ce = e.getChild("streamed")) != null) {
ab.setStreamed(ce.getValue().equals("yes"));
}
} catch (AudioException ex) {
log.error("Error loading AudioBuffer (" + sysName + "): " + ex);
}
}
loadedObjects += audioList.size();
// Now load sources
audioList = audio.getChildren("audiosource");
if (log.isDebugEnabled()) {
log.debug("Found " + audioList.size() + " Audio Source objects");
}
for (int i = 0; i < audioList.size(); i++) {
Element e = audioList.get(i);
String sysName = getSystemName(e);
if (sysName == null) {
log.warn("unexpected null in systemName " + (e) + " " + (e).getAttributes());
break;
}
String userName = getUserName(e);
if (log.isDebugEnabled()) {
log.debug("create Audio: (" + sysName + ")(" + (userName == null ? "<null>" : userName) + ")");
}
try {
AudioSource as = (AudioSource) am.newAudio(sysName, userName);
// load common parts
loadCommon(as, e);
// load sub-type specific parts
// Transient objects for reading child elements
Element ce;
String value;
if ((ce = e.getChild("position")) != null) {
as.setPosition(new Vector3f(Float.parseFloat(ce.getAttributeValue("x")), Float.parseFloat(ce.getAttributeValue("y")), Float.parseFloat(ce.getAttributeValue("z"))));
}
if ((ce = e.getChild("velocity")) != null) {
as.setVelocity(new Vector3f(Float.parseFloat(ce.getAttributeValue("x")), Float.parseFloat(ce.getAttributeValue("y")), Float.parseFloat(ce.getAttributeValue("z"))));
}
if ((ce = e.getChild("assignedbuffer")) != null) {
if (ce.getValue().length() != 0 && !ce.getValue().equals("null")) {
as.setAssignedBuffer(ce.getValue());
}
}
if ((ce = e.getChild("gain")) != null && ce.getValue().length() != 0) {
as.setGain(Float.parseFloat(ce.getValue()));
}
if ((ce = e.getChild("pitch")) != null && ce.getValue().length() != 0) {
as.setPitch(Float.parseFloat(ce.getValue()));
}
if ((ce = e.getChild("distances")) != null) {
if ((value = ce.getAttributeValue("ref")) != null) {
as.setReferenceDistance(Float.parseFloat(value));
}
if ((value = ce.getAttributeValue("max")) != null) {
as.setMaximumDistance(Float.parseFloat(value));
}
}
if ((ce = e.getChild("loops")) != null) {
if ((value = ce.getAttributeValue("min")) != null) {
as.setMinLoops(Integer.parseInt(value));
}
if ((value = ce.getAttributeValue("max")) != null) {
as.setMaxLoops(Integer.parseInt(value));
}
// if ((value = ce.getAttributeValue("mindelay"))!=null)
// as.setMinLoopDelay(Integer.parseInt(value));
// if ((value = ce.getAttributeValue("maxdelay"))!=null)
// as.setMaxLoopDelay(Integer.parseInt(value));
}
if ((ce = e.getChild("fadetimes")) != null) {
if ((value = ce.getAttributeValue("in")) != null) {
as.setFadeIn(Integer.parseInt(value));
}
if ((value = ce.getAttributeValue("out")) != null) {
as.setFadeOut(Integer.parseInt(value));
}
}
if ((ce = e.getChild("dopplerfactor")) != null && ce.getValue().length() != 0) {
as.setDopplerFactor(Float.parseFloat(ce.getValue()));
}
if ((ce = e.getChild("positionrelative")) != null) {
as.setPositionRelative(ce.getValue().equals("yes"));
}
} catch (AudioException ex) {
log.error("Error loading AudioSource (" + sysName + "): " + ex);
}
}
loadedObjects += audioList.size();
// Finally, load Listeners if needed
if (loadedObjects > 0) {
audioList = audio.getChildren("audiolistener");
if (log.isDebugEnabled()) {
log.debug("Found " + audioList.size() + " Audio Listener objects");
}
for (int i = 0; i < audioList.size(); i++) {
Element e = audioList.get(i);
String sysName = getSystemName(e);
if (sysName == null) {
log.warn("unexpected null in systemName " + (e) + " " + (e).getAttributes());
break;
}
String userName = getUserName(e);
if (log.isDebugEnabled()) {
log.debug("create Audio: (" + sysName + ")(" + (userName == null ? "<null>" : userName) + ")");
}
try {
AudioListener al = (AudioListener) am.newAudio(sysName, userName);
// load common parts
loadCommon(al, e);
// load sub-type specific parts
// Transient object for reading child elements
Element ce;
if ((ce = e.getChild("position")) != null) {
al.setPosition(new Vector3f(Float.parseFloat(ce.getAttributeValue("x")), Float.parseFloat(ce.getAttributeValue("y")), Float.parseFloat(ce.getAttributeValue("z"))));
}
if ((ce = e.getChild("velocity")) != null) {
al.setVelocity(new Vector3f(Float.parseFloat(ce.getAttributeValue("x")), Float.parseFloat(ce.getAttributeValue("y")), Float.parseFloat(ce.getAttributeValue("z"))));
}
if ((ce = e.getChild("orientation")) != null) {
al.setOrientation(new Vector3f(Float.parseFloat(ce.getAttributeValue("atX")), Float.parseFloat(ce.getAttributeValue("atY")), Float.parseFloat(ce.getAttributeValue("atZ"))), new Vector3f(Float.parseFloat(ce.getAttributeValue("upX")), Float.parseFloat(ce.getAttributeValue("upY")), Float.parseFloat(ce.getAttributeValue("upZ"))));
}
if ((ce = e.getChild("gain")) != null) {
al.setGain(Float.parseFloat(ce.getValue()));
}
if ((ce = e.getChild("metersperunit")) != null) {
al.setMetersPerUnit(Float.parseFloat((ce.getValue())));
}
} catch (AudioException ex) {
log.error("Error loading AudioListener (" + sysName + "): " + ex);
}
}
Attribute a;
if ((a = audio.getAttribute("distanceattenuated")) != null) {
am.getActiveAudioFactory().setDistanceAttenuated(a.getValue().equals("yes"));
}
}
}
use of jmri.AudioManager in project JMRI by JMRI.
the class AudioSourceFrame method updateBufferList.
public void updateBufferList() {
AudioManager am = InstanceManager.getDefault(jmri.AudioManager.class);
assignedBuffer.removeAllItems();
assignedBuffer.addItem("Select buffer from list");
am.getSystemNameList(Audio.BUFFER).stream().forEach((s) -> {
String u = am.getAudio(s).getUserName();
if (u != null) {
assignedBuffer.addItem(u);
} else {
assignedBuffer.addItem(s);
}
});
}
use of jmri.AudioManager in project JMRI by JMRI.
the class NullAudioFactory method cleanup.
@Override
public void cleanup() {
// Stop the command thread
super.cleanup();
// Get the active AudioManager
AudioManager am = InstanceManager.getDefault(jmri.AudioManager.class);
// Retrieve list of Audio Objects and remove the sources
List<String> audios = am.getSystemNameList();
for (String audioName : audios) {
Audio audio = am.getAudio(audioName);
if (audio.getSubType() == Audio.SOURCE) {
if (log.isDebugEnabled()) {
log.debug("Removing NullAudioSource: " + audioName);
}
// Cast to NullAudioSource and cleanup
((NullAudioSource) audio).cleanUp();
}
}
// Now, re-retrieve list of Audio objects and remove the buffers
audios = am.getSystemNameList();
for (String audioName : audios) {
Audio audio = am.getAudio(audioName);
if (audio.getSubType() == Audio.BUFFER) {
if (log.isDebugEnabled()) {
log.debug("Removing NullAudioBuffer: " + audioName);
}
// Cast to NullAudioBuffer and cleanup
((NullAudioBuffer) audio).cleanUp();
}
}
// Lastly, re-retrieve list and remove listener.
audios = am.getSystemNameList();
for (String audioName : audios) {
Audio audio = am.getAudio(audioName);
if (audio.getSubType() == Audio.LISTENER) {
if (log.isDebugEnabled()) {
log.debug("Removing NullAudioListener: " + audioName);
}
// Cast to NullAudioListener and cleanup
((NullAudioListener) audio).cleanUp();
}
}
// Finally, shutdown NullAudio and close the output device
log.debug("Shutting down NullAudio");
// Do nothing
}
Aggregations