/**
* Copyright (c) 2010-2023 JogAmp Community. All rights reserved.
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* -Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS
* LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A
* RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
* IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
* OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
* ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for use in the
* design, construction, operation or maintenance of any nuclear facility.
*/
package com.jogamp.openal.sound3d;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import com.jogamp.openal.AL;
import com.jogamp.openal.ALC;
import com.jogamp.openal.ALException;
import com.jogamp.openal.ALExt;
import com.jogamp.openal.ALFactory;
import com.jogamp.openal.UnsupportedAudioFileException;
import com.jogamp.openal.util.WAVData;
import com.jogamp.openal.util.WAVLoader;
import jogamp.openal.Debug;
/**
* The AudioSystem3D class provides a set of methods for creating and
* manipulating a 3D audio environment.
*
* @author Athomas Goldberg
*/
public class AudioSystem3D {
static boolean DEBUG = Debug.debug("AudioSystem3D");
static final AL al;
static final ALC alc;
static final ALExt alExt;
static final boolean staticAvailable;
static Listener listener;
static {
ALC _alc = null;
AL _al = null;
ALExt _alExt = null;
try {
_alc = ALFactory.getALC();
_al = ALFactory.getAL();
_alExt = ALFactory.getALExt();
} catch(final Throwable t) {
if( DEBUG ) {
System.err.println("AudioSystem3D: Caught "+t.getClass().getName()+": "+t.getMessage());
t.printStackTrace();
}
}
alc = _alc;
al = _al;
alExt = _alExt;
staticAvailable = null != alc && null != al && null != alExt;
}
/**
* Initialize the Sound3D environment.
* @deprecated Not required to be called due to static initialization
*/
@Deprecated
public static void init() throws ALException { }
/**
* Returns the available state
of this instance.
*
* The available state
is affected by this instance
* overall availability, i.e. after instantiation.
*
*/
public static boolean isAvailable() { return staticAvailable; }
public int getALError() {
return al.alGetError();
}
/**
* Creates a new Sound3D Context for a specified device.
*
* @param device The device the Context is being created for.
*
* @return The new Sound3D context.
*/
public static Context createContext(final Device device) {
return new Context(device);
}
/**
* Makes the specified context the current context.
*
* @param context the context to make current.
*/
public static boolean makeContextCurrent(final Context context) {
return context.makeCurrent();
}
/**
* Release the specified context.
*
* @param context the context to release.
*/
public static boolean releaseContext(final Context context) {
return context.release();
}
/**
* Opens the named audio device.
*
* @param deviceName The specified device name, null for default.
*
* @return The device described by the specified name
*/
public static Device openDevice(final String deviceName) {
return new Device(deviceName);
}
/**
* Generate an array of Sound3D buffers.
*
* @param numBuffers The number of Sound3D buffers to generate.
*
* @return an array of (initially enpty) Sound3D buffers.
*/
public static Buffer[] generateBuffers(final int numBuffers) {
final Buffer[] result = new Buffer[numBuffers];
final int[] arr = new int[numBuffers];
al.alGenBuffers(numBuffers, arr, 0);
for (int i = 0; i < numBuffers; i++) {
result[i] = new Buffer(arr[i]);
}
return result;
}
/**
* Loads a Sound3D buffer with the specified audio file.
*
* @param filename the name of the file to load.
*
* @return a new Sound3D buffer containing the audio data from the
* specified file.
*
* @throws IOException If the file cannot be found or some other IO error
* occurs.
* @throws UnsupportedAudioFileException If the format of the audio data is
* not supported
*/
public static Buffer loadBuffer(final String filename)
throws IOException, UnsupportedAudioFileException {
Buffer result;
final Buffer[] tmp = generateBuffers(1);
result = tmp[0];
final WAVData wd = WAVLoader.loadFromFile(filename);
result.configure(wd.data, wd.format, wd.freq);
return result;
}
/**
* Loads a Sound3D buffer with the specified audio file.
*
* @param stream contains the stream associated with the audio file.
*
* @return a new Sound3D buffer containing the audio data from the
* passed stream.
*
* @throws IOException If the stream cannot be read or some other IO error
* occurs.
* @throws UnsupportedAudioFileException If the format of the audio data is
* not supported
*/
public static Buffer loadBuffer(InputStream stream)
throws IOException, UnsupportedAudioFileException {
Buffer result;
final Buffer[] tmp = generateBuffers(1);
result = tmp[0];
if (!(stream instanceof BufferedInputStream)) {
stream = new BufferedInputStream(stream);
}
final WAVData wd = WAVLoader.loadFromStream(stream);
result.configure(wd.data, wd.format, wd.freq);
return result;
}
/**
* Loads a Sound3D Source with the specified audio file. This is
* functionally equivalent to generateSource(loadBuffer(fileName));
*
* @param filename the name of the file to load.
*
* @return a new Sound3D Source containing the audio data from the
* specified file.
*
* @throws IOException If the file cannot be found or some other IO error
* occurs.
* @throws UnsupportedAudioFileException If the format of the audio data is
* not supported
*/
public static Source loadSource(final String filename)
throws IOException, UnsupportedAudioFileException {
final Buffer buffer = loadBuffer(filename);
return generateSource(buffer);
}
/**
* Loads a Sound3D Source with the specified audio stream. This is
* functionally equivalent to generateSource(loadBuffer(stream));
*
* @param stream contains the stream associated with the audio file.
*
* @return a new Sound3D Source containing the audio data from the
* passed stream.
*
* @throws IOException If the file cannot be found or some other IO error
* occurs.
* @throws UnsupportedAudioFileException If the format of the audio data is
* not supported
*/
public static Source loadSource(final InputStream stream)
throws IOException, UnsupportedAudioFileException {
final Buffer buffer = loadBuffer(stream);
return generateSource(buffer);
}
/**
* Generates a set of uninitialized Source3D sources
*
* @param numSources the number of Sound3D sources to generate.
*
* @return an array of uninitialized sources.
*/
public static Source[] generateSources(final int numSources) {
final Source[] result = new Source[numSources];
final int[] arr = new int[numSources];
al.alGenSources(numSources, arr, 0);
for (int i = 0; i < numSources; i++) {
result[i] = new Source(arr[i]);
}
return result;
}
/**
* Generate a Sound3D source from an initialized Buffer.
*
* @param buff The buffer to be associate with the source.
*
* @return the newly generated Source.
*/
public static Source generateSource(final Buffer buff) {
Source result = null;
final Source[] tmp = generateSources(1);
result = tmp[0];
result.setBuffer(buff);
return result;
}
/**
* Get the listener object associated with this Sound3D environment.
*
* @return The listener object.
*/
public static Listener getListener() {
if (listener == null) {
listener = new Listener();
}
return listener;
}
}