BluetoothA2dp.java revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.bluetooth; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant.SdkConstantType; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.server.BluetoothA2dpService; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Public API for controlling the Bluetooth A2DP Profile Service. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * BluetoothA2dp is a proxy object for controlling the Bluetooth A2DP 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Service via IPC. 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creating a BluetoothA2dp object will initiate a binding with the 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * BluetoothHeadset service. Users of this object should call close() when they 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are finished, so that this proxy object can unbind from the service. 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Currently the BluetoothA2dp service runs in the system server and this 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * proxy object will be immediately bound to the service on construction. 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * However this may change in future releases, and error codes such as 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * BluetoothError.ERROR_IPC_NOT_READY will be returned from this API when the 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * proxy object is not yet attached. 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Currently this class provides methods to connect to A2DP audio sinks. 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class BluetoothA2dp { 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "BluetoothA2dp"; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** int extra for SINK_STATE_CHANGED_ACTION */ 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SINK_STATE = 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.bluetooth.a2dp.intent.SINK_STATE"; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** int extra for SINK_STATE_CHANGED_ACTION */ 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SINK_PREVIOUS_STATE = 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.bluetooth.a2dp.intent.SINK_PREVIOUS_STATE"; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Indicates the state of an A2DP audio sink has changed. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This intent will always contain SINK_STATE, SINK_PREVIOUS_STATE and 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * BluetoothIntent.ADDRESS extras. 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SINK_STATE_CHANGED_ACTION = 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.bluetooth.a2dp.intent.action.SINK_STATE_CHANGED"; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATE_DISCONNECTED = 0; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATE_CONNECTING = 1; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATE_CONNECTED = 2; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATE_DISCONNECTING = 3; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Playing implies connected */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATE_PLAYING = 4; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Default priority for a2dp devices that should allow incoming 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connections */ 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PRIORITY_AUTO = 100; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Default priority for a2dp devices that should not allow incoming 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connections */ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PRIORITY_OFF = 0; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final IBluetoothA2dp mService; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a BluetoothA2dp proxy object for interacting with the local 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Bluetooth A2DP service. 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c Context 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BluetoothA2dp(Context c) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = c; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = ServiceManager.getService(BluetoothA2dpService.BLUETOOTH_A2DP_SERVICE); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (b == null) { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Bluetooth A2DP service not available!"); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = IBluetoothA2dp.Stub.asInterface(b); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Initiate a connection to an A2DP sink. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Listen for SINK_STATE_CHANGED_ACTION to find out when the 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connection is completed. 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param address Remote BT address. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Result code, negative indicates an immediate error. 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int connectSink(String address) { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.connectSink(address); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "", e); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BluetoothError.ERROR_IPC; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Initiate disconnect from an A2DP sink. 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Listen for SINK_STATE_CHANGED_ACTION to find out when 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disconnect is completed. 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param address Remote BT address. 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Result code, negative indicates an immediate error. 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int disconnectSink(String address) { 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.disconnectSink(address); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "", e); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BluetoothError.ERROR_IPC; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Check if a specified A2DP sink is connected. 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param address Remote BT address. 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if connected (or playing), false otherwise and on error. 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isSinkConnected(String address) { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int state = getSinkState(address); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return state == STATE_CONNECTED || state == STATE_PLAYING; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Check if any A2DP sink is connected. 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a List of connected A2DP sinks, or null on error. 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<String> listConnectedSinks() { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.listConnectedSinks(); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "", e); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Get the state of an A2DP sink 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param address Remote BT address. 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return State code, or negative on error 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSinkState(String address) { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getSinkState(address); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "", e); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BluetoothError.ERROR_IPC; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set priority of a2dp sink. 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Priority is a non-negative integer. By default paired sinks will have 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a priority of PRIORITY_AUTO, and unpaired headset PRIORITY_NONE (0). 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sinks with priority greater than zero will accept incoming connections 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (if no sink is currently connected). 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Priority for unpaired sink must be PRIORITY_NONE. 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param address Paired sink 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param priority Integer priority, for example PRIORITY_AUTO or 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PRIORITY_NONE 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Result code, negative indicates an error 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int setSinkPriority(String address, int priority) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.setSinkPriority(address, priority); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "", e); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BluetoothError.ERROR_IPC; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get priority of a2dp sink. 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param address Sink 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return non-negative priority, or negative error code on error. 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSinkPriority(String address) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getSinkPriority(address); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "", e); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BluetoothError.ERROR_IPC; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Check class bits for possible A2DP Sink support. 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a simple heuristic that tries to guess if a device with the 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given class bits might be a A2DP Sink. It is not accurate for all 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * devices. It tries to err on the side of false positives. 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if this device might be a A2DP sink 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static boolean doesClassMatchSink(int btClass) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (BluetoothClass.Service.hasService(btClass, BluetoothClass.Service.RENDER)) { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // By the A2DP spec, sinks must indicate the RENDER service. 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // However we found some that do not (Chordette). So lets also 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // match on some other class bits. 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (BluetoothClass.Device.getDevice(btClass)) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BluetoothClass.Device.AUDIO_VIDEO_HIFI_AUDIO: 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES: 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BluetoothClass.Device.AUDIO_VIDEO_LOUDSPEAKER: 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BluetoothClass.Device.AUDIO_VIDEO_CAR_AUDIO: 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Helper for converting a state to a string. 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For debug use only - strings are not internationalized. 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static String stateToString(int state) { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (state) { 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATE_DISCONNECTED: 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "disconnected"; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATE_CONNECTING: 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "connecting"; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATE_CONNECTED: 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "connected"; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATE_DISCONNECTING: 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "disconnecting"; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATE_PLAYING: 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "playing"; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "<unknown state " + state + ">"; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 248