diff --git a/README.md b/README.md index 76b2cec..8655b26 100644 --- a/README.md +++ b/README.md @@ -36,13 +36,13 @@ Artifacts are available on maven central: org.sheinbergon jna-aac-encoder - 2.0.0 + 2.1.0 ``` **_Gradle_** ```groovy -compile 'org.sheinbergon:jna-aac-encoder:2.0.0' +compile 'org.sheinbergon:jna-aac-encoder:2.1.0' ``` #### Additional information @@ -51,7 +51,8 @@ compile 'org.sheinbergon:jna-aac-encoder:2.0.0' * Windows (64-bit) * OSX (Intel 64-bit / Apple Silicon, compiled with Xcode 13.3 SDK) * Tested with FDK-AAC version is 2.0.2 - * Lower `2.0.x` versions of FDK-AAC might work, but haven't been tested. + * Earlier `2.0.x` versions of FDK-AAC might work, but haven't been tested. + * For JDK 8 compatibility, please use version `2.0.0` of this library * For `0.1.6`/`0.1.5` FDK-AAC support and Windows 32 bit support, please use version `0.1.9` of this library ### Encoding using the JVM AudioSystem @@ -92,7 +93,7 @@ the encoding process to fail. Additional restrictions: * A maximum of 6 audio input/output channels - * Only the AAC-LC/HE-AAC/HE-AACv2 encoding profiles are supported + * Only the AAC-LC/HE-AAC/HE-AACv2 encoding profiles are supported ## Roadmap * Improved lower-level interface (with examples). diff --git a/build.gradle b/build.gradle index 3294d0e..f785b11 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ plugins { ext { depVersions = [ lombok : '1.18.30', - jna : '5.12.1', + jna : '5.13.0', commonsLang3: '3.14.0', jsr305 : '3.0.2' ] @@ -40,7 +40,7 @@ ext { } group 'org.sheinbergon' -version '2.0.0' +version '2.1.0' repositories { mavenCentral() @@ -74,7 +74,7 @@ dependencies { benchmarkImplementation "commons-io:commons-io:${benchmarkDepVersions.commonsIO}" } -sourceCompatibility = JavaVersion.VERSION_1_8 +sourceCompatibility = JavaVersion.VERSION_11 test { @@ -105,7 +105,7 @@ jacoco { } checkstyle { - toolVersion '9.3' + toolVersion '10.12.5' configFile file("$rootDir/checkstyle.xml") } diff --git a/src/benchmark/java/org/sheinbergon/aac/AACEncodingBenchmark.java b/src/benchmark/java/org/sheinbergon/aac/AACEncodingBenchmark.java index 2226a2e..8622e2a 100644 --- a/src/benchmark/java/org/sheinbergon/aac/AACEncodingBenchmark.java +++ b/src/benchmark/java/org/sheinbergon/aac/AACEncodingBenchmark.java @@ -25,7 +25,6 @@ import java.io.File; import java.io.IOException; import java.net.URL; -import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -41,12 +40,10 @@ public class AACEncodingBenchmark { private static final String AAC_ENC_COMMAND_TEMPLATE = AAC_ENC_BIN + " -r %d -t %d -a 1 %s %s"; @SuppressWarnings("MagicNumber") - private static final Map AAC_ENCODING_PROFILE_BITRATE_FACTOR = new HashMap() { - { - put(AACEncodingProfile.AAC_LC, 1.5f); - put(AACEncodingProfile.HE_AAC, 0.625f); - } - }; + private static final Map AAC_ENCODING_PROFILE_BITRATE_FACTOR = Map.of( + AACEncodingProfile.AAC_LC, 1.5f, + AACEncodingProfile.HE_AAC, 0.625f + ); private static final AudioFileFormat.Type WAV = AudioFileFormat.Type.WAVE; private static final String WAV_EXT = "." + WAV.getExtension(); @@ -60,14 +57,11 @@ public class AACEncodingBenchmark { private static final String INPUT_RESOURCE_NAME = "africa-toto.wav"; - private static final Map ENCODING_PROFILES_TO_FILE_TYPES = - new HashMap() { - { - put(AACEncodingProfile.AAC_LC, AACFileTypes.AAC_LC); - put(AACEncodingProfile.HE_AAC, AACFileTypes.AAC_HE); - put(AACEncodingProfile.HE_AAC_V2, AACFileTypes.AAC_HE_V2); - } - }; + private static final Map ENCODING_PROFILES_TO_FILE_TYPES = Map.of( + AACEncodingProfile.AAC_LC, AACFileTypes.AAC_LC, + AACEncodingProfile.HE_AAC, AACFileTypes.AAC_HE, + AACEncodingProfile.HE_AAC_V2, AACFileTypes.AAC_HE_V2 + ); /* This is manually set by each benchmark iteration. @Param annotations are not used * in order to allow better visualization via JMH visualizer. diff --git a/src/main/java/org/sheinbergon/aac/encoder/AACAudioEncoder.java b/src/main/java/org/sheinbergon/aac/encoder/AACAudioEncoder.java index 3227d01..140a1b9 100644 --- a/src/main/java/org/sheinbergon/aac/encoder/AACAudioEncoder.java +++ b/src/main/java/org/sheinbergon/aac/encoder/AACAudioEncoder.java @@ -23,8 +23,6 @@ import javax.annotation.concurrent.NotThreadSafe; import java.io.ByteArrayInputStream; import java.io.IOException; -import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Optional; import java.util.Set; @@ -34,16 +32,13 @@ public final class AACAudioEncoder implements AutoCloseable { @SuppressWarnings("MagicNumber") - private static final Set SAMPLE_RATES = new HashSet() { - { - add(16000); - add(22050); - add(24000); - add(32000); - add(44100); - add(48000); - } - }; + private static final Set SAMPLE_RATES = Set.of( + 16000, + 22050, + 24000, + 32000, + 44100, + 48000); // Some fdk-aac internal constants private static final int PARAMETRIC_STEREO_CHANNEL_COUNT = 2; @@ -107,13 +102,11 @@ public static class Builder { * @see fdk-aac/libAACenc/include/aacenc_lib.h */ @SuppressWarnings("MagicNumber") - private static final Map SAMPLES_TO_BIT_RATE_RATIO = new HashMap() { - { - put(AACEncodingProfile.AAC_LC, 1.5f); - put(AACEncodingProfile.HE_AAC, 0.625f); - put(AACEncodingProfile.HE_AAC_V2, 0.5f); - } - }; + private static final Map SAMPLES_TO_BIT_RATE_RATIO = Map.of( + AACEncodingProfile.AAC_LC, 1.5f, + AACEncodingProfile.HE_AAC, 0.625f, + AACEncodingProfile.HE_AAC_V2, 0.5f + ); // Defaults private boolean afterBurner = true; diff --git a/src/main/java/org/sheinbergon/aac/sound/AACFileWriter.java b/src/main/java/org/sheinbergon/aac/sound/AACFileWriter.java index 027ebd0..5ce5188 100644 --- a/src/main/java/org/sheinbergon/aac/sound/AACFileWriter.java +++ b/src/main/java/org/sheinbergon/aac/sound/AACFileWriter.java @@ -17,7 +17,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; -import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -29,14 +28,11 @@ public final class AACFileWriter extends AudioFileWriter { private static final int INPUT_BUFFER_MULTIPLIER = 16; - private static final Map FILE_TYPES_TO_ENCODING_PROFILES = - new HashMap() { - { - put(AACFileTypes.AAC_LC, AACEncodingProfile.AAC_LC); - put(AACFileTypes.AAC_HE, AACEncodingProfile.HE_AAC); - put(AACFileTypes.AAC_HE_V2, AACEncodingProfile.HE_AAC_V2); - } - }; + private static final Map FILE_TYPES_TO_ENCODING_PROFILES = Map.of( + AACFileTypes.AAC_LC, AACEncodingProfile.AAC_LC, + AACFileTypes.AAC_HE, AACEncodingProfile.HE_AAC, + AACFileTypes.AAC_HE_V2, AACEncodingProfile.HE_AAC_V2 + ); @Override public AudioFileFormat.Type[] getAudioFileTypes() { diff --git a/src/test/java/org/sheinbergon/aac/MediaInfoSupport.java b/src/test/java/org/sheinbergon/aac/MediaInfoSupport.java index 24f24a1..9e6ac85 100644 --- a/src/test/java/org/sheinbergon/aac/MediaInfoSupport.java +++ b/src/test/java/org/sheinbergon/aac/MediaInfoSupport.java @@ -6,8 +6,7 @@ import javax.sound.sampled.AudioFormat; import java.io.File; -import java.util.Arrays; -import java.util.HashSet; +import java.util.Set; @SuppressWarnings("MissingJavadocMethod") public final class MediaInfoSupport { @@ -35,19 +34,19 @@ public static void assertAACOutput( final AACEncodingProfile profile) { boolean opened = false; try { - if (opened = MEDIA_INFO.open(aac)) { + if (!(opened = MEDIA_INFO.open(aac))) { + throw new IllegalStateException("Could not open AAC file " + aac + " via the mediainfo shared library"); + } else { Assertions .assertEquals(EXPECTED_AUDIO_STREAMS_COUNT, MEDIA_INFO.streamCount(MediaInfoLibFacade.StreamKind.Audio)); Assertions.assertEquals(inputFormat.getSampleRate(), Float.valueOf(getParam("SamplingRate")).floatValue()); Assertions.assertEquals(inputFormat.getChannels(), Integer.valueOf(getParam("Channel(s)")).intValue()); Assertions.assertEquals(AAC_MEDIAINFO_FORMAT, getParam("Format")); - Assertions.assertTrue(new HashSet<>(Arrays.asList( + Assertions.assertTrue(Set.of( getParam("Format_AdditionalFeatures"), getParam("Format_Commercial") - )).contains(profile.code())); - } else { - throw new IllegalStateException("Could not open AAC file " + aac + " via the mediainfo shared library"); + ).contains(profile.code())); } } finally { if (opened) { diff --git a/src/test/java/org/sheinbergon/aac/sound/AACFileWriterTest.java b/src/test/java/org/sheinbergon/aac/sound/AACFileWriterTest.java index f475686..d0646d0 100644 --- a/src/test/java/org/sheinbergon/aac/sound/AACFileWriterTest.java +++ b/src/test/java/org/sheinbergon/aac/sound/AACFileWriterTest.java @@ -48,7 +48,7 @@ public void supportedAudioInput() throws UnsupportedAudioFileException, IOExcept @DisplayName("Unsupported audio input") public void unsupportedAudioEncoding() throws IOException { val aac = TestSupport.tempAACOutputFile(); - Assertions.assertThrows(UnsupportedAudioFileException.class, () -> { + Assertions.assertThrows(IllegalArgumentException.class, () -> { try (val input = TestSupport.unsupported24bitWAVAudioInputStream()) { writer.write(input, AACFileTypes.AAC_LC, aac); } finally {