AudioAttributes.java revision b45c27303339e5baa9fe40e4f8ecd211e382982f
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;
28d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.Set;
29d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
30d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi/**
31d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * A class to encapsulate a collection of attributes describing information about an audio
32d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * player or recorder.
33d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi */
34b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivipublic final class AudioAttributes implements Parcelable {
35d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private final static String TAG = "AudioAttributes";
36d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
37d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
38d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is unknown, or other than the ones defined.
39d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
40d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_UNKNOWN = 0;
41d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
42d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is speech.
43d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
44d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_SPEECH = 1;
45d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
46d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is music.
47d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
48d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_MUSIC = 2;
49d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
50d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is a soundtrack, typically accompanying
51d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a movie or TV program.
52d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
53d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_MOVIE = 3;
54d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
55d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is a sound used to accompany a user
56d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * action, such as a beep or sound effect expressing a key click, or event, such as the
57d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * type of a sound for a bonus being received in a game. These sounds are mostly synthesized
58d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * or short Foley sounds.
59d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
60d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_SONIFICATION = 4;
61d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
62d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
63d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is unknown.
64d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
65d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_UNKNOWN = 0;
66d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
67d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is media, such as music, or movie
68d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * soundtracks.
69d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
70d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_MEDIA = 1;
71d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
72d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is voice communications, such as telephony
73d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * or VoIP.
74d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
75d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_VOICE_COMMUNICATION = 2;
76d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
77d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is in-call signalling, such as with
78d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a "busy" beep, or DTMF tones.
79d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
80d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_VOICE_COMMUNICATION_SIGNALLING = 3;
81d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
82d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is an alarm (e.g. wake-up alarm).
83d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
84d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ALARM = 4;
85d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
86d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification. See other
87d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * notification usages for more specialized uses.
88d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
89d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION = 5;
90d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
91d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is telephony ringtone.
92d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
93d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_TELEPHONY_RINGTONE = 6;
94d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
95d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is a request to enter/end a
96d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * communication, such as a VoIP communication or video-conference.
97d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
98d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7;
99d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
100d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification for an "instant"
101d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * communication such as a chat, or SMS.
102d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
103d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8;
104d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
105d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification for a
106d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * non-immediate type of communication such as e-mail.
107d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
108d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9;
109d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
110d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is to attract the user's attention,
111d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * such as a reminder or low battery warning.
112d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
113d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_EVENT = 10;
114d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
115d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is for accessibility, such as with
116d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a screen reader.
117d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
118d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_ACCESSIBILITY = 11;
119d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
120d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is driving or navigation directions.
121d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
122d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12;
123d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
124d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is sonification, such as  with user
125d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * interface sounds.
126d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
127d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_SONIFICATION = 13;
128d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
129d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is for game audio.
130d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
131d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_GAME = 14;
132d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
133d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
134d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag defining a behavior where the audibility of the sound will be ensured by the system.
135d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
136d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_AUDIBILITY_ENFORCED = 0x1 << 0;
137d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
138d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
139d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag defining a behavior where the playback of the sound is ensured without
140d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * degradation only when going to a secure sink.
141d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
142d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    // FIXME not guaranteed yet
143d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    // TODO  add OR to getFlags() when supported and in public API
144d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_SECURE = 0x1 << 1;
145d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
146d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
147d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag to enable when the stream is associated with SCO usage.
148d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Internal use only for dealing with legacy STREAM_BLUETOOTH_SCO
149d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
150d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_SCO = 0x1 << 2;
151d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
152d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
153d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mUsage = USAGE_UNKNOWN;
154d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mContentType = CONTENT_TYPE_UNKNOWN;
155d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mFlags = 0x0;
156d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private HashSet<String> mTags;
157d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
158d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private AudioAttributes() {
159d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
160d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
161d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
162d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the content type.
163d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setContentType(int)}
164d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
165d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getContentType() {
166d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mContentType;
167d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
168d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
169d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
170d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the usage.
171d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setUsage(int)}
172d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
173d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getUsage() {
174d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mUsage;
175d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
176d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
177d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
178d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the flags.
179d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a combined mask of all flags
180d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
181d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getFlags() {
182d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        // only return the flags that are public
183d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return (mFlags & (FLAG_AUDIBILITY_ENFORCED));
184d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
185d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
186d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
187d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
188d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return all the flags, even the non-public ones.
189d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Internal use only
190d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a combined mask of all flags
191d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
192d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getAllFlags() {
193d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mFlags;
194d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
195d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
196d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
197b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi     * @hide
198d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the set of tags.
199d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a read-only set of all tags stored as strings.
200d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
201d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public Set<String> getTags() {
202d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return Collections.unmodifiableSet(mTags);
203d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
204d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
205d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
206d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Builder class for {@link AudioAttributes} objects.
207d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
208d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public static class Builder {
209d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mUsage = USAGE_UNKNOWN;
210d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mContentType = CONTENT_TYPE_UNKNOWN;
211d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mFlags = 0x0;
212d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private HashSet<String> mTags = new HashSet<String>();
213d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
214d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
215d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Constructs a new Builder with the defaults.
216d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
217d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder() {
218d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
219d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
220d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
221d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Constructs a new Builder from a given AudioAttributes
222d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param aa the AudioAttributes object whose data will be reused in the new Builder.
223d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
224d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        @SuppressWarnings("unchecked") // for cloning of mTags
225d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder(AudioAttributes aa) {
226d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mUsage = aa.mUsage;
227d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mContentType = aa.mContentType;
228d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mFlags = aa.mFlags;
229d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mTags = (HashSet<String>) aa.mTags.clone();
230d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
231d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
232d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
233d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Combines all of the attributes that have been set and return a new
234d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * {@link AudioAttributes} object.
235d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return a new {@link AudioAttributes} object
236d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
237d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        @SuppressWarnings("unchecked") // for cloning of mTags
238d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public AudioAttributes build() {
239d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            AudioAttributes aa = new AudioAttributes();
240d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mContentType = mContentType;
241d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mUsage = mUsage;
242d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mFlags = mFlags;
243d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mTags = (HashSet<String>) mTags.clone();
244d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return aa;
245d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
246d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
247d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
248d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the attribute describing what is the intended use of the the audio signal,
249d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * such as alarm or ringtone.
250d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param usage one of {@link AudioAttributes#USAGE_UNKNOWN},
251d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_MEDIA},
252d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_VOICE_COMMUNICATION},
253d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_VOICE_COMMUNICATION_SIGNALLING},
254d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ALARM}, {@link AudioAttributes#USAGE_NOTIFICATION},
255d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_TELEPHONY_RINGTONE},
256d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_REQUEST},
257d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_INSTANT},
258d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_DELAYED},
259d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_EVENT},
260d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_ACCESSIBILITY},
261d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_NAVIGATION_GUIDANCE},
262d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_SONIFICATION},
263d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_GAME}.
264d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
265d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
266d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setUsage(@AttributeUsage int usage) {
267d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch (usage) {
268d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_UNKNOWN:
269d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_MEDIA:
270d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_VOICE_COMMUNICATION:
271d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_VOICE_COMMUNICATION_SIGNALLING:
272d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ALARM:
273d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION:
274d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
275d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
276d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
277d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
278d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_EVENT:
279d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_ACCESSIBILITY:
280d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
281d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_SONIFICATION:
282d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_GAME:
283d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = usage;
284d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     break;
285d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
286d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = USAGE_UNKNOWN;
287d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
288d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
289d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
290d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
291d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
292d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the attribute describing the content type of the audio signal, such as speech,
293d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * or music.
294d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param contentType the content type values, one of
295d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_MOVIE},
296d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_MUSIC},
297d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_SONIFICATION},
298d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_SPEECH},
299d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_UNKNOWN}.
300d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
301d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
302d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setContentType(@AttributeContentType int contentType) {
303d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch (contentType) {
304d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_UNKNOWN:
305d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_MOVIE:
306d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_MUSIC:
307d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_SONIFICATION:
308d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_SPEECH:
309d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mContentType = contentType;
310d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     break;
311d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
312d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = CONTENT_TYPE_UNKNOWN;
313d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
314d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
315d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
316d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
317d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
318d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the combination of flags.
319d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param flags the {@link AudioAttributes#FLAG_AUDIBILITY_ENFORCED} flag.
320d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
321d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
322d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setFlags(int flags) {
323d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            flags &= (AudioAttributes.FLAG_AUDIBILITY_ENFORCED | AudioAttributes.FLAG_SCO
324d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    | AudioAttributes.FLAG_SECURE);
325d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mFlags |= flags;
326d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
327d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
328d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
329d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
330b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @hide
331d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Add a custom tag stored as a string
332d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param tag
333d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
334d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
335d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder addTag(String tag) {
336d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mTags.add(tag);
337d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
338d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
339d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
340d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
341d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Adds attributes inferred from the legacy stream types.
342d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param streamType one of {@link AudioManager#STREAM_VOICE_CALL},
343d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *   {@link AudioManager#STREAM_SYSTEM}, {@link AudioManager#STREAM_RING},
344d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *   {@link AudioManager#STREAM_MUSIC}, {@link AudioManager#STREAM_ALARM},
345d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *    or {@link AudioManager#STREAM_NOTIFICATION}.
346d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
347d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
348d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setLegacyStreamType(int streamType) {
349d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return setInternalLegacyStreamType(streamType);
350d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
351d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
352d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
353d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @hide
354d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * For internal framework use only, enables building from hidden stream types.
355d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param streamType
356d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
357d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
358d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setInternalLegacyStreamType(int streamType) {
359d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch(streamType) {
360d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_VOICE_CALL:
361d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
362d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_VOICE_COMMUNICATION;
363d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
364d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_SYSTEM_ENFORCED:
365d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mFlags |= FLAG_AUDIBILITY_ENFORCED;
366d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    // intended fall through, attributes in common with STREAM_SYSTEM
367d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_SYSTEM:
368d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
369d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_ASSISTANCE_SONIFICATION;
370d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
371d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_RING:
372d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
373d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
374d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
375d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_MUSIC:
376d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_MUSIC;
377d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_MEDIA;
378d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
379d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_ALARM:
380d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
381d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_ALARM;
382d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
383d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_NOTIFICATION:
384d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
385d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_NOTIFICATION;
386d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
387d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_BLUETOOTH_SCO:
388d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
389d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_VOICE_COMMUNICATION;
390d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mFlags |= FLAG_SCO;
391d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
392d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_DTMF:
393d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
394d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_VOICE_COMMUNICATION_SIGNALLING;
395d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
396d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_TTS:
397d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
398d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_ASSISTANCE_ACCESSIBILITY;
399d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
400d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
401d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    Log.e(TAG, "Invalid stream type " + streamType + " in for AudioAttributes");
402d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
403d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
404d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
405d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    };
406d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
407d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /** @hide */
408d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @Override
409d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public String toString () {
410d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return new String("AudioAttributes:"
411d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                + " usage=" + mUsage
412d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                + " content=" + mContentType
413d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                + " flags=0x" + Integer.toHexString(mFlags)
414d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                + " tags=" + mTags);
415d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
416d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
417b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    @Override
418b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public int describeContents() {
419b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        return 0;
420b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
421b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
422b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    @Override
423b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public void writeToParcel(Parcel dest, int flags) {
424b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mUsage);
425b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mContentType);
426b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mFlags);
427b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        String[] tagsArray = new String[mTags.size()];
428b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mTags.toArray(tagsArray);
429b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeStringArray(tagsArray);
430b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
431b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
432b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    private AudioAttributes(Parcel in) {
433b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mUsage = in.readInt();
434b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mContentType = in.readInt();
435b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mFlags = in.readInt();
436b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mTags = new HashSet<String>();
437b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        String[] tagsArray = in.readStringArray();
438b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        for (int i = tagsArray.length - 1 ; i >= 0 ; i--) {
439b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            mTags.add(tagsArray[i]);
440b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
441b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
442b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
443b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    /** @hide */
444b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public static final Parcelable.Creator<AudioAttributes> CREATOR
445b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            = new Parcelable.Creator<AudioAttributes>() {
446b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        /**
447b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * Rebuilds an AudioAttributes previously stored with writeToParcel().
448b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @param p Parcel object to read the AudioAttributes from
449b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @return a new AudioAttributes created from the data in the parcel
450b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         */
451b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        public AudioAttributes createFromParcel(Parcel p) {
452b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            return new AudioAttributes(p);
453b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
454b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        public AudioAttributes[] newArray(int size) {
455b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            return new AudioAttributes[size];
456b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
457b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    };
458b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
459b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
460d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /** @hide */
461d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @IntDef({
462d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_UNKNOWN,
463d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_MEDIA,
464d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_VOICE_COMMUNICATION,
465d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_VOICE_COMMUNICATION_SIGNALLING,
466d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ALARM,
467d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION,
468d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_TELEPHONY_RINGTONE,
469d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_REQUEST,
470d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_INSTANT,
471d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_DELAYED,
472d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_EVENT,
473d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_ACCESSIBILITY,
474d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
475d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_SONIFICATION,
476d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_GAME
477d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    })
478d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @Retention(RetentionPolicy.SOURCE)
479d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public @interface AttributeUsage {}
480d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
481d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /** @hide */
482d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @IntDef({
483d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_UNKNOWN,
484d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_SPEECH,
485d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_MUSIC,
486d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_MOVIE,
487d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_SONIFICATION
488d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    })
489d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @Retention(RetentionPolicy.SOURCE)
490d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public @interface AttributeContentType {}
491d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi}
492