hal: Adding Pan-Scale, downmix mixer control support.
Add support in HAL to send mix matrix params using downmix,
Pan-Scale mixer controls. Add new interactive usecases and
also add support to open and teardown for interactive streams.
Add support in test app for supporting up to 9 concurrent
streams. Add support for mixer matrix params handling.
Change-Id: I0dc5b908ee779b2b2c526a67609c057f591f26e7
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 8b44cd5..14b3563 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -318,6 +318,15 @@
[USECASE_AUDIO_PLAYBACK_VOIP] = "audio-playback-voip",
[USECASE_AUDIO_RECORD_VOIP] = "audio-record-voip",
+ /* For Interactive Audio Streams */
+ [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM1] = "audio-interactive-stream1",
+ [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM2] = "audio-interactive-stream2",
+ [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM3] = "audio-interactive-stream3",
+ [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM4] = "audio-interactive-stream4",
+ [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM5] = "audio-interactive-stream5",
+ [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM6] = "audio-interactive-stream6",
+ [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM7] = "audio-interactive-stream7",
+ [USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM8] = "audio-interactive-stream8",
};
static const audio_usecase_t offload_usecases[] = {
@@ -332,6 +341,17 @@
USECASE_AUDIO_PLAYBACK_OFFLOAD9,
};
+static const audio_usecase_t interactive_usecases[] = {
+ USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM1,
+ USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM2,
+ USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM3,
+ USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM4,
+ USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM5,
+ USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM6,
+ USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM7,
+ USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM8,
+};
+
#define STRING_TO_ENUM(string) { #string, string }
struct string_to_enum {
@@ -2149,6 +2169,50 @@
}
}
+bool is_interactive_usecase(audio_usecase_t uc_id)
+{
+ unsigned int i;
+ for (i = 0; i < sizeof(interactive_usecases)/sizeof(interactive_usecases[0]); i++) {
+ if (uc_id == interactive_usecases[i])
+ return true;
+ }
+ return false;
+}
+
+static audio_usecase_t get_interactive_usecase(struct audio_device *adev)
+{
+ audio_usecase_t ret_uc = USECASE_INVALID;
+ unsigned int intract_uc_index;
+ unsigned int num_usecase = sizeof(interactive_usecases)/sizeof(interactive_usecases[0]);
+
+ ALOGV("%s: num_usecase: %d", __func__, num_usecase);
+ for (intract_uc_index = 0; intract_uc_index < num_usecase; intract_uc_index++) {
+ if (!(adev->interactive_usecase_state & (0x1 << intract_uc_index))) {
+ adev->interactive_usecase_state |= 0x1 << intract_uc_index;
+ ret_uc = interactive_usecases[intract_uc_index];
+ break;
+ }
+ }
+
+ ALOGV("%s: Interactive usecase is %d", __func__, ret_uc);
+ return ret_uc;
+}
+
+static void free_interactive_usecase(struct audio_device *adev,
+ audio_usecase_t uc_id)
+{
+ unsigned int interact_uc_index;
+ unsigned int num_usecase = sizeof(interactive_usecases)/sizeof(interactive_usecases[0]);
+
+ for (interact_uc_index = 0; interact_uc_index < num_usecase; interact_uc_index++) {
+ if (interactive_usecases[interact_uc_index] == uc_id) {
+ adev->interactive_usecase_state &= ~(0x1 << interact_uc_index);
+ break;
+ }
+ }
+ ALOGV("%s: free Interactive usecase %d", __func__, uc_id);
+}
+
bool is_offload_usecase(audio_usecase_t uc_id)
{
unsigned int i;
@@ -2814,7 +2878,9 @@
{
struct stream_out *out = (struct stream_out *)stream;
- if (out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) {
+ if (is_interactive_usecase(out->usecase)) {
+ return out->config.period_size;
+ } else if (out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) {
if (out->flags & AUDIO_OUTPUT_FLAG_TIMESTAMP)
return out->compr_config.fragment_size - sizeof(struct snd_codec_metadata);
else
@@ -5180,7 +5246,10 @@
channels = audio_channel_count_from_out_mask(out->channel_mask);
- if (out->flags & AUDIO_OUTPUT_FLAG_RAW) {
+ if (out->flags & AUDIO_OUTPUT_FLAG_INTERACTIVE) {
+ out->usecase = get_interactive_usecase(adev);
+ out->config = pcm_config_low_latency;
+ } else if (out->flags & AUDIO_OUTPUT_FLAG_RAW) {
out->usecase = USECASE_AUDIO_PLAYBACK_ULL;
out->realtime = may_use_noirq_mode(adev, USECASE_AUDIO_PLAYBACK_ULL,
out->flags);
@@ -5411,6 +5480,9 @@
out->a2dp_compress_mute = false;
+ if (is_interactive_usecase(out->usecase))
+ free_interactive_usecase(adev, out->usecase);
+
if (out->convert_buffer != NULL) {
free(out->convert_buffer);
out->convert_buffer = NULL;