USB: update logic for reporting playback and capture capability of USB devices.
Report USB devices support audio capture when there is a terminal whose subtype is ACI_OUTPUT_TERMINAL and terminal type is USB streaming and there is another terminal whose subtype is ACI_INPUT_TERMINAL and terminal type is not USB streaming. Report USB devices support audio playback when there is a terminal whose subtype is ACI_INPUT_TERMINAL and terminal type is USB streaming and there is another terminal whose subtype is ACI_OUTPUT_TERMINAL and terminal type is not USB streaming. Bug: 279151646 Test: connect usb headset, dumpsys audio policy Change-Id: If1c14cc0a4e3fbdfbed2c105d37ece9a866f18ed
This commit is contained in:
@@ -584,15 +584,34 @@ public final class UsbDescriptorParser {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true only if there is a terminal whose subtype and terminal type are the same as
|
||||
* the given values.
|
||||
* @hide
|
||||
*/
|
||||
public boolean hasAudioTerminal(int subType) {
|
||||
public boolean hasAudioTerminal(int subType, int terminalType) {
|
||||
for (UsbDescriptor descriptor : mDescriptors) {
|
||||
if (descriptor instanceof UsbACInterface) {
|
||||
if (((UsbACInterface) descriptor).getSubclass()
|
||||
== UsbDescriptor.AUDIO_AUDIOCONTROL
|
||||
&& ((UsbACInterface) descriptor).getSubtype()
|
||||
== subType) {
|
||||
if (descriptor instanceof UsbACTerminal) {
|
||||
if (((UsbACTerminal) descriptor).getSubclass() == UsbDescriptor.AUDIO_AUDIOCONTROL
|
||||
&& ((UsbACTerminal) descriptor).getSubtype() == subType
|
||||
&& ((UsbACTerminal) descriptor).getTerminalType() == terminalType) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true only if there is an interface whose subtype is the same as the given one and
|
||||
* terminal type is different from the given one.
|
||||
* @hide
|
||||
*/
|
||||
public boolean hasAudioTerminalExcludeType(int subType, int excludedTerminalType) {
|
||||
for (UsbDescriptor descriptor : mDescriptors) {
|
||||
if (descriptor instanceof UsbACTerminal) {
|
||||
if (((UsbACTerminal) descriptor).getSubclass() == UsbDescriptor.AUDIO_AUDIOCONTROL
|
||||
&& ((UsbACTerminal) descriptor).getSubtype() == subType
|
||||
&& ((UsbACTerminal) descriptor).getTerminalType() != excludedTerminalType) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -604,14 +623,21 @@ public final class UsbDescriptorParser {
|
||||
* @hide
|
||||
*/
|
||||
public boolean hasAudioPlayback() {
|
||||
return hasAudioTerminal(UsbACInterface.ACI_OUTPUT_TERMINAL);
|
||||
return hasAudioTerminalExcludeType(
|
||||
UsbACInterface.ACI_OUTPUT_TERMINAL, UsbTerminalTypes.TERMINAL_USB_STREAMING)
|
||||
&& hasAudioTerminal(
|
||||
UsbACInterface.ACI_INPUT_TERMINAL, UsbTerminalTypes.TERMINAL_USB_STREAMING);
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
public boolean hasAudioCapture() {
|
||||
return hasAudioTerminal(UsbACInterface.ACI_INPUT_TERMINAL);
|
||||
return hasAudioTerminalExcludeType(
|
||||
UsbACInterface.ACI_INPUT_TERMINAL, UsbTerminalTypes.TERMINAL_USB_STREAMING)
|
||||
&& hasAudioTerminal(
|
||||
UsbACInterface.ACI_OUTPUT_TERMINAL,
|
||||
UsbTerminalTypes.TERMINAL_USB_STREAMING);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user