I have posted some questions about applets vs. applications on the lwjgl forums, so I am just waiting for a response before I can provide more information about that issue. In the mean time, I have been tackling the other things that SoundManager needs fixed. Operating on the assumption that the exception showing up randomly is related to OpenAl running out of channels and quietly culling sources, I added in some checks in the "new source" method, and a couple of other places, that dynamicly change the value for maximum source number based on available voice channels. So far I have not gotten the exception in any of my tests, so I believe that problem is now fixed. I have also located the logic error that was making the SoundManager forget which sources were playing before being culled, so I have removed that temporary hack, and the SoundManager now behaves exactly the way it should. One final thing I am adding is "priority sources". These sources will not be subject to culling based on distance (such as background music).
So at this point, this project is nearly complete. The next release should be perfectly functionable in just about any project (although probably more compatible if used in applications than if used in applets). Only restriction is you need to keep the number of active sound sources to 500 or less at any given time. I am just waiting on the verdict from the lwjgl forums before I release the source. I am going to do a bit of streamlining and commenting in the meantime.
Just so I have something to do, I am considering rewriting another SoundManager completely from scratch, using a different approach. In the current SoundManager, the whole focus is on sources, and culling or reactivating them based on distance from listener. I want to try a different approach, focused on soundcard voice channels rather than on sources. In this new approach, I would set up all the active channels I could when the sound manager is created. Then when a source requests to play, it will play on the next available channel. If no channels are open, it will not play, and if it is a looping source, it will wait for a channel to open up. Calling "play()" will not actually play the sound, it will just set a flag telling SoundManager that the user requested to play the sound. Then on a seperate thread, the Sound Manager will sort the sounds by distance, then go down the list and start playing as many as it can on the available channels.
The whole point of making another SoundManager would be just to see which method is faster and can handle more sources. If the new SoundManager works better, I will discard the old one and release the new one. If not, at least it will be good programming practice