[media][audio_core] Add template for creating audio_core pacakge.

This allows different audio_core packages to be created that can
contain device-specific effects.

Test: fx run-test audio_fidl_tests
Change-Id: Ia094b88ca81a67a322c4d92e93845cd99840e547
diff --git a/src/media/audio/audio_core/BUILD.gn b/src/media/audio/audio_core/BUILD.gn
index ee6686f..902e9514 100644
--- a/src/media/audio/audio_core/BUILD.gn
+++ b/src/media/audio/audio_core/BUILD.gn
@@ -2,9 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//build/config.gni")
-import("//build/package.gni")
 import("//build/test/test_package.gni")
+import("//src/media/audio/audio_core_package.gni")
 import("//third_party/cobalt/metrics_registry.gni")
 
 declare_args() {
@@ -19,16 +18,6 @@
   }
 }
 
-config_data("default_audio_policy") {
-  for_pkg = "audio_core"
-  sources = [
-    rebase_path("settings/default/audio_policy.json"),
-  ]
-  outputs = [
-    "settings/default/audio_policy.json",
-  ]
-}
-
 action_foreach("json_schema_headers") {
   visibility = [ ":*" ]
 
@@ -55,40 +44,11 @@
   generate_cc = true
 }
 
-package("audio_core") {
-  deps = [
-    "//src/media/audio/audio_core:audio_core_bin",
-    "//src/media/audio/audio_core:default_audio_policy",
-    "//src/media/audio/effects/passthrough:audio_effects",
-  ]
-
-  binaries = [
-    {
-      name = "audio_core"
-    },
-  ]
-
-  loadable_modules = [
-    {
-      # This audio processing library is hosted in the audio_core process.
-      name = "audio_effects.so"
-    },
-  ]
-
-  meta = [
-    {
-      path = rebase_path("meta/audio_core.cmx")
-      dest = "audio_core.cmx"
-    },
-
-    # The nodevfs cmx is used in some test environments where we would like to provide our own
-    # devfs for the test. At this time we need to remove any dev sandbox metadata as appmgr does
-    # not allow these namespaces to be overridden.
-    {
-      path = rebase_path("meta/audio_core_nodevfs.cmx")
-      dest = "audio_core_nodevfs.cmx"
-    },
-  ]
+audio_core_package("audio_core") {
+  effects = {
+    target = "//src/media/audio/effects/passthrough:audio_effects"
+    name = "audio_effects.so"
+  }
 }
 
 source_set("audio_core_lib") {
diff --git a/src/media/audio/audio_core_package.gni b/src/media/audio/audio_core_package.gni
new file mode 100644
index 0000000..d011573
--- /dev/null
+++ b/src/media/audio/audio_core_package.gni
@@ -0,0 +1,84 @@
+# Copyright 2019 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config.gni")
+import("//build/package.gni")
+
+# Creates a 'audio_core' package. All packages created with this template will be identical, except
+# for the addition of the effects module.
+#
+# Parameters
+#     effects (optional)
+#       A scope defining a loadable module that implements audio effects.
+#
+# Ex:
+#   audio_core_package("foo_audio") {
+#     effects = {
+#       target = "//path/to/effects/module"
+#       name = "module_name.so"
+#     }
+#   }
+template("audio_core_package") {
+  package_name = target_name
+  config_data("${target_name}_default_audio_policy") {
+    for_pkg = package_name
+    sources = [
+      rebase_path(
+          "//src/media/audio/audio_core/settings/default/audio_policy.json"),
+    ]
+    outputs = [
+      "settings/default/audio_policy.json",
+    ]
+  }
+
+  package(target_name) {
+    deps = [
+      "//src/media/audio/audio_core:audio_core_bin",
+    ]
+    data_deps = [
+      ":${target_name}_default_audio_policy",
+    ]
+    if (defined(invoker.effects)) {
+      forward_variables_from(invoker, [ "effects" ])
+      assert(defined(effects.target))
+      deps += [ effects.target ]
+    } else {
+      # If a target doesn't provide effects, we won't end up using the 'invoker' variable and that
+      # causes some GN errors. We explicitly mark the invoker as unused in this situation to allow
+      # for this use case.
+      not_needed([ "invoker" ])
+    }
+
+    binaries = [
+      {
+        name = "audio_core"
+      },
+    ]
+
+    if (defined(effects)) {
+      assert(defined(effects.name))
+      loadable_modules = [
+        {
+          name = effects.name
+        },
+      ]
+    }
+
+    meta = [
+      {
+        path = rebase_path("//src/media/audio/audio_core/meta/audio_core.cmx")
+        dest = "audio_core.cmx"
+      },
+
+      # The nodevfs cmx is used in some test environments where we would like to provide our own
+      # devfs for the test. At this time we need to remove any dev sandbox metadata as appmgr does
+      # not allow these namespaces to be overridden.
+      {
+        path = rebase_path(
+                "//src/media/audio/audio_core/meta/audio_core_nodevfs.cmx")
+        dest = "audio_core_nodevfs.cmx"
+      },
+    ]
+  }
+}