AudioManager.java revision 5982013cfc8274ff0bafaba83c676b3a8890cba9
1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.media;
18
19import android.annotation.SdkConstant;
20import android.annotation.SdkConstant.SdkConstantType;
21import android.content.Context;
22import android.database.ContentObserver;
23import android.os.Binder;
24import android.os.Handler;
25import android.os.IBinder;
26import android.os.RemoteException;
27import android.os.ServiceManager;
28import android.provider.Settings;
29import android.util.Log;
30
31/**
32 * AudioManager provides access to volume and ringer mode control.
33 * <p>
34 * Use <code>Context.getSystemService(Context.AUDIO_SERVICE)</code> to get
35 * an instance of this class.
36 */
37public class AudioManager {
38
39    private final Context mContext;
40    private final Handler mHandler;
41
42    private static String TAG = "AudioManager";
43    private static boolean DEBUG = false;
44    private static boolean localLOGV = DEBUG || android.util.Config.LOGV;
45
46    /**
47     * Broadcast intent, a hint for applications that audio is about to become
48     * 'noisy' due to a change in audio outputs. For example, this intent may
49     * be sent when a wired headset is unplugged, or when an A2DP audio
50     * sink is disconnected, and the audio system is about to automatically
51     * switch audio route to the speaker. Applications that are controlling
52     * audio streams may consider pausing, reducing volume or some other action
53     * on receipt of this intent so as not to surprise the user with audio
54     * from the speaker.
55     */
56    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
57    public static final String ACTION_AUDIO_BECOMING_NOISY = "android.media.AUDIO_BECOMING_NOISY";
58
59    /**
60     * Sticky broadcast intent action indicating that the ringer mode has
61     * changed. Includes the new ringer mode.
62     *
63     * @see #EXTRA_RINGER_MODE
64     */
65    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
66    public static final String RINGER_MODE_CHANGED_ACTION = "android.media.RINGER_MODE_CHANGED";
67
68    /**
69     * The new ringer mode.
70     *
71     * @see #RINGER_MODE_CHANGED_ACTION
72     * @see #RINGER_MODE_NORMAL
73     * @see #RINGER_MODE_SILENT
74     * @see #RINGER_MODE_VIBRATE
75     */
76    public static final String EXTRA_RINGER_MODE = "android.media.EXTRA_RINGER_MODE";
77
78    /**
79     * Broadcast intent action indicating that the vibrate setting has
80     * changed. Includes the vibrate type and its new setting.
81     *
82     * @see #EXTRA_VIBRATE_TYPE
83     * @see #EXTRA_VIBRATE_SETTING
84     */
85    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
86    public static final String VIBRATE_SETTING_CHANGED_ACTION = "android.media.VIBRATE_SETTING_CHANGED";
87
88    /**
89     * @hide Broadcast intent when the volume for a particular stream type changes.
90     * Includes the stream and the new volume
91     *
92     * @see #EXTRA_VOLUME_STREAM_TYPE
93     * @see #EXTRA_VOLUME_STREAM_VALUE
94     */
95    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
96    public static final String VOLUME_CHANGED_ACTION = "android.media.VOLUME_CHANGED_ACTION";
97
98    /**
99     * The new vibrate setting for a particular type.
100     *
101     * @see #VIBRATE_SETTING_CHANGED_ACTION
102     * @see #EXTRA_VIBRATE_TYPE
103     * @see #VIBRATE_SETTING_ON
104     * @see #VIBRATE_SETTING_OFF
105     * @see #VIBRATE_SETTING_ONLY_SILENT
106     */
107    public static final String EXTRA_VIBRATE_SETTING = "android.media.EXTRA_VIBRATE_SETTING";
108
109    /**
110     * The vibrate type whose setting has changed.
111     *
112     * @see #VIBRATE_SETTING_CHANGED_ACTION
113     * @see #VIBRATE_TYPE_NOTIFICATION
114     * @see #VIBRATE_TYPE_RINGER
115     */
116    public static final String EXTRA_VIBRATE_TYPE = "android.media.EXTRA_VIBRATE_TYPE";
117
118    /**
119     * @hide The stream type for the volume changed intent.
120     */
121    public static final String EXTRA_VOLUME_STREAM_TYPE = "android.media.EXTRA_VOLUME_STREAM_TYPE";
122
123    /**
124     * @hide The volume associated with the stream for the volume changed intent.
125     */
126    public static final String EXTRA_VOLUME_STREAM_VALUE =
127        "android.media.EXTRA_VOLUME_STREAM_VALUE";
128
129    /** The audio stream for phone calls */
130    public static final int STREAM_VOICE_CALL = AudioSystem.STREAM_VOICE_CALL;
131    /** The audio stream for system sounds */
132    public static final int STREAM_SYSTEM = AudioSystem.STREAM_SYSTEM;
133    /** The audio stream for the phone ring */
134    public static final int STREAM_RING = AudioSystem.STREAM_RING;
135    /** The audio stream for music playback */
136    public static final int STREAM_MUSIC = AudioSystem.STREAM_MUSIC;
137    /** The audio stream for alarms */
138    public static final int STREAM_ALARM = AudioSystem.STREAM_ALARM;
139    /** The audio stream for notifications */
140    public static final int STREAM_NOTIFICATION = AudioSystem.STREAM_NOTIFICATION;
141    /** @hide The audio stream for phone calls when connected to bluetooth */
142    public static final int STREAM_BLUETOOTH_SCO = AudioSystem.STREAM_BLUETOOTH_SCO;
143    /** @hide The audio stream for enforced system sounds in certain countries (e.g camera in Japan) */
144    public static final int STREAM_SYSTEM_ENFORCED = AudioSystem.STREAM_SYSTEM_ENFORCED;
145    /** The audio stream for DTMF Tones */
146    public static final int STREAM_DTMF = AudioSystem.STREAM_DTMF;
147    /** @hide The audio stream for text to speech (TTS) */
148    public static final int STREAM_TTS = AudioSystem.STREAM_TTS;
149    /** Number of audio streams */
150    /**
151     * @deprecated Use AudioSystem.getNumStreamTypes() instead
152     */
153    @Deprecated public static final int NUM_STREAMS = AudioSystem.NUM_STREAMS;
154
155
156    /**  @hide Default volume index values for audio streams */
157    public static final int[] DEFAULT_STREAM_VOLUME = new int[] {
158        4,  // STREAM_VOICE_CALL
159        5,  // STREAM_SYSTEM
160        5,  // STREAM_RING
161        11, // STREAM_MUSIC
162        6,  // STREAM_ALARM
163        5,  // STREAM_NOTIFICATION
164        7,  // STREAM_BLUETOOTH_SCO
165        5,  // STREAM_SYSTEM_ENFORCED
166        11, // STREAM_DTMF
167        11  // STREAM_TTS
168    };
169
170    /**
171     * Increase the ringer volume.
172     *
173     * @see #adjustVolume(int, int)
174     * @see #adjustStreamVolume(int, int, int)
175     */
176    public static final int ADJUST_RAISE = 1;
177
178    /**
179     * Decrease the ringer volume.
180     *
181     * @see #adjustVolume(int, int)
182     * @see #adjustStreamVolume(int, int, int)
183     */
184    public static final int ADJUST_LOWER = -1;
185
186    /**
187     * Maintain the previous ringer volume. This may be useful when needing to
188     * show the volume toast without actually modifying the volume.
189     *
190     * @see #adjustVolume(int, int)
191     * @see #adjustStreamVolume(int, int, int)
192     */
193    public static final int ADJUST_SAME = 0;
194
195    // Flags should be powers of 2!
196
197    /**
198     * Show a toast containing the current volume.
199     *
200     * @see #adjustStreamVolume(int, int, int)
201     * @see #adjustVolume(int, int)
202     * @see #setStreamVolume(int, int, int)
203     * @see #setRingerMode(int)
204     */
205    public static final int FLAG_SHOW_UI = 1 << 0;
206
207    /**
208     * Whether to include ringer modes as possible options when changing volume.
209     * For example, if true and volume level is 0 and the volume is adjusted
210     * with {@link #ADJUST_LOWER}, then the ringer mode may switch the silent or
211     * vibrate mode.
212     * <p>
213     * By default this is on for the ring stream. If this flag is included,
214     * this behavior will be present regardless of the stream type being
215     * affected by the ringer mode.
216     *
217     * @see #adjustVolume(int, int)
218     * @see #adjustStreamVolume(int, int, int)
219     */
220    public static final int FLAG_ALLOW_RINGER_MODES = 1 << 1;
221
222    /**
223     * Whether to play a sound when changing the volume.
224     * <p>
225     * If this is given to {@link #adjustVolume(int, int)} or
226     * {@link #adjustSuggestedStreamVolume(int, int, int)}, it may be ignored
227     * in some cases (for example, the decided stream type is not
228     * {@link AudioManager#STREAM_RING}, or the volume is being adjusted
229     * downward).
230     *
231     * @see #adjustStreamVolume(int, int, int)
232     * @see #adjustVolume(int, int)
233     * @see #setStreamVolume(int, int, int)
234     */
235    public static final int FLAG_PLAY_SOUND = 1 << 2;
236
237    /**
238     * Removes any sounds/vibrate that may be in the queue, or are playing (related to
239     * changing volume).
240     */
241    public static final int FLAG_REMOVE_SOUND_AND_VIBRATE = 1 << 3;
242
243    /**
244     * Whether to vibrate if going into the vibrate ringer mode.
245     */
246    public static final int FLAG_VIBRATE = 1 << 4;
247
248    /**
249     * Ringer mode that will be silent and will not vibrate. (This overrides the
250     * vibrate setting.)
251     *
252     * @see #setRingerMode(int)
253     * @see #getRingerMode()
254     */
255    public static final int RINGER_MODE_SILENT = 0;
256
257    /**
258     * Ringer mode that will be silent and will vibrate. (This will cause the
259     * phone ringer to always vibrate, but the notification vibrate to only
260     * vibrate if set.)
261     *
262     * @see #setRingerMode(int)
263     * @see #getRingerMode()
264     */
265    public static final int RINGER_MODE_VIBRATE = 1;
266
267    /**
268     * Ringer mode that may be audible and may vibrate. It will be audible if
269     * the volume before changing out of this mode was audible. It will vibrate
270     * if the vibrate setting is on.
271     *
272     * @see #setRingerMode(int)
273     * @see #getRingerMode()
274     */
275    public static final int RINGER_MODE_NORMAL = 2;
276
277    /**
278     * Vibrate type that corresponds to the ringer.
279     *
280     * @see #setVibrateSetting(int, int)
281     * @see #getVibrateSetting(int)
282     * @see #shouldVibrate(int)
283     */
284    public static final int VIBRATE_TYPE_RINGER = 0;
285
286    /**
287     * Vibrate type that corresponds to notifications.
288     *
289     * @see #setVibrateSetting(int, int)
290     * @see #getVibrateSetting(int)
291     * @see #shouldVibrate(int)
292     */
293    public static final int VIBRATE_TYPE_NOTIFICATION = 1;
294
295    /**
296     * Vibrate setting that suggests to never vibrate.
297     *
298     * @see #setVibrateSetting(int, int)
299     * @see #getVibrateSetting(int)
300     */
301    public static final int VIBRATE_SETTING_OFF = 0;
302
303    /**
304     * Vibrate setting that suggests to vibrate when possible.
305     *
306     * @see #setVibrateSetting(int, int)
307     * @see #getVibrateSetting(int)
308     */
309    public static final int VIBRATE_SETTING_ON = 1;
310
311    /**
312     * Vibrate setting that suggests to only vibrate when in the vibrate ringer
313     * mode.
314     *
315     * @see #setVibrateSetting(int, int)
316     * @see #getVibrateSetting(int)
317     */
318    public static final int VIBRATE_SETTING_ONLY_SILENT = 2;
319
320    /**
321     * Suggests using the default stream type. This may not be used in all
322     * places a stream type is needed.
323     */
324    public static final int USE_DEFAULT_STREAM_TYPE = Integer.MIN_VALUE;
325
326    private static IAudioService sService;
327
328    /**
329     * @hide
330     */
331    public AudioManager(Context context) {
332        mContext = context;
333        mHandler = new Handler(context.getMainLooper());
334    }
335
336    private static IAudioService getService()
337    {
338        if (sService != null) {
339            return sService;
340        }
341        IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
342        sService = IAudioService.Stub.asInterface(b);
343        return sService;
344    }
345
346    /**
347     * Adjusts the volume of a particular stream by one step in a direction.
348     *
349     * @param streamType The stream type to adjust. One of {@link #STREAM_VOICE_CALL},
350     * {@link #STREAM_SYSTEM}, {@link #STREAM_RING}, {@link #STREAM_MUSIC} or
351     * {@link #STREAM_ALARM}
352     * @param direction The direction to adjust the volume. One of
353     *            {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, or
354     *            {@link #ADJUST_SAME}.
355     * @param flags One or more flags.
356     * @see #adjustVolume(int, int)
357     * @see #setStreamVolume(int, int, int)
358     */
359    public void adjustStreamVolume(int streamType, int direction, int flags) {
360        IAudioService service = getService();
361        try {
362            service.adjustStreamVolume(streamType, direction, flags);
363        } catch (RemoteException e) {
364            Log.e(TAG, "Dead object in adjustStreamVolume", e);
365        }
366    }
367
368    /**
369     * Adjusts the volume of the most relevant stream. For example, if a call is
370     * active, it will have the highest priority regardless of if the in-call
371     * screen is showing. Another example, if music is playing in the background
372     * and a call is not active, the music stream will be adjusted.
373     *
374     * @param direction The direction to adjust the volume. One of
375     *            {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, or
376     *            {@link #ADJUST_SAME}.
377     * @param flags One or more flags.
378     * @see #adjustSuggestedStreamVolume(int, int, int)
379     * @see #adjustStreamVolume(int, int, int)
380     * @see #setStreamVolume(int, int, int)
381     */
382    public void adjustVolume(int direction, int flags) {
383        IAudioService service = getService();
384        try {
385            service.adjustVolume(direction, flags);
386        } catch (RemoteException e) {
387            Log.e(TAG, "Dead object in adjustVolume", e);
388        }
389    }
390
391    /**
392     * Adjusts the volume of the most relevant stream, or the given fallback
393     * stream.
394     *
395     * @param direction The direction to adjust the volume. One of
396     *            {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, or
397     *            {@link #ADJUST_SAME}.
398     * @param suggestedStreamType The stream type that will be used if there
399     *            isn't a relevant stream. {@link #USE_DEFAULT_STREAM_TYPE} is valid here.
400     * @param flags One or more flags.
401     * @see #adjustVolume(int, int)
402     * @see #adjustStreamVolume(int, int, int)
403     * @see #setStreamVolume(int, int, int)
404     */
405    public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags) {
406        IAudioService service = getService();
407        try {
408            service.adjustSuggestedStreamVolume(direction, suggestedStreamType, flags);
409        } catch (RemoteException e) {
410            Log.e(TAG, "Dead object in adjustVolume", e);
411        }
412    }
413
414    /**
415     * Returns the current ringtone mode.
416     *
417     * @return The current ringtone mode, one of {@link #RINGER_MODE_NORMAL},
418     *         {@link #RINGER_MODE_SILENT}, or {@link #RINGER_MODE_VIBRATE}.
419     * @see #setRingerMode(int)
420     */
421    public int getRingerMode() {
422        IAudioService service = getService();
423        try {
424            return service.getRingerMode();
425        } catch (RemoteException e) {
426            Log.e(TAG, "Dead object in getRingerMode", e);
427            return RINGER_MODE_NORMAL;
428        }
429    }
430
431    /**
432     * Returns the maximum volume index for a particular stream.
433     *
434     * @param streamType The stream type whose maximum volume index is returned.
435     * @return The maximum valid volume index for the stream.
436     * @see #getStreamVolume(int)
437     */
438    public int getStreamMaxVolume(int streamType) {
439        IAudioService service = getService();
440        try {
441            return service.getStreamMaxVolume(streamType);
442        } catch (RemoteException e) {
443            Log.e(TAG, "Dead object in getStreamMaxVolume", e);
444            return 0;
445        }
446    }
447
448    /**
449     * Returns the current volume index for a particular stream.
450     *
451     * @param streamType The stream type whose volume index is returned.
452     * @return The current volume index for the stream.
453     * @see #getStreamMaxVolume(int)
454     * @see #setStreamVolume(int, int, int)
455     */
456    public int getStreamVolume(int streamType) {
457        IAudioService service = getService();
458        try {
459            return service.getStreamVolume(streamType);
460        } catch (RemoteException e) {
461            Log.e(TAG, "Dead object in getStreamVolume", e);
462            return 0;
463        }
464    }
465
466    /**
467     * Sets the ringer mode.
468     * <p>
469     * Silent mode will mute the volume and will not vibrate. Vibrate mode will
470     * mute the volume and vibrate. Normal mode will be audible and may vibrate
471     * according to user settings.
472     *
473     * @param ringerMode The ringer mode, one of {@link #RINGER_MODE_NORMAL},
474     *            {@link #RINGER_MODE_SILENT}, or {@link #RINGER_MODE_VIBRATE}.
475     * @see #getRingerMode()
476     */
477    public void setRingerMode(int ringerMode) {
478        IAudioService service = getService();
479        try {
480            service.setRingerMode(ringerMode);
481        } catch (RemoteException e) {
482            Log.e(TAG, "Dead object in setRingerMode", e);
483        }
484    }
485
486    /**
487     * Sets the volume index for a particular stream.
488     *
489     * @param streamType The stream whose volume index should be set.
490     * @param index The volume index to set. See
491     *            {@link #getStreamMaxVolume(int)} for the largest valid value.
492     * @param flags One or more flags.
493     * @see #getStreamMaxVolume(int)
494     * @see #getStreamVolume(int)
495     */
496    public void setStreamVolume(int streamType, int index, int flags) {
497        IAudioService service = getService();
498        try {
499            service.setStreamVolume(streamType, index, flags);
500        } catch (RemoteException e) {
501            Log.e(TAG, "Dead object in setStreamVolume", e);
502        }
503    }
504
505    /**
506     * Solo or unsolo a particular stream. All other streams are muted.
507     * <p>
508     * The solo command is protected against client process death: if a process
509     * with an active solo request on a stream dies, all streams that were muted
510     * because of this request will be unmuted automatically.
511     * <p>
512     * The solo requests for a given stream are cumulative: the AudioManager
513     * can receive several solo requests from one or more clients and the stream
514     * will be unsoloed only when the same number of unsolo requests are received.
515     * <p>
516     * For a better user experience, applications MUST unsolo a soloed stream
517     * in onPause() and solo is again in onResume() if appropriate.
518     *
519     * @param streamType The stream to be soloed/unsoloed.
520     * @param state The required solo state: true for solo ON, false for solo OFF
521     */
522    public void setStreamSolo(int streamType, boolean state) {
523        IAudioService service = getService();
524        try {
525            service.setStreamSolo(streamType, state, mICallBack);
526        } catch (RemoteException e) {
527            Log.e(TAG, "Dead object in setStreamSolo", e);
528        }
529    }
530
531    /**
532     * Mute or unmute an audio stream.
533     * <p>
534     * The mute command is protected against client process death: if a process
535     * with an active mute request on a stream dies, this stream will be unmuted
536     * automatically.
537     * <p>
538     * The mute requests for a given stream are cumulative: the AudioManager
539     * can receive several mute requests from one or more clients and the stream
540     * will be unmuted only when the same number of unmute requests are received.
541     * <p>
542     * For a better user experience, applications MUST unmute a muted stream
543     * in onPause() and mute is again in onResume() if appropriate.
544     *
545     * @param streamType The stream to be muted/unmuted.
546     * @param state The required mute state: true for mute ON, false for mute OFF
547     */
548    public void setStreamMute(int streamType, boolean state) {
549        IAudioService service = getService();
550        try {
551            service.setStreamMute(streamType, state, mICallBack);
552        } catch (RemoteException e) {
553            Log.e(TAG, "Dead object in setStreamMute", e);
554        }
555    }
556
557    /**
558     * Returns whether a particular type should vibrate according to user
559     * settings and the current ringer mode.
560     * <p>
561     * This shouldn't be needed by most clients that use notifications to
562     * vibrate. The notification manager will not vibrate if the policy doesn't
563     * allow it, so the client should always set a vibrate pattern and let the
564     * notification manager control whether or not to actually vibrate.
565     *
566     * @param vibrateType The type of vibrate. One of
567     *            {@link #VIBRATE_TYPE_NOTIFICATION} or
568     *            {@link #VIBRATE_TYPE_RINGER}.
569     * @return Whether the type should vibrate at the instant this method is
570     *         called.
571     * @see #setVibrateSetting(int, int)
572     * @see #getVibrateSetting(int)
573     */
574    public boolean shouldVibrate(int vibrateType) {
575        IAudioService service = getService();
576        try {
577            return service.shouldVibrate(vibrateType);
578        } catch (RemoteException e) {
579            Log.e(TAG, "Dead object in shouldVibrate", e);
580            return false;
581        }
582    }
583
584    /**
585     * Returns whether the user's vibrate setting for a vibrate type.
586     * <p>
587     * This shouldn't be needed by most clients that want to vibrate, instead
588     * see {@link #shouldVibrate(int)}.
589     *
590     * @param vibrateType The type of vibrate. One of
591     *            {@link #VIBRATE_TYPE_NOTIFICATION} or
592     *            {@link #VIBRATE_TYPE_RINGER}.
593     * @return The vibrate setting, one of {@link #VIBRATE_SETTING_ON},
594     *         {@link #VIBRATE_SETTING_OFF}, or
595     *         {@link #VIBRATE_SETTING_ONLY_SILENT}.
596     * @see #setVibrateSetting(int, int)
597     * @see #shouldVibrate(int)
598     */
599    public int getVibrateSetting(int vibrateType) {
600        IAudioService service = getService();
601        try {
602            return service.getVibrateSetting(vibrateType);
603        } catch (RemoteException e) {
604            Log.e(TAG, "Dead object in getVibrateSetting", e);
605            return VIBRATE_SETTING_OFF;
606        }
607    }
608
609    /**
610     * Sets the setting for when the vibrate type should vibrate.
611     *
612     * @param vibrateType The type of vibrate. One of
613     *            {@link #VIBRATE_TYPE_NOTIFICATION} or
614     *            {@link #VIBRATE_TYPE_RINGER}.
615     * @param vibrateSetting The vibrate setting, one of
616     *            {@link #VIBRATE_SETTING_ON},
617     *            {@link #VIBRATE_SETTING_OFF}, or
618     *            {@link #VIBRATE_SETTING_ONLY_SILENT}.
619     * @see #getVibrateSetting(int)
620     * @see #shouldVibrate(int)
621     */
622    public void setVibrateSetting(int vibrateType, int vibrateSetting) {
623        IAudioService service = getService();
624        try {
625            service.setVibrateSetting(vibrateType, vibrateSetting);
626        } catch (RemoteException e) {
627            Log.e(TAG, "Dead object in setVibrateSetting", e);
628        }
629    }
630
631    /**
632     * Sets the speakerphone on or off.
633     *
634     * @param on set <var>true</var> to turn on speakerphone;
635     *           <var>false</var> to turn it off
636     */
637    public void setSpeakerphoneOn(boolean on){
638        IAudioService service = getService();
639        try {
640            service.setSpeakerphoneOn(on);
641        } catch (RemoteException e) {
642            Log.e(TAG, "Dead object in setSpeakerphoneOn", e);
643        }
644    }
645
646    /**
647     * Checks whether the speakerphone is on or off.
648     *
649     * @return true if speakerphone is on, false if it's off
650     */
651    public boolean isSpeakerphoneOn() {
652        IAudioService service = getService();
653        try {
654            return service.isSpeakerphoneOn();
655        } catch (RemoteException e) {
656            Log.e(TAG, "Dead object in isSpeakerphoneOn", e);
657            return false;
658        }
659     }
660
661    /**
662     * Request use of Bluetooth SCO headset for communications.
663     *
664     * @param on set <var>true</var> to use bluetooth SCO for communications;
665     *               <var>false</var> to not use bluetooth SCO for communications
666     */
667    public void setBluetoothScoOn(boolean on){
668        IAudioService service = getService();
669        try {
670            service.setBluetoothScoOn(on);
671        } catch (RemoteException e) {
672            Log.e(TAG, "Dead object in setBluetoothScoOn", e);
673        }
674    }
675
676    /**
677     * Checks whether communications use Bluetooth SCO.
678     *
679     * @return true if SCO is used for communications;
680     *         false if otherwise
681     */
682    public boolean isBluetoothScoOn() {
683        IAudioService service = getService();
684        try {
685            return service.isBluetoothScoOn();
686        } catch (RemoteException e) {
687            Log.e(TAG, "Dead object in isBluetoothScoOn", e);
688            return false;
689        }
690    }
691
692    /**
693     * @param on set <var>true</var> to route A2DP audio to/from Bluetooth
694     *           headset; <var>false</var> disable A2DP audio
695     * @deprecated Do not use.
696     */
697    @Deprecated public void setBluetoothA2dpOn(boolean on){
698    }
699
700    /**
701     * Checks whether A2DP audio routing to the Bluetooth headset is on or off.
702     *
703     * @return true if A2DP audio is being routed to/from Bluetooth headset;
704     *         false if otherwise
705     */
706    public boolean isBluetoothA2dpOn() {
707        if (AudioSystem.getDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,"")
708            == AudioSystem.DEVICE_STATE_UNAVAILABLE) {
709            return false;
710        } else {
711            return true;
712        }
713    }
714
715    /**
716     * Sets audio routing to the wired headset on or off.
717     *
718     * @param on set <var>true</var> to route audio to/from wired
719     *           headset; <var>false</var> disable wired headset audio
720     * @deprecated Do not use.
721     */
722    @Deprecated public void setWiredHeadsetOn(boolean on){
723    }
724
725    /**
726     * Checks whether audio routing to the wired headset is on or off.
727     *
728     * @return true if audio is being routed to/from wired headset;
729     *         false if otherwise
730     */
731    public boolean isWiredHeadsetOn() {
732        if (AudioSystem.getDeviceConnectionState(AudioSystem.DEVICE_OUT_WIRED_HEADSET,"")
733                == AudioSystem.DEVICE_STATE_UNAVAILABLE) {
734            return false;
735        } else {
736            return true;
737        }
738    }
739
740    /**
741     * Sets the microphone mute on or off.
742     *
743     * @param on set <var>true</var> to mute the microphone;
744     *           <var>false</var> to turn mute off
745     */
746    public void setMicrophoneMute(boolean on){
747        AudioSystem.muteMicrophone(on);
748    }
749
750    /**
751     * Checks whether the microphone mute is on or off.
752     *
753     * @return true if microphone is muted, false if it's not
754     */
755    public boolean isMicrophoneMute() {
756        return AudioSystem.isMicrophoneMuted();
757    }
758
759    /**
760     * Sets the audio mode.
761     *
762     * @param mode  the requested audio mode (NORMAL, RINGTONE, or IN_CALL).
763     *              Informs the HAL about the current audio state so that
764     *              it can route the audio appropriately.
765     */
766    public void setMode(int mode) {
767        IAudioService service = getService();
768        try {
769            service.setMode(mode);
770        } catch (RemoteException e) {
771            Log.e(TAG, "Dead object in setMode", e);
772        }
773    }
774
775    /**
776     * Returns the current audio mode.
777     *
778     * @return      the current audio mode (NORMAL, RINGTONE, or IN_CALL).
779     *              Returns the current current audio state from the HAL.
780     */
781    public int getMode() {
782        IAudioService service = getService();
783        try {
784            return service.getMode();
785        } catch (RemoteException e) {
786            Log.e(TAG, "Dead object in getMode", e);
787            return MODE_INVALID;
788        }
789    }
790
791    /* modes for setMode/getMode/setRoute/getRoute */
792    /**
793     * Audio harware modes.
794     */
795    /**
796     * Invalid audio mode.
797     */
798    public static final int MODE_INVALID            = AudioSystem.MODE_INVALID;
799    /**
800     * Current audio mode. Used to apply audio routing to current mode.
801     */
802    public static final int MODE_CURRENT            = AudioSystem.MODE_CURRENT;
803    /**
804     * Normal audio mode: not ringing and no call established.
805     */
806    public static final int MODE_NORMAL             = AudioSystem.MODE_NORMAL;
807    /**
808     * Ringing audio mode. An incoming is being signaled.
809     */
810    public static final int MODE_RINGTONE           = AudioSystem.MODE_RINGTONE;
811    /**
812     * In call audio mode. A call is established.
813     */
814    public static final int MODE_IN_CALL            = AudioSystem.MODE_IN_CALL;
815
816    /* Routing bits for setRouting/getRouting API */
817    /**
818     * Routing audio output to earpiece
819     * @deprecated
820     */
821    @Deprecated public static final int ROUTE_EARPIECE          = AudioSystem.ROUTE_EARPIECE;
822    /**
823     * Routing audio output to spaker
824     * @deprecated
825     */
826    @Deprecated public static final int ROUTE_SPEAKER           = AudioSystem.ROUTE_SPEAKER;
827    /**
828     * @deprecated use {@link #ROUTE_BLUETOOTH_SCO}
829     * @deprecated
830     */
831    @Deprecated public static final int ROUTE_BLUETOOTH = AudioSystem.ROUTE_BLUETOOTH_SCO;
832    /**
833     * Routing audio output to bluetooth SCO
834     * @deprecated
835     */
836    @Deprecated public static final int ROUTE_BLUETOOTH_SCO     = AudioSystem.ROUTE_BLUETOOTH_SCO;
837    /**
838     * Routing audio output to headset
839     * @deprecated
840     */
841    @Deprecated public static final int ROUTE_HEADSET           = AudioSystem.ROUTE_HEADSET;
842    /**
843     * Routing audio output to bluetooth A2DP
844     * @deprecated
845     */
846    @Deprecated public static final int ROUTE_BLUETOOTH_A2DP    = AudioSystem.ROUTE_BLUETOOTH_A2DP;
847    /**
848     * Used for mask parameter of {@link #setRouting(int,int,int)}.
849     * @deprecated
850     */
851    @Deprecated public static final int ROUTE_ALL               = AudioSystem.ROUTE_ALL;
852
853    /**
854     * Sets the audio routing for a specified mode
855     *
856     * @param mode   audio mode to change route. E.g., MODE_RINGTONE.
857     * @param routes bit vector of routes requested, created from one or
858     *               more of ROUTE_xxx types. Set bits indicate that route should be on
859     * @param mask   bit vector of routes to change, created from one or more of
860     * ROUTE_xxx types. Unset bits indicate the route should be left unchanged
861     *
862     * @deprecated   Do not set audio routing directly, use setSpeakerphoneOn(),
863     * setBluetoothScoOn() methods instead.
864     */
865    @Deprecated
866    public void setRouting(int mode, int routes, int mask) {
867    }
868
869    /**
870     * Returns the current audio routing bit vector for a specified mode.
871     *
872     * @param mode audio mode to get route (e.g., MODE_RINGTONE)
873     * @return an audio route bit vector that can be compared with ROUTE_xxx
874     * bits
875     * @deprecated   Do not query audio routing directly, use isSpeakerphoneOn(),
876     * isBluetoothScoOn(), isBluetoothA2dpOn() and isWiredHeadsetOn() methods instead.
877     */
878    @Deprecated
879    public int getRouting(int mode) {
880        return -1;
881    }
882
883    /**
884     * Checks whether any music is active.
885     *
886     * @return true if any music tracks are active.
887     */
888    public boolean isMusicActive() {
889        return AudioSystem.isMusicActive();
890    }
891
892    /*
893     * Sets a generic audio configuration parameter. The use of these parameters
894     * are platform dependant, see libaudio
895     *
896     * ** Temporary interface - DO NOT USE
897     *
898     * TODO: Replace with a more generic key:value get/set mechanism
899     *
900     * param key   name of parameter to set. Must not be null.
901     * param value value of parameter. Must not be null.
902     */
903    /**
904     * @hide
905     * @deprecated Use {@link #setPrameters(String)} instead
906     */
907    @Deprecated public void setParameter(String key, String value) {
908        setParameters(key+"="+value);
909    }
910
911    /**
912     * Sets a variable number of parameter values to audio hardware.
913     *
914     * @param keyValuePairs list of parameters key value pairs in the form:
915     *    key1=value1;key2=value2;...
916     *
917     */
918    public void setParameters(String keyValuePairs) {
919        AudioSystem.setParameters(keyValuePairs);
920    }
921
922    /**
923     * Sets a varaible number of parameter values to audio hardware.
924     *
925     * @param keys list of parameters
926     * @return list of parameters key value pairs in the form:
927     *    key1=value1;key2=value2;...
928     */
929    public String getParameters(String keys) {
930        return AudioSystem.getParameters(keys);
931    }
932
933    /* Sound effect identifiers */
934    /**
935     * Keyboard and direction pad click sound
936     * @see #playSoundEffect(int)
937     */
938    public static final int FX_KEY_CLICK = 0;
939    /**
940     * Focus has moved up
941     * @see #playSoundEffect(int)
942     */
943    public static final int FX_FOCUS_NAVIGATION_UP = 1;
944    /**
945     * Focus has moved down
946     * @see #playSoundEffect(int)
947     */
948    public static final int FX_FOCUS_NAVIGATION_DOWN = 2;
949    /**
950     * Focus has moved left
951     * @see #playSoundEffect(int)
952     */
953    public static final int FX_FOCUS_NAVIGATION_LEFT = 3;
954    /**
955     * Focus has moved right
956     * @see #playSoundEffect(int)
957     */
958    public static final int FX_FOCUS_NAVIGATION_RIGHT = 4;
959    /**
960     * IME standard keypress sound
961     * @see #playSoundEffect(int)
962     */
963    public static final int FX_KEYPRESS_STANDARD = 5;
964    /**
965     * IME spacebar keypress sound
966     * @see #playSoundEffect(int)
967     */
968    public static final int FX_KEYPRESS_SPACEBAR = 6;
969    /**
970     * IME delete keypress sound
971     * @see #playSoundEffect(int)
972     */
973    public static final int FX_KEYPRESS_DELETE = 7;
974    /**
975     * IME return_keypress sound
976     * @see #playSoundEffect(int)
977     */
978    public static final int FX_KEYPRESS_RETURN = 8;
979    /**
980     * @hide Number of sound effects
981     */
982    public static final int NUM_SOUND_EFFECTS = 9;
983
984    /**
985     * Plays a sound effect (Key clicks, lid open/close...)
986     * @param effectType The type of sound effect. One of
987     *            {@link #FX_KEY_CLICK},
988     *            {@link #FX_FOCUS_NAVIGATION_UP},
989     *            {@link #FX_FOCUS_NAVIGATION_DOWN},
990     *            {@link #FX_FOCUS_NAVIGATION_LEFT},
991     *            {@link #FX_FOCUS_NAVIGATION_RIGHT},
992     *            {@link #FX_KEYPRESS_STANDARD},
993     *            {@link #FX_KEYPRESS_SPACEBAR},
994     *            {@link #FX_KEYPRESS_DELETE},
995     *            {@link #FX_KEYPRESS_RETURN},
996     * NOTE: This version uses the UI settings to determine
997     * whether sounds are heard or not.
998     */
999    public void  playSoundEffect(int effectType) {
1000        if (effectType < 0 || effectType >= NUM_SOUND_EFFECTS) {
1001            return;
1002        }
1003
1004        if (!querySoundEffectsEnabled()) {
1005            return;
1006        }
1007
1008        IAudioService service = getService();
1009        try {
1010            service.playSoundEffect(effectType);
1011        } catch (RemoteException e) {
1012            Log.e(TAG, "Dead object in playSoundEffect"+e);
1013        }
1014    }
1015
1016    /**
1017     * Plays a sound effect (Key clicks, lid open/close...)
1018     * @param effectType The type of sound effect. One of
1019     *            {@link #FX_KEY_CLICK},
1020     *            {@link #FX_FOCUS_NAVIGATION_UP},
1021     *            {@link #FX_FOCUS_NAVIGATION_DOWN},
1022     *            {@link #FX_FOCUS_NAVIGATION_LEFT},
1023     *            {@link #FX_FOCUS_NAVIGATION_RIGHT},
1024     *            {@link #FX_KEYPRESS_STANDARD},
1025     *            {@link #FX_KEYPRESS_SPACEBAR},
1026     *            {@link #FX_KEYPRESS_DELETE},
1027     *            {@link #FX_KEYPRESS_RETURN},
1028     * @param volume Sound effect volume
1029     * NOTE: This version is for applications that have their own
1030     * settings panel for enabling and controlling volume.
1031     */
1032    public void  playSoundEffect(int effectType, float volume) {
1033        if (effectType < 0 || effectType >= NUM_SOUND_EFFECTS) {
1034            return;
1035        }
1036
1037        IAudioService service = getService();
1038        try {
1039            service.playSoundEffectVolume(effectType, volume);
1040        } catch (RemoteException e) {
1041            Log.e(TAG, "Dead object in playSoundEffect"+e);
1042        }
1043    }
1044
1045    /**
1046     * Settings has an in memory cache, so this is fast.
1047     */
1048    private boolean querySoundEffectsEnabled() {
1049        return Settings.System.getInt(mContext.getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED, 0) != 0;
1050    }
1051
1052
1053    /**
1054     *  Load Sound effects.
1055     *  This method must be called when sound effects are enabled.
1056     */
1057    public void loadSoundEffects() {
1058        IAudioService service = getService();
1059        try {
1060            service.loadSoundEffects();
1061        } catch (RemoteException e) {
1062            Log.e(TAG, "Dead object in loadSoundEffects"+e);
1063        }
1064    }
1065
1066    /**
1067     *  Unload Sound effects.
1068     *  This method can be called to free some memory when
1069     *  sound effects are disabled.
1070     */
1071    public void unloadSoundEffects() {
1072        IAudioService service = getService();
1073        try {
1074            service.unloadSoundEffects();
1075        } catch (RemoteException e) {
1076            Log.e(TAG, "Dead object in unloadSoundEffects"+e);
1077        }
1078    }
1079
1080    /**
1081     *  @hide
1082     *  Reload audio settings. This method is called by Settings backup
1083     *  agent when audio settings are restored and causes the AudioService
1084     *  to read and apply restored settings.
1085     */
1086    public void reloadAudioSettings() {
1087        IAudioService service = getService();
1088        try {
1089            service.reloadAudioSettings();
1090        } catch (RemoteException e) {
1091            Log.e(TAG, "Dead object in reloadAudioSettings"+e);
1092        }
1093    }
1094
1095     /**
1096      * {@hide}
1097      */
1098     private IBinder mICallBack = new Binder();
1099}
1100