Skip to content

Commit 427db9b

Browse files
Mike LockwoodAndroid (Google) Code Review
authored andcommitted
Merge "UsbService: Add support for accessory initiating USB audio support" into jb-dev
2 parents 83a708e + 166b05e commit 427db9b

File tree

4 files changed

+73
-19
lines changed

4 files changed

+73
-19
lines changed

core/java/android/hardware/usb/UsbAccessory.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,19 @@ public class UsbAccessory implements Parcelable {
5555
private final String mUri;
5656
private final String mSerial;
5757

58+
/** @hide */
59+
public static final int MANUFACTURER_STRING = 0;
60+
/** @hide */
61+
public static final int MODEL_STRING = 1;
62+
/** @hide */
63+
public static final int DESCRIPTION_STRING = 2;
64+
/** @hide */
65+
public static final int VERSION_STRING = 3;
66+
/** @hide */
67+
public static final int URI_STRING = 4;
68+
/** @hide */
69+
public static final int SERIAL_STRING = 5;
70+
5871
/**
5972
* UsbAccessory should only be instantiated by UsbService implementation
6073
* @hide
@@ -74,12 +87,12 @@ public UsbAccessory(String manufacturer, String model, String description,
7487
* @hide
7588
*/
7689
public UsbAccessory(String[] strings) {
77-
mManufacturer = strings[0];
78-
mModel = strings[1];
79-
mDescription = strings[2];
80-
mVersion = strings[3];
81-
mUri = strings[4];
82-
mSerial = strings[5];
90+
mManufacturer = strings[MANUFACTURER_STRING];
91+
mModel = strings[MODEL_STRING];
92+
mDescription = strings[DESCRIPTION_STRING];
93+
mVersion = strings[VERSION_STRING];
94+
mUri = strings[URI_STRING];
95+
mSerial = strings[SERIAL_STRING];
8396
}
8497

8598
/**

services/java/com/android/server/usb/UsbDeviceManager.java

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,13 @@ public class UsbDeviceManager {
8787

8888
private static final int MSG_UPDATE_STATE = 0;
8989
private static final int MSG_ENABLE_ADB = 1;
90-
private static final int MSG_SET_CURRENT_FUNCTION = 2;
90+
private static final int MSG_SET_CURRENT_FUNCTIONS = 2;
9191
private static final int MSG_SYSTEM_READY = 3;
9292
private static final int MSG_BOOT_COMPLETED = 4;
9393

94+
private static final int AUDIO_MODE_NONE = 0;
95+
private static final int AUDIO_MODE_SOURCE = 1;
96+
9497
// Delay for debouncing USB disconnects.
9598
// We often get rapid connect/disconnect events when enabling USB functions,
9699
// which need debouncing.
@@ -110,6 +113,7 @@ public class UsbDeviceManager {
110113
private boolean mAdbEnabled;
111114
private boolean mAudioSourceEnabled;
112115
private Map<String, List<Pair<String, String>>> mOemModeMap;
116+
private String[] mAccessoryStrings;
113117

114118
private class AdbSettingsObserver extends ContentObserver {
115119
public AdbSettingsObserver() {
@@ -137,7 +141,7 @@ public void onUEvent(UEventObserver.UEvent event) {
137141
mHandler.updateState(state);
138142
} else if ("START".equals(accessory)) {
139143
if (DEBUG) Slog.d(TAG, "got accessory start");
140-
setCurrentFunction(UsbManager.USB_FUNCTION_ACCESSORY, false);
144+
startAccessoryMode();
141145
}
142146
}
143147
};
@@ -160,7 +164,7 @@ public UsbDeviceManager(Context context, UsbSettingsManager settingsManager) {
160164

161165
if (nativeIsStartRequested()) {
162166
if (DEBUG) Slog.d(TAG, "accessory attached at boot");
163-
setCurrentFunction(UsbManager.USB_FUNCTION_ACCESSORY, false);
167+
startAccessoryMode();
164168
}
165169
}
166170

@@ -187,6 +191,29 @@ public void systemReady() {
187191
mHandler.sendEmptyMessage(MSG_SYSTEM_READY);
188192
}
189193

194+
private void startAccessoryMode() {
195+
mAccessoryStrings = nativeGetAccessoryStrings();
196+
boolean enableAudio = (nativeGetAudioMode() == AUDIO_MODE_SOURCE);
197+
// don't start accessory mode if our mandatory strings have not been set
198+
boolean enableAccessory = (mAccessoryStrings != null &&
199+
mAccessoryStrings[UsbAccessory.MANUFACTURER_STRING] != null &&
200+
mAccessoryStrings[UsbAccessory.MODEL_STRING] != null);
201+
String functions = null;
202+
203+
if (enableAccessory && enableAudio) {
204+
functions = UsbManager.USB_FUNCTION_ACCESSORY + ","
205+
+ UsbManager.USB_FUNCTION_AUDIO_SOURCE;
206+
} else if (enableAccessory) {
207+
functions = UsbManager.USB_FUNCTION_ACCESSORY;
208+
} else if (enableAudio) {
209+
functions = UsbManager.USB_FUNCTION_AUDIO_SOURCE;
210+
}
211+
212+
if (functions != null) {
213+
setCurrentFunctions(functions, false);
214+
}
215+
}
216+
190217
private static void initRndisAddress() {
191218
// configure RNDIS ethernet address based on our serial number using the same algorithm
192219
// we had been previously using in kernel board files
@@ -467,9 +494,8 @@ private void updateCurrentAccessory() {
467494
if (!mHasUsbAccessory) return;
468495

469496
if (mConfigured) {
470-
String[] strings = nativeGetAccessoryStrings();
471-
if (strings != null) {
472-
mCurrentAccessory = new UsbAccessory(strings);
497+
if (mAccessoryStrings != null) {
498+
mCurrentAccessory = new UsbAccessory(mAccessoryStrings);
473499
Slog.d(TAG, "entering USB accessory mode: " + mCurrentAccessory);
474500
// defer accessoryAttached if system is not ready
475501
if (mBootCompleted) {
@@ -489,6 +515,7 @@ private void updateCurrentAccessory() {
489515
mSettingsManager.accessoryDetached(mCurrentAccessory);
490516
}
491517
mCurrentAccessory = null;
518+
mAccessoryStrings = null;
492519
}
493520
}
494521
}
@@ -561,10 +588,10 @@ public void handleMessage(Message msg) {
561588
case MSG_ENABLE_ADB:
562589
setAdbEnabled(msg.arg1 == 1);
563590
break;
564-
case MSG_SET_CURRENT_FUNCTION:
565-
String function = (String)msg.obj;
591+
case MSG_SET_CURRENT_FUNCTIONS:
592+
String functions = (String)msg.obj;
566593
boolean makeDefault = (msg.arg1 == 1);
567-
setEnabledFunctions(function, makeDefault);
594+
setEnabledFunctions(functions, makeDefault);
568595
break;
569596
case MSG_SYSTEM_READY:
570597
updateUsbNotification();
@@ -717,9 +744,9 @@ public ParcelFileDescriptor openAccessory(UsbAccessory accessory) {
717744
return nativeOpenAccessory();
718745
}
719746

720-
public void setCurrentFunction(String function, boolean makeDefault) {
721-
if (DEBUG) Slog.d(TAG, "setCurrentFunction(" + function + ") default: " + makeDefault);
722-
mHandler.sendMessage(MSG_SET_CURRENT_FUNCTION, function, makeDefault);
747+
public void setCurrentFunctions(String functions, boolean makeDefault) {
748+
if (DEBUG) Slog.d(TAG, "setCurrentFunctions(" + functions + ") default: " + makeDefault);
749+
mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions, makeDefault);
723750
}
724751

725752
public void setMassStorageBackingFile(String path) {
@@ -787,4 +814,5 @@ public void dump(FileDescriptor fd, PrintWriter pw) {
787814
private native String[] nativeGetAccessoryStrings();
788815
private native ParcelFileDescriptor nativeOpenAccessory();
789816
private native boolean nativeIsStartRequested();
817+
private native int nativeGetAudioMode();
790818
}

services/java/com/android/server/usb/UsbService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ public void clearDefaults(String packageName) {
149149
public void setCurrentFunction(String function, boolean makeDefault) {
150150
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);
151151
if (mDeviceManager != null) {
152-
mDeviceManager.setCurrentFunction(function, makeDefault);
152+
mDeviceManager.setCurrentFunctions(function, makeDefault);
153153
} else {
154154
throw new IllegalStateException("USB device mode not supported");
155155
}

services/jni/com_android_server_UsbDeviceManager.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,17 @@ static jboolean android_server_UsbDeviceManager_isStartRequested(JNIEnv *env, jo
111111
return (result == 1);
112112
}
113113

114+
static jint android_server_UsbDeviceManager_getAudioMode(JNIEnv *env, jobject thiz)
115+
{
116+
int fd = open(DRIVER_NAME, O_RDWR);
117+
if (fd < 0) {
118+
ALOGE("could not open %s", DRIVER_NAME);
119+
return false;
120+
}
121+
int result = ioctl(fd, ACCESSORY_GET_AUDIO_MODE);
122+
close(fd);
123+
return result;
124+
}
114125

115126
static JNINativeMethod method_table[] = {
116127
{ "nativeGetAccessoryStrings", "()[Ljava/lang/String;",
@@ -119,6 +130,8 @@ static JNINativeMethod method_table[] = {
119130
(void*)android_server_UsbDeviceManager_openAccessory },
120131
{ "nativeIsStartRequested", "()Z",
121132
(void*)android_server_UsbDeviceManager_isStartRequested },
133+
{ "nativeGetAudioMode", "()I",
134+
(void*)android_server_UsbDeviceManager_getAudioMode },
122135
};
123136

124137
int register_android_server_UsbDeviceManager(JNIEnv *env)

0 commit comments

Comments
 (0)