summaryrefslogtreecommitdiffstats
path: root/templates/feature/agl-package-management
AgeCommit message (Collapse)AuthorFilesLines
2021-06-08Add agl-package-management featureScott Murray2-0/+10
Changes: - Move addition of package-management to IMAGE_FEATURES and associated package feed variables to a new agl-package-management feature template. The feature is not included by default in the base set. - To somewhat maintain the previous developer experience the new feature has been made a dependency of the agl-devel feature. In practice, the only images affected by this change are agl-image-minimal and agl-image-weston from meta-agl-core, the demo platform images in meta-agl have package management enabled by default. Bug-AGL: SPEC-3971 Signed-off-by: Scott Murray <scott.murray@konsulko.com> Change-Id: I56665e1cd82db19a697fdae2551a9276eab08961 Reviewed-on: https://gerrit.automotivelinux.org/gerrit/c/AGL/meta-agl/+/26393 Tested-by: Jenkins Job builder account ci-image-build: Jenkins Job builder account ci-image-boot-test: Jenkins Job builder account Reviewed-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
.highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
PipeWire Instrument Cluster IPC
===============================

This software component provides a communication link between applications
running in the Instrument Cluster container and the host container's PipeWire
daemon. It is useful when IC applications need to suspend sound output from the
host, temporarily, in order to play an emergency sound.

This component is tailored for use in containerized environments. For use in
an environment where the IC is a different host, additional work may be required.

## libicipc

Most of the functionality is implemented as a library, called `icipc`.

This library implements both the server-side and the client-side.
The server-side is meant to be used by the host, while the client-side is
to be used by the applications running in the IC guest.

The library implements a generic unix socket based communication mechanism
where a sender (client) can send any data buffer to the receiver (server).
The server is always required to respond.

```
  client  ------- REQUEST -------->  server
  client  <--- REPLY (OK/ERROR) ---  server
```

The server is also able to track the clients that are connected, individually.
When a client connects or disconnects, the server is notified.

The protocol used for communication is a binary serialization of data structures,
that aims to be compatible with PipeWire's spa_pod serialization mechanism,
which is used in PipeWire's native protocol. The implementation of this protocol
is kept private, for now, as it is not needed for the simple use case of sending
suspend/resume requests (see below).

## module-protocol-ic-ipc

The server-side component is built as a pipewire module, called
`libpipewire-module-protocol-ic-ipc`. It is meant to be executed on
a standalone pipewire instance, using the pipewire configuration file provided:
`pipewire-ic-ipc.conf`

To start the server manually, execute:
```
$ pipewire -c /absolute/path/to/pipewire-ic-ipc.conf
```

For convenience, systemd `.service` and `.socket` units are provided.

The server listens on a socket, which can be specified in the
`pipewire-ic-ipc.conf` file as an argument to the module. When launched via
systemd socket activation, the socket is passed on from systemd.

The path of the socket is determined by the same rules as the ones that PipeWire
uses for its socket. First, the `PIPEWIRE_RUNTIME_DIR` environment variable
is used. Then, `XDG_RUNTIME_DIR`, followed by `HOME`.

This server can accept two requests from its clients:

 * `SUSPEND`: This sets the `suspend.playback` metadata key on pipewire's
    main metadata object, which is then used by the session manager to suspend
    playback.
 * `RESUME`: This unsets the `suspend.playback` metadata key, reverting the
    actions of `SUSPEND`

When multiple clients send `SUSPEND`, the server keeps track of how many clients
have done this and expects an equal amount of `RESUME` requests before unsetting
the `suspend.playback` metadata key.

When a client sends `SUSPEND` and then disconnects without sending `RESUME`,
the server considers the disconnection event to be equivalent to a `RESUME`
request. Therefore, clients do not explicitly need to send `RESUME` before
disconnecting.

## icipc-client

This is an example client, which is provided for testing & demo purposes.
When launched, it presents a command prompt that accepts 2 commands:

 * `quit` - exits the client
 * `send <request_name>` - sends `<request_name>` to the server

To demo it with `libpipewire-module-protocol-ic-ipc` being the server, use:

 * `send SUSPEND` - suspend playback on the host
 * `send RESUME` - resume playback on the host

## Writing IC apps that use libicipc

IC apps that need to use this SUSPEND/RESUME mechanism for sound, should
directly use libicipc.

For API documentation, refer to `lib/client.h`. Clients should use only
the API provided in this file.

To link to libicipc, use the provided `icipc-0.1` pkg-config package:
```
$ pkg-config --cflags --libs icipc-0.1
```

By default, the libicipc library is built statically. If you wish to build
a dynamically linked version, pass the `-Ddefault_library=dynamic` option to
meson when compiling `pipewire-ic-ipc`

## Compilation & Running

To compile:
```
$ meson build
$ ninja -C build
```

To run tests:
```
$ ninja -C build test
... or ...
$ meson test -C build
```

To perform static code analysis using clang-tidy:
```
$ ninja -C build clang-tidy
```

### Depedencies

 * `libsystemd` is needed when building the library for the server-side
   (host-side) in order to integrate with systemd's socket-activation mechanism

No other dependencies are required. The code builds on top of the standard
C library only.