summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2023-05-17 18:07:44 +0200
committerSven Gothel <[email protected]>2023-05-17 18:07:44 +0200
commit518ae3b1432f43ea6659f0622536fb2135eec9fa (patch)
tree5e4daac4cdef1efc6a1ab7057f95ab7f6cfd310c
parentb2b90538c2727709da4ed4efde84268700e2b7f8 (diff)
ALAudioSink: Enhance using AL_EXT_MCFORMATS (max channels == 8), AL_EXT_FLOAT32, AL_EXT_DOUBLE
Note: AL_SOFT_buffer_samples is n/a since openal-soft 1.18.0 ALHelpers.getALFormat(..) uses cached booleans for optionally used available extensions. Add DEBUG output for ALAudioSink.init() and ALAudioSink.isSupported(), allowing to track supported and used formats.
-rw-r--r--src/java/com/jogamp/openal/util/ALHelpers.java19
-rw-r--r--src/java/jogamp/openal/util/ALAudioSink.java59
2 files changed, 67 insertions, 11 deletions
diff --git a/src/java/com/jogamp/openal/util/ALHelpers.java b/src/java/com/jogamp/openal/util/ALHelpers.java
index 7c2b0d4..a666049 100644
--- a/src/java/com/jogamp/openal/util/ALHelpers.java
+++ b/src/java/com/jogamp/openal/util/ALHelpers.java
@@ -55,12 +55,19 @@ public class ALHelpers {
* @param alChannelLayout AL channel layout, see {@link #getDefaultALChannelLayout(int)}
* @param alSampleType AL sample type, see {@link #getALSampleType(int, boolean, boolean)}.
* @param hasSOFTBufferSamples true if having extension <code>AL_SOFT_buffer_samples</code>, otherwise false
+ * @param hasEXTMcFormats true if having extension <code>AL_EXT_MCFORMATS</code>, otherwise false
+ * @param hasEXTFloat32 true if having extension <code>AL_EXT_FLOAT32</code>, otherwise false
+ * @param hasEXTDouble true if having extension <code>AL_EXT_DOUBLE</code>, otherwise false
* @param al AL instance
* @param alExt ALExt instance
* @return AL buffer format
*/
public static final int getALFormat(final int alChannelLayout, final int alSampleType,
- final boolean hasSOFTBufferSamples, final AL al, final ALExt alExt) {
+ final boolean hasSOFTBufferSamples,
+ final boolean hasEXTMcFormats,
+ final boolean hasEXTFloat32,
+ final boolean hasEXTDouble,
+ final AL al, final ALExt alExt) {
int format = AL_NONE;
/* If using AL_SOFT_buffer_samples, try looking through its formats */
@@ -154,7 +161,7 @@ public class ALHelpers {
format = AL_FORMAT_MONO8;
else if(alChannelLayout == AL_STEREO_SOFT)
format = AL_FORMAT_STEREO8;
- else if(al.alIsExtensionPresent("AL_EXT_MCFORMATS"))
+ else if( hasEXTMcFormats )
{
if(alChannelLayout == AL_QUAD_SOFT)
format = al.alGetEnumValue("AL_FORMAT_QUAD8");
@@ -172,7 +179,7 @@ public class ALHelpers {
format = AL_FORMAT_MONO16;
else if(alChannelLayout == AL_STEREO_SOFT)
format = AL_FORMAT_STEREO16;
- else if(al.alIsExtensionPresent("AL_EXT_MCFORMATS"))
+ else if( hasEXTMcFormats )
{
if(alChannelLayout == AL_QUAD_SOFT)
format = al.alGetEnumValue("AL_FORMAT_QUAD16");
@@ -184,13 +191,13 @@ public class ALHelpers {
format = al.alGetEnumValue("AL_FORMAT_71CHN16");
}
}
- else if(alSampleType == AL_FLOAT_SOFT && al.alIsExtensionPresent("AL_EXT_FLOAT32"))
+ else if(alSampleType == AL_FLOAT_SOFT && hasEXTFloat32)
{
if(alChannelLayout == AL_MONO_SOFT)
format = al.alGetEnumValue("AL_FORMAT_MONO_FLOAT32");
else if(alChannelLayout == AL_STEREO_SOFT)
format = al.alGetEnumValue("AL_FORMAT_STEREO_FLOAT32");
- else if(al.alIsExtensionPresent("AL_EXT_MCFORMATS"))
+ else if( hasEXTMcFormats )
{
if(alChannelLayout == AL_QUAD_SOFT)
format = al.alGetEnumValue("AL_FORMAT_QUAD32");
@@ -202,7 +209,7 @@ public class ALHelpers {
format = al.alGetEnumValue("AL_FORMAT_71CHN32");
}
}
- else if(alSampleType == AL_DOUBLE_SOFT && al.alIsExtensionPresent("AL_EXT_DOUBLE"))
+ else if(alSampleType == AL_DOUBLE_SOFT && hasEXTDouble)
{
if(alChannelLayout == AL_MONO_SOFT)
format = al.alGetEnumValue("AL_FORMAT_MONO_DOUBLE");
diff --git a/src/java/jogamp/openal/util/ALAudioSink.java b/src/java/jogamp/openal/util/ALAudioSink.java
index 418da1f..824c227 100644
--- a/src/java/jogamp/openal/util/ALAudioSink.java
+++ b/src/java/jogamp/openal/util/ALAudioSink.java
@@ -57,7 +57,16 @@ import com.jogamp.openal.util.ALHelpers;
*/
public class ALAudioSink implements AudioSink {
+ /**
+ * [openal-soft >= 1.18.0](https://github.com/kcat/openal-soft/blob/master/ChangeLog)
+ * - Removed support for the AL_SOFT_buffer_samples and AL_SOFT_buffer_sub_data
+ * extensions. Due to conflicts with AL_EXT_SOURCE_RADIUS.
+ */
private static final String AL_SOFT_buffer_samples = "AL_SOFT_buffer_samples";
+ private static final String AL_EXT_MCFORMATS = "AL_EXT_MCFORMATS";
+ private static final String AL_EXT_FLOAT32 = "AL_EXT_FLOAT32";
+ private static final String AL_EXT_DOUBLE = "AL_EXT_DOUBLE";
+
private static final String ALC_EXT_thread_local_context = "ALC_EXT_thread_local_context";
private static final boolean DEBUG_TRACE;
private static final ALC alc;
@@ -68,6 +77,9 @@ public class ALAudioSink implements AudioSink {
private String deviceSpecifier;
private ALCdevice device;
private boolean hasSOFTBufferSamples;
+ private boolean hasEXTMcFormats;
+ private boolean hasEXTFloat32;
+ private boolean hasEXTDouble;
private boolean hasALC_thread_local_context;
private int preferredSampleRate;
private AudioFormat preferredAudioFormat;
@@ -194,8 +206,10 @@ public class ALAudioSink implements AudioSink {
if ( alc.alcGetError(device) != ALCConstants.ALC_NO_ERROR ) {
throw new RuntimeException(getThreadName()+": ALAudioSink: Error making OpenAL context current");
}
-
hasSOFTBufferSamples = al.alIsExtensionPresent(AL_SOFT_buffer_samples);
+ hasEXTMcFormats = al.alIsExtensionPresent(AL_EXT_MCFORMATS);
+ hasEXTFloat32 = al.alIsExtensionPresent(AL_EXT_FLOAT32);
+ hasEXTDouble = al.alIsExtensionPresent(AL_EXT_DOUBLE);
hasALC_thread_local_context = alc.alcIsExtensionPresent(null, ALC_EXT_thread_local_context) ||
alc.alcIsExtensionPresent(device, ALC_EXT_thread_local_context) ;
clearPreALError("init."+checkErrIter++);
@@ -218,8 +232,12 @@ public class ALAudioSink implements AudioSink {
System.out.println(" Version: "+alcvers[0]+"."+alcvers[1]);
System.out.println(" Extensions: "+alc.alcGetString(device, ALCConstants.ALC_EXTENSIONS));
System.out.println("ALAudioSink: hasSOFTBufferSamples "+hasSOFTBufferSamples);
+ System.out.println("ALAudioSink: hasEXTMcFormats "+hasEXTMcFormats);
+ System.out.println("ALAudioSink: hasEXTFloat32 "+hasEXTFloat32);
+ System.out.println("ALAudioSink: hasEXTDouble "+hasEXTDouble);
System.out.println("ALAudioSink: hasALC_thread_local_context "+hasALC_thread_local_context);
System.out.println("ALAudioSink: preferredAudioFormat "+preferredAudioFormat);
+ System.out.println("ALAudioSink: maxSupportedChannels "+getMaxSupportedChannels());
clearPreALError("init."+checkErrIter++);
}
@@ -391,7 +409,11 @@ public class ALAudioSink implements AudioSink {
if( !staticAvailable ) {
return 0;
}
- return hasSOFTBufferSamples ? 8 : 2;
+ if( hasEXTMcFormats || hasSOFTBufferSamples ) {
+ return 8;
+ } else {
+ return 2;
+ }
}
@Override
@@ -401,6 +423,9 @@ public class ALAudioSink implements AudioSink {
}
if( format.planar || !format.littleEndian ) {
// FIXME big-endian supported w/ SOFT where it's native format!
+ if( DEBUG ) {
+ System.err.println(getThreadName()+": ALAudioSink.isSupported: NO.0 "+format);
+ }
return false;
}
final int alChannelLayout = ALHelpers.getDefaultALChannelLayout(format.channelCount);
@@ -409,13 +434,29 @@ public class ALAudioSink implements AudioSink {
if( ALConstants.AL_NONE != alSampleType ) {
lockContext();
try {
- final int alFormat = ALHelpers.getALFormat(alChannelLayout, alSampleType, hasSOFTBufferSamples, al, alExt);
- return ALConstants.AL_NONE != alFormat;
+ final int alFormat = ALHelpers.getALFormat(alChannelLayout, alSampleType,
+ hasSOFTBufferSamples, hasEXTMcFormats, hasEXTFloat32, hasEXTDouble,
+ al, alExt);
+ if( ALConstants.AL_NONE != alFormat ) {
+ if( DEBUG ) {
+ System.err.println(getThreadName()+": ALAudioSink.isSupported: OK "+format+", alFormat "+toHexString(alFormat));
+ }
+ return true;
+ } else {
+ if( DEBUG ) {
+ System.err.println(getThreadName()+": ALAudioSink.isSupported: NO.1 "+format);
+ }
+ return false;
+ }
+
} finally {
unlockContext();
}
}
}
+ if( DEBUG ) {
+ System.err.println(getThreadName()+": ALAudioSink.isSupported: NO.X "+format);
+ }
return false;
}
@@ -429,12 +470,17 @@ public class ALAudioSink implements AudioSink {
lockContext();
try {
if( ALConstants.AL_NONE != alChannelLayout && ALConstants.AL_NONE != alSampleType ) {
- alFormat = ALHelpers.getALFormat(alChannelLayout, alSampleType, hasSOFTBufferSamples, al, alExt);
+ alFormat = ALHelpers.getALFormat(alChannelLayout, alSampleType,
+ hasSOFTBufferSamples, hasEXTMcFormats, hasEXTFloat32, hasEXTDouble,
+ al, alExt);
} else {
alFormat = ALConstants.AL_NONE;
}
if( ALConstants.AL_NONE == alFormat ) {
// not supported
+ if( DEBUG ) {
+ System.err.println(getThreadName()+": ALAudioSink.init: Not supported: "+requestedFormat+", "+toString());
+ }
return false;
}
// Allocate buffers
@@ -473,6 +519,9 @@ public class ALAudioSink implements AudioSink {
}
chosenFormat = requestedFormat;
+ if( DEBUG ) {
+ System.err.println(getThreadName()+": ALAudioSink.init: OK "+requestedFormat+", "+toString());
+ }
return true;
}