audio: add Ultrasound input source and content_type

The Ultrasound is added as the SystemAPI

Bug: 200256985
Test: atest AudioAttributesTest
Signed-off-by: Carter Hsu <carterhsu@google.com>
Change-Id: I1a0146c32faeba3a60a4a7bdf997d985bbb12251
This commit is contained in:
Carter Hsu 2021-10-20 16:12:53 +08:00
parent 8ddb283a68
commit 0267771f63
14 changed files with 145 additions and 58 deletions

View File

@ -23,6 +23,7 @@ package android {
field public static final String ACCESS_TV_DESCRAMBLER = "android.permission.ACCESS_TV_DESCRAMBLER";
field public static final String ACCESS_TV_SHARED_FILTER = "android.permission.ACCESS_TV_SHARED_FILTER";
field public static final String ACCESS_TV_TUNER = "android.permission.ACCESS_TV_TUNER";
field public static final String ACCESS_ULTRASOUND = "android.permission.ACCESS_ULTRASOUND";
field public static final String ACCESS_VIBRATOR_STATE = "android.permission.ACCESS_VIBRATOR_STATE";
field public static final String ACTIVITY_EMBEDDING = "android.permission.ACTIVITY_EMBEDDING";
field public static final String ADJUST_RUNTIME_PERMISSIONS_POLICY = "android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY";
@ -5664,6 +5665,7 @@ package android.media {
method public int getCapturePreset();
method public int getSystemUsage();
method public static boolean isSystemUsage(int);
field @RequiresPermission(android.Manifest.permission.ACCESS_ULTRASOUND) public static final int CONTENT_TYPE_ULTRASOUND = 1997; // 0x7cd
field public static final int FLAG_BEACON = 8; // 0x8
field public static final int FLAG_BYPASS_INTERRUPTION_POLICY = 64; // 0x40
field public static final int FLAG_BYPASS_MUTE = 128; // 0x80
@ -5680,6 +5682,7 @@ package android.media {
method public android.media.AudioAttributes.Builder setCapturePreset(int);
method @NonNull @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD) public android.media.AudioAttributes.Builder setHotwordModeEnabled(boolean);
method public android.media.AudioAttributes.Builder setInternalCapturePreset(int);
method @NonNull public android.media.AudioAttributes.Builder setInternalContentType(int);
method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.AudioAttributes.Builder setSystemUsage(int);
}
@ -5895,6 +5898,7 @@ package android.media {
field @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_OUTPUT) public static final int ECHO_REFERENCE = 1997; // 0x7cd
field @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD) public static final int HOTWORD = 1999; // 0x7cf
field @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_OUTPUT) public static final int RADIO_TUNER = 1998; // 0x7ce
field @RequiresPermission(android.Manifest.permission.ACCESS_ULTRASOUND) public static final int ULTRASOUND = 2000; // 0x7d0
}
public final class MediaRouter2 {

View File

@ -57,7 +57,7 @@ static struct {
jmethodID setUsage;
jmethodID setSystemUsage;
jmethodID setInternalCapturePreset;
jmethodID setContentType;
jmethodID setInternalContentType;
jmethodID replaceFlags;
jmethodID addTag;
} gAudioAttributesBuilderMethods;
@ -127,7 +127,7 @@ static jint nativeAudioAttributesToJavaAudioAttributes(
gAudioAttributesBuilderMethods.setInternalCapturePreset,
attributes.source);
env->CallObjectMethod(jAttributeBuilder.get(),
gAudioAttributesBuilderMethods.setContentType,
gAudioAttributesBuilderMethods.setInternalContentType,
attributes.content_type);
env->CallObjectMethod(jAttributeBuilder.get(),
gAudioAttributesBuilderMethods.replaceFlags,
@ -202,9 +202,9 @@ int register_android_media_AudioAttributes(JNIEnv *env)
gAudioAttributesBuilderMethods.setInternalCapturePreset = GetMethodIDOrDie(
env, audioAttributesBuilderClass, "setInternalCapturePreset",
"(I)Landroid/media/AudioAttributes$Builder;");
gAudioAttributesBuilderMethods.setContentType = GetMethodIDOrDie(
env, audioAttributesBuilderClass, "setContentType",
"(I)Landroid/media/AudioAttributes$Builder;");
gAudioAttributesBuilderMethods.setInternalContentType =
GetMethodIDOrDie(env, audioAttributesBuilderClass, "setInternalContentType",
"(I)Landroid/media/AudioAttributes$Builder;");
gAudioAttributesBuilderMethods.replaceFlags = GetMethodIDOrDie(
env, audioAttributesBuilderClass, "replaceFlags",
"(I)Landroid/media/AudioAttributes$Builder;");

View File

@ -4745,6 +4745,12 @@
<permission android:name="android.permission.CAPTURE_AUDIO_HOTWORD"
android:protectionLevel="signature|privileged|role" />
<!-- @SystemApi Allows an application to access the ultrasound content.
<p>Not for use by third-party applications.</p>
@hide -->
<permission android:name="android.permission.ACCESS_ULTRASOUND"
android:protectionLevel="signature|privileged" />
<!-- Puts an application in the chain of trust for sound trigger
operations. Being in the chain of trust allows an application to
delegate an identity of a separate entity to the sound trigger system

View File

@ -50,4 +50,8 @@ enum AudioContentType {
* in a game. These sounds are mostly synthesized or short Foley sounds.
*/
SONIFICATION = 4,
/**
* Content type value to use when the content type is ultrasound.
*/
ULTRASOUND = 1997,
}

View File

@ -59,4 +59,8 @@ enum AudioInputFlags {
* Input contains an encoded audio stream.
*/
DIRECT = 7,
/**
* Input is for capturing "ultrasound" audio commands.
*/
ULTRASOUND = 8,
}

View File

@ -97,4 +97,8 @@ enum AudioOutputFlags {
* tracks.
*/
GAPLESS_OFFLOAD = 15,
/**
* Output is used for transmitting ultrasound audio.
*/
ULTRASOUND = 16,
}

View File

@ -87,4 +87,8 @@ enum AudioSource {
* hotword detection. Same tuning as VOICE_RECOGNITION.
*/
HOTWORD = 1999,
/** Microphone audio source for ultrasound sound if available,
* behaves like DEFAULT otherwise.
*/
ULTRASOUND = 2000,
}

View File

@ -40,4 +40,5 @@ enum AudioContentType {
MUSIC = 2,
MOVIE = 3,
SONIFICATION = 4,
ULTRASOUND = 1997,
}

View File

@ -43,4 +43,5 @@ enum AudioInputFlags {
VOIP_TX = 5,
HW_AV_SYNC = 6,
DIRECT = 7,
ULTRASOUND = 8,
}

View File

@ -51,4 +51,5 @@ enum AudioOutputFlags {
VOIP_RX = 13,
INCALL_MUSIC = 14,
GAPLESS_OFFLOAD = 15,
ULTRASOUND = 16,
}

View File

@ -50,4 +50,5 @@ enum AudioSource {
ECHO_REFERENCE = 1997,
FM_TUNER = 1998,
HOTWORD = 1999,
ULTRASOUND = 2000,
}

View File

@ -101,6 +101,13 @@ public final class AudioAttributes implements Parcelable {
* or short Foley sounds.
*/
public final static int CONTENT_TYPE_SONIFICATION = 4;
/**
* @hide
* Content type value to use when the content type is ultrasound.
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.ACCESS_ULTRASOUND)
public static final int CONTENT_TYPE_ULTRASOUND = 1997;
/**
* Invalid value, only ever used for an uninitialized usage value
@ -957,6 +964,26 @@ public final class AudioAttributes implements Parcelable {
return this;
}
/**
* @hide
* Sets the attribute describing the content type of the audio signal, such as speech,
* , music or ultrasound.
* @param contentType the content type values.
* @return the same Builder instance.
*/
@SystemApi
public @NonNull Builder setInternalContentType(@AttrInternalContentType int contentType) {
switch (contentType) {
case CONTENT_TYPE_ULTRASOUND:
mContentType = contentType;
break;
default:
setContentType(contentType);
break;
}
return this;
}
/**
* Sets the combination of flags.
*
@ -1234,7 +1261,8 @@ public final class AudioAttributes implements Parcelable {
/**
* @hide
* Same as {@link #setCapturePreset(int)} but authorizes the use of HOTWORD,
* REMOTE_SUBMIX, RADIO_TUNER, VOICE_DOWNLINK, VOICE_UPLINK, VOICE_CALL and ECHO_REFERENCE.
* REMOTE_SUBMIX, RADIO_TUNER, VOICE_DOWNLINK, VOICE_UPLINK, VOICE_CALL, ECHO_REFERENCE
* and ULTRASOUND
* @param preset
* @return the same Builder instance.
*/
@ -1246,7 +1274,8 @@ public final class AudioAttributes implements Parcelable {
|| (preset == MediaRecorder.AudioSource.VOICE_DOWNLINK)
|| (preset == MediaRecorder.AudioSource.VOICE_UPLINK)
|| (preset == MediaRecorder.AudioSource.VOICE_CALL)
|| (preset == MediaRecorder.AudioSource.ECHO_REFERENCE)) {
|| (preset == MediaRecorder.AudioSource.ECHO_REFERENCE)
|| (preset == MediaRecorder.AudioSource.ULTRASOUND)) {
mSource = preset;
} else {
setCapturePreset(preset);
@ -1589,6 +1618,7 @@ public final class AudioAttributes implements Parcelable {
case CONTENT_TYPE_MUSIC: return new String("CONTENT_TYPE_MUSIC");
case CONTENT_TYPE_MOVIE: return new String("CONTENT_TYPE_MOVIE");
case CONTENT_TYPE_SONIFICATION: return new String("CONTENT_TYPE_SONIFICATION");
case CONTENT_TYPE_ULTRASOUND: return new String("CONTENT_TYPE_ULTRASOUND");
default: return new String("unknown content type " + mContentType);
}
}
@ -1823,4 +1853,16 @@ public final class AudioAttributes implements Parcelable {
})
@Retention(RetentionPolicy.SOURCE)
public @interface AttributeContentType {}
/** @hide */
@IntDef({
CONTENT_TYPE_UNKNOWN,
CONTENT_TYPE_SPEECH,
CONTENT_TYPE_MUSIC,
CONTENT_TYPE_MOVIE,
CONTENT_TYPE_SONIFICATION,
CONTENT_TYPE_ULTRASOUND
})
@Retention(RetentionPolicy.SOURCE)
public @interface AttrInternalContentType {}
}

View File

@ -1033,11 +1033,12 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection,
//--------------
// audio source
if ( (audioSource < MediaRecorder.AudioSource.DEFAULT) ||
((audioSource > MediaRecorder.getAudioSourceMax()) &&
(audioSource != MediaRecorder.AudioSource.RADIO_TUNER) &&
(audioSource != MediaRecorder.AudioSource.ECHO_REFERENCE) &&
(audioSource != MediaRecorder.AudioSource.HOTWORD)) ) {
if ((audioSource < MediaRecorder.AudioSource.DEFAULT)
|| ((audioSource > MediaRecorder.getAudioSourceMax())
&& (audioSource != MediaRecorder.AudioSource.RADIO_TUNER)
&& (audioSource != MediaRecorder.AudioSource.ECHO_REFERENCE)
&& (audioSource != MediaRecorder.AudioSource.HOTWORD)
&& (audioSource != MediaRecorder.AudioSource.ULTRASOUND))) {
throw new IllegalArgumentException("Invalid audio source " + audioSource);
}
mRecordSource = audioSource;

View File

@ -365,6 +365,7 @@ public class MediaRecorder implements AudioRouting,
*/
public static final int VOICE_PERFORMANCE = 10;
/**
* Source for an echo canceller to capture the reference signal to be cancelled.
* <p>
@ -408,6 +409,15 @@ public class MediaRecorder implements AudioRouting,
@SystemApi
@RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD)
public static final int HOTWORD = 1999;
/** Microphone audio source for ultrasound sound if available, behaves like
* {@link #DEFAULT} otherwise.
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.ACCESS_ULTRASOUND)
public static final int ULTRASOUND = 2000;
}
/** @hide */
@ -442,6 +452,7 @@ public class MediaRecorder implements AudioRouting,
AudioSource.ECHO_REFERENCE,
AudioSource.RADIO_TUNER,
AudioSource.HOTWORD,
AudioSource.ULTRASOUND,
})
@Retention(RetentionPolicy.SOURCE)
public @interface SystemSource {}
@ -454,20 +465,20 @@ public class MediaRecorder implements AudioRouting,
*/
public static boolean isSystemOnlyAudioSource(int source) {
switch(source) {
case AudioSource.DEFAULT:
case AudioSource.MIC:
case AudioSource.VOICE_UPLINK:
case AudioSource.VOICE_DOWNLINK:
case AudioSource.VOICE_CALL:
case AudioSource.CAMCORDER:
case AudioSource.VOICE_RECOGNITION:
case AudioSource.VOICE_COMMUNICATION:
//case REMOTE_SUBMIX: considered "system" as it requires system permissions
case AudioSource.UNPROCESSED:
case AudioSource.VOICE_PERFORMANCE:
return false;
default:
return true;
case AudioSource.DEFAULT:
case AudioSource.MIC:
case AudioSource.VOICE_UPLINK:
case AudioSource.VOICE_DOWNLINK:
case AudioSource.VOICE_CALL:
case AudioSource.CAMCORDER:
case AudioSource.VOICE_RECOGNITION:
case AudioSource.VOICE_COMMUNICATION:
//case REMOTE_SUBMIX: considered "system" as it requires system permissions
case AudioSource.UNPROCESSED:
case AudioSource.VOICE_PERFORMANCE:
return false;
default:
return true;
}
}
@ -491,6 +502,7 @@ public class MediaRecorder implements AudioRouting,
case AudioSource.ECHO_REFERENCE:
case AudioSource.RADIO_TUNER:
case AudioSource.HOTWORD:
case AudioSource.ULTRASOUND:
return true;
default:
return false;
@ -500,38 +512,40 @@ public class MediaRecorder implements AudioRouting,
/** @hide */
public static final String toLogFriendlyAudioSource(int source) {
switch(source) {
case AudioSource.DEFAULT:
return "DEFAULT";
case AudioSource.MIC:
return "MIC";
case AudioSource.VOICE_UPLINK:
return "VOICE_UPLINK";
case AudioSource.VOICE_DOWNLINK:
return "VOICE_DOWNLINK";
case AudioSource.VOICE_CALL:
return "VOICE_CALL";
case AudioSource.CAMCORDER:
return "CAMCORDER";
case AudioSource.VOICE_RECOGNITION:
return "VOICE_RECOGNITION";
case AudioSource.VOICE_COMMUNICATION:
return "VOICE_COMMUNICATION";
case AudioSource.REMOTE_SUBMIX:
return "REMOTE_SUBMIX";
case AudioSource.UNPROCESSED:
return "UNPROCESSED";
case AudioSource.ECHO_REFERENCE:
return "ECHO_REFERENCE";
case AudioSource.VOICE_PERFORMANCE:
return "VOICE_PERFORMANCE";
case AudioSource.RADIO_TUNER:
return "RADIO_TUNER";
case AudioSource.HOTWORD:
return "HOTWORD";
case AudioSource.AUDIO_SOURCE_INVALID:
return "AUDIO_SOURCE_INVALID";
default:
return "unknown source " + source;
case AudioSource.DEFAULT:
return "DEFAULT";
case AudioSource.MIC:
return "MIC";
case AudioSource.VOICE_UPLINK:
return "VOICE_UPLINK";
case AudioSource.VOICE_DOWNLINK:
return "VOICE_DOWNLINK";
case AudioSource.VOICE_CALL:
return "VOICE_CALL";
case AudioSource.CAMCORDER:
return "CAMCORDER";
case AudioSource.VOICE_RECOGNITION:
return "VOICE_RECOGNITION";
case AudioSource.VOICE_COMMUNICATION:
return "VOICE_COMMUNICATION";
case AudioSource.REMOTE_SUBMIX:
return "REMOTE_SUBMIX";
case AudioSource.UNPROCESSED:
return "UNPROCESSED";
case AudioSource.ECHO_REFERENCE:
return "ECHO_REFERENCE";
case AudioSource.VOICE_PERFORMANCE:
return "VOICE_PERFORMANCE";
case AudioSource.RADIO_TUNER:
return "RADIO_TUNER";
case AudioSource.HOTWORD:
return "HOTWORD";
case AudioSource.ULTRASOUND:
return "ULTRASOUND";
case AudioSource.AUDIO_SOURCE_INVALID:
return "AUDIO_SOURCE_INVALID";
default:
return "unknown source " + source;
}
}