package com.miniabs; import java.io.File; import java.io.FileInputStream; import android.content.Context; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.PowerManager; /** Android's own MediaPlayer: every Android version. No speed control (Android 2.x can't). */ final class MediaPlayerEngine implements Engine, MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener { private final MediaPlayer mp = new MediaPlayer(); private Listener listener; private int buffered; MediaPlayerEngine(Context c) { mp.setAudioStreamType(AudioManager.STREAM_MUSIC); mp.setWakeMode(c.getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); mp.setOnPreparedListener(this); mp.setOnCompletionListener(this); mp.setOnErrorListener(this); mp.setOnBufferingUpdateListener(this); } public void setListener(Listener l) { listener = l; } public void setSource(File file, String url) throws Exception { if (file != null) { FileInputStream in = new FileInputStream(file); try { mp.setDataSource(in.getFD()); } finally { in.close(); } } else { mp.setDataSource(url); } } public void prepare() { mp.prepareAsync(); } public void start() { mp.start(); } public void pause() { mp.pause(); } public void seekTo(int ms) { mp.seekTo(ms); } public int position() { return mp.getCurrentPosition(); } public int duration() { return Math.max(0, mp.getDuration()); } public int bufferedPercent() { return buffered; } public void setVolume(float v) { mp.setVolume(v, v); } public void setSpeed(float speed, boolean skipSilence) {} public void release() { listener = null; try { mp.reset(); } catch (Exception ignored) {} try { mp.release(); } catch (Exception ignored) {} } public void onPrepared(MediaPlayer p) { if (listener != null) listener.onPrepared(this); } public void onCompletion(MediaPlayer p) { if (listener != null) listener.onCompletion(this); } public boolean onError(MediaPlayer p, int what, int extra) { if (listener != null) listener.onError(this, "Erro de reprodución (" + what + "/" + extra + ").", false); return true; } public void onBufferingUpdate(MediaPlayer p, int percent) { buffered = percent; } }