All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jogamp.openal.sound3d.Source Maven / Gradle / Ivy

/**
* 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 com.jogamp.openal.AL;

/**
 * This class is used to represent sound-producing objects in the Sound3D
 * environment. It contains methods for setting the position, direction, pitch,
 * gain and other properties along with methods for starting, pausing, rewinding
 * and stopping sudio projecting from a source.
 *
 * @author Athomas Goldberg
 */
public final class Source {
    private final AL al;
    private final int sourceID;
    private Buffer buffer;

    Source(AL al, int sourceID) {
        this.al = al;
        this.sourceID = sourceID;
    }

    /**
     * Beginning playing the audio in this source.
     */
    public void play() {
        al.alSourcePlay(sourceID);
    }

    /**
     * pauses the audio in this Source.
     */
    public void pause() {
        al.alSourcePause(sourceID);
    }

    /**
     * Stops the audio in this Source
     */
    public void stop() {
        al.alSourceStop(sourceID);
    }

    /**
     * Rewinds the audio in this source
     */
    public void rewind() {
        al.alSourceRewind(sourceID);
    }

    /**
     * Delete this source, freeing its resources.
     */
    public void delete() {
        al.alDeleteSources(1, new int[] { sourceID }, 0);
    }

    /**
     * Determines whether or not this source is playing.
     *
     * @return {@code true} if this source is playing.
     */
    public boolean isPlaying() {
        int[] result = new int[1];
        al.alGetSourcei(sourceID, AL.AL_SOURCE_STATE, result, 0);
        return result[0] == AL.AL_PLAYING;
    }

    /**
     * Sets the pitch of the audio on this source. The pitch may be modified
     * without altering the playback speed of the audio.
     *
     * @param pitch the pitch value of this source.
     */
    public void setPitch(float pitch) {
        al.alSourcef(sourceID, AL.AL_PITCH, pitch);
    }

    /**
     * Gets the pitch of the audio on this source. The pitch may be modified
     * without altering the playback speed of the audio.
     *
     * @return the pitch value of this source.
     */
    public float getPitch() {
        float[] result = new float[1];
        al.alGetSourcef(sourceID, AL.AL_PITCH, result, 0);

        return result[0];
    }

    /**
     * Sets the gain of the audio on this source. This can be used to contro
     * the volume of the source.
     *
     * @param gain the gain of the audio on this source
     */
    public void setGain(float gain) {
        al.alSourcef(sourceID, AL.AL_GAIN, gain);
    }

    /**
     * Gets the gain of the audio on this source. This can be used to contro
     * the volume of the source.
     *
     * @return the gain of the audio on this source
     */
    public float getGain() {
        float[] result = new float[1];
        al.alGetSourcef(sourceID, AL.AL_GAIN, result, 0);

        return result[0];
    }

    /**
     * Sets the max distance where there will no longer be any attenuation of
     * the source.
     *
     * @param maxDistance the max ditance for source attentuation.
     */
    public void setMaxDistance(float maxDistance) {
        al.alSourcef(sourceID, AL.AL_MAX_DISTANCE, maxDistance);
    }

    /**
     * Gets the max distance where there will no longer be any attenuation of
     * the source.
     *
     * @return the max ditance for source attentuation.
     */
    public float getMaxDistance() {
        float[] result = new float[1];
        al.alGetSourcef(sourceID, AL.AL_MAX_DISTANCE, result, 0);

        return result[0];
    }

    /**
     * Sets the rolloff rate of the source. The default value is 1.0
     *
     * @param rolloffFactor the rolloff rate of the source.
     */
    public void setRolloffFactor(float rolloffFactor) {
        al.alSourcef(sourceID, AL.AL_ROLLOFF_FACTOR, rolloffFactor);
    }

    /**
     * Gets the rolloff rate of the source. The default value is 1.0
     *
     * @return the rolloff rate of the source.
     */
    public float getRolloffFactor() {
        float[] result = new float[1];
        al.alGetSourcef(sourceID, AL.AL_ROLLOFF_FACTOR, result, 0);

        return result[0];
    }

    /**
     * Sets the distance under which the volume for the source would normally
     * drop by half, before being influenced by rolloff factor or max distance.
     *
     * @param referenceDistance the reference distance for the source.
     */
    public void setReferenceDistance(float referenceDistance) {
        al.alSourcef(sourceID, AL.AL_REFERENCE_DISTANCE, referenceDistance);
    }

    /**
     * Gets the distance under which the volume for the source would normally
     * drop by half, before being influenced by rolloff factor or max distance.
     *
     * @return the reference distance for the source.
     */
    public float getReferenceDistance() {
        float[] result = new float[1];
        al.alGetSourcef(sourceID, AL.AL_REFERENCE_DISTANCE, result, 0);

        return result[0];
    }

    /**
     * Sets the minimum gain for this source.
     *
     * @param minGain the minimum gain for this source.
     */
    public void setMinGain(float minGain) {
        al.alSourcef(sourceID, AL.AL_MIN_GAIN, minGain);
    }

    /**
     * Gets the minimum gain for this source.
     *
     * @return the minimum gain for this source.
     */
    public float getMinGain() {
        float[] result = new float[1];
        al.alGetSourcef(sourceID, AL.AL_MIN_GAIN, result, 0);

        return result[0];
    }

    /**
     * Sets the maximum gain for this source.
     *
     * @param maxGain the maximum gain for this source
     */
    public void setMaxGain(float maxGain) {
        al.alSourcef(sourceID, AL.AL_MAX_GAIN, maxGain);
    }

    /**
     * SGets the maximum gain for this source.
     *
     * @return the maximum gain for this source
     */
    public float getMaxGain() {
        float[] result = new float[1];
        al.alGetSourcef(sourceID, AL.AL_MAX_GAIN, result, 0);

        return result[0];
    }

    /**
     * Sets the gain when outside the oriented cone.
     *
     * @param coneOuterGain the gain when outside the oriented cone.
     */
    public void setConeOuterGain(float coneOuterGain) {
        al.alSourcef(sourceID, AL.AL_CONE_OUTER_GAIN, coneOuterGain);
    }

    /**
     * Gets the gain when outside the oriented cone.
     *
     * @return the gain when outside the oriented cone.
     */
    public float getConeOuterGain() {
        float[] result = new float[1];
        al.alGetSourcef(sourceID, AL.AL_CONE_OUTER_GAIN, result, 0);

        return result[0];
    }

    /**
     * Sets the x,y,z position of the source.
     *
     * @param position a Vec3f object containing the x,y,z position of the
     * source.
     */
    public void setPosition(Vec3f position) {
        al.alSource3f(
            sourceID,
            AL.AL_POSITION,
            position.v1,
            position.v2,
            position.v3);
    }

    /**
     * Sets the x,y,z position of the source.
     *
     * @param x the x position of the source.
     * @param y the y position of the source.
     * @param z the z position of the source.
     */
    public void setPosition(float x, float y, float z) {
        al.alSource3f(sourceID, AL.AL_POSITION, x, y, z);
    }

    /**
     * Gets the x,y,z position of the source.
     *
     * @return a Vec3f object containing the x,y,z position of the
     * source.
     */
    public Vec3f getPosition() {
        Vec3f result = null;
        float[] pos = new float[3];
        al.alGetSourcefv(sourceID, AL.AL_POSITION, pos, 0);
        result = new Vec3f(pos[0], pos[1], pos[2]);

        return result;
    }

    /**
     * Sets the velocity vector of the source.
     *
     * @param velocity the velocity vector of the source
     */
    public void setVelocity(Vec3f velocity) {
        al.alSource3f(
            sourceID,
            AL.AL_VELOCITY,
            velocity.v1,
            velocity.v2,
            velocity.v3);
    }

    /**
     * Sets the velocity vector of the source.
     *
     * @param x the x velocity of the source.
     * @param y the y velocity of the source.
     * @param z the z velocity of the source.
     */
    public void setVelocity(float x, float y, float z) {
        al.alSource3f(sourceID, AL.AL_VELOCITY, x, y, z);
    }

    /**
     * Gets the velocity vector of the source.
     *
     * @return the velocity vector of the source
     */
    public Vec3f getVelocity() {
        Vec3f result = null;
        float[] vel = new float[3];
        al.alGetSourcefv(sourceID, AL.AL_VELOCITY, vel, 0);
        result = new Vec3f(vel[0], vel[1], vel[2]);

        return result;
    }

    /**
     * Sets the direction vector of the source.
     *
     * @param direction the direction vector of the source.
     */
    public void setDirection(Vec3f direction) {
        al.alSource3f(
            sourceID,
            AL.AL_DIRECTION,
            direction.v1,
            direction.v2,
            direction.v3);
    }

    /**
     * Sets the direction vector of the source.
     *
     * @param x the x direction of the source.
     * @param y the y direction of the source.
     * @param z the z direction of the source.
     */
    public void setDirection(float x, float y, float z) {
        al.alSource3f(sourceID, AL.AL_DIRECTION, x, y, z);
    }

    /**
     * Gets the direction vector of the source.
     *
     * @return the direction vector of the source.
     */
    public Vec3f getDirection() {
        Vec3f result = null;
        float[] dir = new float[3];
        al.alGetSourcefv(sourceID, AL.AL_DIRECTION, dir, 0);
        result = new Vec3f(dir[0], dir[1], dir[2]);

        return result;
    }

    /**
     * Determines if the position of the source is relative to the listener. 
     * The default is false.
     * @param isRelative true if the position of the source is relative
     * to the listener, false if the position of the source is relative to the 
     * world.
     */
    public void setSourceRelative(boolean isRelative) {
        int rel = isRelative ? 1 : 0;
        al.alSourcei(sourceID, AL.AL_SOURCE_RELATIVE, rel);
    }

    /**
     * Determines if the position of the source is relative to the listener. 
     * The default is false.
     * @return true if the position of the source is relative
     * to the listener, false if the position of the source is relative to the 
     * world.
     */
    public boolean isSourceRelative() {
        int[] result = new int[1];
        al.alGetSourcei(sourceID, AL.AL_SOURCE_RELATIVE, result, 0);

        return result[0] == 1;
    }

    /**
     * turns looping on or off. 
     *
     * @param isLooping true-looping is on, false-looping is off
     */
    public void setLooping(boolean isLooping) {
        int loop = isLooping ? 1 : 0;
        al.alSourcei(sourceID, AL.AL_LOOPING, loop);
    }

    /**
     * indicates whether looping is turned on or off. 
     *
     * @return true-looping is on, false-looping is off
     */
    public boolean getLooping() {
        boolean result = false;
        int[] tmp = new int[1];
        al.alGetSourcei(sourceID, AL.AL_LOOPING, tmp, 0);
        return tmp[0] == AL.AL_TRUE;
    }

    
    /**
     * Gets the number of buffers currently queued on this source. 
     * @return the number of buffers currently queued on this source.
     */
    public int getBuffersQueued() {
        int[] result = new int[1];
        al.alGetSourcei(sourceID, AL.AL_BUFFERS_QUEUED, result, 0);

        return result[0];
    }

    /**
     * Gets the number of buffers already processed on this source. 
     * @return the number of buffers already processed on this source.
     */
    public int getBuffersProcessed() {
        int[] result = new int[1];
        al.alGetSourcei(sourceID, AL.AL_BUFFERS_PROCESSED, result, 0);

        return result[0];
    }

    /**
     * Sets the buffer associated with this source.
     *
     * @param buffer the buffer associated with this source
     */
    public void setBuffer(Buffer buffer) {
        al.alSourcei(sourceID, AL.AL_BUFFER, buffer.bufferID);
        this.buffer = buffer;
    }

    /**
     * Gets the buffer associated with this source.
     *
     * @return the buffer associated with this source
     */
    public Buffer getBuffer() {
        return buffer;
    }

    /**
     * Queues one or more buffers on a source. Useful for streaming audio, 
     * buffers will be played in the order they are queued.
     *
     * @param buffers a set of initialized (loaded) buffers.
     */
    public void queueBuffers(Buffer[] buffers) {
        int numBuffers = buffers.length;
        int[] arr = new int[numBuffers];

        for (int i = 0; i < numBuffers; i++) {
            arr[i] = buffers[i].bufferID;
        }

        al.alSourceQueueBuffers(sourceID, numBuffers, arr, 0);
    }

    /**
     * Unqueues one or more buffers on a source.
     *
     * @param buffers a set of previously queued buffers.
     */
    public void unqueueBuffers(Buffer[] buffers) {
        int numBuffers = buffers.length;
        int[] arr = new int[numBuffers];

        for (int i = 0; i < numBuffers; i++) {
            arr[i] = buffers[i].bufferID;
        }

        al.alSourceUnqueueBuffers(sourceID, numBuffers, arr, 0);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy