package com.wisedu.scc.love.widget.audio;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.util.Log;
import java.io.IOException;
public final class MediaMangerImpl implements IMediaManager {
private static final int RECORDING_BITRATE = 12200;
private MediaRecorder mMediaRecorder;
private MediaPlayer mMediaPlayer;
private int mPausedPosition;
private final String TAG = "MediaMangerImpl";
private OnMediaEventListener mOnMediaEventListener;
private MediaMangerImpl() {
}
/**
* Creates new instance of MEdiaManger.
* @return MediaMangerImpl
*/
public static MediaMangerImpl newInstance() {
return new MediaMangerImpl();
}
@Override
public void recordGreeting(String fileName) {
Log.d(TAG , String.format("Recording a file:%s", fileName));
// reset any previous paused position
mPausedPosition = 0;
// initialise MediaRecorder
if (mMediaRecorder == null) {
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mMediaRecorder.setAudioEncodingBitRate(RECORDING_BITRATE);
mMediaRecorder.setOnErrorListener(new RecorderErrorListener());
} else {
mMediaRecorder.stop();
mMediaRecorder.reset();
}
mMediaRecorder.setOutputFile(fileName);
try {
mMediaRecorder.prepare();
mMediaRecorder.start();
} catch (IllegalStateException e) {
Log.e(TAG, "IllegalStateException thrown while trying to record a greeting");
e.printStackTrace();
mMediaRecorder.release();
mMediaRecorder = null;
} catch (IOException e) {
Log.e(TAG, "IOException thrown while trying to record a greeting");
e.printStackTrace();
mMediaRecorder.release();
mMediaRecorder = null;
}
}
@Override
public void playGreeting(String fileName, boolean isRestartRequired) {
Log.d(TAG , String.format("Playing a file:%s", fileName));
if (mMediaPlayer == null) {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnErrorListener(new PlayerErrorListener());
mMediaPlayer.setOnCompletionListener(new PlayerCompletionListener());
} else {
mMediaPlayer.stop();
mMediaPlayer.reset();
}
try {
mMediaPlayer.setDataSource(fileName);
mMediaPlayer.prepare();
if (isRestartRequired) {
mMediaPlayer.seekTo(0);
} else { // probably paused before, so use paused position
mMediaPlayer.seekTo(mPausedPosition);
}
// reset any previous paused position
mPausedPosition = 0;
mMediaPlayer.start();
} catch (IOException e) {
Log.e(TAG, "IOException thrown while trying to play a greeting");
e.printStackTrace();
mMediaPlayer.release();
mMediaPlayer = null;
}
}
@Override
public void stopRecording() {
if (mMediaRecorder != null) {
Log.d(TAG, "Stopping recording");
mMediaRecorder.stop();
mMediaRecorder.release();
mMediaRecorder = null;
}
}
@Override
public void stopPlayback() {
if (mMediaPlayer != null) {
Log.d(TAG, "Stopping playback");
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
}
@Override
public void pausePlayback() {
if (mMediaPlayer != null) {
mMediaPlayer.pause();
mPausedPosition = mMediaPlayer.getCurrentPosition();
}
}
@Override
public int getPlaybackDuration() {
int duration = 0;
if (mMediaPlayer != null) {
duration = mMediaPlayer.getDuration();
}
return duration;
}
@Override
public int getCurrentPlaybackPosition() {
int position = 0;
if (mMediaPlayer != null) {
position = mMediaPlayer.getCurrentPosition();
Log.d(TAG, String.format("Got playback position:%d", position));
}
return position;
}
@Override
public void setPlayPosition(int progress) {
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.seekTo(progress);
}
mPausedPosition = progress;
}
@Override
public boolean isPlaying() {
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
return true;
}
return false;
}
@Override
public MediaPlayer getMediaPlayer() {
return mMediaPlayer;
}
@Override
public MediaRecorder getMediaRecorder() {
return mMediaRecorder;
}
@Override
public void setOnMediaEventListener(
OnMediaEventListener onMediaEventListener) {
mOnMediaEventListener = onMediaEventListener;
}
/**
* Listener for the MediaRecorder error messages.
*/
public class RecorderErrorListener implements MediaRecorder.OnErrorListener {
@Override
public void onError(MediaRecorder mp, int what, int extra) {
String whatDescription = "";
switch (what) {
case MediaRecorder.MEDIA_RECORDER_ERROR_UNKNOWN:
whatDescription = "MEDIA_RECORDER_ERROR_UNKNOWN";
break;
default:
whatDescription = Integer.toString(what);
break;
}
if(mOnMediaEventListener != null) {
mOnMediaEventListener.onMediaRecordError();
}
Log.e(TAG, String.format("MediaRecorder error occured: %s,%d", whatDescription, extra));
}
}
/**
* Listener for the MediaPlayer error messages.
*/
public class PlayerErrorListener implements MediaPlayer.OnErrorListener {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
String whatDescription = "";
switch (what) {
case MediaPlayer.MEDIA_ERROR_UNKNOWN:
whatDescription = "MEDIA_ERROR_UNKNOWN";
break;
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
whatDescription = "MEDIA_ERROR_SERVER_DIED";
break;
default:
whatDescription = Integer.toString(what);
break;
}
if(mOnMediaEventListener != null) {
mOnMediaEventListener.onMediaPlayError();
}
Log.e(TAG, String.format("MediaPlayer error occured: %s:%d", whatDescription, extra));
return false;
}
}
public class PlayerCompletionListener implements MediaPlayer.OnCompletionListener {
@Override
public void onCompletion(MediaPlayer mp) {
if(mOnMediaEventListener != null) {
mOnMediaEventListener.onMediaRecordCompletion();
}
}
}
}