#
# Template audio policy configuration file
#

# Global configuration section:
# - before audio HAL version 3.0:
#   lists input and output devices always present on the device
#   as well as the output device selected by default.
#   Devices are designated by a string that corresponds to the enum in audio.h
#
#  global_configuration {
#    attached_output_devices AUDIO_DEVICE_OUT_SPEAKER
#    default_output_device AUDIO_DEVICE_OUT_SPEAKER
#    attached_input_devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_REMOTE_SUBMIX
#  }
#
# - after and including audio HAL 3.0 the global_configuration section is included in each
#   hardware module section.
#   it also includes the audio HAL version of this hw module:
#  global_configuration {
#    ...
#     audio_hal_version <major.minor>  # audio HAL version in e.g. 3.0
#  }
#   other attributes (attached devices, default device) have to be included in the
#   global_configuration section of each hardware module


# audio hardware module section: contains descriptors for all audio hw modules present on the
# device. Each hw module node is named after the corresponding hw module library base name.
# For instance, "primary" corresponds to audio.primary.<device>.so.
# The "primary" module is mandatory and must include at least one output with
# AUDIO_OUTPUT_FLAG_PRIMARY flag.
# Each module descriptor contains one or more output profile descriptors and zero or more
# input profile descriptors. Each profile lists all the parameters supported by a given output
# or input stream category.
# The "channel_masks", "formats", "devices" and "flags" are specified using strings corresponding
# to enums in audio.h and audio_policy.h. They are concatenated by use of "|" without space or "\n".
#
# For audio HAL version posterior to 3.0 the following sections or sub sections can be present in
# a hw module section:
# - A "global_configuration" section: see above
# - Optionally a "devices" section:
#   This section contains descriptors for audio devices with attributes like an address or a
#   gain controller. The syntax for the devices section and device descriptor is as follows:
#    devices {
#      <device name> {              # <device name>: any string without space
#        type <device type>         # <device type> e.g. AUDIO_DEVICE_OUT_SPEAKER
#        address <address>          # optional: device address, char string less than 64 in length
#      }
#    }
# - one or more "gains" sections can be present in a device descriptor section.
#   If present, they describe the capabilities of gain controllers attached to this input or
#   output device. e.g. :
#   <device name> {                  # <device name>: any string without space
#     type <device type>             # <device type> e.g. AUDIO_DEVICE_OUT_SPEAKER
#     address <address>              # optional: device address, char string less than 64 in length
#     gains {
#       <gain name> {
#         mode <gain modes supported>              # e.g. AUDIO_GAIN_MODE_CHANNELS
#         channel_mask <controlled channels>       # needed if mode AUDIO_GAIN_MODE_CHANNELS
#         min_value_mB <min value in millibel>
#         max_value_mB <max value in millibel>
#         default_value_mB <default value in millibel>
#         step_value_mB <step value in millibel>
#         min_ramp_ms <min duration in ms>         # needed if mode AUDIO_GAIN_MODE_RAMP
#         max_ramp_ms <max duration ms>            # needed if mode AUDIO_GAIN_MODE_RAMP
#       }
#     }
#   }
# - when a device descriptor is present, output and input profiles can refer to this device by
# its name in their "devices" section instead of specifying a device type. e.g. :
#   outputs {
#     primary {
#       sampling_rates 44100
#       channel_masks AUDIO_CHANNEL_OUT_STEREO
#       formats AUDIO_FORMAT_PCM_16_BIT
#       devices <device name>
#       flags AUDIO_OUTPUT_FLAG_PRIMARY
#     }
#   }
# sample audio_policy.conf file below

audio_hw_modules {
  primary {
    global_configuration {
      attached_output_devices AUDIO_DEVICE_OUT_SPEAKER
      default_output_device AUDIO_DEVICE_OUT_SPEAKER
      attached_input_devices AUDIO_DEVICE_IN_BUILTIN_MIC
      audio_hal_version 3.0
    }
    devices {
      speaker {
        type AUDIO_DEVICE_OUT_SPEAKER
        gains {
          gain_1 {
            mode AUDIO_GAIN_MODE_JOINT
            min_value_mB -8400
            max_value_mB 4000
            default_value_mB 0
            step_value_mB 100
          }
        }
      }
    }
    outputs {
      primary {
        sampling_rates 48000
        channel_masks AUDIO_CHANNEL_OUT_STEREO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices speaker
        flags AUDIO_OUTPUT_FLAG_PRIMARY
      }
    }
    inputs {
      primary {
        sampling_rates 8000|16000
        channel_masks AUDIO_CHANNEL_IN_MONO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices AUDIO_DEVICE_IN_BUILTIN_MIC
      }
    }
  }
  r_submix {
    global_configuration {
      attached_input_devices AUDIO_DEVICE_IN_REMOTE_SUBMIX
      audio_hal_version 2.0
    }
    outputs {
      submix {
        sampling_rates 48000
        channel_masks AUDIO_CHANNEL_OUT_STEREO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices AUDIO_DEVICE_OUT_REMOTE_SUBMIX
      }
    }
    inputs {
      submix {
        sampling_rates 48000
        channel_masks AUDIO_CHANNEL_IN_STEREO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices AUDIO_DEVICE_IN_REMOTE_SUBMIX
      }
    }
  }
}
