summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/android/camera/EffectsRecorder.java33
-rw-r--r--src/com/android/camera/SoundPlayer.java13
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() {