Skip to content

Commit 1ac5d4f

Browse files
Revathi Uddarajuluk1337
authored andcommitted
WiredAccessoryManager: Add support for DisplayPort Audio
Add and handle uevents for DisplayPort to route the audio data to DisplayPort interface. CRs-fixed: 2088965 Change-Id: I34747de57183dfad50cce6c1809c06267936e95a
1 parent 96e5fca commit 1ac5d4f

File tree

1 file changed

+149
-7
lines changed

1 file changed

+149
-7
lines changed

services/core/java/com/android/server/WiredAccessoryManager.java

Lines changed: 149 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ final class WiredAccessoryManager implements WiredAccessoryCallbacks {
7070
private static final String NAME_H2W = "h2w";
7171
private static final String NAME_USB_AUDIO = "usb_audio";
7272
private static final String NAME_HDMI_AUDIO = "hdmi_audio";
73+
private static final String NAME_DP_AUDIO = "soc:qcom,msm-ext-disp";
7374
private static final String NAME_HDMI = "hdmi";
7475

7576
private static final int MSG_NEW_DEVICE_STATE = 1;
@@ -416,22 +417,86 @@ private List<UEventInfo> makeObservedUEventList() {
416417
}
417418
}
418419

420+
// Monitor DisplayPort
421+
uei = new UEventInfo(NAME_DP_AUDIO, BIT_HDMI_AUDIO, 0, 0);
422+
if (uei.checkSwitchExists()) {
423+
retVal.add(uei);
424+
} else {
425+
Slog.w(TAG, "This kernel does not have DP audio support");
426+
}
427+
419428
return retVal;
420429
}
421430

422431
@Override
423432
public void onUEvent(UEventObserver.UEvent event) {
424-
if (LOG) Slog.v(TAG, "Headset UEVENT: " + event.toString());
433+
String devPath = event.get("DEVPATH");
434+
String name = event.get("NAME");
435+
int state = 0;
436+
437+
if (name == null) {
438+
name = event.get("SWITCH_NAME");
439+
}
425440

426441
try {
427-
String devPath = event.get("DEVPATH");
428-
String name = event.get("SWITCH_NAME");
429-
int state = Integer.parseInt(event.get("SWITCH_STATE"));
430-
synchronized (mLock) {
431-
updateStateLocked(devPath, name, state);
442+
if (name.equals(NAME_DP_AUDIO)) {
443+
String stateStr = event.get("STATE");
444+
int offset = 0;
445+
int length = stateStr.length();
446+
447+
// parse DP=1\nHDMI=1\0
448+
while (offset < length) {
449+
int equals = stateStr.indexOf('=', offset);
450+
451+
if (equals > offset) {
452+
String intfName = stateStr.substring(offset, equals);
453+
454+
if (intfName.equals("DP")) {
455+
state = Integer.parseInt(
456+
stateStr.substring(equals + 1, equals + 2));
457+
break;
458+
}
459+
}
460+
461+
offset = equals + 3;
462+
}
463+
} else {
464+
state = Integer.parseInt(event.get("SWITCH_STATE"));
432465
}
433466
} catch (NumberFormatException e) {
434-
Slog.e(TAG, "Could not parse switch state from event " + event);
467+
Slog.i(TAG, "couldn't get state from event, checking node");
468+
469+
for (int i = 0; i < mUEventInfo.size(); ++i) {
470+
UEventInfo uei = mUEventInfo.get(i);
471+
472+
if (name.equals(uei.getDevName())) {
473+
char[] buffer = new char[1024];
474+
int len = 0;
475+
476+
try {
477+
FileReader file = new FileReader(uei.getSwitchStatePath());
478+
len = file.read(buffer, 0, 1024);
479+
file.close();
480+
} catch (FileNotFoundException e1) {
481+
Slog.e(TAG, "file not found");
482+
break;
483+
} catch (Exception e11) {
484+
Slog.e(TAG, "onUEvent exception", e11);
485+
}
486+
487+
try {
488+
state = Integer.parseInt((new String(buffer, 0, len)).trim());
489+
} catch (NumberFormatException e2) {
490+
Slog.e(TAG, "could not convert to number");
491+
break;
492+
}
493+
break;
494+
}
495+
}
496+
}
497+
498+
synchronized (mLock) {
499+
updateStateLocked(devPath, name, state);
435500
}
436501
}
437502

@@ -450,23 +515,100 @@ private final class UEventInfo {
450515
private final int mState1Bits;
451516
private final int mState2Bits;
452517
private final int mStateNbits;
518+
private int mDevIndex;
519+
private int mCableIndex;
453520

454521
public UEventInfo(String devName, int state1Bits, int state2Bits, int stateNbits) {
455522
mDevName = devName;
456523
mState1Bits = state1Bits;
457524
mState2Bits = state2Bits;
458525
mStateNbits = stateNbits;
526+
527+
if (mDevName.equals(NAME_DP_AUDIO)) {
528+
getDevIndex();
529+
getCableIndex();
530+
}
531+
}
532+
533+
private void getDevIndex() {
534+
int index = 0;
535+
char[] buffer = new char[1024];
536+
537+
while (true) {
538+
String devPath = String.format(Locale.US,
539+
"/sys/class/switch/extcon%d/name",
540+
index);
541+
542+
try {
543+
FileReader file = new FileReader(devPath);
544+
int len = file.read(buffer, 0, 1024);
545+
file.close();
546+
547+
String devName = (new String(buffer, 0, len)).trim();
548+
if (devName.equals(mDevName)) {
549+
mDevIndex = index;
550+
break;
551+
} else {
552+
index++;
553+
}
554+
} catch (FileNotFoundException e) {
555+
break;
556+
} catch (Exception e) {
557+
Slog.e(TAG, "getDevIndex exception", e);
558+
break;
559+
}
560+
}
561+
}
562+
563+
private void getCableIndex() {
564+
int index = 0;
565+
char[] buffer = new char[1024];
566+
567+
while (true) {
568+
String cablePath = String.format(Locale.US,
569+
"/sys/class/switch/extcon%d/cable.%d/name",
570+
mDevIndex, index);
571+
572+
try {
573+
FileReader file = new FileReader(cablePath);
574+
int len = file.read(buffer, 0, 1024);
575+
file.close();
576+
577+
String cableName = (new String(buffer, 0, len)).trim();
578+
if (cableName.equals("DP")) {
579+
mCableIndex = index;
580+
break;
581+
} else {
582+
index++;
583+
}
584+
} catch (FileNotFoundException e) {
585+
break;
586+
} catch (Exception e) {
587+
Slog.e(TAG, "getCableIndex exception", e);
588+
break;
589+
}
590+
}
459591
}
460592

461593
public String getDevName() {
462594
return mDevName;
463595
}
464596

465597
public String getDevPath() {
598+
if (mDevName.equals(NAME_DP_AUDIO)) {
599+
return String.format(Locale.US,
600+
"/devices/platform/soc/%s/extcon/extcon%d",
601+
mDevName, mDevIndex);
602+
}
466603
return String.format(Locale.US, "/devices/virtual/switch/%s", mDevName);
467604
}
468605

469606
public String getSwitchStatePath() {
607+
if (mDevName.equals(NAME_DP_AUDIO)) {
608+
return String.format(Locale.US,
609+
"/sys/class/switch/extcon%d/cable.%d/state",
610+
mDevIndex, mCableIndex);
611+
}
470612
return String.format(Locale.US, "/sys/class/switch/%s/state", mDevName);
471613
}
472614

0 commit comments

Comments
 (0)