1d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi/*
2d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * Copyright (C) 2014 The Android Open Source Project
3d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi *
4d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * you may not use this file except in compliance with the License.
6d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * You may obtain a copy of the License at
7d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi *
8d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi *
10d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * See the License for the specific language governing permissions and
14d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * limitations under the License.
15d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi */
16d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
17d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivipackage android.media;
18d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
19d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport android.annotation.IntDef;
206894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Triviimport android.annotation.SystemApi;
21b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Triviimport android.os.Parcel;
22b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Triviimport android.os.Parcelable;
23cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Triviimport android.text.TextUtils;
24d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport android.util.Log;
25d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
26d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.lang.annotation.Retention;
27d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.lang.annotation.RetentionPolicy;
28d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.Collections;
29d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.HashSet;
30a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Triviimport java.util.Iterator;
31e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Triviimport java.util.Objects;
32d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.Set;
33d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
34d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi/**
35d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * A class to encapsulate a collection of attributes describing information about an audio
3604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * stream.
3704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <p><code>AudioAttributes</code> supersede the notion of stream types (see for instance
3804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * {@link AudioManager#STREAM_MUSIC} or {@link AudioManager#STREAM_ALARM}) for defining the
3904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * behavior of audio playback. Attributes allow an application to specify more information than is
4004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * conveyed in a stream type by allowing the application to define:
4104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <ul>
4204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <li>usage: "why" you are playing a sound, what is this sound used for. This is achieved with
4304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     the "usage" information. Examples of usage are {@link #USAGE_MEDIA} and {@link #USAGE_ALARM}.
4404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     These two examples are the closest to stream types, but more detailed use cases are
4504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     available. Usage information is more expressive than a stream type, and allows certain
4604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     platforms or routing policies to use this information for more refined volume or routing
4704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     decisions. Usage is the most important information to supply in <code>AudioAttributes</code>
4804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     and it is recommended to build any instance with this information supplied, see
4904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     {@link AudioAttributes.Builder} for exceptions.</li>
5004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <li>content type: "what" you are playing. The content type expresses the general category of
5104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     the content. This information is optional. But in case it is known (for instance
5204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     {@link #CONTENT_TYPE_MOVIE} for a movie streaming service or {@link #CONTENT_TYPE_MUSIC} for
5304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     a music playback application) this information might be used by the audio framework to
5404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     selectively configure some audio post-processing blocks.</li>
5504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <li>flags: "how" is playback to be affected, see the flag definitions for the specific playback
5604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     behaviors they control. </li>
5704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * </ul>
5804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <p><code>AudioAttributes</code> are used for example in one of the {@link AudioTrack}
5904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * constructors (see {@link AudioTrack#AudioTrack(AudioAttributes, AudioFormat, int, int, int)}),
6004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * to configure a {@link MediaPlayer}
6104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * (see {@link MediaPlayer#setAudioAttributes(AudioAttributes)} or a
6204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * {@link android.app.Notification} (see {@link android.app.Notification#audioAttributes}). An
6304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <code>AudioAttributes</code> instance is built through its builder,
6404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * {@link AudioAttributes.Builder}.
65d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi */
66b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivipublic final class AudioAttributes implements Parcelable {
67d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private final static String TAG = "AudioAttributes";
68d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
69d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
70d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is unknown, or other than the ones defined.
71d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
72d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_UNKNOWN = 0;
73d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
74d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is speech.
75d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
76d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_SPEECH = 1;
77d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
78d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is music.
79d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
80d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_MUSIC = 2;
81d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
82d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is a soundtrack, typically accompanying
83d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a movie or TV program.
84d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
85d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_MOVIE = 3;
86d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
87d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is a sound used to accompany a user
88d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * action, such as a beep or sound effect expressing a key click, or event, such as the
89d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * type of a sound for a bonus being received in a game. These sounds are mostly synthesized
90d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * or short Foley sounds.
91d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
92d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_SONIFICATION = 4;
93d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
94d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
95d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is unknown.
96d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
97d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_UNKNOWN = 0;
98d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
99d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is media, such as music, or movie
100d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * soundtracks.
101d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
102d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_MEDIA = 1;
103d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
104d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is voice communications, such as telephony
105d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * or VoIP.
106d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
107d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_VOICE_COMMUNICATION = 2;
108d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
109d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is in-call signalling, such as with
110d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a "busy" beep, or DTMF tones.
111d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
112d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_VOICE_COMMUNICATION_SIGNALLING = 3;
113d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
114d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is an alarm (e.g. wake-up alarm).
115d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
116d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ALARM = 4;
117d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
118d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification. See other
119d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * notification usages for more specialized uses.
120d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
121d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION = 5;
122d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
123d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is telephony ringtone.
124d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
12589c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_RINGTONE = 6;
12689c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi    /**
127d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is a request to enter/end a
128d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * communication, such as a VoIP communication or video-conference.
129d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
130d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7;
131d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
132d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification for an "instant"
133d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * communication such as a chat, or SMS.
134d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
135d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8;
136d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
137d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification for a
138d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * non-immediate type of communication such as e-mail.
139d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
140d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9;
141d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
142d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is to attract the user's attention,
143d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * such as a reminder or low battery warning.
144d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
145d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_EVENT = 10;
146d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
147d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is for accessibility, such as with
148d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a screen reader.
149d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
150d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_ACCESSIBILITY = 11;
151d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
152d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is driving or navigation directions.
153d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
154d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12;
155d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
156d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is sonification, such as  with user
157d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * interface sounds.
158d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
159d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_SONIFICATION = 13;
160d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
161d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is for game audio.
162d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
163d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_GAME = 14;
1648fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi    /**
1658fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi     * @hide
1668fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi     * Usage value to use when feeding audio to the platform and replacing "traditional" audio
1678fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi     * source, such as audio capture devices.
1688fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi     */
1698fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi    public final static int USAGE_VIRTUAL_SOURCE = 15;
170d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
171d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
172d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag defining a behavior where the audibility of the sound will be ensured by the system.
173d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
174d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_AUDIBILITY_ENFORCED = 0x1 << 0;
175d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
176d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
177d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag defining a behavior where the playback of the sound is ensured without
178d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * degradation only when going to a secure sink.
179d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
180d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    // FIXME not guaranteed yet
1816894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    // TODO  add in FLAG_ALL_PUBLIC when supported and in public API
182d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_SECURE = 0x1 << 1;
183d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
184d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
185d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag to enable when the stream is associated with SCO usage.
186d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Internal use only for dealing with legacy STREAM_BLUETOOTH_SCO
187d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
188d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_SCO = 0x1 << 2;
1896894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    /**
1906894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * @hide
1916894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * Flag defining a behavior where the system ensures that the playback of the sound will
1926894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * be compatible with its use as a broadcast for surrounding people and/or devices.
1936894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * Ensures audibility with no or minimal post-processing applied.
1946894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     */
1956894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    @SystemApi
1966894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    public final static int FLAG_BEACON = 0x1 << 3;
197d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
198b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent    /**
199b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent     * Flag requesting the use of an output stream supporting hardware A/V synchronization.
200b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent     */
201b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent    public final static int FLAG_HW_AV_SYNC = 0x1 << 4;
202d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
203bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent    /**
204bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent     * @hide
205bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent     * Flag requesting capture from the source used for hardware hotword detection.
206bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent     * To be used with capture preset MediaRecorder.AudioSource.HOTWORD or
207bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent     * MediaRecorder.AudioSource.VOICE_RECOGNITION.
208bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent     */
209bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent    @SystemApi
210bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent    public final static int FLAG_HW_HOTWORD = 0x1 << 5;
211bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent
2126894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    private final static int FLAG_ALL = FLAG_AUDIBILITY_ENFORCED | FLAG_SECURE | FLAG_SCO |
213bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent            FLAG_BEACON | FLAG_HW_AV_SYNC | FLAG_HW_HOTWORD;
21456340fc2e87985fb3d396b63b28168bf57ebe7ceEric Laurent    private final static int FLAG_ALL_PUBLIC = FLAG_AUDIBILITY_ENFORCED | FLAG_HW_AV_SYNC;
2156894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi
216d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mUsage = USAGE_UNKNOWN;
217d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mContentType = CONTENT_TYPE_UNKNOWN;
218701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    private int mSource = MediaRecorder.AudioSource.AUDIO_SOURCE_INVALID;
219d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mFlags = 0x0;
220d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private HashSet<String> mTags;
221a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi    private String mFormattedTags;
222d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
223d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private AudioAttributes() {
224d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
225d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
226d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
227d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the content type.
228d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setContentType(int)}
229d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
230d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getContentType() {
231d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mContentType;
232d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
233d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
234d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
235d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the usage.
236d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setUsage(int)}
237d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
238d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getUsage() {
239d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mUsage;
240d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
241d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
242d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
243701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     * @hide
244701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     * Return the capture preset.
245701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setCapturePreset(int)} or a
246701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     *    negative value if none has been set.
247701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     */
2481b3541d5eedb332ea01066b4a78a2d06d5304044Jean-Michel Trivi    @SystemApi
249701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    public int getCapturePreset() {
250701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        return mSource;
251701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    }
252701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi
253701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    /**
254d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the flags.
255d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a combined mask of all flags
256d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
257d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getFlags() {
258d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        // only return the flags that are public
2596894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi        return (mFlags & (FLAG_ALL_PUBLIC));
260d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
261d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
262d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
263d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
264d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return all the flags, even the non-public ones.
265d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Internal use only
266d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a combined mask of all flags
267d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
268d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getAllFlags() {
2696894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi        return (mFlags & FLAG_ALL);
270d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
271d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
272d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
273b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi     * @hide
274d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the set of tags.
275d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a read-only set of all tags stored as strings.
276d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
277d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public Set<String> getTags() {
278d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return Collections.unmodifiableSet(mTags);
279d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
280d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
281d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
282d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Builder class for {@link AudioAttributes} objects.
28304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <p> Here is an example where <code>Builder</code> is used to define the
28404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * {@link AudioAttributes} to be used by a new <code>AudioTrack</code> instance:
28504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *
28604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <pre class="prettyprint">
28704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * AudioTrack myTrack = new AudioTrack(
28804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *         new AudioAttributes.Builder()
28904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *             .setUsage(AudioAttributes.USAGE_MEDIA)
29004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *             .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
29104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *             .build(),
29204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *         myFormat, myBuffSize, AudioTrack.MODE_STREAM, mySession);
29304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * </pre>
29404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *
29504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <p>By default all types of information (usage, content type, flags) conveyed by an
29604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <code>AudioAttributes</code> instance are set to "unknown". Unknown information will be
29704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * interpreted as a default value that is dependent on the context of use, for instance a
29804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * {@link MediaPlayer} will use a default usage of {@link AudioAttributes#USAGE_MEDIA}.
299d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
300d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public static class Builder {
301d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mUsage = USAGE_UNKNOWN;
302d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mContentType = CONTENT_TYPE_UNKNOWN;
303701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        private int mSource = MediaRecorder.AudioSource.AUDIO_SOURCE_INVALID;
304d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mFlags = 0x0;
305d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private HashSet<String> mTags = new HashSet<String>();
306d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
307d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
308d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Constructs a new Builder with the defaults.
30904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * By default, usage and content type are respectively {@link AudioAttributes#USAGE_UNKNOWN}
31004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * and {@link AudioAttributes#CONTENT_TYPE_UNKNOWN}, and flags are 0. It is recommended to
31104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * configure the usage (with {@link #setUsage(int)}) or deriving attributes from a legacy
31204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * stream type (with {@link #setLegacyStreamType(int)}) before calling {@link #build()}
31304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * to override any default playback behavior in terms of routing and volume management.
314d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
315d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder() {
316d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
317d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
318d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
319d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Constructs a new Builder from a given AudioAttributes
320d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param aa the AudioAttributes object whose data will be reused in the new Builder.
321d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
322d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        @SuppressWarnings("unchecked") // for cloning of mTags
323d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder(AudioAttributes aa) {
324d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mUsage = aa.mUsage;
325d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mContentType = aa.mContentType;
326d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mFlags = aa.mFlags;
327d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mTags = (HashSet<String>) aa.mTags.clone();
328d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
329d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
330d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
331d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Combines all of the attributes that have been set and return a new
332d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * {@link AudioAttributes} object.
333d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return a new {@link AudioAttributes} object
334d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
335d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        @SuppressWarnings("unchecked") // for cloning of mTags
336d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public AudioAttributes build() {
337d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            AudioAttributes aa = new AudioAttributes();
338d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mContentType = mContentType;
339d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mUsage = mUsage;
340701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            aa.mSource = mSource;
341d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mFlags = mFlags;
342d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mTags = (HashSet<String>) mTags.clone();
343cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            aa.mFormattedTags = TextUtils.join(";", mTags);
344d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return aa;
345d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
346d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
347d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
348d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the attribute describing what is the intended use of the the audio signal,
349d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * such as alarm or ringtone.
350d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param usage one of {@link AudioAttributes#USAGE_UNKNOWN},
351d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_MEDIA},
352d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_VOICE_COMMUNICATION},
353d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_VOICE_COMMUNICATION_SIGNALLING},
354d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ALARM}, {@link AudioAttributes#USAGE_NOTIFICATION},
35589c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_RINGTONE},
356d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_REQUEST},
357d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_INSTANT},
358d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_DELAYED},
359d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_EVENT},
360d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_ACCESSIBILITY},
361d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_NAVIGATION_GUIDANCE},
362d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_SONIFICATION},
363d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_GAME}.
364d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
365d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
366d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setUsage(@AttributeUsage int usage) {
367d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch (usage) {
368d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_UNKNOWN:
369d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_MEDIA:
370d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_VOICE_COMMUNICATION:
371d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_VOICE_COMMUNICATION_SIGNALLING:
372d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ALARM:
373d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION:
37489c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi                case USAGE_NOTIFICATION_RINGTONE:
375d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
376d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
377d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
378d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_EVENT:
379d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_ACCESSIBILITY:
380d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
381d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_SONIFICATION:
382d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_GAME:
3838fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi                case USAGE_VIRTUAL_SOURCE:
384d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = usage;
385d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     break;
386d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
387d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = USAGE_UNKNOWN;
388d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
389d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
390d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
391d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
392d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
393d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the attribute describing the content type of the audio signal, such as speech,
394d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * or music.
395d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param contentType the content type values, one of
396d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_MOVIE},
397d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_MUSIC},
398d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_SONIFICATION},
399d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_SPEECH},
400d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_UNKNOWN}.
401d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
402d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
403d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setContentType(@AttributeContentType int contentType) {
404d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch (contentType) {
405d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_UNKNOWN:
406d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_MOVIE:
407d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_MUSIC:
408d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_SONIFICATION:
409d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_SPEECH:
410d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mContentType = contentType;
411d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     break;
412d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
413d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = CONTENT_TYPE_UNKNOWN;
414d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
415d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
416d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
417d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
418d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
419d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the combination of flags.
420d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param flags the {@link AudioAttributes#FLAG_AUDIBILITY_ENFORCED} flag.
421d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
422d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
423d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setFlags(int flags) {
4246894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi            flags &= AudioAttributes.FLAG_ALL;
425d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mFlags |= flags;
426d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
427d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
428d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
429d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
430b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @hide
431d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Add a custom tag stored as a string
432d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param tag
433d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
434d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
435d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder addTag(String tag) {
436d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mTags.add(tag);
437d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
438d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
439d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
440d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
44104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * Sets attributes as inferred from the legacy stream types.
44204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * Use this method when building an {@link AudioAttributes} instance to initialize some of
44304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * the attributes by information derived from a legacy stream type.
444d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param streamType one of {@link AudioManager#STREAM_VOICE_CALL},
445d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *   {@link AudioManager#STREAM_SYSTEM}, {@link AudioManager#STREAM_RING},
446d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *   {@link AudioManager#STREAM_MUSIC}, {@link AudioManager#STREAM_ALARM},
447d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *    or {@link AudioManager#STREAM_NOTIFICATION}.
448d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
449d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
450d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setLegacyStreamType(int streamType) {
451d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return setInternalLegacyStreamType(streamType);
452d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
453d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
454d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
455d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @hide
456d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * For internal framework use only, enables building from hidden stream types.
457d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param streamType
458d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
459d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
460d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setInternalLegacyStreamType(int streamType) {
461d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch(streamType) {
462d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_VOICE_CALL:
463d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
464d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
465d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_SYSTEM_ENFORCED:
466d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mFlags |= FLAG_AUDIBILITY_ENFORCED;
467d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    // intended fall through, attributes in common with STREAM_SYSTEM
468d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_SYSTEM:
469d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
470d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
471d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_RING:
472d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
473d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
474d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_MUSIC:
475d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_MUSIC;
476d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
477d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_ALARM:
478d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
479d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
480d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_NOTIFICATION:
481d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
482d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
483d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_BLUETOOTH_SCO:
484d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
485d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mFlags |= FLAG_SCO;
486d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
487d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_DTMF:
488d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
489d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
490d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_TTS:
491d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
492d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
493d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
494701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    Log.e(TAG, "Invalid stream type " + streamType + " for AudioAttributes");
495701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            }
496c1601f73b98b004b6210631830d2184255037948Jean-Michel Trivi            mUsage = usageForLegacyStreamType(streamType);
497701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            return this;
498701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        }
499701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi
500701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        /**
501701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @hide
502701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * Sets the capture preset.
503701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * Use this audio attributes configuration method when building an {@link AudioRecord}
504701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * instance with {@link AudioRecord#AudioRecord(AudioAttributes, AudioFormat, int)}.
505701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @param preset one of {@link MediaRecorder.AudioSource#DEFAULT},
506701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         *     {@link MediaRecorder.AudioSource#MIC}, {@link MediaRecorder.AudioSource#CAMCORDER},
507701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         *     {@link MediaRecorder.AudioSource#VOICE_RECOGNITION} or
508701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         *     {@link MediaRecorder.AudioSource#VOICE_COMMUNICATION}.
509701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @return the same Builder instance.
510701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         */
5111b3541d5eedb332ea01066b4a78a2d06d5304044Jean-Michel Trivi        @SystemApi
512701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        public Builder setCapturePreset(int preset) {
513701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            switch (preset) {
514701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.DEFAULT:
515701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.MIC:
516701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.CAMCORDER:
517701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.VOICE_RECOGNITION:
518701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.VOICE_COMMUNICATION:
519701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    mSource = preset;
520701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    break;
521701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                default:
522701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    Log.e(TAG, "Invalid capture preset " + preset + " for AudioAttributes");
523701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            }
524701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            return this;
525701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        }
526701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi
527701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        /**
528701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @hide
529ce4483cb83afb3a42a32ef2cb00cf04d6f9018fdBenson Huang         * Same as {@link #setCapturePreset(int)} but authorizes the use of HOTWORD,
530ce4483cb83afb3a42a32ef2cb00cf04d6f9018fdBenson Huang         * REMOTE_SUBMIX and FM_TUNER.
531701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @param preset
532701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @return the same Builder instance.
533701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         */
534701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        public Builder setInternalCapturePreset(int preset) {
535701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            if ((preset == MediaRecorder.AudioSource.HOTWORD)
536ce4483cb83afb3a42a32ef2cb00cf04d6f9018fdBenson Huang                    || (preset == MediaRecorder.AudioSource.REMOTE_SUBMIX)
537ce4483cb83afb3a42a32ef2cb00cf04d6f9018fdBenson Huang                    || (preset == MediaRecorder.AudioSource.FM_TUNER)) {
538701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                mSource = preset;
539701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            } else {
540701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                setCapturePreset(preset);
541d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
542d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
543d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
544d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    };
545d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
546b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    @Override
547b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public int describeContents() {
548b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        return 0;
549b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
550b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
5518df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    /**
5528df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * @hide
5538df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * Used to indicate that when parcelling, the tags should be parcelled through the flattened
5548df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * formatted string, not through the array of strings.
5558df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * Keep in sync with frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
5568df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * see definition of kAudioAttributesMarshallTagFlattenTags
5578df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     */
5588df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    public final static int FLATTEN_TAGS = 0x1;
5598df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    /**
5608df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * When adding tags for writeToParcel(Parcel, int), add them in the list of flags (| NEW_FLAG)
5618df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     */
5628df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    private final static int ALL_PARCEL_FLAGS = FLATTEN_TAGS;
563b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    @Override
564b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public void writeToParcel(Parcel dest, int flags) {
565b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mUsage);
566b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mContentType);
567701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        dest.writeInt(mSource);
568b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mFlags);
5698df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        dest.writeInt(flags & ALL_PARCEL_FLAGS);
5708df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        if ((flags & FLATTEN_TAGS) == 0) {
5718df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            String[] tagsArray = new String[mTags.size()];
5728df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            mTags.toArray(tagsArray);
5738df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            dest.writeStringArray(tagsArray);
5748df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        } else if ((flags & FLATTEN_TAGS) == FLATTEN_TAGS) {
5758df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            dest.writeString(mFormattedTags);
5768df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        }
577b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
578b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
579b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    private AudioAttributes(Parcel in) {
580b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mUsage = in.readInt();
581b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mContentType = in.readInt();
582701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        mSource = in.readInt();
583b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mFlags = in.readInt();
5848df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        boolean hasFlattenedTags = ((in.readInt() & FLATTEN_TAGS) == FLATTEN_TAGS);
585b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mTags = new HashSet<String>();
5868df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        if (hasFlattenedTags) {
587cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            mFormattedTags = new String(in.readString());
588cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            mTags.add(mFormattedTags);
5898df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        } else {
5908df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            String[] tagsArray = in.readStringArray();
5918df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            for (int i = tagsArray.length - 1 ; i >= 0 ; i--) {
5928df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi                mTags.add(tagsArray[i]);
5938df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            }
594cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            mFormattedTags = TextUtils.join(";", mTags);
595b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
596b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
597b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
598b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public static final Parcelable.Creator<AudioAttributes> CREATOR
599b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            = new Parcelable.Creator<AudioAttributes>() {
600b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        /**
601b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * Rebuilds an AudioAttributes previously stored with writeToParcel().
602b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @param p Parcel object to read the AudioAttributes from
603b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @return a new AudioAttributes created from the data in the parcel
604b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         */
605b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        public AudioAttributes createFromParcel(Parcel p) {
606b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            return new AudioAttributes(p);
607b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
608b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        public AudioAttributes[] newArray(int size) {
609b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            return new AudioAttributes[size];
610b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
611b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    };
612b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
613e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    @Override
614e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    public boolean equals(Object o) {
615e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        if (this == o) return true;
616e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        if (o == null || getClass() != o.getClass()) return false;
617e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
618e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        AudioAttributes that = (AudioAttributes) o;
619e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
620e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        return ((mContentType == that.mContentType)
621e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mFlags == that.mFlags)
622e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mSource == that.mSource)
623e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mUsage == that.mUsage)
624e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                //mFormattedTags is never null due to assignment in Builder or unmarshalling
625e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mFormattedTags.equals(that.mFormattedTags)));
626e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    }
627e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
628e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    @Override
629e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    public int hashCode() {
630e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        return Objects.hash(mContentType, mFlags, mSource, mUsage, mFormattedTags);
631e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    }
632e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
633a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    @Override
634a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    public String toString () {
635a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi        return new String("AudioAttributes:"
636a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " usage=" + mUsage
637a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " content=" + mContentType
638a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " flags=0x" + Integer.toHexString(mFlags).toUpperCase()
639cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi                + " tags=" + mFormattedTags);
640a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    }
641a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi
642998ff75484f1eecb6ebef150de4ac8456d22e864Jean-Michel Trivi    /** @hide */
643a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    public String usageToString() {
6447b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        return usageToString(mUsage);
6457b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    }
6467b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock
6477b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    /** @hide */
6487b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    public static String usageToString(int usage) {
6497b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        switch(usage) {
650a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_UNKNOWN:
651a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_UNKNOWN");
652a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_MEDIA:
653a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_MEDIA");
654a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION:
655a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_VOICE_COMMUNICATION");
656a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION_SIGNALLING:
657a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_VOICE_COMMUNICATION");
658a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ALARM:
659a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ALARM");
660a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION:
661a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION");
66289c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi            case USAGE_NOTIFICATION_RINGTONE:
663a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION");
664a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
665a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION");
666a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
667a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_COMMUNICATION_INSTANT");
668a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
669a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_COMMUNICATION_DELAYED");
670a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_EVENT:
671a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_EVENT");
672a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_ACCESSIBILITY:
673a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_ACCESSIBILITY");
674a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
675a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_NAVIGATION_GUIDANCE");
676a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_SONIFICATION:
677a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_SONIFICATION");
678a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_GAME:
679a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_GAME");
680a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            default:
6817b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return new String("unknown usage " + usage);
6827b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        }
6837b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    }
6847b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock
6857b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    /** @hide */
6867b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    public static int usageForLegacyStreamType(int streamType) {
6877b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        switch(streamType) {
6887b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_VOICE_CALL:
6897b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_VOICE_COMMUNICATION;
6907b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_SYSTEM_ENFORCED:
6917b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_SYSTEM:
6927b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_ASSISTANCE_SONIFICATION;
6937b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_RING:
69489c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi                return USAGE_NOTIFICATION_RINGTONE;
6957b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_MUSIC:
6967b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_MEDIA;
6977b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_ALARM:
6987b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_ALARM;
6997b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_NOTIFICATION:
7007b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_NOTIFICATION;
7017b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_BLUETOOTH_SCO:
7027b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_VOICE_COMMUNICATION;
7037b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_DTMF:
7047b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_VOICE_COMMUNICATION_SIGNALLING;
7057b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_TTS:
7067b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_ASSISTANCE_ACCESSIBILITY;
7077b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            default:
7087b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_UNKNOWN;
709a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi        }
710a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    }
711b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
712d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /** @hide */
71309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi    public static int toLegacyStreamType(AudioAttributes aa) {
71409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        // flags to stream type mapping
71509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        if ((aa.getFlags() & FLAG_AUDIBILITY_ENFORCED) == FLAG_AUDIBILITY_ENFORCED) {
71609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            return AudioSystem.STREAM_SYSTEM_ENFORCED;
71709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        }
71809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        if ((aa.getFlags() & FLAG_SCO) == FLAG_SCO) {
71909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            return AudioSystem.STREAM_BLUETOOTH_SCO;
72009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        }
72109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi
72209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        // usage to stream type mapping
72309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        switch (aa.getUsage()) {
72409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_MEDIA:
72509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_GAME:
72609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ASSISTANCE_ACCESSIBILITY:
72709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
72809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_MUSIC;
72909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ASSISTANCE_SONIFICATION:
73009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_SYSTEM;
73109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION:
73209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_VOICE_CALL;
73309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION_SIGNALLING:
73409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_DTMF;
73509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ALARM:
73609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_ALARM;
73789c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi            case USAGE_NOTIFICATION_RINGTONE:
73809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_RING;
73909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION:
74009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
74109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
74209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
74309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_EVENT:
74409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_NOTIFICATION;
74509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_UNKNOWN:
74609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            default:
74709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_MUSIC;
74809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        }
74909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi    }
75009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi
75109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi    /** @hide */
752d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @IntDef({
753d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_UNKNOWN,
754d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_MEDIA,
755d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_VOICE_COMMUNICATION,
756d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_VOICE_COMMUNICATION_SIGNALLING,
757d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ALARM,
758d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION,
75989c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi        USAGE_NOTIFICATION_RINGTONE,
760d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_REQUEST,
761d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_INSTANT,
762d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_DELAYED,
763d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_EVENT,
764d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_ACCESSIBILITY,
765d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
766d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_SONIFICATION,
767d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_GAME
768d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    })
769d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @Retention(RetentionPolicy.SOURCE)
770d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public @interface AttributeUsage {}
771d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
772d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /** @hide */
773d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @IntDef({
774d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_UNKNOWN,
775d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_SPEECH,
776d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_MUSIC,
777d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_MOVIE,
778d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_SONIFICATION
779d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    })
780d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @Retention(RetentionPolicy.SOURCE)
781d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public @interface AttributeContentType {}
782d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi}
783