[pulseaudio-discuss] RFC: Configuration system
tanuk at iki.fi
Thu Apr 26 03:49:17 PDT 2012
I have written a proposal about a new configuration system to the wiki:
For easier commenting on the mailing list, I'll copy the wiki markup
= Configuration System =
Status: '''draft'''. This is the initial proposal by Tanu, so there may
be many opinions that are only held by him. The idea is to keep this
page as a reference while discussing the configuration system, and
record the results of the discussion here.
== Introduction ==
One of the [[Software/PulseAudio/GSoC2012|Google Summer of Code project
ideas for 2012]] was a "configuration system". The configuration system
was not among the selected projects, but the system was seen as a
priority, so the plan now is to design and implement the important bits
(the client API and the server-side infrastructure) ourselves within May
2012 or so (the reason for the tight schedule is that we'd like the GSoC
students to benefit from this new system). Porting the existing
configuration to the new system is not a matter of urgency. All the
existing stuff has to be kept in mind while doing the design, though, so
that the porting work is possible to do when that time comes.
The configuration system should make it easy to implement
runtime-modifiable persistent configuration options in the core and
modules. Currently that involves writing protocol extensions (for
multiple protocols, if you aim for completeness) and managing the data
storage yourself. The goal is to reduce that work, and also to make life
easier for applications.
There are some notes from previous discussion at
== Goals ==
* The client API should be easy to use.
* The set of supported configuration options should be easy to extend.
* No protocol extensions.
* Make it as easy as possible to add a new option.
* Support also other things than statically named global options.
* For example, options for ports requires dynamic keys to identify
* We want (or do we?) to support also persistent data that is less
configuration-like, like the stream-restore database or the equalizer
* Support change notifications both at client side and at server side.
* Support reading and modifying client.conf. (?)
== Design ==
The configuration system stores "options". Options have a value and a
(multi-part) identifier. The options need at least two pieces of
identification information: the object id and the option name. For
example, the maximum volume of a port could have object id
"foocard:barport" and option id "max-volume". Objects have also a type
(e.g. card, port, stream-restore entry). The object ids could have the
type information encoded into them, or the type could be a separate
identifier. A separate identifier is better, because otherwise you need
to store the known options for each object, while it would be easier and
more efficient to store the known options for the type of the objects.
So, option values can be referenced by giving three identifiers: object
type, object id and option name. These can be encoded in a single key
string (e.g. "core.Port/cardname:portname/max-volume") if so desired,
but the configuration system has to have concepts for these three
things. We might want to also have a type namespace concept, for example
to split the configuration into one file per namespace (core could have
its own namespace and each module could have theirs). In the client API
it's probably best to encode the namespace into the object type.
More information about the pulseaudio-discuss