multiple sounds in openal

just a question i’m messing around with the space invaders demo, trying to understand how openal works, but i’m having problems playing more then one sound at a time if i do try play another sound the sound that is currently running restarts, and new one is not played, i’ve had a look at some of the tutorials but just can’t get it to run, i think it may need a for loop or something in the playSound() method, but not sure any help would, thx



package org.newdawn.spaceinvaders;
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.test.openal.WaveData;


/**
 * $Id: SoundManager.java,v 1.1 2004/06/12 19:59:20 matzon Exp $
 * <p>
 * Simple sound manager for OpenAL using n sources accessed in
 * a round robin schedule. Source n is reserved for a single buffer and checking for
 * whether it's playing.
 * </p>
 * @author Brian Matzon <brian@matzon.dk>
 * @version $Revision: 1.1 $
 */
public class SoundManager {

  /** We support at most 256 buffers*/
  private int[] buffers = new int[256];
  
  /** Number of sources is limited tby user (and hardware) */
  private int[] sources;
  
  /** Our internal scratch buffer */
  private IntBuffer scratchBuffer = BufferUtils.createIntBuffer(256);
  
  /** Whether we're running in no sound mode */
  private boolean soundOutput;
  
  /** Current index in our buffers */
  private int bufferIndex;
  
  /** Current index in our source list */
  private int sourceIndex;
  
  /**
   * Creates a new SoundManager
   */
  public SoundManager() {
  }

  /**
   * Plays a sound effect
   * @param buffer Buffer index to play gotten from addSound 
   */
  public void playEffect(int buffer) {
    if(soundOutput) {
      // make sure we never choose last channel, since it is used for special sounds
          int channel = sources[(sourceIndex++ % (sources.length-1))];
      
      // link buffer and source, and play it
          AL10.alSourcei(channel, AL10.AL_BUFFER, buffers[buffer]);
          AL10.alSourcePlay(channel);
    }
  }

  /**
   * Plays a sound on last source
   * @param buffer Buffer index to play gotten from addSound
   */
  public void playSound(int buffer) {
    if(soundOutput) {
      AL10.alSourcei(sources[sources.length-1], AL10.AL_BUFFER, buffers[buffer]);
      AL10.alSourcePlay(sources[sources.length-1]);
    }
  }
  
  /**
   * Whether a sound is playing on last source
   * @return true if a source is playing right now on source n
   */
  public boolean isPlayingSound() {
        return AL10.alGetSourcei(sources[sources.length-1], AL10.AL_SOURCE_STATE) == AL10.AL_PLAYING;
  }
  
  /**
   * Initializes the SoundManager
   * 
   * @param sources Number of sources to create
   */
  public void initialize(int channels) {
    try {
     AL.create();
     
     // allocate sources
     scratchBuffer.limit(channels);
     AL10.alGenSources(scratchBuffer);
     scratchBuffer.rewind();
     scratchBuffer.get(sources = new int[channels]);
     
     // could we allocate all channels?
     if(AL10.alGetError() != AL10.AL_NO_ERROR) {
           throw new LWJGLException("Unable to allocate " + channels + " sources");
     }
     
     // we have sound
     soundOutput = true;
    } catch (LWJGLException le) {
          le.printStackTrace();
      System.out.println("Sound disabled");
    }
  }
  
  /**
   * Adds a sound to the Sound Managers pool
   * 
   * @param path Path to file to load
   * @return index into SoundManagers buffer list
   */
  public int addSound(String path) {
    // Generate 1 buffer entry
    scratchBuffer.rewind().position(0).limit(1);
    AL10.alGenBuffers(scratchBuffer);
    buffers[bufferIndex] = scratchBuffer.get(0);
    
    // load wave data from buffer
    WaveData wavefile = WaveData.create("sounds/" + path);

    // copy to buffers
    AL10.alBufferData(buffers[bufferIndex], wavefile.format, wavefile.data, wavefile.samplerate);
    
    // unload file again
    wavefile.dispose();        
    
    // return index for this sound
        return bufferIndex++;
  }
  
  /**
   * Destroy this SoundManager
   */
  public void destroy() {
    if(soundOutput) {
      
      // stop playing sounds
      scratchBuffer.position(0).limit(sources.length);
      scratchBuffer.put(sources).flip();
      AL10.alSourceStop(scratchBuffer);

      // destroy sources
      AL10.alDeleteSources(scratchBuffer);
      
      // destroy buffers
      scratchBuffer.position(0).limit(bufferIndex);
      scratchBuffer.put(buffers, 0, bufferIndex).flip();
      AL10.alDeleteBuffers(scratchBuffer);
      
      // destory OpenAL
          AL.destroy();
    }
  }
}

Hehe - thats because the SoundManager I wrote for Space Invaders has two methods to make sound output.
1 - playSound - This method ALWAYS uses the last channel to play on. That way I can guarentee that no one else is using that slot.
2 - playEffect - this method uses all channels BUT the last one. Any already playing sounds will be cut.

Apparently you have been testing playSound all the time :wink:

[quote]Apparently you have been testing playSound all the time :wink:
[/quote]
:oGAH, how could i miss that, thanks for the help.:wink:

bangs head repeatedly against wall