6060import java .util .List ;
6161import java .util .HashMap ;
6262import java .util .Map ;
63+ import java .util .Scanner ;
6364
6465/**
6566 * UsbDeviceManager manages USB state in device mode.
@@ -81,6 +82,8 @@ public class UsbDeviceManager {
8182 "/sys/class/android_usb/android0/f_mass_storage/lun/file" ;
8283 private static final String RNDIS_ETH_ADDR_PATH =
8384 "/sys/class/android_usb/android0/f_rndis/ethaddr" ;
85+ private static final String AUDIO_SOURCE_PCM_PATH =
86+ "/sys/class/android_usb/android0/f_audio_source/pcm" ;
8487
8588 private static final int MSG_UPDATE_STATE = 0 ;
8689 private static final int MSG_ENABLE_ADB = 1 ;
@@ -105,6 +108,7 @@ public class UsbDeviceManager {
105108 private final boolean mHasUsbAccessory ;
106109 private boolean mUseUsbNotification ;
107110 private boolean mAdbEnabled ;
111+ private boolean mAudioSourceEnabled ;
108112 private Map <String , List <Pair <String , String >>> mOemModeMap ;
109113
110114 private class AdbSettingsObserver extends ContentObserver {
@@ -291,6 +295,8 @@ public UsbHandler(Looper looper) {
291295 String state = FileUtils .readTextFile (new File (STATE_PATH ), 0 , null ).trim ();
292296 updateState (state );
293297 mAdbEnabled = containsFunction (mCurrentFunctions , UsbManager .USB_FUNCTION_ADB );
298+ mAudioSourceEnabled = containsFunction (mCurrentFunctions ,
299+ UsbManager .USB_FUNCTION_AUDIO_SOURCE );
294300
295301 // Upgrade step for previous versions that used persist.service.adb.enable
296302 String value = SystemProperties .get ("persist.service.adb.enable" , "" );
@@ -504,6 +510,28 @@ private void updateUsbState() {
504510 mContext .sendStickyBroadcast (intent );
505511 }
506512
513+ private void updateAudioSourceFunction (boolean enabled ) {
514+ // send a sticky broadcast containing current USB state
515+ Intent intent = new Intent (Intent .ACTION_USB_AUDIO_ACCESSORY_PLUG );
516+ intent .addFlags (Intent .FLAG_RECEIVER_REPLACE_PENDING );
517+ intent .addFlags (Intent .FLAG_RECEIVER_REGISTERED_ONLY );
518+ intent .putExtra ("state" , (enabled ? 1 : 0 ));
519+ if (enabled ) {
520+ try {
521+ Scanner scanner = new Scanner (new File (AUDIO_SOURCE_PCM_PATH ));
522+ int card = scanner .nextInt ();
523+ int device = scanner .nextInt ();
524+ intent .putExtra ("card" , card );
525+ intent .putExtra ("device" , device );
526+ } catch (FileNotFoundException e ) {
527+ Slog .e (TAG , "could not open audio source PCM file" , e );
528+ }
529+ }
530+
531+ mContext .sendStickyBroadcast (intent );
532+ mAudioSourceEnabled = enabled ;
533+ }
534+
507535 @ Override
508536 public void handleMessage (Message msg ) {
509537 switch (msg .what ) {
@@ -523,6 +551,11 @@ public void handleMessage(Message msg) {
523551 }
524552 if (mBootCompleted ) {
525553 updateUsbState ();
554+ boolean audioSourceEnabled = containsFunction (mCurrentFunctions ,
555+ UsbManager .USB_FUNCTION_AUDIO_SOURCE );
556+ if (audioSourceEnabled != mAudioSourceEnabled ) {
557+ updateAudioSourceFunction (audioSourceEnabled );
558+ }
526559 }
527560 break ;
528561 case MSG_ENABLE_ADB :
@@ -543,6 +576,7 @@ public void handleMessage(Message msg) {
543576 if (mCurrentAccessory != null ) {
544577 mSettingsManager .accessoryAttached (mCurrentAccessory );
545578 }
579+ updateAudioSourceFunction (mAudioSourceEnabled );
546580 break ;
547581 }
548582 }
0 commit comments