Вы довольно близки, но есть несколько необычных вещей, которые, возможно, способствуют проблеме производительности.
Прежде всего, если вы просто воспроизводите .wav, на самом деле не должно быть необходимости иметь дело с какой-либо «точкой чтения», а значением 0, и на самом деле не должно быть необходимости в «остатке вычисление. Когда вы выполняете запись, это должно быть просто число байтов, которые были прочитаны (возвращаемое значение метода read ()).
Мне также неясно, почему вы делаете ArrayCopy. Вы можете это потерять?
Задание потока с низким приоритетом и установка режима сна - я полагаю, вы надеялись, что это замедлит обработку звука, чтобы позволить большей части вашей игры обрабатывать? Я никогда не видел, чтобы это было сделано раньше, и это действительно необычно, если это действительно необходимо. Я очень рекомендую избавиться от них.
Мне любопытно, откуда твой аудиофайл. Вы не транслируете его через Интернет, не так ли?
Кстати, способ получения входных данных из файла и помещения его в InputStream, скорее всего, не будет работать с Java7. Многие люди сообщают об ошибке с этим. Оказывается, правильнее и эффективнее сгенерировать URL из файла, а затем получить AudioInputStream, используя URL в качестве аргумента, а не файла. Ошибка, которая может появиться, является ошибкой «Mark / Reset». (Поиск по нему покажет, что он появляется несколько раз.)