00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.sound;
00023
00024 import com.realtime.crossfire.jxclient.util.DebugWriter;
00025 import java.util.concurrent.ExecutorService;
00026 import java.util.concurrent.Executors;
00027 import javax.sound.sampled.DataLine;
00028 import org.jetbrains.annotations.NotNull;
00029 import org.jetbrains.annotations.Nullable;
00030
00036 public class ClipManager {
00037
00041 @NotNull
00042 private final ExecutorService executorService = Executors.newCachedThreadPool();
00043
00047 @NotNull
00048 private final ClipCache clipCache;
00049
00056 public ClipManager(@NotNull final AudioFileLoader audioFileLoader, @Nullable final DebugWriter debugSound) {
00057 clipCache = new ClipCache(audioFileLoader, debugSound);
00058 }
00059
00065 public void play(@Nullable final String name, @NotNull final String action) {
00066 final DataLine clip = clipCache.allocateClip(name, action);
00067 if (clip == null) {
00068 return;
00069 }
00070
00071 executorService.execute(new Runnable() {
00072
00073 @Override
00074 public void run() {
00075 try {
00076 clip.start();
00077 try {
00078 clip.drain();
00079 } finally {
00080 clip.stop();
00081 }
00082 } finally {
00083 clipCache.freeClip(clip);
00084 }
00085 }
00086
00087 });
00088 }
00089
00093 public void shutdown() {
00094 executorService.shutdownNow();
00095 }
00096
00097 }