Application Layer

Application Layer represents the built-in FW modules (processing components), loadable FW modules and example templates with application libraries required for modules integration. Application layer content is assumed to be open source and only proprietary 3rd party components should remain private.

@startuml
allowmixing

scale max 1280 width

package "SOF" {

  package "Application layer" as APP_CUSTOMIZATION {

    package "Example Loadable Module" as LOADABLE_MODULE {
      component "3rd Party Post-Processing" as PROCESSING_3RD_PARTY
      component "WoV" as WOV_MODULE
      component "ACA" as ACA_MODULE
      component "Other modules" as OTHER_MODULES

      PROCESSING_3RD_PARTY -[hidden]right- WOV_MODULE
      WOV_MODULE -[hidden]right- ACA_MODULE
      ACA_MODULE -[hidden]right- OTHER_MODULES
    }

    package "Built-in Module" as BUILTIN_MODULE {
      component "Copier" as COPIER
      component "SRC" as SRC
      component "Mixers" as MIXERS
      component "History Buffer/KPB" as HISTORY_BUFFER
      component "Probe" as PROBE

      COPIER -[hidden]right- SRC
      SRC -[hidden]right- MIXERS
      MIXERS -[hidden]right- HISTORY_BUFFER
      HISTORY_BUFFER -[hidden]right- PROBE
    }

      BUILTIN_MODULE -[hidden]down- LOADABLE_MODULE
  }

  package "System Services" as SYS_SERVICES {

    interface "System Services" as SS

    package "Media Processing Pipelines Services extension" as KERNEL_EXTENSION {
        component "Communication" as COMMUNICATION
        component "Pipelines and Component Infrastructure" as PIPELINE_COMPONENT_INFRASTRUCTURE
        component "AVS Scheduling" as AVS_SCHEDULERS

        COMMUNICATION -[hidden]right- PIPELINE_COMPONENT_INFRASTRUCTURE
        PIPELINE_COMPONENT_INFRASTRUCTURE -[hidden]right- AVS_SCHEDULERS
    }

    package "Zephyr" as ZEPHYR {
        component "Services" as SERVICES
    }

    SS -[hidden]down- KERNEL_EXTENSION
    SS -[hidden]down- ZEPHYR

    KERNEL_EXTENSION -[hidden]right- ZEPHYR
  }

  APP_CUSTOMIZATION -[hidden]down- SYS_SERVICES
  BUILTIN_MODULE .down. SS
  PROCESSING_3RD_PARTY .down. SS
  WOV_MODULE .down. SS
  ACA_MODULE .down. SS
  OTHER_MODULES .down. SS
}

@enduml

Figure 43 Application Layer

Modules in Application Layer

The built-in modules are built together with base firmware and they have direct access to all firmware drivers and service APIs. When built-in module is enabled in configuration, it is guaranteed to exist in firmware binary.

The loadable modules are built separately from base firmware and they are loaded dynamically as a separate binary, depending on the host audio configuration. To build, use LMDK(Loadable Module Development Kit) which is standalone kit containing all required files.

All the application layer module access base firmware services are via the System Services ABI.

NOTE: The built-in modules are utility components provided by the base firmware/kernel.

Examples of built-in modules:

  • Audio built-in components: Copiers, Mixers, Volume, SRC, etc.

Example how to build a loadable module:

Probe

The probe module is special module in FW infrastructure that allows to inject or extract data from a specified probe point. The traditional client platforms use HDA DMAs to transfer data in and out of such module.

Loadable Modules

The loadable modules are build into separate binaries from the main SOF build. To communicate with them is used native system agent and to control is used module api Component & Module Interfaces.