import java.applet.Applet;
import java.applet.AudioClip;

import java.awt.Color;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Image;

import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;

import java.awt.image.ImageObserver;

import java.awt.Graphics;
import java.awt.MediaTracker;
import java.awt.Point;


import java.lang.Thread;

import java.util.Date;

import java.util.Random;


public class player extends Applet
{
	private juke jukebox;
	private int[][] sets = {{0}, {1, 2}, {3, 4, 5}, {6, 7, 8, 9, 5}, {10, 11, 12, 6, 13}};

	public void init()
	{
		setBackground (Color.black);
		int i = 0;
		while (true)
		{
			if (getParameter("lyd_" + i) != null) i++;
			else break;
		}



		AudioClip silence = getAudioClip(getCodeBase(), "silence.au");
		AudioClip[] acs = new AudioClip[i];
		int[] secs = new int[i];

		for (int j = 0; j < i; j++)
		{
			acs[j] = getAudioClip(getCodeBase(), getParameter("lyd_" + j));
			secs[j] = 0;//1000;
		}

		jukebox = new juke(acs, secs, 100, silence);

		jukebox.start();

		playSet3();

	}

	public void silenceAll()
	{
		jukebox.silenceAll();
	}

	public void playSet0()
	{
		jukebox.playSet(sets[0]);
	}

	public void playSet1()
	{

		jukebox.playSet(sets[1]);
	}

	public void playSet2()
	{

		jukebox.playSet(sets[2]);
	}

	public void playSet3()
	{

		jukebox.playSet(sets[3]);
	}

	public void playSet4()
	{
		jukebox.playSet(sets[4]);
	}



	public void destroy()
	{
		jukebox.killThread();
	}

}

class juke extends Thread
{
	private AudioClip[] clips;
	private AudioClip silence;
	private long[] millisecs;
	private boolean living = true;
	private int pause;
	private int num_clips;

	public juke(AudioClip[] ac, int[] secs, int p, AudioClip s)
	{
		clips = ac;
		num_clips = clips.length;
		millisecs = new long[num_clips];
		for (int i = 0; i < num_clips; i++) playLoop(i, secs[i]);
		pause = p;
		silence = s;
		s.loop();

	}

	public void run()
	{
		while (living)
		{
			long d = new Date().getTime();
			for (int i = 0; i < num_clips; i++) if (millisecs[i] < d) clips[i].stop();
			try {sleep (pause);} catch (Throwable t){}
		}
		for (int i = 0; i < num_clips; i++) clips[i].stop();
	}

	public void playSound(int i)
	{
		if (living) clips[i].play();
	}

	public void playLoop(int i, int secs)
	{
		i = i % num_clips;
		if (secs > 0)
		{
			millisecs[i] = new Date().getTime() + secs * 500;
			clips[i].loop();
		}
		else millisecs[i] = 0;
	}

	public void silenceAll()
	{
		for (int i = 0; i < num_clips; i++) clips[i].stop();
	}

	public void killThread()
	{
		silenceAll();
		silence.stop();
		living = false;
	}

	public void playSet (int[] in)
	{
		for (int i = 0; i < in.length; i ++) playLoop (in[i], 10000000);
	}
}
