LWJGL Forum

Programming => OpenAL => Topic started by: Cottonwood on December 12, 2010, 21:59:56

Title: [solved] lwjgl-2.6 sample lesson2; looking for the source code ;)
Post by: Cottonwood on December 12, 2010, 21:59:56
I tried to build the source code for the lesson 2 by updating the source from lesson 1 using the comments in between the code snippets of Lesson2. Including the method kbhit() from the download this leaded to the following code:
import java.io.IOException;
import java.io.FileNotFoundException;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.util.Scanner;

import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.openal.AL;
import org.lwjgl.openal.AL10;
import org.lwjgl.util.WaveData;
import org.lwjgl.Sys;

public class Lesson2 {
 /** Buffers hold sound data. */
 IntBuffer buffer = BufferUtils.createIntBuffer(1);

 /** Sources are points emitting sound. */
 IntBuffer source = BufferUtils.createIntBuffer(1);

 /** Position of the source sound. */
 FloatBuffer sourcePos = (FloatBuffer)BufferUtils.createFloatBuffer(3).put(new float[] { 0.0f, 0.0f, 0.0f }).rewind();

 /** Velocity of the source sound. */
 FloatBuffer sourceVel = (FloatBuffer)BufferUtils.createFloatBuffer(3).put(new float[] { 0.0f, 0.0f, 0.1f }).rewind();

 /** Position of the listener. */
 FloatBuffer listenerPos = (FloatBuffer)BufferUtils.createFloatBuffer(3).put(new float[] { 0.0f, 0.0f, 0.0f }).rewind();

 /** Velocity of the listener. */
 FloatBuffer listenerVel = (FloatBuffer)BufferUtils.createFloatBuffer(3).put(new float[] { 0.0f, 0.0f, 0.0f }).rewind();

 /** Orientation of the listener. (first 3 elements are "at", second 3 are "up") */
 FloatBuffer listenerOri = (FloatBuffer)BufferUtils.createFloatBuffer(6).put(new float[] { 0.0f, 0.0f, -1.0f,  0.0f, 1.0f, 0.0f }).rewind();

 /**
 * boolean LoadALData()
 *
 *  This function will load our sample data from the disk using the Alut
 *  utility and send the data into OpenAL as a buffer. A source is then
 *  also created to play that buffer.
 */
 int loadALData() {
   // Load wav data into a buffer.
   AL10.alGenBuffers(buffer);

   if(AL10.alGetError() != AL10.AL_NO_ERROR)
     return AL10.AL_FALSE;

   //Loads the wave file from your file system
   /*java.io.FileInputStream fin = null;
   try {
     fin = new java.io.FileInputStream("Footsteps.wav");
   } catch (java.io.FileNotFoundException ex) {
     ex.printStackTrace();
     return AL10.AL_FALSE;
   }
   WaveData waveFile = WaveData.create(fin);
   try {
     fin.close();
   } catch (java.io.IOException ex) {
   }*/

   //Loads the wave file from this class's package in your classpath
   WaveData waveFile = WaveData.create("Footsteps.wav");

   AL10.alBufferData(buffer.get(0), waveFile.format, waveFile.data, waveFile.samplerate);
   waveFile.dispose();

   // Bind the buffer with the source.
   AL10.alGenSources(source);

   if (AL10.alGetError() != AL10.AL_NO_ERROR)
     return AL10.AL_FALSE;

   AL10.alSourcei(source.get(0), AL10.AL_BUFFER,   buffer.get(0) );
   AL10.alSourcef(source.get(0), AL10.AL_PITCH,    1.0f          );
   AL10.alSourcef(source.get(0), AL10.AL_GAIN,     1.0f          );
   AL10.alSource (source.get(0), AL10.AL_POSITION, sourcePos     );
   AL10.alSource (source.get(0), AL10.AL_VELOCITY, sourceVel     );
   AL10.alSourcei(source.get(0), AL10.AL_LOOPING,  AL10.AL_TRUE  );

   // Do another error check and return.
   if (AL10.alGetError() == AL10.AL_NO_ERROR)
     return AL10.AL_TRUE;

   return AL10.AL_FALSE;
 }

 /**
  * void setListenerValues()
  *
  *  We already defined certain values for the Listener, but we need
  *  to tell OpenAL to use that data. This function does just that.
  */
 void setListenerValues() {
   AL10.alListener(AL10.AL_POSITION,    listenerPos);
   AL10.alListener(AL10.AL_VELOCITY,    listenerVel);
   AL10.alListener(AL10.AL_ORIENTATION, listenerOri);
 }

 /**
  * void killALData()
  *
  *  We have allocated memory for our buffers and sources which needs
  *  to be returned to the system. This function frees that memory.
  */
 void killALData() {
   AL10.alDeleteSources(source);
   AL10.alDeleteBuffers(buffer);
 }

 public static void main(String[] args) {
   new Lesson2().execute();
 }

 /**
  *  Check for keyboard hit
  */  
 private boolean kbhit() {
   try {
     return (System.in.available() != 0);
   } catch (IOException ioe) {
   }
   return false;
 }  

 public void execute() {
   // Initialize OpenAL and clear the error bit.
   try{
     AL.create();
   } catch (LWJGLException le) {
     le.printStackTrace();
     return;
   }
   AL10.alGetError();

   // Load the wav data.
   if(loadALData() == AL10.AL_FALSE) {
     System.out.println("Error loading data.");
     return;
   }

   setListenerValues();

   // Loop.
   long time = Sys.getTime();
   long elapse = 0;

   while (!kbhit()) {
    elapse += Sys.getTime() - time;
    time += elapse;

    if (elapse > 5000) {
     elapse = 0;

     sourcePos.put(0, sourcePos.get(0) + sourceVel.get(0));
     sourcePos.put(1, sourcePos.get(1) + sourceVel.get(1));
     sourcePos.put(2, sourcePos.get(2) + sourceVel.get(2));

     AL10.alSource(source.get(0), AL10.AL_POSITION, sourcePos);
     };
   }
   killALData();
 }
}


When the program runs only the core temperature increases. But there are no footsteps.

What's wrong?

//Edit: I could fix the "temperature problem" with a sleep(100):
     AL10.alSource(source.get(0), AL10.AL_POSITION, sourcePos);
     };
     try{
         Thread.sleep(100);
     }
     catch(InterruptedException e){
         System.out.println("Sleep Interrupted");
     }
   }
   killALData();


But the missing sound problem remains.
Title: Re: lwjgl-2.6 sample lesson2; looking for the source code ;)
Post by: Cottonwood on December 13, 2010, 22:35:05
If I'd taken the last code snippet from the downloaded zip the program would have worked earlier. Now it does.
Here's the working code.
import java.io.IOException;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;

import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.openal.AL;
import org.lwjgl.openal.AL10;
import org.lwjgl.util.WaveData;
import org.lwjgl.Sys;

public class Lesson2 {
    /** Buffers hold sound data. */
    IntBuffer buffer = BufferUtils.createIntBuffer(1);

    /** Sources are points emitting sound. */
    IntBuffer source = BufferUtils.createIntBuffer(1);

    /** Position of the source sound. */
    FloatBuffer sourcePos = (FloatBuffer)BufferUtils.createFloatBuffer(3).put(new float[] { 0.0f, 0.0f, 0.0f }).rewind();

    /** Velocity of the source sound. */
    FloatBuffer sourceVel = (FloatBuffer)BufferUtils.createFloatBuffer(3).put(new float[] { 0.0f, 0.0f, 0.1f }).rewind();

    /** Position of the listener. */
    FloatBuffer listenerPos = (FloatBuffer)BufferUtils.createFloatBuffer(3).put(new float[] { 0.0f, 0.0f, 0.0f }).rewind();

    /** Velocity of the listener. */
    FloatBuffer listenerVel = (FloatBuffer)BufferUtils.createFloatBuffer(3).put(new float[] { 0.0f, 0.0f, 0.0f }).rewind();

    /** Orientation of the listener. (first 3 elements are "at", second 3 are "up") */
    FloatBuffer listenerOri = (FloatBuffer)BufferUtils.createFloatBuffer(6).put(new float[] { 0.0f, 0.0f, -1.0f,    0.0f, 1.0f, 0.0f }).rewind();

    /**
    * boolean LoadALData()
    *
    *    This function will load our sample data from the disk using the Alut
    *    utility and send the data into OpenAL as a buffer. A source is then
    *    also created to play that buffer.
    */
    int loadALData() {
        // Load wav data into a buffer.
        AL10.alGenBuffers(buffer);

        if(AL10.alGetError() != AL10.AL_NO_ERROR)
            return AL10.AL_FALSE;
/*
        //Loads the wave file from your file system
        java.io.FileInputStream fin = null;
        try {
            fin = new java.io.FileInputStream("Footsteps.wav");
        } catch (java.io.FileNotFoundException ex) {
            System.out.println("Datei nicht gefunden.");
            ex.printStackTrace();
            return AL10.AL_FALSE;
        }
    System.out.println("Datei geöffnet.");
        WaveData waveFile = WaveData.create(fin);
        try {
            fin.close();
        } catch (java.io.IOException ex) {
        }
*/
        //Loads the wave file from this class's package in your classpath
        WaveData waveFile = WaveData.create("Footsteps.wav");

        AL10.alBufferData(buffer.get(0), waveFile.format, waveFile.data, waveFile.samplerate);
        waveFile.dispose();

        // Bind the buffer with the source.
        AL10.alGenSources(source);

        if (AL10.alGetError() != AL10.AL_NO_ERROR)
            return AL10.AL_FALSE;

        AL10.alSourcei(source.get(0), AL10.AL_BUFFER,     buffer.get(0) );
        AL10.alSourcef(source.get(0), AL10.AL_PITCH,        1.0f                    );
        AL10.alSourcef(source.get(0), AL10.AL_GAIN,         1.0f                    );
        AL10.alSource (source.get(0), AL10.AL_POSITION, sourcePos         );
        AL10.alSource (source.get(0), AL10.AL_VELOCITY, sourceVel         );
        AL10.alSourcei(source.get(0), AL10.AL_LOOPING,    AL10.AL_TRUE    );

        // Do another error check and return.
        if (AL10.alGetError() == AL10.AL_NO_ERROR)
            return AL10.AL_TRUE;

        return AL10.AL_FALSE;
    }

    /**
     * void setListenerValues()
     *
     *    We already defined certain values for the Listener, but we need
     *    to tell OpenAL to use that data. This function does just that.
     */
    void setListenerValues() {
        AL10.alListener(AL10.AL_POSITION,        listenerPos);
        AL10.alListener(AL10.AL_VELOCITY,        listenerVel);
        AL10.alListener(AL10.AL_ORIENTATION, listenerOri);
    }

    /**
     * void killALData()
     *
     *    We have allocated memory for our buffers and sources which needs
     *    to be returned to the system. This function frees that memory.
     */
    void killALData() {
        AL10.alDeleteSources(source);
        AL10.alDeleteBuffers(buffer);
    }

    public static void main(String[] args) {
        new Lesson2().execute();
    }

    public void execute() {

        // Initialize OpenAL and clear the error bit.
        try{
            AL.create();
        } catch (LWJGLException le) {
            le.printStackTrace();
            return;
        }

        AL10.alGetError();

        // Load the wav data.
        if(loadALData() == AL10.AL_FALSE) {
            System.out.println("Error loading data.");
            return;
        }

        setListenerValues();

        AL10.alSourcePlay(source.get(0));

        // Loop.
        long time = Sys.getTime();
        long elapse = 0;

        System.out.println("Press ENTER to exit");

        while (!kbhit()) {
            elapse += Sys.getTime() - time;
            time += elapse;

            if (elapse > 5000) {
                elapse = 0;

                sourcePos.put(0, sourcePos.get(0) + sourceVel.get(0));
                sourcePos.put(1, sourcePos.get(1) + sourceVel.get(1));
                sourcePos.put(2, sourcePos.get(2) + sourceVel.get(2));

                AL10.alSource(source.get(0), AL10.AL_POSITION, sourcePos);
            };
            try{
                    Thread.sleep(100);
            }
            catch(InterruptedException e){
                    System.out.println("Sleep Interrupted");
            }
        }
        killALData();
        AL.destroy();
    }
    /**
     *    Check for keyboard hit
     */   
    private boolean kbhit() {
        try {
            return (System.in.available() != 0);
        } catch (IOException ioe) {
        }
        return false;
    }
}