package org.restcomm.android.sdk.MediaClient;
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import org.restcomm.android.sdk.util.RCLogger;
/*
* Notice that I'm doing everything in main thread right now, which is bad practice, but since all audio files are so small it doesn't
* seem to cause any issues and I would like to avoid spending the time to make all this work properly asynchronously.
*
* Since only one sound can play at a given time what I did was to take a very simplistic approach where a single MediaPlayer is used
* and re-initiated with each call
*
* Credits for the sounds used:
*
* The SDK uses these sounds from freesound:
* - 'Call Busy.wav' by 'henrique85n' ( http://www.freesound.org/people/henrique85n/ )
* - 'PhoneRinging.mp3' by 'acclivity' ( http://www.freesound.org/people/acclivity/ )
*/
public class MediaPlayerWrapper implements MediaPlayer.OnCompletionListener {
private final Context androidContext;
private MediaPlayer mediaPlayer = null;
private static final String TAG = "MediaPlayerWrapper";
MediaPlayerWrapper(Context androidContext)
{
RCLogger.v(TAG, "MediaPlayerWrapper()");
this.androidContext = androidContext;
}
void play(int resid, boolean loop)
{
RCLogger.v(TAG, "MediaPlayerWrapper.play(): " + resid);
if (mediaPlayer != null) {
RCLogger.v(TAG, "MediaPlayerWrapper.play(): reset");
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
// Request audio focus before making any device switch.
((AudioManager) androidContext.getSystemService(Context.AUDIO_SERVICE)).requestAudioFocus(null, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
mediaPlayer = MediaPlayer.create(androidContext, resid);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setLooping(loop);
mediaPlayer.start();
if (!loop) {
// For non-looping sounds we want an event when they are done so that we can abandon focus
mediaPlayer.setOnCompletionListener(this);
}
}
void stop()
{
RCLogger.v(TAG, "MediaPlayerWrapper.stop()");
if (mediaPlayer != null) {
RCLogger.v(TAG, "MediaPlayerWrapper.stop(): stopping");
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
((AudioManager) androidContext.getSystemService(Context.AUDIO_SERVICE)).abandonAudioFocus(null);
}
}
void close()
{
RCLogger.v(TAG, "MediaPlayerWrapper.close()");
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
((AudioManager) androidContext.getSystemService(Context.AUDIO_SERVICE)).abandonAudioFocus(null);
}
}
public void onCompletion(MediaPlayer mediaPlayer)
{
RCLogger.v(TAG, "onCompletion()");
((AudioManager) androidContext.getSystemService(Context.AUDIO_SERVICE)).abandonAudioFocus(null);
if (this.mediaPlayer != null) {
RCLogger.v(TAG, "onCompletion(): reset");
this.mediaPlayer.stop();
// mediaPlayer.reset();
this.mediaPlayer.release();
this.mediaPlayer = null;
}
}
}