package org.awesomeapp.messenger.ui; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnPreparedListener; import android.media.audiofx.Visualizer; import android.net.Uri; import android.os.AsyncTask; import android.support.v4.content.ContextCompat; import android.util.Log; import android.widget.TextView; import android.widget.Toast; import org.awesomeapp.messenger.ImApp; import org.awesomeapp.messenger.ui.widgets.VisualizerView; import org.awesomeapp.messenger.util.HttpMediaStreamer; public class AudioPlayer { private static final String TAG = "AudioPlayer"; private Context mContext; private String mFileName; private String mMimeType; private static MediaPlayer mediaPlayer; private HttpMediaStreamer streamer; private Visualizer mVisualizer; private VisualizerView mVisualizerView; private TextView mInfoView; private int mDuration = -1; private boolean mPrepared = false; private boolean mPlayOnPrepare = false; public AudioPlayer(Context context, String fileName, String mimeType, VisualizerView visualizerView, TextView infoView) throws Exception { mContext = context.getApplicationContext(); mFileName = fileName; mMimeType = mimeType; mVisualizerView = visualizerView; mInfoView = infoView; } public int getDuration () { return mDuration; } public void play() { if (mPrepared) { int permissionCheck = ContextCompat.checkSelfPermission(mContext, Manifest.permission.RECORD_AUDIO); if (permissionCheck == PackageManager.PERMISSION_GRANTED) { if (mVisualizer == null) setupVisualizerFxAndUI(); if (!mVisualizer.getEnabled()) mVisualizer.setEnabled(true); } mediaPlayer.start(); } else { mPlayOnPrepare = true; new AsyncTask<String, Void, Boolean>() { @Override protected Boolean doInBackground(String... params) { try { initPlayer(); return true; } catch (Exception e) { e.printStackTrace(); return false; } } @Override protected void onPostExecute(Boolean playerInit) { } }.execute(); } } public void pause() { mediaPlayer.pause(); } public boolean isPlaying () { if (mediaPlayer != null) return mediaPlayer.isPlaying(); else return false; } public boolean isPaused () { if (mediaPlayer != null) return (!mediaPlayer.isPlaying()) && (mediaPlayer.getCurrentPosition() > 0); else return false; } public void stop() { killPlayer(); } private void killPlayer() { if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } if (streamer != null) { streamer.destroy(); streamer = null; } } public void initPlayer() throws Exception { info.guardianproject.iocipher.File fileStream = new info.guardianproject.iocipher.File(mFileName); if (mediaPlayer != null) { if (mediaPlayer.isPlaying()) mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); if (fileStream.exists()) { streamer = new HttpMediaStreamer(fileStream, mMimeType); Uri uri = streamer.getUri(); mediaPlayer.setDataSource(mContext, uri); } else { mediaPlayer.setDataSource(mFileName); } mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mediaPlayer, int i, int i1) { Log.d("AudioPlayer", "there was an error loading music: " + i + " " + i1); return true; } }); mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mPrepared = true; mDuration = mediaPlayer.getDuration(); mInfoView.setText((getDuration()/1000) + "secs"); if (mPlayOnPrepare) play(); } }); mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { //killPlayer(); if (mVisualizer != null) mVisualizer.setEnabled(false); } }); mediaPlayer.prepareAsync(); } private void setupVisualizerFxAndUI() { try { // Create the Visualizer object and attach it to our media player. mVisualizer = new Visualizer(mediaPlayer.getAudioSessionId()); mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]); mVisualizer.setDataCaptureListener( new Visualizer.OnDataCaptureListener() { public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) { mVisualizerView.updateVisualizer(bytes); } public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) { } }, Visualizer.getMaxCaptureRate() / 2, true, false); } catch (RuntimeException re) { Log.w(ImApp.LOG_TAG, "unable to init audio player visualizaer",re); } } }