## canberra

canberra — General libcanberra API

## Synopsis

    #define             CA_PROP_MEDIA_NAME
    #define             CA_PROP_MEDIA_TITLE
    #define             CA_PROP_MEDIA_ARTIST
    #define             CA_PROP_MEDIA_LANGUAGE
    #define             CA_PROP_MEDIA_FILENAME
    #define             CA_PROP_MEDIA_ICON
    #define             CA_PROP_MEDIA_ICON_NAME
    #define             CA_PROP_MEDIA_ROLE
    #define             CA_PROP_EVENT_ID
    #define             CA_PROP_EVENT_DESCRIPTION
    #define             CA_PROP_EVENT_MOUSE_X
    #define             CA_PROP_EVENT_MOUSE_Y
    #define             CA_PROP_EVENT_MOUSE_HPOS
    #define             CA_PROP_EVENT_MOUSE_VPOS
    #define             CA_PROP_EVENT_MOUSE_BUTTON
    #define             CA_PROP_WINDOW_NAME
    #define             CA_PROP_WINDOW_ID
    #define             CA_PROP_WINDOW_ICON
    #define             CA_PROP_WINDOW_ICON_NAME
    #define             CA_PROP_WINDOW_X11_DISPLAY
    #define             CA_PROP_WINDOW_X11_SCREEN
    #define             CA_PROP_WINDOW_X11_MONITOR
    #define             CA_PROP_WINDOW_X11_XID
    #define             CA_PROP_APPLICATION_NAME
    #define             CA_PROP_APPLICATION_ID
    #define             CA_PROP_APPLICATION_VERSION
    #define             CA_PROP_APPLICATION_ICON
    #define             CA_PROP_APPLICATION_ICON_NAME
    #define             CA_PROP_APPLICATION_LANGUAGE
    #define             CA_PROP_APPLICATION_PROCESS_ID
    #define             CA_PROP_APPLICATION_PROCESS_BINARY
    #define             CA_PROP_APPLICATION_PROCESS_USER
    #define             CA_PROP_APPLICATION_PROCESS_HOST
    #define             CA_PROP_CANBERRA_CACHE_CONTROL
    #define             CA_PROP_CANBERRA_VOLUME
    #define             CA_PROP_CANBERRA_XDG_THEME_NAME
    #define             CA_PROP_CANBERRA_XDG_THEME_OUTPUT_PROFILE

    typedef             ca_context;
    void                (*ca_finish_callback_t)             (ca_context *c,
                                                             uint32_t id,
                                                             int error_code,
                                                             void *userdata);
    int                 ca_context_create                   (ca_context **c);
    int                 ca_context_destroy                  (ca_context *c);
    int                 ca_context_open                     (ca_context *c);
    int                 ca_context_set_driver               (ca_context *c,
                                                             const char *driver);
    int                 ca_context_change_device            (ca_context *c,
                                                             const char *device);
    int                 ca_context_change_props             (ca_context *c,
                                                             ...);
    int                 ca_context_change_props_full        (ca_context *c,
                                                             ca_proplist *p);
    int                 ca_context_play                     (ca_context *c,
                                                             uint32_t id,
                                                             ...);
    int                 ca_context_play_full                (ca_context *c,
                                                             uint32_t id,
                                                             ca_proplist *p,
                                                             ca_finish_callback_t cb,
                                                             void *userdata);
    int                 ca_context_cancel                   (ca_context *c,
                                                             uint32_t id);
    int                 ca_context_cache                    (ca_context *c,
                                                             ...);
    int                 ca_context_cache_full               (ca_context *c,
                                                             ca_proplist *p);
    int                 ca_context_playing                  (ca_context *c,
                                                             uint32_t id,
                                                             int *playing);

    const char *        ca_strerror                         (int code);

    typedef             ca_proplist;
    int                 ca_proplist_create                  (ca_proplist **p);
    int                 ca_proplist_destroy                 (ca_proplist *p);
    int                 ca_proplist_sets                    (ca_proplist *p,
                                                             const char *key,
                                                             const char *value);
    int                 ca_proplist_setf                    (ca_proplist *p,
                                                             const char *key,
                                                             const char *format,
                                                             ...);
    int                 ca_proplist_set                     (ca_proplist *p,
                                                             const char *key,
                                                             const void *data,
                                                             size_t nbytes);

## Description

libcanberra defines a simple abstract interface for playing event sounds.

libcanberra relies on the XDG sound naming specification for identifying event sounds. On Unix/Linux the right sound to play is found via the mechanisms defined in the XDG sound themeing specification. On other systems the XDG sound name is translated to the native sound id for the operating system.

An event sound is triggered via libcanberra by calling the `ca_context_play()` function on a previously created ca_context object. The `ca_context_play()` takes a list of key-value pairs that describe the event sound to generate as closely as possible. The most important property is `CA_PROP_EVENT_ID` which defines the XDG sound name for the sound to play.

libcanberra is not a generic event abstraction system. It's only purpose is playing sounds -- however in a very elaborate way. As much information about the context the sound is triggered from shall be supplied to the sound system as possible, so that it can replace the sound with some other kind of feedback for a11y cases. Also this additional information can be used to enhance user experience (e.g. by positioning sounds in space depending on the place on the screen the sound was triggered from, and similar uses).

The set of properties defined for event sounds is extensible and shared with other audio systems, such as PulseAudio. Some of the properties that may be set are specific to an application, to a window, to an input event or to the media being played back.

The user can attach a set of properties to the context itself, which is than automatically inherited by each sample being played back. (`ca_context_change_props()`).

Some of the properties can be filled in by libcanberra or one of its backends automatically and thus need not be be filled in by the application (such as `CA_PROP_APPLICATION_PROCESS_ID` and friends). However the application can always overwrite any of these implicit properties.

libcanberra is thread-safe and OOM-safe (as far as the backend allows this). It is not async-signal safe.

Most libcanberra functions return an integer that indicates success when 0 (`CA_SUCCESS`) or an error when negative. In the latter case `ca_strerror()` can be used to convert this code into a human readable string.

libcanberra property names need to be in 7bit ASCII, string property values UTF8.

Optionally a libcanberra backend can support caching of sounds in a sound system. If this functionality is used, the latencies for event sound playback can be much smaller and fewer resources are needed to start playback. If a backend does not support cacheing, the respective functions will return an error code of `CA_ERROR_NOTSUPPORTED`.

It is highly recommended that the application sets the `CA_PROP_APPLICATION_NAME`, `CA_PROP_APPLICATION_ID`, `CA_PROP_APPLICATION_ICON_NAME`/`CA_PROP_APPLICATION_ICON` properties immediately after creating the ca_context, before calling `ca_context_open()` or `ca_context_play()`.

Its is highly recommended to pass at least `CA_PROP_EVENT_ID`, `CA_PROP_EVENT_DESCRIPTION` to `ca_context_play()` for each event sound generated. For sound events based on mouse inputs events `CA_PROP_EVENT_MOUSE_X`, `CA_PROP_EVENT_MOUSE_Y`, `CA_PROP_EVENT_MOUSE_HPOS`, `CA_PROP_EVENT_MOUSE_VPOS`, `CA_PROP_EVENT_MOUSE_BUTTON` should be passed. For sound events attached to a widget on the screen, the `CA_PROP_WINDOW_xxx` properties should be set.

## Details

### CA_PROP_MEDIA_NAME

    #define CA_PROP_MEDIA_NAME                         "media.name"

A name describing the media being played. Localized if possible and applicable.

### CA_PROP_MEDIA_TITLE

    #define CA_PROP_MEDIA_TITLE                        "media.title"

A (song) title describing the media being played. Localized if possible and applicable.

### CA_PROP_MEDIA_ARTIST

    #define CA_PROP_MEDIA_ARTIST                       "media.artist"

The artist of this media. Localized if possible and applicable.

### CA_PROP_MEDIA_LANGUAGE

    #define CA_PROP_MEDIA_LANGUAGE                     "media.language"

The language this media is in, in some standard POSIX locale string, such as "de_DE".

### CA_PROP_MEDIA_FILENAME

    #define CA_PROP_MEDIA_FILENAME                     "media.filename"

The file name this media was or can be loaded from.

### CA_PROP_MEDIA_ICON

    #define CA_PROP_MEDIA_ICON                         "media.icon"

An icon for this media in binary PNG format.

### CA_PROP_MEDIA_ICON_NAME

    #define CA_PROP_MEDIA_ICON_NAME                    "media.icon_name"

An icon name as defined in the XDG icon naming specifcation.

### CA_PROP_MEDIA_ROLE

    #define CA_PROP_MEDIA_ROLE                         "media.role"

The "role" this media is played in. For event sounds the string "event". For other cases strings like "music", "video", "game", ...

### CA_PROP_EVENT_ID

    #define CA_PROP_EVENT_ID                           "event.id"

A textual id for an event sound, as mandated by the XDG sound naming specification.

### CA_PROP_EVENT_DESCRIPTION

    #define CA_PROP_EVENT_DESCRIPTION                  "event.description"

A descriptive string for the sound event. Localized if possible and applicable.

### CA_PROP_EVENT_MOUSE_X

    #define CA_PROP_EVENT_MOUSE_X                      "event.mouse.x"

If this sound event was triggered by a mouse input event, the X position of the mouse cursor on the screen, formatted as string.

### CA_PROP_EVENT_MOUSE_Y

    #define CA_PROP_EVENT_MOUSE_Y                      "event.mouse.y"

If this sound event was triggered by a mouse input event, the Y position of the mouse cursor on the screen, formatted as string.

### CA_PROP_EVENT_MOUSE_HPOS

    #define CA_PROP_EVENT_MOUSE_HPOS                   "event.mouse.hpos"

If this sound event was triggered by a mouse input event, the X position of the mouse cursor as fractional value between 0 and 1, formatted as string, 0 reflecting the left side of the screen, 1 the right side.

### CA_PROP_EVENT_MOUSE_VPOS

    #define CA_PROP_EVENT_MOUSE_VPOS                   "event.mouse.vpos"

If this sound event was triggered by a mouse input event, the Y position of the mouse cursor as fractional value between 0 and 1, formatted as string, 0 reflecting the top end of the screen, 1 the bottom end.

### CA_PROP_EVENT_MOUSE_BUTTON

    #define CA_PROP_EVENT_MOUSE_BUTTON                 "event.mouse.button"

If this sound event was triggered by a mouse input event, the number of the mouse button that triggered it, formatted as string. 1 for left mouse button, 3 for right, 2 for middle.

### CA_PROP_WINDOW_NAME

    #define CA_PROP_WINDOW_NAME                        "window.name"

If this sound event was triggered by a window on the screen, the name of this window as human readable string.

### CA_PROP_WINDOW_ID

    #define CA_PROP_WINDOW_ID                          "window.id"

If this sound event was triggered by a window on the screen, some identification string for this window, so that the sound system can recognize specific windows.

### CA_PROP_WINDOW_ICON

    #define CA_PROP_WINDOW_ICON                        "window.icon"

If this sound event was triggered by a window on the screen, binary icon data in PNG format for this window.

### CA_PROP_WINDOW_ICON_NAME

    #define CA_PROP_WINDOW_ICON_NAME                   "window.icon_name"

If this sound event was triggered by a window on the screen, an icon name for this window, as defined in the XDG icon naming specification.

### CA_PROP_WINDOW_X11_DISPLAY

    #define CA_PROP_WINDOW_X11_DISPLAY                 "window.x11.display"

If this sound event was triggered by a window on the screen and the windowing system is X11, the X display name of the window (e.g. ":0").

### CA_PROP_WINDOW_X11_SCREEN

    #define CA_PROP_WINDOW_X11_SCREEN                  "window.x11.screen"

If this sound event was triggered by a window on the screen and the windowing system is X11, the X screen id of the window formatted as string (e.g. "0").

### CA_PROP_WINDOW_X11_MONITOR

    #define CA_PROP_WINDOW_X11_MONITOR                 "window.x11.monitor"

If this sound event was triggered by a window on the screen and the windowing system is X11, the X monitor id of the window formatted as string (e.g. "0").

### CA_PROP_WINDOW_X11_XID

    #define CA_PROP_WINDOW_X11_XID                     "window.x11.xid"

If this sound event was triggered by a window on the screen and the windowing system is X11, the XID of the window formatted as string.

### CA_PROP_APPLICATION_NAME

    #define CA_PROP_APPLICATION_NAME                   "application.name"

The name of the application this sound event was triggered by as human readable string. (e.g. "GNU Emacs") Localized if possible and applicable.

### CA_PROP_APPLICATION_ID

    #define CA_PROP_APPLICATION_ID                     "application.id"

An identifier for the program this sound event was triggered by. (e.g. "org.gnu.emacs").

### CA_PROP_APPLICATION_VERSION

    #define CA_PROP_APPLICATION_VERSION                "application.version"

A version number for the program this sound event was triggered by. (e.g. "22.2")

### CA_PROP_APPLICATION_ICON

    #define CA_PROP_APPLICATION_ICON                   "application.icon"

Binary icon data in PNG format for the application this sound event is triggered by.

### CA_PROP_APPLICATION_ICON_NAME

    #define CA_PROP_APPLICATION_ICON_NAME              "application.icon_name"

An icon name for the application this sound event is triggered by, as defined in the XDG icon naming specification.

### CA_PROP_APPLICATION_LANGUAGE

    #define CA_PROP_APPLICATION_LANGUAGE               "application.language"

The locale string the application that is triggering this sound event is running in. A POSIX locale string such as de_DE`euro`.

### CA_PROP_APPLICATION_PROCESS_ID

    #define CA_PROP_APPLICATION_PROCESS_ID             "application.process.id"

The unix PID of the process that is triggering this sound event, formatted as string.

### CA_PROP_APPLICATION_PROCESS_BINARY

    #define CA_PROP_APPLICATION_PROCESS_BINARY         "application.process.binary"

The path to the process binary of the process that is triggering this sound event.

### CA_PROP_APPLICATION_PROCESS_USER

    #define CA_PROP_APPLICATION_PROCESS_USER           "application.process.user"

The user that owns the process that is triggering this sound event.

### CA_PROP_APPLICATION_PROCESS_HOST

    #define CA_PROP_APPLICATION_PROCESS_HOST           "application.process.host"

The host name of the host the process that is triggering this sound event runs on.

### CA_PROP_CANBERRA_CACHE_CONTROL

    #define CA_PROP_CANBERRA_CACHE_CONTROL             "canberra.cache-control"

A special property that can be used to control the automatic sound caching of sounds in the sound server. One of "permanent", "volatile", "never". "permanent" will cause this sample to be cached in the server permanently. This is useful for very frequently used sound events such as those used for input feedback. "volatile" may be used for cacheing sounds in the sound server temporarily. They will expire after some time or on cache pressure. Finally, "never" may be used for sounds that should never be cached, because they are only generated very seldomly or even only once at most (such as desktop login sounds).

If this property is not explicitly passed to `ca_context_play()` it will default to "never". If it is not explicitly passed to `ca_context_cache()` it will default to "permanent".

If the list of properties is handed on to the sound server this property is stripped from it.

### CA_PROP_CANBERRA_VOLUME

    #define CA_PROP_CANBERRA_VOLUME                    "canberra.volume"

A special property that can be used to control the volume this sound event is played in if the backend supports it. A floating point value for the decibel multiplier for the sound. 0 dB relates to zero gain, and is the default volume these sounds are played in.

If the list of properties is handed on to the sound server this property is stripped from it.

### CA_PROP_CANBERRA_XDG_THEME_NAME

    #define CA_PROP_CANBERRA_XDG_THEME_NAME            "canberra.xdg-theme.name"

A special property that can be used to control the XDG sound theme that is used for this sample.

If the list of properties is handed on to the sound server this property is stripped from it.

### CA_PROP_CANBERRA_XDG_THEME_OUTPUT_PROFILE

    #define CA_PROP_CANBERRA_XDG_THEME_OUTPUT_PROFILE  "canberra.xdg-theme.output-profile"

A special property that can be used to control the XDG sound theme output profile that is used for this sample.

If the list of properties is handed on to the sound server this property is stripped from it.

### ca_context

    typedef struct ca_context ca_context;

A libcanberra context object.

### ca_finish_callback_t ()

    void                (*ca_finish_callback_t)             (ca_context *c,
                                                             uint32_t id,
                                                             int error_code,
                                                             void *userdata);

Playback completion event callback. The context this callback is called in is undefined, it might or might not be called from a background thread, and from any stack frame. The code implementing this function may not call any libcanberra API call from this callback -- this might result in a deadlock. Instead it may only be used to asynchronously signal some kind of notification object (semaphore, message queue, ...).

`c` : | The libcanberra context this callback is called for
`id` : | The numerical id passed to the `ca_context_play_full()` when starting the event sound playback.
`error_code` : | A numerical error code describing the reason this callback is called. If CA_SUCCESS is passed in the playback of the event sound was successfully completed.
`userdata` : | Some arbitrary user data the caller of `ca_context_play_full()` passed in.

### ca_context_create ()

    int                 ca_context_create                   (ca_context **c);

Create an (unconnected) context object. This call will not connect to the sound system, calling this function might even suceed if no working driver backend is available. To find out if one is available call `ca_context_open()`.

`c` : | A pointer wheere to fill in the newly created context object.
Returns : | 0 on success, negative error code on error.

### ca_context_destroy ()

    int                 ca_context_destroy                  (ca_context *c);

Destroy a (connected or unconnected) context object.

`c` : | the context to destroy.
Returns : | 0 on success, negative error code on error.

### ca_context_open ()

    int                 ca_context_open                     (ca_context *c);

Connect the context to the sound system. This call is implicitly called in `ca_context_play()` or `ca_context_cache()` if not called explicitly. It is recommended to initialize application properties with `ca_context_change_props()` before calling this function.

`c` : | the context to connect.
Returns : | 0 on success, negative error code on error.

### ca_context_set_driver ()

    int                 ca_context_set_driver               (ca_context *c,
                                                             const char *driver);

Specify the backend driver used. This function may not be called again after `ca_context_open()` suceeded. This function might suceed even when the specified driver backend is not available. Use `ca_context_open()` to find out whether the backend is available.

`c` : | the context to change the backend driver for
`driver` : | the backend driver to use (e.g. "alsa", "pulse", "null", ...)
Returns : | 0 on success, negative error code on error.

### ca_context_change_device ()

    int                 ca_context_change_device            (ca_context *c,
                                                             const char *device);

Specify the backend device to use. This function may be called not be called after `ca_context_open()` suceeded. This function might suceed even when the specified driver backend is not available. Use `ca_context_open()` to find out whether the backend is available

Depending on the backend use this might or might not cause all currently playing event sounds to be moved to the new device..

`c` : | the context to change the backend device for
`device` : | the backend device to use, in a format that is specific to the backend.
Returns : | 0 on success, negative error code on error.

### ca_context_change_props ()

    int                 ca_context_change_props             (ca_context *c,
                                                             ...);

Write one or more string properties to the context object. Requires final NULL sentinel. Properties set like this will be attached to both the client object of the sound server and to all event sounds played or cached. It is recommended to call this function at least once before calling `ca_context_open()`, so that the initial application properties are set properly before the initial connection to the sound system. This function can be called both before and after the `ca_context_open()` call. Properties that have already been set before will be overwritten.

`c` : | the context to set the properties on.
`...` : | the list of string pairs for the properties. Needs to be a NULL terminated list.
Returns : | 0 on success, negative error code on error.

### ca_context_change_props_full ()

    int                 ca_context_change_props_full        (ca_context *c,
                                                             ca_proplist *p);

Similar to `ca_context_change_props()`, but takes a ca_proplist instead of a variable list of properties. Can be used to set binary properties such as `CA_PROP_APPLICATION_ICON`.

`c` : | the context to set the properties on.
`p` : | the property list to set.
Returns : | 0 on success, negative error code on error.

### ca_context_play ()

    int                 ca_context_play                     (ca_context *c,
                                                             uint32_t id,
                                                             ...);

Play one event sound. id can be any numeric value which later can be used to cancel an event sound that is currently being played. You may use the same id twice or more times if you want to cancel multiple event sounds with a single `ca_context_cancel()` call at once. It is recommended to pass 0 for the id if the event sound shall never be canceled. If the requested sound is not cached in the server yet this call might result in the sample being uploaded temporarily or permanently (this may be controlled with `CA_PROP_CANBERRA_CACHE_CONTROL`). This function will start playback in the background. It will not wait until playback completed. Depending on the backend used a sound that is started shortly before your application terminates might or might not continue to play after your application terminated. If you want to make sure that all sounds finish to play you need to wait synchronously for the callback function of `ca_context_play_full()` to be called before you terminate your application.

The sample to play is identified by the `CA_PROP_EVENT_ID` property. If it is already cached in the server the cached version is played. The properties passed in this call are merged with the properties supplied when the sample was cached (if applicable) and the context properties as set with `ca_context_change_props()`.

If `CA_PROP_EVENT_ID` is not defined the sound file passed in the `CA_PROP_MEDIA_FILENAME` is played.

On Linux/Unix the right sound to play is determined according to `CA_PROP_EVENT_ID`, `CA_PROP_APPLICATION_LANGUAGE`/`CA_PROP_MEDIA_LANGUAGE`, the system locale, `CA_PROP_CANBERRA_XDG_THEME_NAME` and `CA_PROP_CANBERRA_XDG_THEME_OUTPUT_PROFILE`, following the XDG Sound Theming Specification. On non-Unix systems the native event sound that matches the XDG sound name in `CA_PROP_EVENT_ID` is played.

`c` : | the context to play the event sound on
`id` : | an integer id this sound can later be identified with when calling `ca_context_cancel()`
`...` : | additional properties for this sound event.
Returns : | 0 on success, negative error code on error.

### ca_context_play_full ()

    int                 ca_context_play_full                (ca_context *c,
                                                             uint32_t id,
                                                             ca_proplist *p,
                                                             ca_finish_callback_t cb,
                                                             void *userdata);

Play one event sound, and call the specified callback function when completed. See ca_finish_callback_t for the semantics the callback is called in. Also see `ca_context_play()`.

It is guaranteed that the callback is called exactly once if `ca_context_play_full()` returns CA_SUCCESS. You thus may safely pass allocated memory to the callback and assume that it is freed properly.

`c` : | the context to play the event sound on
`id` : | an integer id this sound can be later be identified with when calling `ca_context_cancel()` or when the callback is called.
`p` : | A property list of properties for this event sound
`cb` : | A callback to call when this sound event sucessfully finished playing or when an error occured during playback.
Returns : | 0 on success, negative error code on error.

### ca_context_cancel ()

    int                 ca_context_cancel                   (ca_context *c,
                                                             uint32_t id);

Cancel one or more event sounds that have been started via `ca_context_play()`. If the sound was started with `ca_context_play_full()` and a callback function was passed this might cause this function to be called with `CA_ERROR_CANCELED` as error code.

`c` : | the context to cancel the sounds on
`id` : | the id that identify the sounds to cancel.
Returns : | 0 on success, negative error code on error.

### ca_context_cache ()

    int                 ca_context_cache                    (ca_context *c,
                                                             ...);

Upload the specified sample into the audio server and attach the specified properties to it. This function will only return after the sample upload was finished.

The sound to cache is found with the same algorithm that is used to find the sounds for `ca_context_play()`.

If the backend doesn't support caching sound samples this function will return `CA_ERROR_NOTSUPPORTED`.

`c` : | The context to use for uploading.
`...` : | The properties for this event sound. Terminated with NULL.
Returns : | 0 on success, negative error code on error.

### ca_context_cache_full ()

    int                 ca_context_cache_full               (ca_context *c,
                                                             ca_proplist *p);

Upload the specified sample into the server and attach the specified properties to it. Similar to `ca_context_cache()` but takes a ca_proplist instead of a variable number of arguments.

If the backend doesn't support caching sound samples this function will return CA_ERROR_NOTSUPPORTED.

`c` : | The context to use for uploading.
`p` : | The property list for this event sound.
Returns : | 0 on success, negative error code on error.

### ca_context_playing ()

    int                 ca_context_playing                  (ca_context *c,
                                                             uint32_t id,
                                                             int *playing);

Check if at least one sound with the specified id is still playing. Returns 0 in *playing if no sound with this id is playing anymore or non-zero if there is at least one playing.

`c` : | the context to check if sound is still playing
`id` : | the id that identify the sounds to check
`playing` : | a pointer to a boolean that will be updated with the play status
Returns : | 0 on success, negative error code on error.

Since 0.16

### ca_strerror ()

    const char *        ca_strerror                         (int code);

Converts a numerical error code as returned by most libcanberra API functions into a human readable error string.

`code` : | Numerical error code as returned by a libcanberra API function
Returns : | a human readable error string.

### ca_proplist

    typedef struct ca_proplist ca_proplist;

A canberra property list object. Basically a hashtable.

### ca_proplist_create ()

    int                 ca_proplist_create                  (ca_proplist **p);

Allocate a new empty property list.

`p` : | A pointer where to fill in a pointer for the new property list.
Returns : | 0 on success, negative error code on error.

### ca_proplist_destroy ()

    int                 ca_proplist_destroy                 (ca_proplist *p);

Destroys a property list that was created with `ca_proplist_create()` earlier.

`p` : | The property list to destroy
Returns : | 0 on success, negative error code on error.

### ca_proplist_sets ()

    int                 ca_proplist_sets                    (ca_proplist *p,
                                                             const char *key,
                                                             const char *value);

Add a new string key/value pair to the property list.

`p` : | The property list to add this key/value pair to
`key` : | The key for this key/value pair
`value` : | The value for this key/value pair
Returns : | 0 on success, negative error code on error.

### ca_proplist_setf ()

    int                 ca_proplist_setf                    (ca_proplist *p,
                                                             const char *key,
                                                             const char *format,
                                                             ...);

Much like `ca_proplist_sets()`: add a new string key/value pair to the property list. Takes a standard C format string plus arguments and formats a string of it.

`p` : | The property list to add this key/value pair to
`key` : | The key for this key/value pair
`format` : | The format string for the value for this key/value pair
`...` : | The parameters for the format string
Returns : | 0 on success, negative error code on error.

### ca_proplist_set ()

    int                 ca_proplist_set                     (ca_proplist *p,
                                                             const char *key,
                                                             const void *data,
                                                             size_t nbytes);

Add a new binary key/value pair to the property list.

`p` : | The property list to add this key/value pair to
`key` : | The key for this key/value pair
`data` : | The binary value for this key value pair
`nbytes` : | The size of thebinary value for this key value pair.
Returns : | 0 on success, negative error code on error.