/* * ServeStream: A HTTP stream browser/player for Android * Copyright 2013 William Seemann * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.sourceforge.servestream.media; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import android.content.Context; import android.media.MediaPlayer; import android.util.Log; public class NativePlayer extends AbstractMediaPlayer { private static final String TAG = NativePlayer.class.getName(); protected MediaPlayer mMediaPlayer; public NativePlayer() { mMediaPlayer = new MediaPlayer(); initializeStaticCompatMethods(); } @Override public void setDataSource(Context context, long id) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException { } @Override public void setDataSource(String path) throws IOException, IllegalArgumentException, SecurityException, IllegalStateException { mMediaPlayer.setDataSource(path); } @Override public void prepare() throws IOException, IllegalStateException { mMediaPlayer.prepare(); } @Override public void prepareAsync() throws IllegalStateException { mMediaPlayer.prepareAsync(); } @Override public void start() throws IllegalStateException { mMediaPlayer.start(); } @Override public void stop() throws IllegalStateException { mMediaPlayer.stop(); } @Override public void pause() throws IllegalStateException { mMediaPlayer.pause(); } @Override public void seekTo(int msec) throws IllegalStateException { mMediaPlayer.seekTo(msec); } @Override public int getCurrentPosition() { return mMediaPlayer.getCurrentPosition(); } @Override public int getDuration() { return mMediaPlayer.getDuration(); } @Override public void release() { mMediaPlayer.release(); } @Override public void reset() { mMediaPlayer.reset(); } @Override public void setVolume(float leftVolume, float rightVolume) { mMediaPlayer.setVolume(leftVolume, rightVolume); } @Override public void setAudioSessionId(int sessionId) { setAudioSessionIdCompat(mMediaPlayer, sessionId); } @Override public int getAudioSessionId() { return getAudioSessionIdCompat(mMediaPlayer); } private static Method sMethodRegisterSetAudioSessionId; private static Method sMethodRegisterGetAudioSessionId; private static void initializeStaticCompatMethods() { try { sMethodRegisterGetAudioSessionId = MediaPlayer.class.getMethod( "setAudioSessionId", int.class); sMethodRegisterGetAudioSessionId = MediaPlayer.class.getMethod( "getAudioSessionId"); } catch (NoSuchMethodException e) { // Silently fail when running on an OS before API level 9. } } private static void setAudioSessionIdCompat(MediaPlayer mediaPlayer, int sessionId) { if (sMethodRegisterSetAudioSessionId == null) { return; } try { sMethodRegisterSetAudioSessionId.invoke(mediaPlayer, sessionId); } catch (InvocationTargetException e) { // Unpack original exception when possible Throwable cause = e.getCause(); if (cause instanceof RuntimeException) { throw (RuntimeException) cause; } else if (cause instanceof Error) { throw (Error) cause; } else { // Unexpected checked exception; wrap and re-throw throw new RuntimeException(e); } } catch (IllegalAccessException e) { Log.e(TAG, "IllegalAccessException invoking setAudioSessionId."); e.printStackTrace(); } } private static int getAudioSessionIdCompat(MediaPlayer mediaPlayer) { int audioSessionId = 0; if (sMethodRegisterGetAudioSessionId == null) { return audioSessionId; } try { audioSessionId = (Integer) sMethodRegisterGetAudioSessionId.invoke(mediaPlayer); } catch (InvocationTargetException e) { // Unpack original exception when possible Throwable cause = e.getCause(); if (cause instanceof RuntimeException) { throw (RuntimeException) cause; } else if (cause instanceof Error) { throw (Error) cause; } else { // Unexpected checked exception; wrap and re-throw throw new RuntimeException(e); } } catch (IllegalAccessException e) { Log.e(TAG, "IllegalAccessException invoking getAudioSessionId."); e.printStackTrace(); } return audioSessionId; } @Override public void setOnPreparedListener(OnPreparedListener listener) { mOnPreparedListener = listener; mMediaPlayer.setOnPreparedListener(onPreparedListener); } @Override public void setOnCompletionListener(OnCompletionListener listener) { mOnCompletionListener = listener; mMediaPlayer.setOnCompletionListener(onCompletionListener); } @Override public void setOnErrorListener(OnErrorListener listener) { mOnErrorListener = listener; mMediaPlayer.setOnErrorListener(onErrorListener); } private MediaPlayer.OnPreparedListener onPreparedListener = new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { if (mOnPreparedListener != null) { mOnPreparedListener.onPrepared(NativePlayer.this); } } }; private MediaPlayer.OnCompletionListener onCompletionListener = new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { if (mOnCompletionListener != null) { mOnCompletionListener.onCompletion(NativePlayer.this); } } }; private MediaPlayer.OnErrorListener onErrorListener = new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { if (mOnErrorListener != null) { mOnErrorListener.onError(NativePlayer.this, what, extra); } return false; } }; }