Обработчик звука, использующий Clip и AudioInputstream, сохраняет звук в оперативной памяти - PullRequest
0 голосов
/ 12 ноября 2018

Обработчик звука, который я разработал для своих игр, обрабатывает музыку и звуковые эффекты.Теоретически должен быть один голос для каждого sfx и музыки, и каждый должен иметь возможность воспроизводить только одну дорожку за раз.

Однако, хотя мониторинг используемых ресурсов, объем используемой оперативной памяти экспоненциально увеличивается при пропуске дорожек,вплоть до предела аргументов в 8 Гб - это означает, что он загружает дорожки в память каждый раз, когда воспроизводится, и никогда не выгружается.

При отладке я поместил нездоровое количество .Drains и .Flushes наклипы в моем классе и сброс AudioInputStream на ноль, экспериментируя безрезультатно.

На боковой ноте при быстром пропуске треков появляются случайные фантомные голоса, продолжая безудержно воспроизводиться на заднем планеконтролируемый музыкальный голос - я чувствую, что это, вероятно, тесно связано.

Ниже представлен весь класс, включая все позиции, которые использовались .Drain и т. д. во время отладки.Пропуск песни начинается с NextTrack() или PrevTrack(), оба дают одинаковый результат.

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

public class SoundHandler {
    private static Clip sfx = null, Music = null;
    public static boolean MusicEnabled = true;
    private static int STIndex = 0;
    private static final int TrackCount = 41;
    private static AudioInputStream audioInputStream;    

        //Channel true = sfx, else music
        private static void PlayFile(String filename, boolean Chanel){
            try {
                   audioInputStream = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream(filename)));

                if (Chanel) {
                    try {sfx.stop(); sfx.drain();}catch (Exception e) {}
                    sfx = AudioSystem.getClip();
                    sfx.open(audioInputStream);
                    sfx.start();
                } else {
                    if (!MusicEnabled) {return;}
                    try {Music.stop(); Music.drain();}catch (Exception e) {}
                    Music = AudioSystem.getClip();
                    Music.open(audioInputStream);
                    Music.start();                  
                }




            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }


        //Music Handler for external
        private static void PlayTrack() {
            String Location = String.valueOf(Game.ResourcePath + "/Audio/Runtime/ST" + STIndex + ".wav");    
            PlayFile(Location, false);
        }

        public static void SFX(String Effect) {
            String Location = String.valueOf(Game.ResourcePath + "/Audio/Runtime/" + Effect + ".wav");
            PlayFile(Location, true);
        }


        public static void NextTrack() {
            if (STIndex >= TrackCount) {STIndex = 0;} else {STIndex++;}
            Music.stop();
            Music.drain();
            Music.flush();          
            try {audioInputStream.close();} catch (IOException e) {}
            audioInputStream = null;
            PlayTrack();
        }

        public static void PrevTrack() {
            if (STIndex <= 0) {STIndex = TrackCount;} else {STIndex--;}
            Music.stop();
            Music.drain();
            Music.flush();          
            try {audioInputStream.close();} catch (IOException e) {}
            audioInputStream = null;
            PlayTrack();
        }

        public static void StartMusic () {
            MusicEnabled = true;
            STIndex = 0;
            String Location = String.valueOf(Game.ResourcePath + "/Audio/Runtime/ST" + STIndex + ".wav");
            PlayFile(Location, false);
        }

        public static void PlayIndex(int index) {
            MusicEnabled = true;
            STIndex = 0;
            String Location = String.valueOf(Game.ResourcePath + "/Audio/Runtime/ST" + index + ".wav");
            PlayFile(Location, false);
        }

        public static void PlayStop() {
            MusicEnabled = !MusicEnabled;
            if (MusicEnabled) {
                StartMusic();
            } else {
                try {Music.stop(); Music.drain(); Music.flush();}catch (Exception e) {}
            }}

        public static void Tick() {
            try {if ((!Music.isActive()) && MusicEnabled){NextTrack();}} catch (Exception e) {}
            if (!MusicEnabled) {
                try {if (!Music.isActive()){Music.stop(); Music.drain();}} catch (Exception e) {}
            }}

        public static int getST() {
            return STIndex;
        }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...