SoundBufferLibrary.java

net.minecraft.client.sounds.SoundBufferLibrary

信息

  • 全限定名:net.minecraft.client.sounds.SoundBufferLibrary
  • 类型:public class
  • 包:net.minecraft.client.sounds
  • 源码路径:src/main/java/net/minecraft/client/sounds/SoundBufferLibrary.java
  • 起始行号:L21
  • 职责:

    TODO

字段/常量

  • resourceManager

    • 类型: ResourceProvider
    • 修饰符: private final
    • 源码定位: L22
    • 说明:

      TODO

  • cache

    • 类型: Map<Identifier,CompletableFuture<SoundBuffer>>
    • 修饰符: private final
    • 源码定位: L23
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.sounds.SoundBufferLibrary.DebugOutput

    • 类型: interface
    • 修饰符: public
    • 源码定位: L78
    • 说明:

      TODO

  • net.minecraft.client.sounds.SoundBufferLibrary.DebugOutput.Counter

    • 类型: class
    • 修饰符: public static
    • 源码定位: L82
    • 说明:

      TODO

构造器

public SoundBufferLibrary(ResourceProvider resourceProvider) @ L25

  • 构造器名:SoundBufferLibrary
  • 源码定位:L25
  • 修饰符:public

参数:

  • resourceProvider: ResourceProvider

说明:

TODO

方法

下面的方法块按源码顺序生成。

public CompletableFuture<SoundBuffer> getCompleteBuffer(Identifier location) @ L29

  • 方法名:getCompleteBuffer
  • 源码定位:L29
  • 返回类型:CompletableFuture
  • 修饰符:public

参数:

  • location: Identifier

说明:

TODO

public CompletableFuture<AudioStream> getStream(Identifier location, boolean looping) @ L48

  • 方法名:getStream
  • 源码定位:L48
  • 返回类型:CompletableFuture
  • 修饰符:public

参数:

  • location: Identifier
  • looping: boolean

说明:

TODO

public void clear() @ L59

  • 方法名:clear
  • 源码定位:L59
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public CompletableFuture<?> preload(Collection<Sound> sounds) @ L64

  • 方法名:preload
  • 源码定位:L64
  • 返回类型:CompletableFuture<?>
  • 修饰符:public

参数:

  • sounds: Collection

说明:

TODO

public void enumerate(SoundBufferLibrary.DebugOutput debugOutput) @ L68

  • 方法名:enumerate
  • 源码定位:L68
  • 返回类型:void
  • 修饰符:public

参数:

  • debugOutput: SoundBufferLibrary.DebugOutput

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class SoundBufferLibrary {
    private final ResourceProvider resourceManager;
    private final Map<Identifier, CompletableFuture<SoundBuffer>> cache = Maps.newHashMap();
 
    public SoundBufferLibrary(ResourceProvider resourceProvider) {
        this.resourceManager = resourceProvider;
    }
 
    public CompletableFuture<SoundBuffer> getCompleteBuffer(Identifier location) {
        return this.cache.computeIfAbsent(location, l -> CompletableFuture.supplyAsync(() -> {
            try {
                SoundBuffer x2;
                try (
                    InputStream is = this.resourceManager.open(l);
                    FiniteAudioStream as = new JOrbisAudioStream(is);
                ) {
                    ByteBuffer data = as.readAll();
                    x2 = new SoundBuffer(data, as.getFormat());
                }
 
                return x2;
            } catch (IOException var10) {
                throw new CompletionException(var10);
            }
        }, Util.nonCriticalIoPool()));
    }
 
    public CompletableFuture<AudioStream> getStream(Identifier location, boolean looping) {
        return CompletableFuture.supplyAsync(() -> {
            try {
                InputStream is = this.resourceManager.open(location);
                return (AudioStream)(looping ? new LoopingAudioStream(JOrbisAudioStream::new, is) : new JOrbisAudioStream(is));
            } catch (IOException var4) {
                throw new CompletionException(var4);
            }
        }, Util.nonCriticalIoPool());
    }
 
    public void clear() {
        this.cache.values().forEach(future -> future.thenAccept(SoundBuffer::discardAlBuffer));
        this.cache.clear();
    }
 
    public CompletableFuture<?> preload(Collection<Sound> sounds) {
        return CompletableFuture.allOf(sounds.stream().map(sound -> this.getCompleteBuffer(sound.getPath())).toArray(CompletableFuture[]::new));
    }
 
    public void enumerate(SoundBufferLibrary.DebugOutput debugOutput) {
        this.cache.forEach((id, bufferFuture) -> {
            SoundBuffer buffer = bufferFuture.getNow(null);
            if (buffer != null && buffer.isValid()) {
                debugOutput.accountBuffer(id, buffer.size(), buffer.format());
            }
        });
    }
 
    @OnlyIn(Dist.CLIENT)
    public interface DebugOutput {
        void accountBuffer(Identifier id, int size, AudioFormat format);
 
        @OnlyIn(Dist.CLIENT)
        public static class Counter implements SoundBufferLibrary.DebugOutput {
            private int totalCount;
            private long totalSize;
 
            @Override
            public void accountBuffer(Identifier id, int size, AudioFormat format) {
                this.totalCount++;
                this.totalSize += size;
            }
 
            public int totalCount() {
                return this.totalCount;
            }
 
            public long totalSize() {
                return this.totalSize;
            }
        }
    }
}

引用的其他类

  • SoundBuffer

    • 引用位置: 字段/构造调用/返回值
    • 关联成员: SoundBuffer()
  • Sound

    • 引用位置: 参数
  • AudioStream

    • 引用位置: 返回值
  • JOrbisAudioStream

    • 引用位置: 构造调用
    • 关联成员: JOrbisAudioStream()
  • LoopingAudioStream

    • 引用位置: 构造调用
    • 关联成员: LoopingAudioStream()
  • Identifier

    • 引用位置: 参数/字段
  • ResourceProvider

    • 引用位置: 参数/字段
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.nonCriticalIoPool()