Jump to content
  • Advertisement
Sign in to follow this  
Achilleos

OpenAL: Listener Position has no effect

This topic is 3608 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, might it be that the listener position has no effect? Simple example: In the joal tutorial LoopingAndFadeAway the sound source is shifted at linear speed in z-direction. The sound gets quieter. If instead the source is fixed and the listener is shifted at linear speed in (-z)-direction nothing happens. Here is the tutorial source with the commented block at line 130.
/**
* 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 MIDROSYSTEMS, 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.
*
* Created on Jun 24, 2003
*/

import java.nio.ByteBuffer;

import net.java.games.joal.AL;
import net.java.games.joal.ALC;
import net.java.games.joal.ALFactory;
import net.java.games.joal.util.ALut;

/**
 * @author Athomas Goldberg
 *
 */
public class LoopingAndFadeaway {

    static int[] buffer = new int[1];
    static int[] source = new int[1];
    static float[] sourcePos = { 0.0f, 0.0f, 0.0f };
    static float[] sourceVel = { 0.0f, 0.0f, 0.1f };
    static float[] listenerPos = { 0.0f, 0.0f, 0.0f };
    static float[] listenerVel = { 0.0f, 0.0f, -0.1f };
    static float[] listenerOri = { 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f };
    static AL al;
    static ALC alc;

    static int loadALData() {
        if (al.alGetError() != AL.AL_NO_ERROR) {
            return AL.AL_FALSE;
        }

        int[] format = new int[1];
        int[] size = new int[1];
        ByteBuffer[] data = new ByteBuffer[1];
        int[] freq = new int[1];
        int[] loop = new int[1];

        // Load wav data into a buffer.
        al.alGenBuffers(1, buffer, 0);
        if (al.alGetError() != AL.AL_NO_ERROR)
            return AL.AL_FALSE;

        ALut.alutLoadWAVFile(
            "wavdata/Footsteps.wav",
            format, data, size, freq, loop);
        al.alBufferData(buffer[0], format[0], data[0], size[0], freq[0]);
        System.out.println("bufferID " + buffer[0]);

        al.alGenSources(1, source, 0);
        System.out.println("sourceID " + source[0]);
        al.alSourcei(source[0], AL.AL_BUFFER, buffer[0]);
        al.alSourcef(source[0], AL.AL_PITCH, 1.0f);
        al.alSourcef(source[0], AL.AL_GAIN, 1.0f);
        al.alSourcefv(source[0], AL.AL_POSITION, sourcePos, 0);
        al.alSourcefv(source[0], AL.AL_POSITION, sourceVel, 0);
        al.alSourcei(source[0], AL.AL_LOOPING, AL.AL_TRUE);

        if (al.alGetError() != AL.AL_NO_ERROR) {
            return AL.AL_FALSE;
        }

        return AL.AL_TRUE;
    }

    static void setListenerValues() {
        al.alListenerfv(AL.AL_POSITION, listenerPos, 0);
        al.alListenerfv(AL.AL_VELOCITY, listenerVel, 0);
        al.alListenerfv(AL.AL_ORIENTATION, listenerOri, 0);
    }

    static void killAllData() {
        al.alDeleteBuffers(1, buffer, 0);
        al.alDeleteSources(1, source, 0);
    }

    public static void main(String[] args) {
        try {
            ALut.alutInit();
            al = ALFactory.getAL();
        } catch(Exception e) {
            e.printStackTrace();
            return;
        }

        if(loadALData() == AL.AL_FALSE) {
            System.exit(1);
        }; 
        al.alSourcePlay(source[0]);
        long startTime = System.currentTimeMillis();
        long elapsed = 0;
        long ticker = 0;
        long lastTime = 0;
        while (elapsed < 10000) {
            elapsed = System.currentTimeMillis() - startTime;            
            if (ticker > 100)
            {
              ticker = 0;
//              sourcePos[0] += sourceVel[0];
//              sourcePos[1] += sourceVel[1];
//              sourcePos[2] += sourceVel[2];
//              al.alSourcefv(source[0], AL.AL_POSITION, sourcePos, 0);
              listenerPos[0] += listenerVel[0];
              listenerPos[1] += listenerVel[1];
              listenerPos[2] += listenerVel[2];
              al.alListenerfv(AL.AL_POSITION, listenerPos, 0);
            }
            ticker += System.currentTimeMillis() - lastTime;
            lastTime = System.currentTimeMillis(); 
        }
        ALut.alutExit();
    }
}


What did I not mention? The listener position is always at default vec3(0.0)... Any suggestions? Thanks, Achilleos.

Share this post


Link to post
Share on other sites
Advertisement
Hi,

Try the following :

- Check the WAV file you're loading. If it contains more than one channel (ie it's not MONO), then OpenAL will not spatialize it. You can check the "format" variable, if it's not AL_FORMAT_MONO8 or AL_FORMAT_MONO16, then it's not MONO.

- Instrument your code : put this

System.out.println("Listener pos : x:" + listenerPos[0] + " y: " + listenerPos[1] + " z: " + listenerPos[2]);


after you set the listener position (after the commented block). And add lines like this where you want to know what your code is doing.

- It seems like you never call setListenerValues() and killAllData(), maybe you forgot it.

Hope these tips help,
Vico87

Share this post


Link to post
Share on other sites
Thanks for your answer.
The wav is mono and the positioning is working when the source position is altered. The codes has some flaws but its "nearly" completly the source of the tutorial #2 from here:
https://joal-demos.dev.java.net/devmaster/lesson2.html

And the listener position is updated too.
This is the complete source, just take it, bind the joal lib and test it.

I have chosen this little code brick just for demonstration purposes. The application i am working on is a complete game engine. The orientation works as aspected but had some direction issues. I needed some time to figure out that the listener position always is at center of the openal coordinate system.
I searched for the bug and after some testing i tried to manipulate the most easiest code brick available: the beginner tutorial #2. And voilá: the same issue is present.

If its a real bug in the api i would have expected some other to discuss about this topic... so i guess there is some minor thing i did not mention. At least there is a "dirty hack" to start working with the sound: just add the listener position to every source position. But the outcome is not the same...

Share this post


Link to post
Share on other sites
I know the problem then. You must set the source to interpret its position as absolute and not relative to the listener. You do this with the following line of code :
alSourcei(id, AL_SOURCE_RELATIVE, AL_FALSE);

Share this post


Link to post
Share on other sites
The initial value for AL_SOURCE_RELATIVE is AL_FALSE, thats not the mistake.
Actually i was at home yesterday and wanted to replay immediatly back. But, as it should be, i tested your comment first. And the unbelievable happened: it worked!
Even without added this line of code!

So i thought that i maybe fixed the issue by the way and did not mention it. But there was a feeling that i was wrong with it. And i was. At work, the listener has no effect.

Thats what i figured out until now:
My PC at home has a creative labs soundblaster X-FI Xtreme Audio. Here everything works as expected (and like its written in the API docu).
At work, the PC has a SoundMax Integrated Digital HD Audio. The driver installed is not recognized by OpenAL, so i got 2 devices "Generic Hardware" and "Generic Software". Meaning DirectSound and DirectSound3D.

The tutorial uses Alut to initialize the audio device and to create the context. Mabye, its a driver issue... i will update the driver tomorrow and reply back.

Greetings.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!