AudioAttributes.java revision 7b41467704f941b11af6aace3e40993afc7f6c6f
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;
20b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Triviimport android.os.Parcel;
21b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Triviimport android.os.Parcelable;
22d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport android.util.Log;
23d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
24d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.lang.annotation.Retention;
25d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.lang.annotation.RetentionPolicy;
26d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.Collections;
27d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.HashSet;
28a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Triviimport java.util.Iterator;
29d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.Set;
30d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
31d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi/**
32d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * A class to encapsulate a collection of attributes describing information about an audio
33d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * player or recorder.
34d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi */
35b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivipublic final class AudioAttributes implements Parcelable {
36d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private final static String TAG = "AudioAttributes";
37d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
38d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
39d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is unknown, or other than the ones defined.
40d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
41d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_UNKNOWN = 0;
42d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
43d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is speech.
44d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
45d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_SPEECH = 1;
46d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
47d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is music.
48d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
49d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_MUSIC = 2;
50d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
51d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is a soundtrack, typically accompanying
52d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a movie or TV program.
53d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
54d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_MOVIE = 3;
55d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
56d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is a sound used to accompany a user
57d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * action, such as a beep or sound effect expressing a key click, or event, such as the
58d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * type of a sound for a bonus being received in a game. These sounds are mostly synthesized
59d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * or short Foley sounds.
60d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
61d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_SONIFICATION = 4;
62d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
63d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
64d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is unknown.
65d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
66d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_UNKNOWN = 0;
67d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
68d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is media, such as music, or movie
69d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * soundtracks.
70d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
71d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_MEDIA = 1;
72d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
73d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is voice communications, such as telephony
74d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * or VoIP.
75d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
76d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_VOICE_COMMUNICATION = 2;
77d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
78d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is in-call signalling, such as with
79d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a "busy" beep, or DTMF tones.
80d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
81d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_VOICE_COMMUNICATION_SIGNALLING = 3;
82d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
83d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is an alarm (e.g. wake-up alarm).
84d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
85d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ALARM = 4;
86d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
87d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification. See other
88d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * notification usages for more specialized uses.
89d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
90d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION = 5;
91d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
92d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is telephony ringtone.
93d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
94d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_TELEPHONY_RINGTONE = 6;
95d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
96d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is a request to enter/end a
97d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * communication, such as a VoIP communication or video-conference.
98d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
99d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7;
100d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
101d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification for an "instant"
102d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * communication such as a chat, or SMS.
103d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
104d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8;
105d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
106d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification for a
107d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * non-immediate type of communication such as e-mail.
108d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
109d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9;
110d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
111d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is to attract the user's attention,
112d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * such as a reminder or low battery warning.
113d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
114d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_EVENT = 10;
115d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
116d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is for accessibility, such as with
117d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a screen reader.
118d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
119d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_ACCESSIBILITY = 11;
120d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
121d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is driving or navigation directions.
122d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
123d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12;
124d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
125d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is sonification, such as  with user
126d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * interface sounds.
127d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
128d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_SONIFICATION = 13;
129d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
130d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is for game audio.
131d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
132d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_GAME = 14;
133d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
134d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
135d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag defining a behavior where the audibility of the sound will be ensured by the system.
136d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
137d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_AUDIBILITY_ENFORCED = 0x1 << 0;
138d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
139d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
140d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag defining a behavior where the playback of the sound is ensured without
141d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * degradation only when going to a secure sink.
142d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
143d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    // FIXME not guaranteed yet
144d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    // TODO  add OR to getFlags() when supported and in public API
145d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_SECURE = 0x1 << 1;
146d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
147d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
148d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag to enable when the stream is associated with SCO usage.
149d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Internal use only for dealing with legacy STREAM_BLUETOOTH_SCO
150d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
151d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_SCO = 0x1 << 2;
152d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
153d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
154d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mUsage = USAGE_UNKNOWN;
155d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mContentType = CONTENT_TYPE_UNKNOWN;
156d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mFlags = 0x0;
157d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private HashSet<String> mTags;
158a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi    private String mFormattedTags;
159d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
160d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private AudioAttributes() {
161d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
162d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
163d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
164d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the content type.
165d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setContentType(int)}
166d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
167d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getContentType() {
168d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mContentType;
169d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
170d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
171d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
172d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the usage.
173d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setUsage(int)}
174d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
175d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getUsage() {
176d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mUsage;
177d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
178d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
179d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
180d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the flags.
181d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a combined mask of all flags
182d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
183d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getFlags() {
184d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        // only return the flags that are public
185d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return (mFlags & (FLAG_AUDIBILITY_ENFORCED));
186d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
187d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
188d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
189d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
190d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return all the flags, even the non-public ones.
191d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Internal use only
192d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a combined mask of all flags
193d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
194d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getAllFlags() {
195d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mFlags;
196d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
197d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
198d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
199b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi     * @hide
200d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the set of tags.
201d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a read-only set of all tags stored as strings.
202d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
203d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public Set<String> getTags() {
204d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return Collections.unmodifiableSet(mTags);
205d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
206d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
207d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
208d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Builder class for {@link AudioAttributes} objects.
209d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
210d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public static class Builder {
211d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mUsage = USAGE_UNKNOWN;
212d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mContentType = CONTENT_TYPE_UNKNOWN;
213d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mFlags = 0x0;
214d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private HashSet<String> mTags = new HashSet<String>();
215d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
216d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
217d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Constructs a new Builder with the defaults.
218d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
219d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder() {
220d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
221d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
222d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
223d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Constructs a new Builder from a given AudioAttributes
224d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param aa the AudioAttributes object whose data will be reused in the new Builder.
225d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
226d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        @SuppressWarnings("unchecked") // for cloning of mTags
227d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder(AudioAttributes aa) {
228d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mUsage = aa.mUsage;
229d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mContentType = aa.mContentType;
230d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mFlags = aa.mFlags;
231d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mTags = (HashSet<String>) aa.mTags.clone();
232d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
233d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
234d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
235d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Combines all of the attributes that have been set and return a new
236d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * {@link AudioAttributes} object.
237d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return a new {@link AudioAttributes} object
238d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
239d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        @SuppressWarnings("unchecked") // for cloning of mTags
240d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public AudioAttributes build() {
241d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            AudioAttributes aa = new AudioAttributes();
242d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mContentType = mContentType;
243d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mUsage = mUsage;
244d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mFlags = mFlags;
245d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mTags = (HashSet<String>) mTags.clone();
246a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi            final Iterator<String> tagIterator = mTags.iterator();
247a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi            String allTagsInOne = new String();
248a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi            while (tagIterator.hasNext()) {
249a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi                allTagsInOne += tagIterator.next() + ";";
250a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi            }
251a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi            aa.mFormattedTags = allTagsInOne;
252d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return aa;
253d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
254d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
255d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
256d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the attribute describing what is the intended use of the the audio signal,
257d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * such as alarm or ringtone.
258d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param usage one of {@link AudioAttributes#USAGE_UNKNOWN},
259d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_MEDIA},
260d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_VOICE_COMMUNICATION},
261d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_VOICE_COMMUNICATION_SIGNALLING},
262d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ALARM}, {@link AudioAttributes#USAGE_NOTIFICATION},
263d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_TELEPHONY_RINGTONE},
264d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_REQUEST},
265d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_INSTANT},
266d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_DELAYED},
267d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_EVENT},
268d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_ACCESSIBILITY},
269d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_NAVIGATION_GUIDANCE},
270d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_SONIFICATION},
271d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_GAME}.
272d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
273d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
274d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setUsage(@AttributeUsage int usage) {
275d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch (usage) {
276d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_UNKNOWN:
277d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_MEDIA:
278d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_VOICE_COMMUNICATION:
279d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_VOICE_COMMUNICATION_SIGNALLING:
280d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ALARM:
281d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION:
282d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
283d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
284d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
285d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
286d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_EVENT:
287d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_ACCESSIBILITY:
288d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
289d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_SONIFICATION:
290d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_GAME:
291d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = usage;
292d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     break;
293d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
294d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = USAGE_UNKNOWN;
295d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
296d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
297d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
298d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
299d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
300d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the attribute describing the content type of the audio signal, such as speech,
301d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * or music.
302d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param contentType the content type values, one of
303d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_MOVIE},
304d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_MUSIC},
305d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_SONIFICATION},
306d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_SPEECH},
307d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_UNKNOWN}.
308d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
309d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
310d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setContentType(@AttributeContentType int contentType) {
311d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch (contentType) {
312d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_UNKNOWN:
313d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_MOVIE:
314d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_MUSIC:
315d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_SONIFICATION:
316d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_SPEECH:
317d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mContentType = contentType;
318d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     break;
319d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
320d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = CONTENT_TYPE_UNKNOWN;
321d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
322d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
323d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
324d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
325d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
326d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the combination of flags.
327d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param flags the {@link AudioAttributes#FLAG_AUDIBILITY_ENFORCED} flag.
328d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
329d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
330d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setFlags(int flags) {
331d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            flags &= (AudioAttributes.FLAG_AUDIBILITY_ENFORCED | AudioAttributes.FLAG_SCO
332d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    | AudioAttributes.FLAG_SECURE);
333d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mFlags |= flags;
334d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
335d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
336d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
337d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
338b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @hide
339d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Add a custom tag stored as a string
340d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param tag
341d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
342d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
343d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder addTag(String tag) {
344d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mTags.add(tag);
345d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
346d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
347d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
348d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
349d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Adds attributes inferred from the legacy stream types.
350d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param streamType one of {@link AudioManager#STREAM_VOICE_CALL},
351d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *   {@link AudioManager#STREAM_SYSTEM}, {@link AudioManager#STREAM_RING},
352d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *   {@link AudioManager#STREAM_MUSIC}, {@link AudioManager#STREAM_ALARM},
353d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *    or {@link AudioManager#STREAM_NOTIFICATION}.
354d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
355d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
356d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setLegacyStreamType(int streamType) {
357d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return setInternalLegacyStreamType(streamType);
358d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
359d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
360d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
361d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @hide
362d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * For internal framework use only, enables building from hidden stream types.
363d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param streamType
364d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
365d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
366d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setInternalLegacyStreamType(int streamType) {
367d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch(streamType) {
368d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_VOICE_CALL:
369d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
370d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
371d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_SYSTEM_ENFORCED:
372d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mFlags |= FLAG_AUDIBILITY_ENFORCED;
373d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    // intended fall through, attributes in common with STREAM_SYSTEM
374d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_SYSTEM:
375d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
376d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
377d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_RING:
378d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
379d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
380d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_MUSIC:
381d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_MUSIC;
382d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
383d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_ALARM:
384d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
385d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
386d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_NOTIFICATION:
387d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
388d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
389d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_BLUETOOTH_SCO:
390d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
391d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mFlags |= FLAG_SCO;
392d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
393d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_DTMF:
394d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
395d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
396d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_TTS:
397d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
398d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
399d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
400d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    Log.e(TAG, "Invalid stream type " + streamType + " in for AudioAttributes");
401d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
4027b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            mUsage = usageForLegacyStreamType(streamType);
403d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
404d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
405d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    };
406d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
407b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    @Override
408b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public int describeContents() {
409b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        return 0;
410b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
411b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
4128df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    /**
4138df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * @hide
4148df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * Used to indicate that when parcelling, the tags should be parcelled through the flattened
4158df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * formatted string, not through the array of strings.
4168df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * Keep in sync with frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
4178df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * see definition of kAudioAttributesMarshallTagFlattenTags
4188df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     */
4198df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    public final static int FLATTEN_TAGS = 0x1;
4208df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    /**
4218df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * When adding tags for writeToParcel(Parcel, int), add them in the list of flags (| NEW_FLAG)
4228df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     */
4238df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    private final static int ALL_PARCEL_FLAGS = FLATTEN_TAGS;
424b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    @Override
425b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public void writeToParcel(Parcel dest, int flags) {
426b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mUsage);
427b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mContentType);
428b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mFlags);
4298df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        dest.writeInt(flags & ALL_PARCEL_FLAGS);
4308df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        if ((flags & FLATTEN_TAGS) == 0) {
4318df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            String[] tagsArray = new String[mTags.size()];
4328df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            mTags.toArray(tagsArray);
4338df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            dest.writeStringArray(tagsArray);
4348df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        } else if ((flags & FLATTEN_TAGS) == FLATTEN_TAGS) {
4358df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            dest.writeString(mFormattedTags);
4368df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        }
437b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
438b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
439b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    private AudioAttributes(Parcel in) {
440b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mUsage = in.readInt();
441b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mContentType = in.readInt();
442b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mFlags = in.readInt();
4438df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        boolean hasFlattenedTags = ((in.readInt() & FLATTEN_TAGS) == FLATTEN_TAGS);
444b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mTags = new HashSet<String>();
4458df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        if (hasFlattenedTags) {
4468df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            mTags.add(in.readString());
4478df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        } else {
4488df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            String[] tagsArray = in.readStringArray();
4498df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            for (int i = tagsArray.length - 1 ; i >= 0 ; i--) {
4508df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi                mTags.add(tagsArray[i]);
4518df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            }
452b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
453b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
454b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
455b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    /** @hide */
456b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public static final Parcelable.Creator<AudioAttributes> CREATOR
457b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            = new Parcelable.Creator<AudioAttributes>() {
458b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        /**
459b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * Rebuilds an AudioAttributes previously stored with writeToParcel().
460b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @param p Parcel object to read the AudioAttributes from
461b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @return a new AudioAttributes created from the data in the parcel
462b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         */
463b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        public AudioAttributes createFromParcel(Parcel p) {
464b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            return new AudioAttributes(p);
465b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
466b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        public AudioAttributes[] newArray(int size) {
467b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            return new AudioAttributes[size];
468b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
469b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    };
470b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
471a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    /** @hide */
472a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    @Override
473a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    public String toString () {
474a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi        return new String("AudioAttributes:"
475a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " usage=" + mUsage
476a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " content=" + mContentType
477a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " flags=0x" + Integer.toHexString(mFlags).toUpperCase()
478a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " tags=" + mTags);
479a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    }
480a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi
481998ff75484f1eecb6ebef150de4ac8456d22e864Jean-Michel Trivi    /** @hide */
482a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    public String usageToString() {
4837b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        return usageToString(mUsage);
4847b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    }
4857b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock
4867b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    /** @hide */
4877b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    public static String usageToString(int usage) {
4887b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        switch(usage) {
489a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_UNKNOWN:
490a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_UNKNOWN");
491a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_MEDIA:
492a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_MEDIA");
493a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION:
494a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_VOICE_COMMUNICATION");
495a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION_SIGNALLING:
496a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_VOICE_COMMUNICATION");
497a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ALARM:
498a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ALARM");
499a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION:
500a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION");
501a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
502a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION");
503a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
504a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION");
505a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
506a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_COMMUNICATION_INSTANT");
507a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
508a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_COMMUNICATION_DELAYED");
509a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_EVENT:
510a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_EVENT");
511a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_ACCESSIBILITY:
512a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_ACCESSIBILITY");
513a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
514a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_NAVIGATION_GUIDANCE");
515a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_SONIFICATION:
516a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_SONIFICATION");
517a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_GAME:
518a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_GAME");
519a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            default:
5207b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return new String("unknown usage " + usage);
5217b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        }
5227b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    }
5237b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock
5247b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    /** @hide */
5257b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    public static int usageForLegacyStreamType(int streamType) {
5267b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        switch(streamType) {
5277b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_VOICE_CALL:
5287b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_VOICE_COMMUNICATION;
5297b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_SYSTEM_ENFORCED:
5307b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_SYSTEM:
5317b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_ASSISTANCE_SONIFICATION;
5327b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_RING:
5337b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
5347b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_MUSIC:
5357b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_MEDIA;
5367b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_ALARM:
5377b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_ALARM;
5387b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_NOTIFICATION:
5397b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_NOTIFICATION;
5407b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_BLUETOOTH_SCO:
5417b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_VOICE_COMMUNICATION;
5427b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_DTMF:
5437b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_VOICE_COMMUNICATION_SIGNALLING;
5447b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_TTS:
5457b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_ASSISTANCE_ACCESSIBILITY;
5467b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            default:
5477b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_UNKNOWN;
548a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi        }
549a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    }
550b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
551d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /** @hide */
55209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi    public static int toLegacyStreamType(AudioAttributes aa) {
55309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        // flags to stream type mapping
55409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        if ((aa.getFlags() & FLAG_AUDIBILITY_ENFORCED) == FLAG_AUDIBILITY_ENFORCED) {
55509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            return AudioSystem.STREAM_SYSTEM_ENFORCED;
55609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        }
55709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        if ((aa.getFlags() & FLAG_SCO) == FLAG_SCO) {
55809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            return AudioSystem.STREAM_BLUETOOTH_SCO;
55909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        }
56009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi
56109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        // usage to stream type mapping
56209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        switch (aa.getUsage()) {
56309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_MEDIA:
56409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_GAME:
56509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ASSISTANCE_ACCESSIBILITY:
56609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
56709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_MUSIC;
56809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ASSISTANCE_SONIFICATION:
56909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_SYSTEM;
57009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION:
57109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_VOICE_CALL;
57209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION_SIGNALLING:
57309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_DTMF;
57409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ALARM:
57509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_ALARM;
57609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
57709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_RING;
57809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION:
57909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
58009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
58109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
58209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_EVENT:
58309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_NOTIFICATION;
58409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_UNKNOWN:
58509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            default:
58609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_MUSIC;
58709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        }
58809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi    }
58909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi
59009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi    /** @hide */
591d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @IntDef({
592d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_UNKNOWN,
593d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_MEDIA,
594d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_VOICE_COMMUNICATION,
595d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_VOICE_COMMUNICATION_SIGNALLING,
596d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ALARM,
597d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION,
598d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_TELEPHONY_RINGTONE,
599d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_REQUEST,
600d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_INSTANT,
601d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_DELAYED,
602d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_EVENT,
603d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_ACCESSIBILITY,
604d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
605d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_SONIFICATION,
606d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_GAME
607d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    })
608d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @Retention(RetentionPolicy.SOURCE)
609d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public @interface AttributeUsage {}
610d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
611d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /** @hide */
612d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @IntDef({
613d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_UNKNOWN,
614d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_SPEECH,
615d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_MUSIC,
616d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_MOVIE,
617d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_SONIFICATION
618d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    })
619d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @Retention(RetentionPolicy.SOURCE)
620d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public @interface AttributeContentType {}
621d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi}
622