Bug fix on Engine Configurable

This patch fixes a couple of issue within audio policy engine configurable
 -valgrind error detected within the parsing of the configuration file
 -configuration file typos
 -start of the PFW delayed to the init in order to wait the full construction
of the engine object
 -wrong specialization of template functions.
 -broadcast volume min / max init to stream collection of manager & PFW

Change-Id: I08823ab4040c92b719747c60cc3fa5c8b5f172ac
Signed-off-by: François Gaffie <francois.gaffie@intel.com>
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystem.cpp b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystem.cpp
index a5dab36..bf3906d 100755
--- a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystem.cpp
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystem.cpp
@@ -49,17 +49,11 @@
     // Try to connect a Plugin Interface from Audio Policy Engine
     EngineInstance *engineInstance = EngineInstance::getInstance();
 
-    if (engineInstance == NULL) {
-         ALOG_ASSERT(engineInstance != NULL, "NULL Plugin Interface");
-        return;
-    }
+    ALOG_ASSERT(engineInstance != NULL, "NULL Plugin Interface");
+
     // Retrieve the Route Interface
     mPluginInterface = engineInstance->queryInterface<android::AudioPolicyPluginInterface>();
-    if (mPluginInterface == NULL) {
-        // bailing out
-        ALOG_ASSERT(mPluginInterface != NULL, "NULL Plugin Interface");
-        return;
-    }
+    ALOG_ASSERT(mPluginInterface != NULL, "NULL Plugin Interface");
 
     // Provide mapping keys to the core, necessary when parsing the XML Structure files.
     addContextMappingKey(mKeyName);
diff --git a/services/audiopolicy/engineconfigurable/src/Engine.cpp b/services/audiopolicy/engineconfigurable/src/Engine.cpp
index 61fae71..733cdf6 100755
--- a/services/audiopolicy/engineconfigurable/src/Engine.cpp
+++ b/services/audiopolicy/engineconfigurable/src/Engine.cpp
@@ -87,11 +87,6 @@
       mPolicyParameterMgr(new ParameterManagerWrapper()),
       mApmObserver(NULL)
 {
-    if (mPolicyParameterMgr->start() != NO_ERROR) {
-        ALOGE("%s: could not start Policy PFW", __FUNCTION__);
-        delete mPolicyParameterMgr;
-        mPolicyParameterMgr = NULL;
-    }
 }
 
 Engine::~Engine()
@@ -111,10 +106,13 @@
 
 status_t Engine::initCheck()
 {
-    return (mPolicyParameterMgr != NULL) &&
-            mPolicyParameterMgr->isStarted() &&
-            (mApmObserver != NULL)?
-                NO_ERROR : NO_INIT;
+    if (mPolicyParameterMgr != NULL && mPolicyParameterMgr->start() != NO_ERROR) {
+        ALOGE("%s: could not start Policy PFW", __FUNCTION__);
+        delete mPolicyParameterMgr;
+        mPolicyParameterMgr = NULL;
+        return NO_INIT;
+    }
+    return (mApmObserver != NULL)? NO_ERROR : NO_INIT;
 }
 
 bool Engine::setVolumeProfileForStream(const audio_stream_type_t &streamType,
@@ -143,19 +141,6 @@
     return collection.add(name, key);
 }
 
-template <>
-routing_strategy Engine::getPropertyForKey<routing_strategy, audio_usage_t>(audio_usage_t usage) const
-{
-    const SwAudioOutputCollection &outputs = mApmObserver->getOutputs();
-
-    if (usage == AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY &&
-            (outputs.isStreamActive(AUDIO_STREAM_RING) ||
-             outputs.isStreamActive(AUDIO_STREAM_ALARM))) {
-        return STRATEGY_SONIFICATION;
-    }
-    return getPropertyForKey<routing_strategy, audio_usage_t>(usage);
-}
-
 template <typename Property, typename Key>
 Property Engine::getPropertyForKey(Key key) const
 {
@@ -167,10 +152,21 @@
     return element->template get<Property>();
 }
 
-template <>
-audio_devices_t Engine::getPropertyForKey<audio_devices_t, routing_strategy>(routing_strategy strategy) const
+routing_strategy Engine::ManagerInterfaceImpl::getStrategyForUsage(audio_usage_t usage)
 {
-    const SwAudioOutputCollection &outputs = mApmObserver->getOutputs();
+    const SwAudioOutputCollection &outputs = mPolicyEngine->mApmObserver->getOutputs();
+
+    if (usage == AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY &&
+            (outputs.isStreamActive(AUDIO_STREAM_RING) ||
+             outputs.isStreamActive(AUDIO_STREAM_ALARM))) {
+        return STRATEGY_SONIFICATION;
+    }
+    return mPolicyEngine->getPropertyForKey<routing_strategy, audio_usage_t>(usage);
+}
+
+audio_devices_t Engine::ManagerInterfaceImpl::getDeviceForStrategy(routing_strategy strategy) const
+{
+    const SwAudioOutputCollection &outputs = mPolicyEngine->mApmObserver->getOutputs();
 
     /** This is the only case handled programmatically because the PFW is unable to know the
      * activity of streams.
@@ -187,19 +183,9 @@
             !outputs.isStreamActiveRemotely(AUDIO_STREAM_MUSIC,
                                     SONIFICATION_RESPECTFUL_AFTER_MUSIC_DELAY) &&
             outputs.isStreamActive(AUDIO_STREAM_MUSIC, SONIFICATION_RESPECTFUL_AFTER_MUSIC_DELAY)) {
-        return getPropertyForKey<audio_devices_t, routing_strategy>(STRATEGY_MEDIA);
+        return mPolicyEngine->getPropertyForKey<audio_devices_t, routing_strategy>(STRATEGY_MEDIA);
     }
-    return getPropertyForKey<audio_devices_t, routing_strategy>(strategy);
-}
-
-routing_strategy Engine::ManagerInterfaceImpl::getStrategyForUsage(audio_usage_t usage)
-{
-    return mPolicyEngine->getPropertyForKey<routing_strategy, audio_usage_t>(usage);
-}
-
-audio_devices_t Engine::ManagerInterfaceImpl::getDeviceForStrategy(routing_strategy stategy) const
-{
-    return mPolicyEngine->getPropertyForKey<audio_devices_t, routing_strategy>(stategy);
+    return mPolicyEngine->getPropertyForKey<audio_devices_t, routing_strategy>(strategy);
 }
 
 template <typename Property, typename Key>
@@ -233,6 +219,9 @@
         ALOGE("%s: Stream Type %d not found", __FUNCTION__, streamType);
         return BAD_TYPE;
     }
+    mApmObserver->getStreamDescriptors().setVolumeIndexMin(streamType, indexMin);
+    mApmObserver->getStreamDescriptors().setVolumeIndexMax(streamType, indexMax);
+
     return stream->initVolume(indexMin, indexMax);
 }
 
diff --git a/services/audiopolicy/engineconfigurable/wrapper/ParameterManagerWrapper.cpp b/services/audiopolicy/engineconfigurable/wrapper/ParameterManagerWrapper.cpp
index 5b935e8..cfe49d4 100755
--- a/services/audiopolicy/engineconfigurable/wrapper/ParameterManagerWrapper.cpp
+++ b/services/audiopolicy/engineconfigurable/wrapper/ParameterManagerWrapper.cpp
@@ -145,7 +145,7 @@
 
         ALOG_ASSERT(node != NULL, "error in parsing file");
         const char *typeName = node->name;
-        char *valueNames = (char *)node->value;
+        char *valueNames = strndup(node->value, strlen(node->value));
 
         addCriterionType(typeName, isInclusive);
 
@@ -178,6 +178,7 @@
             }
             valueName = strtok_r(NULL, ",", &ctx);
         }
+        free(valueNames);
     }
 }
 
diff --git a/services/audiopolicy/engineconfigurable/wrapper/config/audio_policy_criteria.conf b/services/audiopolicy/engineconfigurable/wrapper/config/audio_policy_criteria.conf
index a4ffdd5..5b046a8 100755
--- a/services/audiopolicy/engineconfigurable/wrapper/config/audio_policy_criteria.conf
+++ b/services/audiopolicy/engineconfigurable/wrapper/config/audio_policy_criteria.conf
@@ -24,7 +24,7 @@
 #          * 1 << N -> (N+1)th literal value,
 #
 #########################################################
-# Route|Audio {
+# Policy {
 #    InclusiveCriterionType|ExclusiveCriterionType {
 #        <Criterion Name>  [numerical value 1:]<literal value 1>,[numerical value 2:]<literal value 2>,<literal value 3>,...
 #    }
@@ -33,7 +33,7 @@
 #########################################################
 # Criterion:
 #########################################################
-# Route|Audio {
+# Policy {
 #    Criterion {
 #        <Criterion Name> {
 #            Type            <Criterion type name>
@@ -43,21 +43,12 @@
 # }
 
 Policy {
-    ExclusiveCriterionType {
-        #
-        # The values of the mode MUST be aligned with the definition of the audio_mode_t
-        # from system/audio.h
-        #
-        AndroidModeType     0:Normal,1:RingTone,2:InCall,3:InCommunication
-    }
     InclusiveCriterionType {
         #
         # DO NOT CHANGE ORDER. This definition must be aligned with the definition of
         # AUDIO_DEVICE_OUT_* within <system/audio.h> file of android.
         #
         OutputDevicesMaskType   Earpiece,Speaker,WiredHeadset,WiredHeadphone,BluetoothSco,BluetoothScoHeadset,BluetoothScoCarkit,BluetoothA2dp,BluetoothA2dpHeadphones,BluetoothA2dpSpeaker,Hdmi,AnlgDockHeadset,DgtlDockHeadset,UsbAccessory,UsbDevice,RemoteSubmix,TelephonyTx,Line,HdmiArc,Spdif,Fm,AuxLine,SpeakerSafe
-    }
-    InclusiveCriterionType {
         #
         # DO NOT CHANGE ORDER. This definition must be aligned with the definition of
         # AUDIO_DEVICE_IN_* within <system/audio.h> file of android.
@@ -68,121 +59,75 @@
     }
     ExclusiveCriterionType {
         #
+        # The values of the mode MUST be aligned with the definition of the audio_mode_t
+        # from system/audio.h
+        #
+        AndroidModeType     0:Normal,1:RingTone,2:InCall,3:InCommunication
+        #
         # The values of the mode MUST be aligned with the definition of the
         # audio_policy_forced_config_t from system/audio.h
         #
         ForceUseForCommunicationType    0:ForceNone,1:ForceSpeaker,3:ForceBtSco
-    }
-    ExclusiveCriterionType {
         #
         # The values of the mode MUST be aligned with the definition of the
         # audio_policy_forced_config_t from system/audio.h
         #
         ForceUseForMediaType            0:ForceNone,1:ForceSpeaker,2:ForceHeadphones,4:ForceBtA2dp,5:ForceWiredAccessory,8:ForceAnalogDock,9:ForceDigitalDock,10:ForceNoBtA2dp
-    }
-    ExclusiveCriterionType {
         #
         # The values of the mode MUST be aligned with the definition of the
         # audio_policy_forced_config_t from system/audio.h
         #
         ForceUseForRecordType           0:ForceNone,3:ForceBtSco,5:ForceWiredAccessory
-    }
-    ExclusiveCriterionType {
         #
         # The values of the mode MUST be aligned with the definition of the
         # audio_policy_forced_config_t from system/audio.h
         #
         ForceUseForDockType             0:ForceNone,5:ForceWiredAccessory,6:ForceBtCarDock,7:ForceBtDeskDock,8:ForceAnalogDock,9:ForceDigitalDock
-    }
-    ExclusiveCriterionType {
         #
         # The values of the mode MUST be aligned with the definition of the
         # audio_policy_forced_config_t from system/audio.h
         #
         ForceUseForSystemType           0:ForceNone,11:ForceSystemEnforced
-    }
-    ExclusiveCriterionType {
         #
         # The values of the mode MUST be aligned with the definition of the
         # audio_policy_forced_config_t from system/audio.h
         #
         ForceUseForHdmiSystemAudioType  0:ForceNone,12:ForceHdmiSystemEnforced
     }
-    ExclusiveCriterionType {
-        Rate   8000,11025,12000,16000,22050,24000,32000,44100,48000,96000,176400,192000
-    }
-    ExclusiveCriterionType {
-        Format  Mp3,AmrNb,AmrWb,Aac,HeAacV1,HeAacV2,Vorbis,Pcm16Bit,Pcm8Bit,Pcm32Bit,Pcm8_24Bit
-    }
-    InclusiveCriterionType {
-        OutputChannelMask    FrontLeft,FrontRight,FrontCenter,LowFrequence,BackLeft,BackRight,FromLeftOfCenter,FromRightOfCenter,BackCenter,SideLeft,SideRight,TopCenter,TopFrontLeft,TopFrontCenter,TopFrontRight,TopBackLeft,TopBackCenter,TopBackRight
-    }
-    ExclusiveCriterionType {
-        OutputChannelMasks    Mono,Stereo,Quad,QuadBack,QuadSide,5Point1,5Point1Back,5Point1Side,7Point1,All
-    }
-    InclusiveCriterionType {
-        InputChannelMask   Left,Right,Front,Back,LeftProcessed,RightProcessed,FrontProcessed,BackProcessed,Pressure,XAxis,YAxis,ZAxis,VoiceUplink,VoiceDnlink
-    }
-    ExclusiveCriterionType {
-        InputChannelMasks   Mono,Stereo,FrontBack,VoiceUplinkDnlink,All
-    }
-    InclusiveCriterionType {
-        OutputFlags  Direct,Primary,Fast,DeepBuffer,CompressOffload,NonBlocking,HwAvSync
-    }
-    ExclusiveCriterionType {
-        InputSource     Default,Mic,VoiceUplink,VoiceDownlink,VoiceCall,Camcorder,VoiceRecognition,VoiceCommunication,RemoteSubmix,Hotword
-    }
-
 
     Criterion {
         AvailableInputDevices {
             Type            InputDevicesMaskType
             Default         none
         }
-    }
-    Criterion {
         AvailableOutputDevices {
             Type            OutputDevicesMaskType
             Default         none
         }
-    }
-    Criterion {
         TelephonyMode {
             Type            AndroidModeType
             Default         Normal
         }
-    }
-    Criterion {
         ForceUseForCommunication {
             Type            ForceUseForCommunicationType
             Default         ForceNone
         }
-    }
-    Criterion {
         ForceUseForMedia {
             Type            ForceUseForMediaType
             Default         ForceNone
         }
-    }
-    Criterion {
         ForceUseForRecord {
             Type            ForceUseForRecordType
             Default         ForceNone
         }
-    }
-    Criterion {
         ForceUseForDock {
             Type            ForceUseForDockType
             Default         ForceNone
         }
-    }
-    Criterion {
         ForceUseForSystem {
             Type            ForceUseForSystemType
             Default         ForceNone
         }
-    }
-    Criterion {
         ForceUseForHdmiSystemAudio {
             Type            ForceUseForHdmiSystemAudioType
             Default         ForceNone