hal: restore fm volume when codec backend config changed

During FM playback, usecase play-fm may be disabled and
re-routed because of codec backend config change. Default
FM volume is applied when usecase play-fm re-routed, thus
volume may be different from previous normal one. As for
current mixer path, default value for fm is too low to be
audible.

Restore FM volume after usecase play-fm re-routed by codec
backend config change.

CRs-Fixed: 2171323
Change-Id: I88117989ffcacc48268891c7144f78e7a9875c51
diff --git a/hal/audio_extn/fm.c b/hal/audio_extn/fm.c
index b34bb22..785da65 100644
--- a/hal/audio_extn/fm.c
+++ b/hal/audio_extn/fm.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
  * Not a Contribution.
  *
  * Copyright (C) 2013 The Android Open Source Project
@@ -42,6 +42,7 @@
 #define AUDIO_PARAMETER_KEY_FM_VOLUME "fm_volume"
 #define AUDIO_PARAMETER_KEY_REC_PLAY_CONC "rec_play_conc_on"
 #define AUDIO_PARAMETER_KEY_FM_MUTE "fm_mute"
+#define AUDIO_PARAMETER_KEY_FM_RESTORE_VOLUME "fm_restore_volume"
 #define FM_LOOPBACK_DRAIN_TIME_MS 2
 
 static struct pcm_config pcm_config_fm = {
@@ -312,6 +313,14 @@
         fm_set_volume(adev, fmmod.fm_volume, false);
     }
 
+    ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_FM_RESTORE_VOLUME,
+                            value, sizeof(value));
+    if (ret >= 0) {
+        if (value[0] == '1')
+            fm_set_volume(adev, fmmod.fm_volume, false);
+        ALOGV("%s: set_fm_volume from param restore volume", __func__);
+    }
+
 #ifdef RECORD_PLAY_CONCURRENCY
     ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_REC_PLAY_CONC,
                                value, sizeof(value));
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 4bddaed..738eb30 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1423,6 +1423,11 @@
                                                                         usecase->out_snd_device,
                                                                         platform_get_input_snd_device(adev->platform, uc_info->devices));
                     enable_audio_route(adev, usecase);
+                    if (usecase->id == USECASE_AUDIO_PLAYBACK_FM) {
+                        struct str_parms *parms = str_parms_create_str("fm_restore_volume=1");
+                        if (parms)
+                            audio_extn_fm_set_parameters(adev, parms);
+                    }
                 }
             }
         }