audio hal: fix assertion failed if mono input usb inserted
some usb input support only one channel, start the input channel
count from 1 to usb maximum channel to prevent assertion failed.
clean up extra loop on getting usb channel mask
Bug: 132040577
Test: build pass, mono input usb
Change-Id: Idcccc54c2e07b74c0580c8a8c0bf677c83aea715
Signed-off-by: vincenttew <vincenttew@google.com>
(cherry picked from commit e5de3abcdc0bf765957f929615b2008cd2b9a60c)
(cherry picked from commit 3e44f9f0a0ae9f309e05de57360ad58d053d2e29)
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 9f29706..01cdc05 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1842,8 +1842,6 @@
if (channels > MAX_HIFI_CHANNEL_COUNT)
channels = MAX_HIFI_CHANNEL_COUNT;
- channel_count = DEFAULT_CHANNEL_COUNT;
-
if (is_playback) {
// start from 2 channels as framework currently doesn't support mono.
if (channels >= FCC_2) {
@@ -1856,6 +1854,8 @@
audio_channel_mask_for_index_assignment_from_count(channel_count);
}
} else {
+ // For capture we report all supported channel masks from 1 channel up.
+ channel_count = MIN_CHANNEL_COUNT;
// audio_channel_in_mask_from_count() does the right conversion to either positional or
// indexed mask
for ( ; channel_count <= channels && num_masks < max_masks; channel_count++) {
@@ -1872,20 +1872,10 @@
}
}
- for (channel_count = channels; ((channel_count >= DEFAULT_CHANNEL_COUNT) &&
- (num_masks < max_masks)); channel_count--) {
- const audio_channel_mask_t mask =
- audio_channel_in_mask_from_count(channel_count);
- supported_channel_masks[num_masks++] = mask;
- const audio_channel_mask_t index_mask =
- audio_channel_mask_for_index_assignment_from_count(channel_count);
- if (mask != index_mask && num_masks < max_masks) { // ensure index mask added.
- supported_channel_masks[num_masks++] = index_mask;
- }
+ for (size_t i = 0; i < num_masks; ++i) {
+ ALOGV("%s: %s supported ch %d supported_channel_masks[%zu] %08x num_masks %d", __func__,
+ is_playback ? "P" : "C", channels, i, supported_channel_masks[i], num_masks);
}
-
- ALOGV("%s: %s supported ch %d supported_channel_masks[0] %08x num_masks %d", __func__,
- is_playback ? "P" : "C", channels, supported_channel_masks[0], num_masks);
return num_masks;
}