12e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen/*
22e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * Copyright (C) 2009 The Android Open Source Project
32e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen *
42e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License");
52e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * you may not use this file except in compliance with the License.
62e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * You may obtain a copy of the License at
72e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen *
82e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen *      http://www.apache.org/licenses/LICENSE-2.0
92e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen *
102e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * Unless required by applicable law or agreed to in writing, software
112e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS,
122e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * See the License for the specific language governing permissions and
142e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen * limitations under the License.
152e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen */
162e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
172e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenpackage com.android.effectstest;
182e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
192e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.content.Context;
202e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.content.res.AssetFileDescriptor;
212e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.os.Bundle;
222e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.util.Log;
232e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.view.KeyEvent;
242e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.view.Menu;
252e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.view.View.OnClickListener;
262e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.view.View;
272e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.view.ViewGroup;
282e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.Button;
292e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.TextView;
302e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.EditText;
312e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.SeekBar;
322e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.ToggleButton;
332e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.CompoundButton;
342e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.CompoundButton.OnCheckedChangeListener;
352e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.ImageButton;
362e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.widget.ImageView;
372e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.media.AudioManager;
382e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport android.media.MediaPlayer;
392e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport java.nio.ByteOrder;
402e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport java.nio.ByteBuffer;
412e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport java.io.IOException;
422e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport java.util.HashMap;
432e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenimport java.util.Map;
442e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
452e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissenpublic class SimplePlayer implements OnClickListener {
462e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
472e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    private final static String TAG = "SimplePlayer";
482e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
492e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    int mPlayPauseButtonId;
502e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    int mStopButtonId;
512e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    Context mContext;
522e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    ImageView mPlayPauseButton;
532e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    int mPlayImageResource;
542e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    int mPauseImageResource;
552e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    String mFileName;
562e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    int mFileResId;
572e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    MediaPlayer mMediaPlayer;
582e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    int mStreamType;
592e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    int mSession;
602e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    float mSendLevel = (float)0.5;
612e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    int mEffectId = 0;
622e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    TextView mSessionText;
632e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
642e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    SimplePlayer(Context context, int playPausebuttonId, ImageView playPausebutton,
652e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                int stopButtonId, ImageView stopButton, TextView sessionText, String fileName, int stream, int session)
662e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    {
672e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        set(context, playPausebuttonId, playPausebutton, stopButtonId, stopButton, sessionText, stream, session);
682e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mFileName = fileName;
692e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
702e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
712e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    SimplePlayer(Context context, int playPausebuttonId, ImageView playPausebutton,
722e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            int stopButtonId, ImageView stopButton, TextView sessionText, int fileResId, int stream, int session) {
732e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        set(context, playPausebuttonId, playPausebutton, stopButtonId, stopButton, sessionText, stream, session);
742e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mFileResId = fileResId;
752e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mFileName = "";
762e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
772e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
782e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void set(Context context, int playPausebuttonId, ImageView playPausebutton,
792e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            int stopButtonId, ImageView stopButton, TextView sessionText, int stream, int session) {
802e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mContext = context;
812e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mPlayPauseButtonId = playPausebuttonId;
822e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mStopButtonId = stopButtonId;
832e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mPlayPauseButton = (ImageButton) playPausebutton;
842e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        ImageButton stop = (ImageButton) stopButton;
852e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
862e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mPlayPauseButton.setOnClickListener(this);
872e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mPlayPauseButton.requestFocus();
882e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        stop.setOnClickListener(this);
892e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
902e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mPlayImageResource = android.R.drawable.ic_media_play;
912e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mPauseImageResource = android.R.drawable.ic_media_pause;
922e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mStreamType = stream;
932e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mSession = session;
942e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mSessionText = sessionText;
952e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
962e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
972e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
982e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void onClick(View v) {
992e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (v.getId() == mPlayPauseButtonId) {
1002e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            playOrPause();
1012e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        } else if (v.getId() == mStopButtonId) {
1022e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            stop();
1032e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
1042e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
1052e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1062e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void playOrPause() {
1072e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (mMediaPlayer == null || !mMediaPlayer.isPlaying()){
1082e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen              if (mMediaPlayer == null) {
1092e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                  try {
1102e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      mMediaPlayer = new MediaPlayer();
1112e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      if (mSession != 0) {
1122e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                          mMediaPlayer.setAudioSessionId(mSession);
1132e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                          Log.d(TAG, "mMediaPlayer.setAudioSessionId(): "+ mSession);
1142e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      }
1152e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1162e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      if (mFileName.equals("")) {
1172e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                          Log.d(TAG, "Playing from resource");
1182e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                          AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(mFileResId);
1192e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                          mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
1202e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                          afd.close();
1212e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      } else {
1222e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                          Log.d(TAG, "Playing file: "+mFileName);
1232e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                          mMediaPlayer.setDataSource(mFileName);
1242e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      }
1252e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      mMediaPlayer.setAudioStreamType(mStreamType);
1262e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      mMediaPlayer.prepare();
1272e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      mMediaPlayer.setLooping(true);
1282e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                  } catch (IOException ex) {
1292e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      Log.e(TAG, "mMediaPlayercreate failed:", ex);
1302e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      mMediaPlayer = null;
1312e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                  } catch (IllegalArgumentException ex) {
1322e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      Log.e(TAG, "mMediaPlayercreate failed:", ex);
1332e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      mMediaPlayer = null;
1342e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                  } catch (SecurityException ex) {
1352e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      Log.e(TAG, "mMediaPlayercreate failed:", ex);
1362e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      mMediaPlayer = null;
1372e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                  }
1382e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1392e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                  if (mMediaPlayer != null) {
1402e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      mMediaPlayer.setAuxEffectSendLevel(mSendLevel);
1412e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      mMediaPlayer.attachAuxEffect(mEffectId);
1422e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
1432e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                          public void onCompletion(MediaPlayer mp) {
1442e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                              updatePlayPauseButton();
1452e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                          }
1462e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      });
1472e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                      mSessionText.setText("Session: "+Integer.toString(mMediaPlayer.getAudioSessionId()));
1482e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                  }
1492e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen              }
1502e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen              if (mMediaPlayer != null) {
1512e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen                  mMediaPlayer.start();
1522e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen              }
1532e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen          } else {
1542e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen              mMediaPlayer.pause();
1552e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen          }
1562e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen          updatePlayPauseButton();
1572e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
1582e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1592e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void stop() {
1602e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen      if (mMediaPlayer != null) {
1612e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen          mMediaPlayer.stop();
1622e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen          mMediaPlayer.release();
1632e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen          mMediaPlayer = null;
1642e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen      }
1652e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen      updatePlayPauseButton();
1662e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
1672e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1682e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public boolean isPlaying() {
1692e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (mMediaPlayer != null) {
1702e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return mMediaPlayer.isPlaying();
1712e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        } else {
1722e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            return false;
1732e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
1742e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
1752e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1762e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void updatePlayPauseButton() {
1772e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mPlayPauseButton.setImageResource(isPlaying() ? mPauseImageResource : mPlayImageResource);
1782e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
1792e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1802e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void attachAuxEffect(int effectId) {
1812e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mEffectId = effectId;
1822e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (mMediaPlayer != null) {
1832e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            Log.d(TAG,"attach effect: "+effectId);
1842e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mMediaPlayer.attachAuxEffect(effectId);
1852e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
1862e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
1872e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void setAuxEffectSendLevel(float level) {
1882e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mSendLevel = level;
1892e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        if (mMediaPlayer != null) {
1902e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen            mMediaPlayer.setAuxEffectSendLevel(level);
1912e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        }
1922e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
1932e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen
1942e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    public void setContext(Context context) {
1952e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen        mContext = context;
1962e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen    }
1972e2beaaee2a427598ced5067fc59f3ae9a98cf35Marco Nelissen}
198