Reputation: 13
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
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:
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");
Upvotes: 1