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;
20d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Triviimport android.annotation.NonNull;
216894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Triviimport android.annotation.SystemApi;
22f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Triviimport android.os.Bundle;
23b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Triviimport android.os.Parcel;
24b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Triviimport android.os.Parcelable;
25cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Triviimport android.text.TextUtils;
26d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport android.util.Log;
27d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
28d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.lang.annotation.Retention;
29d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.lang.annotation.RetentionPolicy;
30d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.Collections;
31d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.HashSet;
32e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Triviimport java.util.Objects;
33d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.Set;
34d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
35d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi/**
36d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * A class to encapsulate a collection of attributes describing information about an audio
3704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * stream.
3804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <p><code>AudioAttributes</code> supersede the notion of stream types (see for instance
3904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * {@link AudioManager#STREAM_MUSIC} or {@link AudioManager#STREAM_ALARM}) for defining the
4004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * behavior of audio playback. Attributes allow an application to specify more information than is
4104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * conveyed in a stream type by allowing the application to define:
4204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <ul>
4304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <li>usage: "why" you are playing a sound, what is this sound used for. This is achieved with
4404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     the "usage" information. Examples of usage are {@link #USAGE_MEDIA} and {@link #USAGE_ALARM}.
4504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     These two examples are the closest to stream types, but more detailed use cases are
4604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     available. Usage information is more expressive than a stream type, and allows certain
4704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     platforms or routing policies to use this information for more refined volume or routing
4804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     decisions. Usage is the most important information to supply in <code>AudioAttributes</code>
4904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     and it is recommended to build any instance with this information supplied, see
5004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     {@link AudioAttributes.Builder} for exceptions.</li>
5104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <li>content type: "what" you are playing. The content type expresses the general category of
5204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     the content. This information is optional. But in case it is known (for instance
5304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     {@link #CONTENT_TYPE_MOVIE} for a movie streaming service or {@link #CONTENT_TYPE_MUSIC} for
5404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     a music playback application) this information might be used by the audio framework to
5504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     selectively configure some audio post-processing blocks.</li>
5604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <li>flags: "how" is playback to be affected, see the flag definitions for the specific playback
5704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     behaviors they control. </li>
5804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * </ul>
5904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <p><code>AudioAttributes</code> are used for example in one of the {@link AudioTrack}
6004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * constructors (see {@link AudioTrack#AudioTrack(AudioAttributes, AudioFormat, int, int, int)}),
6104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * to configure a {@link MediaPlayer}
6204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * (see {@link MediaPlayer#setAudioAttributes(AudioAttributes)} or a
6304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * {@link android.app.Notification} (see {@link android.app.Notification#audioAttributes}). An
6404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <code>AudioAttributes</code> instance is built through its builder,
6504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * {@link AudioAttributes.Builder}.
66d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi */
67b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivipublic final class AudioAttributes implements Parcelable {
68d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private final static String TAG = "AudioAttributes";
69d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
70d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
71d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is unknown, or other than the ones defined.
72d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
73d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_UNKNOWN = 0;
74d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
75d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is speech.
76d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
77d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_SPEECH = 1;
78d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
79d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is music.
80d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
81d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_MUSIC = 2;
82d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
83d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is a soundtrack, typically accompanying
84d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a movie or TV program.
85d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
86d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_MOVIE = 3;
87d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
88d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is a sound used to accompany a user
89d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * action, such as a beep or sound effect expressing a key click, or event, such as the
90d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * type of a sound for a bonus being received in a game. These sounds are mostly synthesized
91d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * or short Foley sounds.
92d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
93d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_SONIFICATION = 4;
94d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
95d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
96d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is unknown.
97d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
98d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_UNKNOWN = 0;
99d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
100d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is media, such as music, or movie
101d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * soundtracks.
102d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
103d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_MEDIA = 1;
104d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
105d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is voice communications, such as telephony
106d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * or VoIP.
107d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
108d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_VOICE_COMMUNICATION = 2;
109d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
110d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is in-call signalling, such as with
111d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a "busy" beep, or DTMF tones.
112d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
113d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_VOICE_COMMUNICATION_SIGNALLING = 3;
114d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
115d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is an alarm (e.g. wake-up alarm).
116d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
117d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ALARM = 4;
118d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
119d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification. See other
120d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * notification usages for more specialized uses.
121d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
122d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION = 5;
123d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
124d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is telephony ringtone.
125d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
12689c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_RINGTONE = 6;
12789c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi    /**
128d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is a request to enter/end a
129d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * communication, such as a VoIP communication or video-conference.
130d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
131d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7;
132d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
133d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification for an "instant"
134d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * communication such as a chat, or SMS.
135d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
136d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8;
137d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
138d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification for a
139d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * non-immediate type of communication such as e-mail.
140d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
141d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9;
142d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
143d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is to attract the user's attention,
144d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * such as a reminder or low battery warning.
145d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
146d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_EVENT = 10;
147d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
148d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is for accessibility, such as with
149d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a screen reader.
150d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
151d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_ACCESSIBILITY = 11;
152d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
153d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is driving or navigation directions.
154d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
155d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12;
156d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
157d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is sonification, such as  with user
158d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * interface sounds.
159d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
160d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_SONIFICATION = 13;
161d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
162d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is for game audio.
163d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
164d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_GAME = 14;
1658fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi    /**
1668fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi     * @hide
1678fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi     * Usage value to use when feeding audio to the platform and replacing "traditional" audio
1688fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi     * source, such as audio capture devices.
1698fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi     */
1708fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi    public final static int USAGE_VIRTUAL_SOURCE = 15;
171d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
172d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
173d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag defining a behavior where the audibility of the sound will be ensured by the system.
174d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
175d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_AUDIBILITY_ENFORCED = 0x1 << 0;
176d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
177d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
178d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag defining a behavior where the playback of the sound is ensured without
179d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * degradation only when going to a secure sink.
180d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
181d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    // FIXME not guaranteed yet
1826894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    // TODO  add in FLAG_ALL_PUBLIC when supported and in public API
183d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_SECURE = 0x1 << 1;
184d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
185d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
186d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag to enable when the stream is associated with SCO usage.
187d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Internal use only for dealing with legacy STREAM_BLUETOOTH_SCO
188d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
189d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_SCO = 0x1 << 2;
1906894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    /**
1916894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * @hide
1926894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * Flag defining a behavior where the system ensures that the playback of the sound will
1936894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * be compatible with its use as a broadcast for surrounding people and/or devices.
1946894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * Ensures audibility with no or minimal post-processing applied.
1956894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     */
1966894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    @SystemApi
1976894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    public final static int FLAG_BEACON = 0x1 << 3;
198d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
199b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent    /**
200b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent     * Flag requesting the use of an output stream supporting hardware A/V synchronization.
201b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent     */
202b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent    public final static int FLAG_HW_AV_SYNC = 0x1 << 4;
203d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
204bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent    /**
205bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent     * @hide
206bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent     * Flag requesting capture from the source used for hardware hotword detection.
207bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent     * To be used with capture preset MediaRecorder.AudioSource.HOTWORD or
208bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent     * MediaRecorder.AudioSource.VOICE_RECOGNITION.
209bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent     */
210bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent    @SystemApi
211bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent    public final static int FLAG_HW_HOTWORD = 0x1 << 5;
212bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent
213bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock    /**
214bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock     * @hide
215bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock     * Flag requesting audible playback even under limited interruptions.
216bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock     */
217bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock    @SystemApi
218bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock    public final static int FLAG_BYPASS_INTERRUPTION_POLICY = 0x1 << 6;
219bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock
220bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock    /**
221bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock     * @hide
222bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock     * Flag requesting audible playback even when the underlying stream is muted.
223bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock     */
224bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock    @SystemApi
225bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock    public final static int FLAG_BYPASS_MUTE = 0x1 << 7;
226bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock
227dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk    /**
2282050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * Flag requesting a low latency path when creating an AudioTrack.
229dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk     * When using this flag, the sample rate must match the native sample rate
230dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk     * of the device. Effects processing is also unavailable.
2312050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     *
2322050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * Note that if this flag is used without specifying a bufferSizeInBytes then the
2332050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * AudioTrack's actual buffer size may be too small. It is recommended that a fairly
2342050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * large buffer should be specified when the AudioTrack is created.
2352050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * Then the actual size can be reduced by calling
2362050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * {@link AudioTrack#setBufferSizeInFrames(int)}. The buffer size can be optimized
2372050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * by lowering it after each write() call until the audio glitches, which is detected by calling
2382050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * {@link AudioTrack#getUnderrunCount()}. Then the buffer size can be increased
2392050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * until there are no glitches.
2402050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * This tuning step should be done while playing silence.
2412050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * This technique provides a compromise between latency and glitch rate.
242dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk     */
243dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk    public final static int FLAG_LOW_LATENCY = 0x1 << 8;
244dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk
2456894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    private final static int FLAG_ALL = FLAG_AUDIBILITY_ENFORCED | FLAG_SECURE | FLAG_SCO |
246bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock            FLAG_BEACON | FLAG_HW_AV_SYNC | FLAG_HW_HOTWORD | FLAG_BYPASS_INTERRUPTION_POLICY |
247dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk            FLAG_BYPASS_MUTE | FLAG_LOW_LATENCY;
248dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk    private final static int FLAG_ALL_PUBLIC = FLAG_AUDIBILITY_ENFORCED |
249dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk            FLAG_HW_AV_SYNC | FLAG_LOW_LATENCY;
2506894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi
251d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mUsage = USAGE_UNKNOWN;
252d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mContentType = CONTENT_TYPE_UNKNOWN;
253701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    private int mSource = MediaRecorder.AudioSource.AUDIO_SOURCE_INVALID;
254d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mFlags = 0x0;
255d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private HashSet<String> mTags;
256a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi    private String mFormattedTags;
257f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi    private Bundle mBundle; // lazy-initialized, may be null
258d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
259d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private AudioAttributes() {
260d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
261d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
262d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
263d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the content type.
264d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setContentType(int)}
265d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
266d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getContentType() {
267d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mContentType;
268d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
269d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
270d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
271d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the usage.
272d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setUsage(int)}
273d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
274d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getUsage() {
275d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mUsage;
276d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
277d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
278d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
279701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     * @hide
280701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     * Return the capture preset.
281701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setCapturePreset(int)} or a
282701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     *    negative value if none has been set.
283701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     */
2841b3541d5eedb332ea01066b4a78a2d06d5304044Jean-Michel Trivi    @SystemApi
285701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    public int getCapturePreset() {
286701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        return mSource;
287701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    }
288701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi
289701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    /**
290d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the flags.
291d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a combined mask of all flags
292d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
293d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getFlags() {
294d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        // only return the flags that are public
2956894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi        return (mFlags & (FLAG_ALL_PUBLIC));
296d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
297d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
298d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
299d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
300d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return all the flags, even the non-public ones.
301d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Internal use only
302d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a combined mask of all flags
303d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
30400a009204e51997249d60eab4f147eff566e2b1fEric Laurent    @SystemApi
305d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getAllFlags() {
3066894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi        return (mFlags & FLAG_ALL);
307d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
308d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
309d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
310b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi     * @hide
311f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi     * Return the Bundle of data.
312f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi     * @return a copy of the Bundle for this instance, may be null.
313f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi     */
314f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi    @SystemApi
315f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi    public Bundle getBundle() {
316f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        if (mBundle == null) {
317f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            return mBundle;
318f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        } else {
319f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            return new Bundle(mBundle);
320f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        }
321f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi    }
322f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi
323f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi    /**
324f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi     * @hide
325d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the set of tags.
326d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a read-only set of all tags stored as strings.
327d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
328d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public Set<String> getTags() {
329d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return Collections.unmodifiableSet(mTags);
330d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
331d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
332d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
333d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Builder class for {@link AudioAttributes} objects.
33404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <p> Here is an example where <code>Builder</code> is used to define the
33504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * {@link AudioAttributes} to be used by a new <code>AudioTrack</code> instance:
33604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *
33704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <pre class="prettyprint">
33804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * AudioTrack myTrack = new AudioTrack(
33904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *         new AudioAttributes.Builder()
34004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *             .setUsage(AudioAttributes.USAGE_MEDIA)
34104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *             .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
34204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *             .build(),
34304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *         myFormat, myBuffSize, AudioTrack.MODE_STREAM, mySession);
34404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * </pre>
34504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *
34604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <p>By default all types of information (usage, content type, flags) conveyed by an
34704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <code>AudioAttributes</code> instance are set to "unknown". Unknown information will be
34804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * interpreted as a default value that is dependent on the context of use, for instance a
34904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * {@link MediaPlayer} will use a default usage of {@link AudioAttributes#USAGE_MEDIA}.
350d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
351d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public static class Builder {
352d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mUsage = USAGE_UNKNOWN;
353d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mContentType = CONTENT_TYPE_UNKNOWN;
354701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        private int mSource = MediaRecorder.AudioSource.AUDIO_SOURCE_INVALID;
355d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mFlags = 0x0;
356d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private HashSet<String> mTags = new HashSet<String>();
357f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        private Bundle mBundle;
358d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
359d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
360d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Constructs a new Builder with the defaults.
36104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * By default, usage and content type are respectively {@link AudioAttributes#USAGE_UNKNOWN}
36204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * and {@link AudioAttributes#CONTENT_TYPE_UNKNOWN}, and flags are 0. It is recommended to
36304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * configure the usage (with {@link #setUsage(int)}) or deriving attributes from a legacy
36404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * stream type (with {@link #setLegacyStreamType(int)}) before calling {@link #build()}
36504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * to override any default playback behavior in terms of routing and volume management.
366d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
367d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder() {
368d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
369d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
370d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
371d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Constructs a new Builder from a given AudioAttributes
372d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param aa the AudioAttributes object whose data will be reused in the new Builder.
373d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
374d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        @SuppressWarnings("unchecked") // for cloning of mTags
375d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder(AudioAttributes aa) {
376d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mUsage = aa.mUsage;
377d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mContentType = aa.mContentType;
378d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mFlags = aa.mFlags;
379d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mTags = (HashSet<String>) aa.mTags.clone();
380d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
381d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
382d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
383d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Combines all of the attributes that have been set and return a new
384d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * {@link AudioAttributes} object.
385d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return a new {@link AudioAttributes} object
386d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
387d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        @SuppressWarnings("unchecked") // for cloning of mTags
388d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public AudioAttributes build() {
389d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            AudioAttributes aa = new AudioAttributes();
390d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mContentType = mContentType;
391d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mUsage = mUsage;
392701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            aa.mSource = mSource;
393d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mFlags = mFlags;
394d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mTags = (HashSet<String>) mTags.clone();
395cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            aa.mFormattedTags = TextUtils.join(";", mTags);
396f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            if (mBundle != null) {
397f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                aa.mBundle = new Bundle(mBundle);
398f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            }
399d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return aa;
400d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
401d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
402d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
403d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the attribute describing what is the intended use of the the audio signal,
404d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * such as alarm or ringtone.
405d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param usage one of {@link AudioAttributes#USAGE_UNKNOWN},
406d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_MEDIA},
407d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_VOICE_COMMUNICATION},
408d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_VOICE_COMMUNICATION_SIGNALLING},
409d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ALARM}, {@link AudioAttributes#USAGE_NOTIFICATION},
41089c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_RINGTONE},
411d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_REQUEST},
412d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_INSTANT},
413d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_DELAYED},
414d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_EVENT},
415d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_ACCESSIBILITY},
416d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_NAVIGATION_GUIDANCE},
417d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_SONIFICATION},
418d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_GAME}.
419d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
420d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
421d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setUsage(@AttributeUsage int usage) {
422d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch (usage) {
423d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_UNKNOWN:
424d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_MEDIA:
425d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_VOICE_COMMUNICATION:
426d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_VOICE_COMMUNICATION_SIGNALLING:
427d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ALARM:
428d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION:
42989c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi                case USAGE_NOTIFICATION_RINGTONE:
430d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
431d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
432d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
433d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_EVENT:
434d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_ACCESSIBILITY:
435d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
436d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_SONIFICATION:
437d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_GAME:
4388fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi                case USAGE_VIRTUAL_SOURCE:
439d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = usage;
440d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     break;
441d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
442d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = USAGE_UNKNOWN;
443d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
444d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
445d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
446d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
447d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
448d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the attribute describing the content type of the audio signal, such as speech,
449d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * or music.
450d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param contentType the content type values, one of
451d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_MOVIE},
452d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_MUSIC},
453d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_SONIFICATION},
454d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_SPEECH},
455d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_UNKNOWN}.
456d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
457d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
458d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setContentType(@AttributeContentType int contentType) {
459d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch (contentType) {
460d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_UNKNOWN:
461d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_MOVIE:
462d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_MUSIC:
463d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_SONIFICATION:
464d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_SPEECH:
465d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mContentType = contentType;
466d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     break;
467d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
468d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = CONTENT_TYPE_UNKNOWN;
469d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
470d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
471d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
472d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
473d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
474d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the combination of flags.
47526d2fdbba3dab2b46db3c68514cad6f428b88406Jean-Michel Trivi         * @param flags a combination of {@link AudioAttributes#FLAG_AUDIBILITY_ENFORCED},
47626d2fdbba3dab2b46db3c68514cad6f428b88406Jean-Michel Trivi         *    {@link AudioAttributes#FLAG_HW_AV_SYNC}.
477d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
478d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
479d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setFlags(int flags) {
4806894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi            flags &= AudioAttributes.FLAG_ALL;
481d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mFlags |= flags;
482d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
483d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
484d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
485d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
486b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @hide
487f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi         * Adds a Bundle of data
488f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi         * @param bundle a non-null Bundle
489f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi         * @return the same builder instance
490f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi         */
491f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        @SystemApi
492f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        public Builder addBundle(@NonNull Bundle bundle) {
493f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            if (bundle == null) {
494f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                throw new IllegalArgumentException("Illegal null bundle");
495f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            }
496f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            if (mBundle == null) {
497f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                mBundle = new Bundle(bundle);
498f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            } else {
499f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                mBundle.putAll(bundle);
500f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            }
501f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            return this;
502f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        }
503f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi
504f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        /**
505f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi         * @hide
506d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Add a custom tag stored as a string
507d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param tag
508d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
509d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
510d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder addTag(String tag) {
511d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mTags.add(tag);
512d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
513d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
514d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
515d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
51604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * Sets attributes as inferred from the legacy stream types.
51704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * Use this method when building an {@link AudioAttributes} instance to initialize some of
51804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * the attributes by information derived from a legacy stream type.
519d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param streamType one of {@link AudioManager#STREAM_VOICE_CALL},
520d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *   {@link AudioManager#STREAM_SYSTEM}, {@link AudioManager#STREAM_RING},
521d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *   {@link AudioManager#STREAM_MUSIC}, {@link AudioManager#STREAM_ALARM},
522d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *    or {@link AudioManager#STREAM_NOTIFICATION}.
523d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
524d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
525d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setLegacyStreamType(int streamType) {
526d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return setInternalLegacyStreamType(streamType);
527d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
528d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
529d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
530d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @hide
531d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * For internal framework use only, enables building from hidden stream types.
532d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param streamType
533d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
534d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
535d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setInternalLegacyStreamType(int streamType) {
536d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch(streamType) {
537d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_VOICE_CALL:
538d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
539d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
540d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_SYSTEM_ENFORCED:
541d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mFlags |= FLAG_AUDIBILITY_ENFORCED;
542d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    // intended fall through, attributes in common with STREAM_SYSTEM
543d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_SYSTEM:
544d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
545d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
546d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_RING:
547d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
548d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
549d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_MUSIC:
550d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_MUSIC;
551d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
552d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_ALARM:
553d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
554d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
555d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_NOTIFICATION:
556d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
557d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
558d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_BLUETOOTH_SCO:
559d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
560d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mFlags |= FLAG_SCO;
561d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
562d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_DTMF:
563d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
564d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
565d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_TTS:
566d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
567d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
568d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
569701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    Log.e(TAG, "Invalid stream type " + streamType + " for AudioAttributes");
570701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            }
571c1601f73b98b004b6210631830d2184255037948Jean-Michel Trivi            mUsage = usageForLegacyStreamType(streamType);
572701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            return this;
573701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        }
574701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi
575701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        /**
576701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @hide
577701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * Sets the capture preset.
578701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * Use this audio attributes configuration method when building an {@link AudioRecord}
579701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * instance with {@link AudioRecord#AudioRecord(AudioAttributes, AudioFormat, int)}.
580701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @param preset one of {@link MediaRecorder.AudioSource#DEFAULT},
581701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         *     {@link MediaRecorder.AudioSource#MIC}, {@link MediaRecorder.AudioSource#CAMCORDER},
582a7cc59c3187711d390c5a483d26c463a1bcbd331rago         *     {@link MediaRecorder.AudioSource#VOICE_RECOGNITION},
583a7cc59c3187711d390c5a483d26c463a1bcbd331rago         *     {@link MediaRecorder.AudioSource#VOICE_COMMUNICATION} or
584a7cc59c3187711d390c5a483d26c463a1bcbd331rago         *     {@link MediaRecorder.AudioSource#UNPROCESSED}
585701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @return the same Builder instance.
586701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         */
5871b3541d5eedb332ea01066b4a78a2d06d5304044Jean-Michel Trivi        @SystemApi
588701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        public Builder setCapturePreset(int preset) {
589701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            switch (preset) {
590701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.DEFAULT:
591701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.MIC:
592701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.CAMCORDER:
593701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.VOICE_RECOGNITION:
594701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.VOICE_COMMUNICATION:
595a7cc59c3187711d390c5a483d26c463a1bcbd331rago                case MediaRecorder.AudioSource.UNPROCESSED:
596701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    mSource = preset;
597701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    break;
598701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                default:
599701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    Log.e(TAG, "Invalid capture preset " + preset + " for AudioAttributes");
600701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            }
601701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            return this;
602701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        }
603701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi
604701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        /**
605701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @hide
606ce4483cb83afb3a42a32ef2cb00cf04d6f9018fdBenson Huang         * Same as {@link #setCapturePreset(int)} but authorizes the use of HOTWORD,
60700a009204e51997249d60eab4f147eff566e2b1fEric Laurent         * REMOTE_SUBMIX and RADIO_TUNER.
608701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @param preset
609701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @return the same Builder instance.
610701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         */
61100a009204e51997249d60eab4f147eff566e2b1fEric Laurent        @SystemApi
612701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        public Builder setInternalCapturePreset(int preset) {
613701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            if ((preset == MediaRecorder.AudioSource.HOTWORD)
614ce4483cb83afb3a42a32ef2cb00cf04d6f9018fdBenson Huang                    || (preset == MediaRecorder.AudioSource.REMOTE_SUBMIX)
61500a009204e51997249d60eab4f147eff566e2b1fEric Laurent                    || (preset == MediaRecorder.AudioSource.RADIO_TUNER)) {
616701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                mSource = preset;
617701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            } else {
618701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                setCapturePreset(preset);
619d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
620d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
621d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
622d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    };
623d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
624b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    @Override
625b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public int describeContents() {
626b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        return 0;
627b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
628b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
6298df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    /**
6308df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * @hide
6318df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * Used to indicate that when parcelling, the tags should be parcelled through the flattened
6328df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * formatted string, not through the array of strings.
6338df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * Keep in sync with frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
6348df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * see definition of kAudioAttributesMarshallTagFlattenTags
6358df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     */
6368df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    public final static int FLATTEN_TAGS = 0x1;
637f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi
638f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi    private final static int ATTR_PARCEL_IS_NULL_BUNDLE = -1977;
639f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi    private final static int ATTR_PARCEL_IS_VALID_BUNDLE = 1980;
640f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi
6418df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    /**
6428df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * When adding tags for writeToParcel(Parcel, int), add them in the list of flags (| NEW_FLAG)
6438df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     */
6448df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    private final static int ALL_PARCEL_FLAGS = FLATTEN_TAGS;
645b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    @Override
646b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public void writeToParcel(Parcel dest, int flags) {
647b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mUsage);
648b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mContentType);
649701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        dest.writeInt(mSource);
650b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mFlags);
6518df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        dest.writeInt(flags & ALL_PARCEL_FLAGS);
6528df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        if ((flags & FLATTEN_TAGS) == 0) {
6538df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            String[] tagsArray = new String[mTags.size()];
6548df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            mTags.toArray(tagsArray);
6558df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            dest.writeStringArray(tagsArray);
6568df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        } else if ((flags & FLATTEN_TAGS) == FLATTEN_TAGS) {
6578df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            dest.writeString(mFormattedTags);
6588df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        }
659f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        if (mBundle == null) {
660f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            dest.writeInt(ATTR_PARCEL_IS_NULL_BUNDLE);
661f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        } else {
662f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            dest.writeInt(ATTR_PARCEL_IS_VALID_BUNDLE);
663f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            dest.writeBundle(mBundle);
664f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        }
665b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
666b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
667b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    private AudioAttributes(Parcel in) {
668b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mUsage = in.readInt();
669b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mContentType = in.readInt();
670701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        mSource = in.readInt();
671b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mFlags = in.readInt();
6728df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        boolean hasFlattenedTags = ((in.readInt() & FLATTEN_TAGS) == FLATTEN_TAGS);
673b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mTags = new HashSet<String>();
6748df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        if (hasFlattenedTags) {
675cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            mFormattedTags = new String(in.readString());
676cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            mTags.add(mFormattedTags);
6778df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        } else {
6788df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            String[] tagsArray = in.readStringArray();
6798df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            for (int i = tagsArray.length - 1 ; i >= 0 ; i--) {
6808df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi                mTags.add(tagsArray[i]);
6818df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            }
682cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            mFormattedTags = TextUtils.join(";", mTags);
683b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
684f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        switch (in.readInt()) {
685f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            case ATTR_PARCEL_IS_NULL_BUNDLE:
686f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                mBundle = null;
687f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                break;
688f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            case ATTR_PARCEL_IS_VALID_BUNDLE:
689f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                mBundle = new Bundle(in.readBundle());
690f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                break;
691f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            default:
692f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                Log.e(TAG, "Illegal value unmarshalling AudioAttributes, can't initialize bundle");
693f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        }
694b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
695b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
696b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public static final Parcelable.Creator<AudioAttributes> CREATOR
697b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            = new Parcelable.Creator<AudioAttributes>() {
698b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        /**
699b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * Rebuilds an AudioAttributes previously stored with writeToParcel().
700b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @param p Parcel object to read the AudioAttributes from
701b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @return a new AudioAttributes created from the data in the parcel
702b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         */
703b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        public AudioAttributes createFromParcel(Parcel p) {
704b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            return new AudioAttributes(p);
705b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
706b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        public AudioAttributes[] newArray(int size) {
707b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            return new AudioAttributes[size];
708b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
709b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    };
710b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
711e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    @Override
712e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    public boolean equals(Object o) {
713e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        if (this == o) return true;
714e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        if (o == null || getClass() != o.getClass()) return false;
715e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
716e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        AudioAttributes that = (AudioAttributes) o;
717e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
718e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        return ((mContentType == that.mContentType)
719e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mFlags == that.mFlags)
720e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mSource == that.mSource)
721e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mUsage == that.mUsage)
722e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                //mFormattedTags is never null due to assignment in Builder or unmarshalling
723e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mFormattedTags.equals(that.mFormattedTags)));
724e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    }
725e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
726e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    @Override
727e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    public int hashCode() {
728f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        return Objects.hash(mContentType, mFlags, mSource, mUsage, mFormattedTags, mBundle);
729e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    }
730e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
731a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    @Override
732a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    public String toString () {
733a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi        return new String("AudioAttributes:"
734a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " usage=" + mUsage
735a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " content=" + mContentType
736a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " flags=0x" + Integer.toHexString(mFlags).toUpperCase()
737f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                + " tags=" + mFormattedTags
738f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                + " bundle=" + (mBundle == null ? "null" : mBundle.toString()));
739a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    }
740a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi
741998ff75484f1eecb6ebef150de4ac8456d22e864Jean-Michel Trivi    /** @hide */
742a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    public String usageToString() {
7437b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        return usageToString(mUsage);
7447b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    }
7457b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock
7467b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    /** @hide */
7477b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    public static String usageToString(int usage) {
7487b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        switch(usage) {
749a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_UNKNOWN:
750a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_UNKNOWN");
751a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_MEDIA:
752a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_MEDIA");
753a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION:
754a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_VOICE_COMMUNICATION");
755a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION_SIGNALLING:
75645228bf3e0c0c99be912dc9c8c663f4e8ce96233Zach Johnson                return new String("USAGE_VOICE_COMMUNICATION_SIGNALLING");
757a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ALARM:
758a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ALARM");
759a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION:
760a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION");
76189c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi            case USAGE_NOTIFICATION_RINGTONE:
76245228bf3e0c0c99be912dc9c8c663f4e8ce96233Zach Johnson                return new String("USAGE_NOTIFICATION_RINGTONE");
763a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
76445228bf3e0c0c99be912dc9c8c663f4e8ce96233Zach Johnson                return new String("USAGE_NOTIFICATION_COMMUNICATION_REQUEST");
765a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
766a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_COMMUNICATION_INSTANT");
767a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
768a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_COMMUNICATION_DELAYED");
769a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_EVENT:
770a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_EVENT");
771a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_ACCESSIBILITY:
772a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_ACCESSIBILITY");
773a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
774a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_NAVIGATION_GUIDANCE");
775a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_SONIFICATION:
776a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_SONIFICATION");
777a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_GAME:
778a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_GAME");
779a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            default:
7807b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return new String("unknown usage " + usage);
7817b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        }
7827b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    }
7837b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock
7847b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    /** @hide */
7857b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    public static int usageForLegacyStreamType(int streamType) {
7867b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        switch(streamType) {
7877b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_VOICE_CALL:
7887b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_VOICE_COMMUNICATION;
7897b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_SYSTEM_ENFORCED:
7907b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_SYSTEM:
7917b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_ASSISTANCE_SONIFICATION;
7927b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_RING:
79389c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi                return USAGE_NOTIFICATION_RINGTONE;
7947b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_MUSIC:
7957b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_MEDIA;
7967b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_ALARM:
7977b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_ALARM;
7987b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_NOTIFICATION:
7997b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_NOTIFICATION;
8007b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_BLUETOOTH_SCO:
8017b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_VOICE_COMMUNICATION;
8027b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_DTMF:
8037b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_VOICE_COMMUNICATION_SIGNALLING;
8047b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_TTS:
8057b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_ASSISTANCE_ACCESSIBILITY;
8067b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            default:
8077b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_UNKNOWN;
808a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi        }
809a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    }
810d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi    /**
811d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * @hide
812d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * CANDIDATE FOR PUBLIC (or at least SYSTEM) API
813d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * Returns the stream type matching the given attributes for volume control.
814d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * Use this method to derive the stream type needed to configure the volume
815d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * control slider in an {@link Activity} with {@link Activity#setVolumeControlStream(int)}.
816d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * <BR>Do not use this method to set the stream type on an audio player object
817d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * (e.g. {@link AudioTrack}, {@link MediaPlayer}), use <code>AudioAttributes</code> instead.
818d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * @param aa non-null AudioAttributes.
819d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * @return a valid stream type for <code>Activity</code> or stream volume control that matches
820d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     *     the attributes, or {@link AudioManager#USE_DEFAULT_STREAM_TYPE} if there isn't a direct
821d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     *     match. Note that <code>USE_DEFAULT_STREAM_TYPE</code> is not a valid value
822d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     *     for {@link AudioManager#setStreamVolume(int, int, int)}.
823d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     */
824d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi    public static int getVolumeControlStream(@NonNull AudioAttributes aa) {
825d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi        if (aa == null) {
826d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi            throw new IllegalArgumentException("Invalid null audio attributes");
827d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi        }
828d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi        return toVolumeStreamType(true /*fromGetVolumeControlStream*/, aa);
829d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi    }
830b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
8313d22bf04e399123e07ae9c2075784b63c8678d04Jean-Michel Trivi    /**
8323d22bf04e399123e07ae9c2075784b63c8678d04Jean-Michel Trivi     * @hide
8333d22bf04e399123e07ae9c2075784b63c8678d04Jean-Michel Trivi     * Only use to get which stream type should be used for volume control, NOT for audio playback
8343d22bf04e399123e07ae9c2075784b63c8678d04Jean-Michel Trivi     * (all audio playback APIs are supposed to take AudioAttributes as input parameters)
8353d22bf04e399123e07ae9c2075784b63c8678d04Jean-Michel Trivi     * @param aa non-null AudioAttributes.
8363d22bf04e399123e07ae9c2075784b63c8678d04Jean-Michel Trivi     * @return a valid stream type for volume control that matches the attributes.
8373d22bf04e399123e07ae9c2075784b63c8678d04Jean-Michel Trivi     */
838d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi    public static int toLegacyStreamType(@NonNull AudioAttributes aa) {
839d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi        return toVolumeStreamType(false /*fromGetVolumeControlStream*/, aa);
840d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi    }
841d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi
842d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi    private static int toVolumeStreamType(boolean fromGetVolumeControlStream, AudioAttributes aa) {
84309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        // flags to stream type mapping
84409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        if ((aa.getFlags() & FLAG_AUDIBILITY_ENFORCED) == FLAG_AUDIBILITY_ENFORCED) {
845d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi            return fromGetVolumeControlStream ?
846d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                    AudioSystem.STREAM_SYSTEM : AudioSystem.STREAM_SYSTEM_ENFORCED;
84709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        }
84809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        if ((aa.getFlags() & FLAG_SCO) == FLAG_SCO) {
849d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi            return fromGetVolumeControlStream ?
850d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                    AudioSystem.STREAM_VOICE_CALL : AudioSystem.STREAM_BLUETOOTH_SCO;
85109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        }
85209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi
85309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        // usage to stream type mapping
85409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        switch (aa.getUsage()) {
85509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_MEDIA:
85609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_GAME:
85709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ASSISTANCE_ACCESSIBILITY:
85809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
85909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_MUSIC;
86009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ASSISTANCE_SONIFICATION:
86109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_SYSTEM;
86209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION:
86309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_VOICE_CALL;
86409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION_SIGNALLING:
865d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                return fromGetVolumeControlStream ?
866d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                        AudioSystem.STREAM_VOICE_CALL : AudioSystem.STREAM_DTMF;
86709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ALARM:
86809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_ALARM;
86989c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi            case USAGE_NOTIFICATION_RINGTONE:
87009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_RING;
87109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION:
87209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
87309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
87409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
87509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_EVENT:
87609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_NOTIFICATION;
87709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_UNKNOWN:
878d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                return fromGetVolumeControlStream ?
879d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                        AudioManager.USE_DEFAULT_STREAM_TYPE : AudioSystem.STREAM_MUSIC;
88009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            default:
881d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                if (fromGetVolumeControlStream) {
882d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                    throw new IllegalArgumentException("Unknown usage value " + aa.getUsage() +
883d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                            " in audio attributes");
884d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                } else {
885d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                    return AudioSystem.STREAM_MUSIC;
886d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                }
88709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        }
88809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi    }
88909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi
89009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi    /** @hide */
891d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @IntDef({
892d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_UNKNOWN,
893d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_MEDIA,
894d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_VOICE_COMMUNICATION,
895d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_VOICE_COMMUNICATION_SIGNALLING,
896d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ALARM,
897d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION,
89889c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi        USAGE_NOTIFICATION_RINGTONE,
899d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_REQUEST,
900d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_INSTANT,
901d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_DELAYED,
902d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_EVENT,
903d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_ACCESSIBILITY,
904d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
905d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_SONIFICATION,
906d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_GAME
907d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    })
908d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @Retention(RetentionPolicy.SOURCE)
909d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public @interface AttributeUsage {}
910d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
911d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /** @hide */
912d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @IntDef({
913d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_UNKNOWN,
914d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_SPEECH,
915d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_MUSIC,
916d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_MOVIE,
917d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_SONIFICATION
918d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    })
919d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @Retention(RetentionPolicy.SOURCE)
920d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public @interface AttributeContentType {}
921d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi}
922