#if JAVA
package org.kbinani.media;

import java.io.*;
import javax.sound.sampled.*;

public class BSoundPlayer{
    private static final int BUFLEN = 128000;
    private AudioInputStream m_stream = null;
    private boolean m_stop_required = false;
    private boolean m_playing = false;
    private String m_sound_location = "";

    public BSoundPlayer( String sound_location ){
        setSoundLocation( sound_location );
    }

    public BSoundPlayer(){
    }

    public String getSoundLocation(){
        return m_sound_location;
    }

    public void setSoundLocation( String value ){
        stop();
        m_sound_location = value;
        if( m_stream != null ){
            try{
                m_stream.close();
            }catch( Exception ex0 ){
                System.err.println( "BSoundPlayer#setSoundLocation; ex0=" + ex0 );
            }
        }
        try {
            File sound_file = new File( m_sound_location );
            m_stream = AudioSystem.getAudioInputStream( sound_file );
        }catch( Exception ex ){
            System.err.println( "BSoundPlayer#.ctor; ex=" + ex );
        }
    }

    public void play(){
        try{
            Thread t = new Thread( new PlaySoundRunner() );
            t.start();
            t.join();
        }catch( Exception ex ){
            System.out.println( "BSoundPlayer#play; ex=" + ex );
        }
    }

    public void stop(){
        if( m_playing ){
            try{
                m_stop_required = true;
                while( m_playing ){
                    Thread.sleep( 0 );
                }
                m_stop_required = false;
            }catch( Exception ex ){
                System.err.println( "BSoundPlayer#stop; ex=" + ex );
            }
        }
    }

    public class PlaySoundRunner implements Runnable{
        public void run(){
            SourceDataLine line = null;
            m_playing = true;
            try{
                AudioFormat audioFormat = m_stream.getFormat();

                DataLine.Info info = new DataLine.Info( SourceDataLine.class, audioFormat );
                line = (SourceDataLine)AudioSystem.getLine( info );
                line.open( audioFormat );
                line.start();

                int len = 1;
                byte[] buf = new byte[BUFLEN];
                while( len > 0 && !m_stop_required ){
                    len = m_stream.read( buf, 0, buf.length );
                    if( len >= 0 ){
                        int nBytesWritten = line.write( buf, 0, len );
                    }else{
                        break;
                    }
                }
            } catch( Exception ex ){
                System.err.println( "BSoundPlayer.PlaySoundRunner#run; ex=" + ex );
            } finally {
                if( line != null ){
                    try{
                        line.drain();
                        line.close();
                    }catch( Exception ex2 ){
                        System.err.println( "BSoundPlayer.PlaySoundRunner#run; ex2=" + ex2 );
                    }
                }
            }
            m_playing = false;
        }
    }
}
#else
namespace Boare.Lib.Media {

    public class BSoundPlayer : System.Media.SoundPlayer {
        public BSoundPlayer( string sound_location )
            : base( sound_location ) {
        }

        public BSoundPlayer()
            : base() {
        }

        public void play() {
            base.Play();
        }

        public string getSoundLocation() {
            return base.SoundLocation;
        }

        public void setSoundLocation( string value ) {
            base.SoundLocation = value;
        }
    }

}
#endif
