summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt4
-rw-r--r--media/java/android/media/AudioRecord.java13
-rw-r--r--media/java/android/media/MediaRecorder.java36
-rw-r--r--media/java/android/media/MicrophoneDirection.java14
-rw-r--r--media/jni/android_media_MediaRecorder.cpp40
5 files changed, 95 insertions, 12 deletions
diff --git a/api/current.txt b/api/current.txt
index 7007e3c428a8..e0aa52f965a3 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -25732,7 +25732,7 @@ package android.media {
field public static final int MEDIA_TRACK_TYPE_VIDEO = 1; // 0x1
}
- public class MediaRecorder implements android.media.AudioRecordingMonitor android.media.AudioRouting {
+ public class MediaRecorder implements android.media.AudioRecordingMonitor android.media.AudioRouting android.media.MicrophoneDirection {
ctor public MediaRecorder();
method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
method protected void finalize();
@@ -25762,6 +25762,8 @@ package android.media {
method public void setLocation(float, float);
method public void setMaxDuration(int) throws java.lang.IllegalArgumentException;
method public void setMaxFileSize(long) throws java.lang.IllegalArgumentException;
+ method public boolean setMicrophoneDirection(int);
+ method public boolean setMicrophoneFieldDimension(@FloatRange(from=-1.0, to=1.0) float);
method public void setNextOutputFile(java.io.FileDescriptor) throws java.io.IOException;
method public void setNextOutputFile(java.io.File) throws java.io.IOException;
method public void setOnErrorListener(android.media.MediaRecorder.OnErrorListener);
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index fbb629b8383a..91d2069c57a7 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -1791,13 +1791,14 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection,
// MicrophoneDirection
//--------------------
/**
- * Specifies the logical microphone (for processing).
+ * Specifies the logical microphone (for processing). Applications can use this to specify
+ * which side of the device to optimize capture from. Typically used in conjunction with
+ * the camera capturing video.
*
- * @param direction Direction constant.
* @return true if sucessful.
*/
- public boolean setMicrophoneDirection(int direction) {
- return native_set_microphone_direction(direction) == 0;
+ public boolean setMicrophoneDirection(@DirectionMode int direction) {
+ return native_set_microphone_direction(direction) == AudioSystem.SUCCESS;
}
/**
@@ -1809,7 +1810,9 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection,
* @return true if sucessful.
*/
public boolean setMicrophoneFieldDimension(@FloatRange(from = -1.0, to = 1.0) float zoom) {
- return native_set_microphone_field_dimension(zoom) == 0;
+ Preconditions.checkArgument(
+ zoom >= -1 && zoom <= 1, "Argument must fall between -1 & 1 (inclusive)");
+ return native_set_microphone_field_dimension(zoom) == AudioSystem.SUCCESS;
}
//---------------------------------------------------------
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 1304afe3654e..e7b4752701fb 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -17,6 +17,7 @@
package android.media;
import android.annotation.CallbackExecutor;
+import android.annotation.FloatRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -35,6 +36,7 @@ import android.util.Pair;
import android.view.Surface;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.Preconditions;
import java.io.File;
import java.io.FileDescriptor;
@@ -45,7 +47,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
-
/**
* Used to record audio and video. The recording control is based on a
* simple state machine (see below).
@@ -90,7 +91,8 @@ import java.util.concurrent.Executor;
*/
public class MediaRecorder implements AudioRouting,
AudioRecordingMonitor,
- AudioRecordingMonitorClient
+ AudioRecordingMonitorClient,
+ MicrophoneDirection
{
static {
System.loadLibrary("media_jni");
@@ -1527,6 +1529,36 @@ public class MediaRecorder implements AudioRouting,
ArrayList<MicrophoneInfo> activeMicrophones);
//--------------------------------------------------------------------------
+ // MicrophoneDirection
+ //--------------------
+ /**
+ * Specifies the logical microphone (for processing).
+ *
+ * @param direction Direction constant.
+ * @return true if sucessful.
+ */
+ public boolean setMicrophoneDirection(@DirectionMode int direction) {
+ return native_setMicrophoneDirection(direction) == 0;
+ }
+
+ /**
+ * Specifies the zoom factor (i.e. the field dimension) for the selected microphone
+ * (for processing). The selected microphone is determined by the use-case for the stream.
+ *
+ * @param zoom the desired field dimension of microphone capture. Range is from -1 (wide angle),
+ * though 0 (no zoom) to 1 (maximum zoom).
+ * @return true if sucessful.
+ */
+ public boolean setMicrophoneFieldDimension(@FloatRange(from = -1.0, to = 1.0) float zoom) {
+ Preconditions.checkArgument(
+ zoom >= -1 && zoom <= 1, "Argument must fall between -1 & 1 (inclusive)");
+ return native_setMicrophoneFieldDimension(zoom) == 0;
+ }
+
+ private native int native_setMicrophoneDirection(int direction);
+ private native int native_setMicrophoneFieldDimension(float zoom);
+
+ //--------------------------------------------------------------------------
// Implementation of AudioRecordingMonitor interface
//--------------------
diff --git a/media/java/android/media/MicrophoneDirection.java b/media/java/android/media/MicrophoneDirection.java
index 489e2683259e..2382da54801c 100644
--- a/media/java/android/media/MicrophoneDirection.java
+++ b/media/java/android/media/MicrophoneDirection.java
@@ -22,6 +22,10 @@ import android.annotation.IntDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+/**
+ * Interface defining mechanism for controlling the directionality and field width of
+ * audio capture.
+ */
public interface MicrophoneDirection {
/**
* Don't do any directionality processing of the activated microphone(s).
@@ -41,21 +45,23 @@ public interface MicrophoneDirection {
int MIC_DIRECTION_EXTERNAL = 3;
/** @hide */
- @IntDef({
+ /*public*/ @IntDef({
MIC_DIRECTION_UNSPECIFIED,
MIC_DIRECTION_FRONT,
MIC_DIRECTION_BACK,
MIC_DIRECTION_EXTERNAL
})
@Retention(RetentionPolicy.SOURCE)
- public @interface Directionmode{};
+ @interface DirectionMode{};
/**
- * Specifies the logical microphone (for processing).
+ * Specifies the logical microphone (for processing). Applications can use this to specify
+ * which side of the device to optimize capture from. Typically used in conjunction with
+ * the camera capturing video.
*
* @param direction Direction constant.
* @return true if sucessful.
*/
- boolean setMicrophoneDirection(@Directionmode int direction);
+ boolean setMicrophoneDirection(@DirectionMode int direction);
/**
* Specifies the zoom factor (i.e. the field dimension) for the selected microphone
diff --git a/media/jni/android_media_MediaRecorder.cpp b/media/jni/android_media_MediaRecorder.cpp
index a7c015932441..3ec0903472bc 100644
--- a/media/jni/android_media_MediaRecorder.cpp
+++ b/media/jni/android_media_MediaRecorder.cpp
@@ -760,6 +760,44 @@ android_media_MediaRecord_getActiveMicrophones(JNIEnv *env,
return jStatus;
}
+static jint android_media_MediaRecord_setMicrophoneDirection(
+ JNIEnv *env, jobject thiz, jint direction) {
+ ALOGV("setMicrophoneDirection(%d)", direction);
+ sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
+ if (mr == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return (jint)AUDIO_JAVA_NO_INIT;
+ }
+
+ jint jStatus = AUDIO_JAVA_SUCCESS;
+ status_t status =
+ mr->setMicrophoneDirection(static_cast<audio_microphone_direction_t>(direction));
+ if (status != NO_ERROR) {
+ jStatus = nativeToJavaStatus(status);
+ }
+
+ return jStatus;
+}
+
+static jint android_media_MediaRecord_setMicrophoneFieldDimension(
+ JNIEnv *env, jobject thiz, jfloat zoom) {
+ ALOGV("setMicrophoneFieldDimension(%f)", zoom);
+ sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
+ if (mr == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return (jint)AUDIO_JAVA_NO_INIT;
+ }
+
+ jint jStatus = AUDIO_JAVA_SUCCESS;
+ status_t status = mr->setMicrophoneFieldDimension(zoom);
+ if (status != NO_ERROR) {
+ jStatus = nativeToJavaStatus(status);
+ }
+
+ return jStatus;
+
+}
+
static jint android_media_MediaRecord_getPortId(JNIEnv *env, jobject thiz) {
sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
if (mr == NULL) {
@@ -812,6 +850,8 @@ static const JNINativeMethod gMethods[] = {
{"native_getActiveMicrophones", "(Ljava/util/ArrayList;)I", (void *)android_media_MediaRecord_getActiveMicrophones},
{"native_getPortId", "()I", (void *)android_media_MediaRecord_getPortId},
+ {"native_setMicrophoneDirection", "(I)I", (void *)android_media_MediaRecord_setMicrophoneDirection},
+ {"native_setMicrophoneFieldDimension", "(F)I", (void *)android_media_MediaRecord_setMicrophoneFieldDimension},
};
// This function only registers the native methods, and is called from