मैं एक साधारण टैंक गेम बना रहा हूं और इसका बैकग्राउंड म्यूजिक है। जब भी खिलाड़ी मरता है तो मुझे संगीत बंद करने की आवश्यकता होती है (खिलाड़ियों का स्वास्थ्य int 0 हो जाता है)। मैं यह कैसे करु?

मैंने play() फ़ंक्शन के बाहर थ्रेड घोषित करके और इसे t.stop() से रोककर थ्रेड को रोकने की कोशिश की, लेकिन यह काम नहीं किया।

package com.company;

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

import javax.sound.sampled.*;

public class Sound implements Runnable
{

    private String fileLocation;
    public String getFileLocation() {
        return fileLocation;
    }

    public Sound() {
    }



    public void play(String fileLocation)
    {
        Thread t = new Thread(this);
        this.fileLocation = fileLocation;
        t.start();
    }

    public void run ()
    {
        playSound(fileLocation);
    }



    public void playSound(String fileName)
    {
        File soundFile = new File(fileName);
        AudioInputStream audioInputStream = null;
        try
        {
            audioInputStream = AudioSystem.getAudioInputStream(soundFile);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        AudioFormat audioFormat = audioInputStream.getFormat();
        SourceDataLine line = null;
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
        try
        {
            line = (SourceDataLine) AudioSystem.getLine(info);
            line.open(audioFormat);
        }
        catch (LineUnavailableException e)
        {
            e.printStackTrace();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        line.start();
        int nBytesRead = 0;
        byte[] abData = new byte[128000];
        while (nBytesRead != -1)
        {
            try
            {
                nBytesRead = audioInputStream.read(abData, 0, abData.length);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            if (nBytesRead >= 0)
            {
                int nBytesWritten = line.write(abData, 0, nBytesRead);
            }
        }
        line.drain();
        line.close();
    }
}
0
Mati 10 जुलाई 2019, 14:21

1 उत्तर

सबसे बढ़िया उत्तर

एक अस्थिर बूलियन घोषित करें। अस्थिर क्यों? क्योंकि इसे पूरे धागे में अपडेट करने की जरूरत है।

private volatile boolean playing;

बूलियन को जबकि क्लॉज में शामिल करें।

while(playing && nBytesRead != -1)

प्लेबैक थ्रेड के बाहर से बूलियन को एक्सेस करने योग्य बनाएं।

public void setPlaying(boolean) {
    this.playing = playing;
}

जब आप ध्वनि बंद करना चाहें, तो setPlaying(false) पर कॉल करें। ध्वनि शुरू होने से पहले बूलियन को सही बनाना न भूलें।

यहां एकमात्र दोष यह है कि ध्वनि एक क्लिक के साथ समाप्त हो सकती है, क्योंकि यह तत्काल होगी। एक फ़ेड जोड़ने में एक javax.sound.sampled.Control ऑब्जेक्ट (मुझे इनके साथ संदिग्ध भाग्य मिला है), या पीसीएम डेटा के साथ ही झुकाव।

कम से कम SourceDataLine के साथ, हमारे पास बाइट्स (आपके abData सरणी में) तक पहुंच है। डेटा को आपके ऑडियो प्रारूप के अनुसार पीसीएम में इकट्ठा किया जा सकता है, फिर एक फैडर मान से गुणा किया जा सकता है जो 64 फ्रेम जैसी किसी चीज़ के दौरान 1 से 0 तक जाता है, पीसीएम मानों को धीरे-धीरे 0 पर डायल करता है, और फिर इन नए पीसीएम मूल्यों को ले जाता है। और उन्हें वापस बाइट्स में परिवर्तित करना और उसे लिखना। हां, एक क्लिक से छुटकारा पाने में बहुत परेशानी होती है। लेकिन यह कीमती है।

0
Phil Freihofner 11 जुलाई 2019, 06:58