OggVorbisInfo class

Пакет: com.hypixel.hytale.server.core.asset.common

Файл: com/hypixel/hytale/server/core/asset/common/OggVorbisInfoCache.java

Поля (3)

МодификаторыТипИмя
public final int channels
public final double duration
public final int sampleRate

Методы (1)

МодификаторыВозвратСигнатура
public String toStringpublic String toString()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.asset.common;

class="kw">import com.hypixel.hytale.common.util.CompletableFutureUtil;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.util.io.MemorySegmentUtil;
class="kw">import java.lang.foreign.MemorySegment;
class="kw">import java.util.Map;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class OggVorbisInfoCache {
   class="kw">public class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">static class="kw">final MemorySegment VORBIS_ID_HEADER = MemorySegment.ofArray(new byte[]{1, 118, 111, 114, 98, 105, 115});
   class="kw">private class="kw">static class="kw">final int OGGS_MAGIC = 1332176723;
   class="kw">private class="kw">static class="kw">final Map<String, OggVorbisInfoCache.OggVorbisInfo> vorbisFiles = new ConcurrentHashMap<>();

   class="kw">public OggVorbisInfoCache() {
   }

   @Nonnull
   class="kw">public class="kw">static CompletableFuture<OggVorbisInfoCache.OggVorbisInfo> get(String var0) {
      OggVorbisInfoCache.OggVorbisInfo var1 = vorbisFiles.get(var0);
      if (var1 != null) {
         class="kw">return CompletableFuture.completedFuture(var1);
      }

      CommonAsset var2 = CommonAssetRegistry.getByName(var0);
      class="kw">return var2 == null ? CompletableFuture.completedFuture(null) : get0(var2);
   }

   @Nonnull
   class="kw">public class="kw">static CompletableFuture<OggVorbisInfoCache.OggVorbisInfo> get(@Nonnull CommonAsset var0) {
      OggVorbisInfoCache.OggVorbisInfo var1 = vorbisFiles.get(var0.getName());
      class="kw">return var1 != null ? CompletableFuture.completedFuture(var1) : get0(var0);
   }

   @Nullable
   class="kw">public class="kw">static OggVorbisInfoCache.OggVorbisInfo getNow(String var0) {
      OggVorbisInfoCache.OggVorbisInfo var1 = vorbisFiles.get(var0);
      if (var1 != null) {
         class="kw">return var1;
      }

      CommonAsset var2 = CommonAssetRegistry.getByName(var0);
      class="kw">return var2 == null ? null : get0(var2).join();
   }

   class="kw">public class="kw">static OggVorbisInfoCache.OggVorbisInfo getNow(@Nonnull CommonAsset var0) {
      OggVorbisInfoCache.OggVorbisInfo var1 = vorbisFiles.get(var0.getName());
      class="kw">return var1 != null ? var1 : get0(var0).join();
   }

   @Nonnull
   class="kw">private class="kw">static CompletableFuture<OggVorbisInfoCache.OggVorbisInfo> get0(@Nonnull CommonAsset var0) {
      String var1 = var0.getName();
      class="kw">return CompletableFutureUtil._catch(var0.getBlob().thenApply(var1x -> {
         OggVorbisInfoCache.OggVorbisInfo var2 = parse(var1x);
         vorbisFiles.put(var1, var2);
         class="kw">return var2;
      }));
   }

   @Nonnull
   class="kw">static OggVorbisInfoCache.OggVorbisInfo parse(byte[] var0) {
      MemorySegment var1 = MemorySegment.ofArray(var0);
      int var2 = var0.length;
      int var3 = -1;
      int var4 = 0;

      for (int var5 = var2 - 7; var4 <= var5; var4++) {
         if (var0[var4] == 1 && var1.asSlice(var4, 7L).mismatch(VORBIS_ID_HEADER) == -1L) {
            var3 = var4;
            break;
         }
      }

      if (var3 >= 0 && var3 + 16 <= var2) {
         var4 = Byte.toUnsignedInt(var0[var3 + 11]);
         int var13 = var1.get(MemorySegmentUtil.INT_LE, var3 + 12);
         double var6 = -1.0;
         if (var13 > 0) {
            for (int ix = Math.max(0, var2 - 14); ix >= 0; ix--) {
               if (var0[ix] == 79 && var1.get(MemorySegmentUtil.INT_BE, ix) == 1332176723) {
                  int var9 = Byte.toUnsignedInt(var0[ix + 5]);
                  if ((var9 & 4) != 0) {
                     long var10 = var1.get(MemorySegmentUtil.LONG_LE, ix + 6);
                     if (var10 >= 0L) {
                        var6 = (double)var10 / var13;
                     }
                     break;
                  }
               }
            }
         }

         class="kw">return new OggVorbisInfoCache.OggVorbisInfo(var4, var13, var6);
      } else {
         throw new IllegalArgumentException("Vorbis id header not found");
      }
   }

   class="kw">public class="kw">static void invalidate(String var0) {
      vorbisFiles.remove(var0);
   }

   class="kw">public class="kw">static class OggVorbisInfo {
      class="kw">public class="kw">final int channels;
      class="kw">public class="kw">final int sampleRate;
      class="kw">public class="kw">final double duration;

      OggVorbisInfo(int var1, int var2, double var3) {
         this.channels = var1;
         this.sampleRate = var2;
         this.duration = var3;
      }

      @Nonnull
      @Override
      class="kw">public String toString() {
         class="kw">return "OggVorbisInfo{channels=" + this.channels + ", sampleRate=" + this.sampleRate + ", duration=" + this.duration + "}";
      }
   }
}