Остановка воспроизведения клипа в бегах - PullRequest
1 голос
/ 02 мая 2011

В настоящее время я застрял в своем проекте, в настоящее время я могу играть музыку, но я хочу иметь возможность поменять местами песню, чтобы я мог различать тему главного меню и тему игры.

Я написал приложение для понимания, есть ли способ остановить воспроизведение клипа (например, из другой части моего программного обеспечения), изменив логическое значение с true на false. Я очень старался, например, чтобы сделать логическое значение volatile таким, как оно будет меняться в процессе, но ничего не помогло. Мне нужно найти способ остановить клип во время бега, кто-нибудь может мне помочь с этой проблемой?

Я написал в todo, где должен находиться код для остановки клипа, если это возможно, вы можете записать код, чтобы остановить воспроизведение моего клипа во время прогона?

package sound;

import java.io.File;
import java.io.IOException;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

    public class Music implements LineListener, Runnable
    {

    private File soundFile;
    private Thread thread;
    private static Music player;
    private Music audio;
    private Clip clip;
    private boolean stop;

    /**
    * Private because of the singleton
    */
    public Music()
    {
    }

    /**
    * Play a siren sound
    */
    public void playSiren(String musicFileName)
    {
        Music p = getPlayer();
        p.playSirenFile(musicFileName);
    }

    /**
    * Play the siren file
    */
    private void playSirenFile(String musicFileName)
    {
        this.soundFile = new File("Music/"+musicFileName+".wav");
        stop = true;
        thread = new Thread(this);
        thread.setName("SoundPlayer");
        thread.start();

    }

    public Clip getClip()
    {
        return this.clip;
        }
    /**
    * Invoked when the thread kicks off
    */
    @SuppressWarnings("deprecation")
    public void run()
    {
        try
        {
            AudioInputStream stream = AudioSystem.getAudioInputStream(this.soundFile);
            AudioFormat format = stream.getFormat();
            if ((format.getEncoding() == AudioFormat.Encoding.ULAW) || (format.getEncoding() == AudioFormat.Encoding.ALAW))
            {
                AudioFormat tmp = new AudioFormat(
                AudioFormat.Encoding.PCM_SIGNED,
                format.getSampleRate(),
                format.getSampleSizeInBits() * 2, format.getChannels(),
                format.getFrameSize() * 2, format.getFrameRate(), true);
                stream = AudioSystem.getAudioInputStream(tmp, stream);
                format = tmp;
            }
            DataLine.Info info = new DataLine.Info(Clip.class, stream
            .getFormat(), ((int) stream.getFrameLength() * format
            .getFrameSize()));

            this.clip = (Clip) AudioSystem.getLine(info);
            this.clip.addLineListener(this);
            this.clip.open(stream);

            this.clip.start();
            try
            {
                thread.sleep(99);
            }
            catch (Exception e)
            {
            }
            while (clip.isActive() && thread != null)
            {
                try
                {
                    thread.sleep(99);
                }
                catch (Exception e)
                {
                    break;
                }
            }
            clip.loop(99999999);
        }

        catch (UnsupportedAudioFileException e)
        {
        e.printStackTrace();
        }
        catch (IOException e)
        {
        e.printStackTrace();
        }
        catch (LineUnavailableException e)
        {
        e.printStackTrace();
        }   

    }

    private static Music getPlayer()
    {
        if (player == null)
        {
            player = new Music();
        }
        return player;
    }

    public void update(LineEvent event)
    {
    }

    public void stopClip()
    {
        // TODO NEED HELP HERE
    }

    public void closeClip()
    {
        clip.close();
    }

    public void startClip()
    {
        clip.start();
    }
    public void volume(float volume)
    {
            //TODO NEED HELP HERE

        /*
        FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
        gainControl.setValue(-50.0f); // Reduce volume IN DECIBELS
        clip.start();
        */
    }
    }

1 Ответ

1 голос
/ 11 мая 2011

Вы уверены, что получаете доступ к программе с помощью одноэлементной версии, поскольку синглтон находится в частном порядке в вашем классе, если вы этого не сделаете, вы не остановите клип, а только создадите новые

Метод getPlayer () имеет ту же функцию, что и метод getInstance () в сиглетонах.Так вы уверены, что получаете доступ к запущенному obkect с помощью вызова getplayer ()?Поскольку этот метод является закрытым в вашем классе, если вы не используете этот метод, вы не остановите клип, а только создадите новые.

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