diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/camera/EffectsRecorder.java | 33 | ||||
-rw-r--r-- | src/com/android/camera/SoundPlayer.java | 13 |
2 files changed, 45 insertions, 1 deletions
diff --git a/src/com/android/camera/EffectsRecorder.java b/src/com/android/camera/EffectsRecorder.java index 2483173..9b3e3b1 100644 --- a/src/com/android/camera/EffectsRecorder.java +++ b/src/com/android/camera/EffectsRecorder.java @@ -17,6 +17,7 @@ package com.android.camera; import android.content.Context; +import android.content.res.AssetFileDescriptor; import android.filterfw.GraphEnvironment; import android.filterfw.core.Filter; import android.filterfw.core.GLEnvironment; @@ -36,13 +37,17 @@ import android.os.ConditionVariable; import android.os.Handler; import android.os.Looper; import android.os.ParcelFileDescriptor; +import android.os.SystemProperties; import android.util.Log; import android.view.Surface; import android.view.SurfaceHolder; import java.io.IOException; +import java.io.FileNotFoundException; +import java.io.File; import java.lang.Runnable; + /** * Encapsulates the mobile filter framework components needed to record video with * effects applied. Modeled after MediaRecorder. @@ -95,6 +100,9 @@ public class EffectsRecorder { private SurfaceTexture mTextureSource; + private static final String mVideoRecordSound = "/system/media/audio/ui/VideoRecord.ogg"; + private SoundPlayer mRecordSound; + private static final int STATE_CONFIGURE = 0; private static final int STATE_WAITING_FOR_SURFACE = 1; private static final int STATE_PREVIEW = 2; @@ -123,6 +131,28 @@ public class EffectsRecorder { if (mLogVerbose) Log.v(TAG, "EffectsRecorder created (" + this + ")"); mContext = context; mHandler = new Handler(Looper.getMainLooper()); + + // Construct sound player; use enforced sound output if necessary + File recordSoundFile = new File(mVideoRecordSound); + try { + ParcelFileDescriptor recordSoundParcel = + ParcelFileDescriptor.open(recordSoundFile, + ParcelFileDescriptor.MODE_READ_ONLY); + AssetFileDescriptor recordSoundAsset = + new AssetFileDescriptor(recordSoundParcel, 0, + AssetFileDescriptor.UNKNOWN_LENGTH); + if (SystemProperties.get("ro.camera.sound.forced", "0").equals("0")) { + if (mLogVerbose) Log.v(TAG, "Standard recording sound"); + mRecordSound = new SoundPlayer(recordSoundAsset, false); + } else { + if (mLogVerbose) Log.v(TAG, "Forced recording sound"); + mRecordSound = new SoundPlayer(recordSoundAsset, true); + } + } catch (java.io.FileNotFoundException e) { + Log.e(TAG, "System video record sound not found"); + mRecordSound = null; + } + } public void setCamera(Camera cameraDevice) { @@ -524,6 +554,7 @@ public class EffectsRecorder { recorder.setInputValue("errorListener", mErrorListener); } recorder.setInputValue("recording", true); + if (mRecordSound != null) mRecordSound.play(); mState = STATE_RECORD; } @@ -542,6 +573,7 @@ public class EffectsRecorder { } Filter recorder = mRunner.getGraph().getFilter("recorder"); recorder.setInputValue("recording", false); + if (mRecordSound != null) mRecordSound.play(); mState = STATE_PREVIEW; } @@ -670,6 +702,7 @@ public class EffectsRecorder { stopPreview(); // Fall-through default: + mRecordSound.release(); mState = STATE_RELEASED; break; } diff --git a/src/com/android/camera/SoundPlayer.java b/src/com/android/camera/SoundPlayer.java index fed3926..a3acb44 100644 --- a/src/com/android/camera/SoundPlayer.java +++ b/src/com/android/camera/SoundPlayer.java @@ -34,6 +34,7 @@ public class SoundPlayer implements Runnable { private int mPlayCount = 0; private boolean mExit; private AssetFileDescriptor mAfd; + private int mAudioStreamType; @Override public void run() { @@ -41,7 +42,7 @@ public class SoundPlayer implements Runnable { try { if (mPlayer == null) { MediaPlayer player = new MediaPlayer(); - player.setAudioStreamType(AudioManager.STREAM_MUSIC); + player.setAudioStreamType(mAudioStreamType); player.setDataSource(mAfd.getFileDescriptor(), mAfd.getStartOffset(), mAfd.getLength()); player.setLooping(false); @@ -71,6 +72,16 @@ public class SoundPlayer implements Runnable { public SoundPlayer(AssetFileDescriptor afd) { mAfd = afd; + mAudioStreamType = AudioManager.STREAM_MUSIC; + } + + public SoundPlayer(AssetFileDescriptor afd, boolean enforceAudible) { + mAfd = afd; + if (enforceAudible) { + mAudioStreamType = 7; // AudioManager.STREAM_SYSTEM_ENFORCED; currently hidden API. + } else { + mAudioStreamType = AudioManager.STREAM_MUSIC; + } } public void play() { |