package at.tugraz.ist.musicdroid;
import java.util.HashMap;
import android.annotation.SuppressLint;
import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;
public class SoundPlayer {
private SoundPool soundPool;
private HashMap<Integer, Integer> soundPoolMap;
private static final int PRIORITY=1;
private int soundID = 0;
private Context context;
private HashMap<Integer, PlayThread> threadMap = null;
@SuppressLint("UseSparseArrays")
public SoundPlayer(Context cxt){
context = cxt;
threadMap = new HashMap<Integer, SoundPlayer.PlayThread>();
}
private void fillSoundpool (String path){
soundPoolMap.put(soundID, soundPool.load(path, PRIORITY));
soundID++;
}
@SuppressLint("UseSparseArrays")
public void initSoundpool () {
soundPool = new SoundPool(8, AudioManager.STREAM_MUSIC, 100);
soundPoolMap = new HashMap<Integer, Integer>();
}
@SuppressLint("UseSparseArrays")
public void setSoundpool(String path){
fillSoundpool(path);
}
public void playSound(int midiValue){
midiValue = midiValue - 35;
AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float leftVolume = curVolume/maxVolume;
float rightVolume = curVolume/maxVolume;
int priority = 1;
int no_loop = 0;
float normal_playback_rate = 1f;
soundPool.play(soundPoolMap.get(midiValue), leftVolume, rightVolume, priority, no_loop, normal_playback_rate);
}
public void playNote(int note)
{
if (!isNotePlaying(note))
{
PlayThread thread = new PlayThread(note);
thread.start();
threadMap.put(note, thread);
}
}
public boolean isNotePlaying(int note)
{
return threadMap.containsKey(note);
}
public void stopNote(int note)
{
PlayThread thread = threadMap.get(note);
if (thread != null)
{
thread.requestStop();
threadMap.remove(note);
}
}
private class PlayThread extends Thread
{
int note;
@SuppressWarnings("unused")
boolean stop = false;
int streamId = 0;
public PlayThread(int note)
{
super();
this.note = note;
}
public void run()
{
note = note - 36;
AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float leftVolume = curVolume/maxVolume;
float rightVolume = curVolume/maxVolume;
int priority = 1;
int no_loop = 0;
float normal_playback_rate = 1f;
streamId = soundPool.play(soundPoolMap.get(note), leftVolume, rightVolume, priority, no_loop, normal_playback_rate);
}
public synchronized void requestStop()
{
soundPool.stop(streamId);
stop = true;
}
}
}