package rabbitescape.ui.android.sound; import android.content.res.Resources; import android.media.SoundPool; public class MusicPlayer { private static final int LOADING = -1000; private static final float VOLUME = 0.5f; private final LoadedClips clips; private final SoundPool soundPool; private final Resources resources; private String currentTrack; private Integer nowPlayingClipId; private int nowPlayingPlayId; private boolean paused; private MusicTrackLoader trackLoader; public MusicPlayer( SoundPool soundPool, Resources resources, MusicPlayer previousPlayer ) { this.clips = new LoadedClips(); this.soundPool = soundPool; this.resources = resources; this.currentTrack = previousPlayer != null ? previousPlayer.currentTrack : null; nowPlayingClipId = null; nowPlayingPlayId = -1; paused = false; trackLoader = null; } public void ensureLoadedAndPlay() { if ( currentTrack == null || soundPool == null || resources == null ) { return; } String currentTrackPath = "music/" + currentTrack + ".ogg"; Integer currentTrackId = clips.get( currentTrackPath ); if ( nowPlayingClipId != null ) { if ( nowPlayingClipId.equals( currentTrackId ) ) { if ( paused ) { try { soundPool.resume( nowPlayingPlayId ); paused = false; } catch ( Throwable t ) { // Ignore failures caused by sound problems t.printStackTrace(); } } return; // We're already playing the right thing } else { stop(); } } if ( currentTrackId == null ) { clips.put( currentTrackPath, LOADING ); trackLoader = new MusicTrackLoader( soundPool, resources, currentTrackPath, this ); trackLoader.start(); } else if ( currentTrackId != LOADING ) { playId( currentTrackId ); } } public void pause() { if ( nowPlayingPlayId != -1 ) { try { soundPool.pause( nowPlayingPlayId ); paused = true; } catch ( Throwable t ) { // Ignore failures caused by sound problems t.printStackTrace(); } } } public void stop() { if ( nowPlayingPlayId != -1 ) { try { soundPool.stop( nowPlayingPlayId ); nowPlayingClipId = null; nowPlayingPlayId = -1; paused = false; } catch ( Throwable t ) { // Ignore failures caused by sound problems t.printStackTrace(); } } } public void clear() { waitForLoadingThread(); clips.clear(); } public void switchTrack( String track, boolean muted ) { if ( track == null ) { stop(); } else if ( !track.equals( currentTrack ) ) { currentTrack = track; if ( !muted ) { ensureLoadedAndPlay(); } } } public void addTrack( String trackPath, int clipId ) { clips.put( trackPath, clipId ); playId( clipId ); } public void playId( Integer clipId ) { try { nowPlayingPlayId = soundPool.play( clipId, VOLUME, VOLUME, 2, -1, 1 ); nowPlayingClipId = clipId; paused = false; } catch ( Throwable t ) { // Ignore failures caused by sound problems t.printStackTrace(); } } private void waitForLoadingThread() { if ( trackLoader == null ) { return; } while( trackLoader.isRunning() ) { try { trackLoader.join(); } catch ( InterruptedException e ) { // Nothing to do } } } }