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