Anu
Anu

Reputation: 13

JFrame loading music now running

I've been trying to make a loading program for my friend. He said that it would be better if it played music, so I tried to add music and it's saying it doesn't work. It keeps on giving me an error saying The system cannot find the file specified but the file is in the same package as the class.

static File sound;
static boolean muted = false;
static float volume = 100.0f;
static float pan = 0.0f;
static double seconds = 0.0d;
static boolean loopedForever = false;
static int loopTimes = 0;
static int loopsDone = 0;

public static void main(String[] args){
    sound = new File("src/196006__corsica-s__patriceo.wav");
    new Thread(play).start();
}
final static Runnable play = new Runnable() // This Thread/Runnabe is for playing the sound
{
    public void run()
    {
        try
        {
            // Check if the audio file is a .wav file
            if (sound.getName().toLowerCase().contains(".wav"))
            {
                AudioInputStream stream = AudioSystem.getAudioInputStream(sound);

                AudioFormat format = stream.getFormat();

                if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED)
                {
                    format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                            format.getSampleRate(),
                            format.getSampleSizeInBits() * 2,
                            format.getChannels(),
                            format.getFrameSize() * 2,
                            format.getFrameRate(),
                            true);

                    stream = AudioSystem.getAudioInputStream(format, stream);
                }

                SourceDataLine.Info info = new DataLine.Info(
                        SourceDataLine.class,
                        stream.getFormat(),
                        (int) (stream.getFrameLength() * format.getFrameSize()));

                SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
                line.open(stream.getFormat());
                line.start();

                // Set Volume
                FloatControl volume_control = (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN);
                volume_control.setValue((float) (Math.log(volume / 100.0f) / Math.log(10.0f) * 20.0f));

                // Mute
                BooleanControl mute_control = (BooleanControl) line.getControl(BooleanControl.Type.MUTE);
                mute_control.setValue(muted);

                FloatControl pan_control = (FloatControl) line.getControl(FloatControl.Type.PAN);
                pan_control.setValue(pan);

                long last_update = System.currentTimeMillis();
                double since_last_update = (System.currentTimeMillis() - last_update) / 1000.0d;

                // Wait the amount of seconds set before continuing
                while (since_last_update < seconds)
                {
                    since_last_update = (System.currentTimeMillis() - last_update) / 1000.0d;
                }

                System.out.println("Playing!");

                int num_read = 0;
                byte[] buf = new byte[line.getBufferSize()];

                while ((num_read = stream.read(buf, 0, buf.length)) >= 0)
                {
                    int offset = 0;

                    while (offset < num_read)
                    {
                        offset += line.write(buf, offset, num_read - offset);
                    }
                }

                line.drain();
                line.stop();

                if (loopedForever)
                {
                    new Thread(play).start();
                }
                else if (loopsDone < loopTimes)
                {
                    loopsDone++;
                    new Thread(play).start();
                }
            }
        }
        catch (Exception ex) {ex.printStackTrace();} 

    }
};

Upvotes: 0

Views: 64

Answers (1)

user1803551
user1803551

Reputation: 13427

I tested your code, it works fine. You problem is with the location of the file in the folder/package hierarchy.

This is how I access the file based on your code:

public class Example {

    public static void main(String[] args) {

        sound = new File("harpsi-cs.wav");
        new Thread(play).start();
    }
}

and this is my hierarchy:

enter image description here

Often projects create a resources folder to put their files there. In that case, don't forget to make it a source folder and change your path accordingly:

sound = new File("resources/harpsi-cs.wav");

enter image description here

Upvotes: 1

Related Questions