package dk.dr.radio.afspilning.wrapper; import android.content.Context; import android.net.Uri; import android.os.Build; import android.os.PowerManager; import com.google.android.exoplayer.ExoPlayer; import com.google.android.exoplayer.ExoPlayerLibraryInfo; import java.io.IOException; import com.google.android.exoplayer.demo.player.ExtractorRendererBuilder; import com.google.android.exoplayer.demo.player.DemoPlayer; import com.google.android.exoplayer.demo.EventLogger; import com.google.android.exoplayer.demo.player.HlsRendererBuilder; import dk.dr.radio.diverse.App; import dk.dr.radio.diverse.Log; /** * Wrapper til ExoPlayer. * @author Jacob Nordfalk 28-11-14. */ public class ExoPlayerWrapper implements MediaPlayerWrapper, DemoPlayer.Listener { DemoPlayer player; private EventLogger eventLogger; private MediaPlayerLytter lytter; private PowerManager.WakeLock mWakeLock = null; @Override public void setDataSource(final String url) throws IOException { App.forgrundstråd.post(new Runnable() { @Override public void run() { String versionName; versionName = "ExoPlayerDemo/" + App.versionsnavn + " (Linux;Android " + Build.VERSION.RELEASE + ") " + "ExoPlayerLib/" + ExoPlayerLibraryInfo.VERSION; if (url.contains("m3u8")) { player = new DemoPlayer(new HlsRendererBuilder(App.instans, versionName, url)); if (App.fejlsøgning) App.kortToast("HlsRendererBuilder\n" + url); } else { player = new DemoPlayer(new ExtractorRendererBuilder(App.instans, versionName, Uri.parse(url))); if (App.fejlsøgning) App.kortToast("ExtractorRendererBuilder\n" + url); } player.addListener(ExoPlayerWrapper.this); player.seekTo(0); eventLogger = new EventLogger(); eventLogger.startSession(); player.addListener(eventLogger); player.setInfoListener(eventLogger); player.setInternalErrorListener(eventLogger); } }); } @Override public void setAudioStreamType(int streamMusic) { //TODO player.setAudioStreamType(streamMusic); } @Override public void prepare() throws IOException { App.forgrundstråd.post(new Runnable() { @Override public void run() { if (player==null) return; player.prepare(); player.setPlayWhenReady(true); } }); } @Override public void seekTo(long offsetMs) { if (App.fejlsøgning) App.kortToast("seekTo(" + offsetMs+"\n"+player); if (player!=null) player.seekTo(offsetMs); // else udeståendeSeekToOffsetMs = offsetMs; } @Override public long getDuration() { if (player==null) return 0; // fix for https://mint.splunk.com/dashboard/project/cd78aa05/errors/3038148734 return player.getDuration(); } @Override public long getCurrentPosition() { return player.getCurrentPosition(); } @Override public void start() { player.getPlayerControl().start(); stayAwake(true); } @Override public void stop() { if (player!=null) player.getPlayerControl().pause(); stayAwake(false); } @Override public void release() { player.release(); stayAwake(false); } @Override public void reset() { //player.reset(); stayAwake(false); } @Override public boolean isPlaying() { return player!=null && player.getPlaybackState()== ExoPlayer.STATE_READY; } @Override public void setVolume(float leftVolume, float rightVolume) { Log.e(new IllegalArgumentException("ikke implementeret")); } /** * Set the low-level power management behavior for this MediaPlayer. * * <p>This function has the MediaPlayer access the low-level power manager * service to control the device's power usage while playing is occurring. * The parameter is a combination of {@link android.os.PowerManager} wake flags. * Use of this method requires {@link android.Manifest.permission#WAKE_LOCK} * permission. * By default, no attempt is made to keep the device awake during playback. * * @param context the Context to use * @param mode the power/wake mode to set * @see android.os.PowerManager */ public void setWakeMode(Context context, int mode) { boolean washeld = false; if (mWakeLock != null) { if (mWakeLock.isHeld()) { washeld = true; mWakeLock.release(); } mWakeLock = null; } PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(mode|PowerManager.ON_AFTER_RELEASE, "ExoPlayer"); mWakeLock.setReferenceCounted(false); if (washeld) { mWakeLock.acquire(); } } private void stayAwake(boolean awake) { if (mWakeLock != null) { if (awake && !mWakeLock.isHeld()) { mWakeLock.acquire(); } else if (!awake && mWakeLock.isHeld()) { mWakeLock.release(); } } } @Override public void setMediaPlayerLytter(MediaPlayerLytter lytter) { this.lytter = lytter; } @Override public void onStateChanged(boolean playWhenReady, int playbackState) { if (lytter==null) return; switch (playbackState) { case ExoPlayer.STATE_BUFFERING: lytter.onBufferingUpdate(null, player.getBufferedPercentage()); break; case ExoPlayer.STATE_ENDED: lytter.onCompletion(null); break; case ExoPlayer.STATE_IDLE: lytter.onCompletion(null); //text += "idle"; break; case ExoPlayer.STATE_PREPARING: lytter.onBufferingUpdate(null, 100); break; case ExoPlayer.STATE_READY: lytter.onPrepared(null); break; default: break; } } @Override public void onError(Exception e) { if (lytter==null) return; lytter.onError(null, 42, 42); } @Override public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) { } @Override public String toString() { return "ExoPlayer"; } }