Let's try moving to modern 48kHz / 60Hz / unsyncd configuration? Add args.
We should bump to at least 21 here so I can use "record" classes.
This commit is contained in:
@@ -62,17 +62,71 @@ import static com.threerings.openal.Log.log;
|
|||||||
public class SoundManager
|
public class SoundManager
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Creates, initializes and returns the singleton sound manager instance.
|
* Initialization properties for the sound manager.
|
||||||
|
*
|
||||||
|
* @param frequency TODO
|
||||||
|
* @param refresh TODO
|
||||||
|
* @param sync TODO
|
||||||
|
*/
|
||||||
|
public static class InitArgs
|
||||||
|
{
|
||||||
|
public InitArgs (int frequency, int refresh, boolean sync)
|
||||||
|
{
|
||||||
|
_frequency = frequency;
|
||||||
|
_refresh = refresh;
|
||||||
|
_sync = sync;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int frequency () { return _frequency; }
|
||||||
|
public int refresh () { return _refresh; }
|
||||||
|
public boolean sync () { return _sync; }
|
||||||
|
|
||||||
|
private final int _frequency, _refresh;
|
||||||
|
private final boolean _sync;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Should be this:::: ARGH!
|
||||||
|
//public static record InitArgs (int frequency, int refresh, boolean sync) {}
|
||||||
|
|
||||||
|
// To move to a modern 48 kHz mixer, use 48000 / 60 here. (OpenAL picks driver
|
||||||
|
// defaults (often 48 kHz / 50 Hz), resamples our 44.1 kHz assets, and audibly degrades quality.
|
||||||
|
public static InitArgs getDefaultInitArgs ()
|
||||||
|
{
|
||||||
|
return new InitArgs(48000, 60, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Match the pre-LWJGL3 AL.create("", 44100, 15, false).
|
||||||
|
public static InitArgs getLegacyInitArgs ()
|
||||||
|
{
|
||||||
|
return new InitArgs(44100, 15, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates, initializes and returns the singleton sound manager instance with default
|
||||||
|
* parameters.
|
||||||
*
|
*
|
||||||
* @param rqueue a queue that the sound manager can use to post short runnables that must be
|
* @param rqueue a queue that the sound manager can use to post short runnables that must be
|
||||||
* executed on the same thread from which all other sound methods will be called.
|
* executed on the same thread from which all other sound methods will be called.
|
||||||
*/
|
*/
|
||||||
public static SoundManager createSoundManager (RunQueue rqueue)
|
public static SoundManager createSoundManager (RunQueue rqueue)
|
||||||
|
{
|
||||||
|
return createSoundManager(rqueue, getDefaultInitArgs());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates, initializes and returns the singleton sound manager instance.
|
||||||
|
*
|
||||||
|
* @param rqueue a queue that the sound manager can use to post short runnables that must be
|
||||||
|
* executed on the same thread from which all other sound methods will be called.
|
||||||
|
*
|
||||||
|
* @param args init arg for creating the openAL context, or null to not pass init args.
|
||||||
|
*/
|
||||||
|
public static SoundManager createSoundManager (RunQueue rqueue, InitArgs args)
|
||||||
{
|
{
|
||||||
if (_soundmgr != null) {
|
if (_soundmgr != null) {
|
||||||
throw new IllegalStateException("A sound manager has already been created.");
|
throw new IllegalStateException("A sound manager has already been created.");
|
||||||
}
|
}
|
||||||
_soundmgr = new SoundManager(rqueue);
|
_soundmgr = new SoundManager(rqueue, args);
|
||||||
return _soundmgr;
|
return _soundmgr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,7 +259,12 @@ public class SoundManager
|
|||||||
/**
|
/**
|
||||||
* Creates a sound manager and initializes the OpenAL sound subsystem.
|
* Creates a sound manager and initializes the OpenAL sound subsystem.
|
||||||
*/
|
*/
|
||||||
protected SoundManager (RunQueue rqueue)
|
protected SoundManager (RunQueue rqueue) // provided for backwards compatibility..?
|
||||||
|
{
|
||||||
|
this(rqueue, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected SoundManager (RunQueue rqueue, InitArgs args)
|
||||||
{
|
{
|
||||||
_rqueue = rqueue;
|
_rqueue = rqueue;
|
||||||
|
|
||||||
@@ -219,17 +278,19 @@ public class SoundManager
|
|||||||
}
|
}
|
||||||
ALCCapabilities deviceCaps = ALC.createCapabilities(_alcDevice);
|
ALCCapabilities deviceCaps = ALC.createCapabilities(_alcDevice);
|
||||||
|
|
||||||
// Match the pre-LWJGL3 AL.create("", 44100, 15, false). Without explicit attribs,
|
IntBuffer attribs;
|
||||||
// OpenAL picks driver defaults (often 48 kHz / 50 Hz), resamples our 44.1 kHz assets,
|
if (args == null) attribs = null;
|
||||||
// and audibly degrades quality. To move to a modern 48 kHz mixer, use 48000 / 60 here.
|
else {
|
||||||
IntBuffer attribs = BufferUtils.createIntBuffer(7);
|
attribs = BufferUtils.createIntBuffer(7);
|
||||||
attribs.put(ALC10.ALC_FREQUENCY).put(44100);
|
attribs.put(ALC10.ALC_FREQUENCY).put(args.frequency());
|
||||||
attribs.put(ALC10.ALC_REFRESH).put(15);
|
attribs.put(ALC10.ALC_REFRESH).put(args.refresh());
|
||||||
attribs.put(ALC10.ALC_SYNC).put(ALC10.ALC_FALSE);
|
attribs.put(ALC10.ALC_SYNC).put(args.sync() ? ALC10.ALC_TRUE : ALC10.ALC_FALSE);
|
||||||
attribs.put(0).flip();
|
attribs.put(0).flip();
|
||||||
|
}
|
||||||
_alcContext = ALC10.alcCreateContext(_alcDevice, attribs);
|
_alcContext = ALC10.alcCreateContext(_alcDevice, attribs);
|
||||||
ALC10.alcMakeContextCurrent(_alcContext);
|
ALC10.alcMakeContextCurrent(_alcContext);
|
||||||
AL.createCapabilities(deviceCaps);
|
AL.createCapabilities(deviceCaps);
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.warning("Failed to initialize sound system.", e);
|
log.warning("Failed to initialize sound system.", e);
|
||||||
// don't start the background loading thread
|
// don't start the background loading thread
|
||||||
|
|||||||
Reference in New Issue
Block a user