
// ClipsLoader.java
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th

/* Třída ClipsLoader uchovává kolekci objektů typu ClipInfo
   v hašovací tabulce HashMap s klíči tvořenými názvy jejich souborů.

   Název a jméno souboru příslušného klipu získáme ze souboru s údaji o
   zvucích, který se načítá při vytvoření objektu typu ClipsLoader.
   Tento informační soubor by měl být v adresáři Sounds/.

   Třída ClipsLoader umožňuje přehrát, zastavit a cyklicky přehrávat 
   konkrétní klip. Ke klipu lze připojit instanci třídy SoundsWatcher. 
   Všechnu tuto funkcionalitu řeší objekt typu ClipInfo; Třída ClipsLoader
   jednoduše převádí volání metod do třídy ClipInfo.

   Dále je možné, aby současně hrálo více klipů, neboť za přehrávání klipu
   je odpovědný příslušný objekt typu ClipInfo.
*/


import java.awt.*;
import java.util.*;
import java.io.*;


public class ClipsLoader
{
  private final static String SOUND_DIR = "Sounds/";

  private HashMap clipsMap; 
    /* Klíče jsou tvořeny názvy klipu, objektem (hodnotou) jsou pak
       instance třídy ClipInfo */


  public ClipsLoader(String soundsFnm)
  { clipsMap = new HashMap();
    loadSoundsFile(soundsFnm);
  }

  public ClipsLoader()
  {  clipsMap = new HashMap();  } 



  private void loadSoundsFile(String soundsFnm)
  /* Soubor se skládá s řádků ve tvaru:
        <název> <jménosouboru>         // jeden zvukový soubor
        nebo prázdný řádek
        nebo řádek s komentáři.
  */
  { 
    String sndsFNm = SOUND_DIR + soundsFnm;
    System.out.println("Čtený soubor: " + sndsFNm);
    try {
      InputStream in = this.getClass().getResourceAsStream(sndsFNm);
      BufferedReader br = new BufferedReader( new InputStreamReader(in));
      // BufferedReader br = new BufferedReader( new FileReader(sndsFNm));
      StringTokenizer tokens;
      String line, name, fnm;
      while((line = br.readLine()) != null) {
        if (line.length() == 0)  // prázdný řádek
          continue;
        if (line.startsWith("//"))   // komentář
          continue;

        tokens = new StringTokenizer(line);
        if (tokens.countTokens() != 2)
          System.out.println("Nesprávný počet argumentů pro " + line);
        else {
          name = tokens.nextToken();
          fnm = tokens.nextToken();
          load(name, fnm);
        }
      }
      br.close();
    } 
    catch (IOException e) 
    { System.out.println("Chyba při čtení souboru: " + sndsFNm);
      System.exit(1);
    }
  }  // konec metody: metody: loadSoundsFile()



  // ----------- zpracovává konkrétní klip --------


  public void load(String name, String fnm)
  // pro klip s názvem name vytvoř objekt typu ClipInfo a ulož jej
  {
    if (clipsMap.containsKey(name))
      System.out.println( "Error: " + name + "already stored");
    else {
      clipsMap.put(name, new ClipInfo(name, fnm) );
      System.out.println("-- " + name + "/" + fnm);
    }
  }  // konec metody: metody: load()


  public void close(String name)
  // uzavři specifikovaný klip
  {  ClipInfo ci = (ClipInfo) clipsMap.get(name);
     if (ci == null)
       System.out.println( "Chyba: " + name + "není k dispozici");
     else
      ci.close();
  } // konec metody: metody: close()

 

  public void play(String name, boolean toLoop)
  // přehraj (možná i cyklicky) specifikovaný klip
  {  ClipInfo ci = (ClipInfo) clipsMap.get(name);
     if (ci == null)
       System.out.println( "Chyba: " + name + "není k dispozici");
     else
      ci.play(toLoop);
  } // konec metody: metody: play()


  public void stop(String name)
  // stop the clip, resetting it to the beginning
  // zastav klip a přetoč jej na začátek
  { ClipInfo ci = (ClipInfo) clipsMap.get(name);
    if (ci == null)
       System.out.println( "Chyba: " + name + "není k dispozici");
    else
      ci.stop();
  } // konec metody: metody: stop()


  public void pause(String name)
  { ClipInfo ci = (ClipInfo) clipsMap.get(name);
    if (ci == null)
       System.out.println( "Chyba: " + name + "není k dispozici");
    else
      ci.pause();
  } // konec metody: metody: pause()


  public void resume(String name)
  { ClipInfo ci = (ClipInfo) clipsMap.get(name);
    if (ci == null)
       System.out.println( "Chyba: " + name + "není k dispozici");
    else
      ci.resume();
  } // konec metody: metody: resume()


  // -------------------------------------------------------


  public void setWatcher(String name, SoundsWatcher sw)
  /* Pro daný klip připrav hlídače, který bude upozorněn, jakmile se
     klip začne přehrávat cyklicky nebo se zastaví. */
  { ClipInfo ci = (ClipInfo) clipsMap.get(name);
    if (ci == null)
       System.out.println( "Chyba: " + name + "není k dispozici");
    else
      ci.setWatcher(sw);
  } // konec metody: metody: setWatcher()

}  // konec metody: třídy: ClipsLoader
