kanberra

kanberra — General libkanberra API

Functions

Types and Values

Description

libkanberra defines a simple abstract interface for playing event sounds.

libkanberra 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 libkanberra by calling the ka_context_play() function on a previously created ka_context object. The ka_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 KA_PROP_EVENT_ID which defines the XDG sound name for the sound to play.

libkanberra 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. (ka_context_change_props()).

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

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

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

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

Optionally a libkanberra 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 KA_ERROR_NOTSUPPORTED.

It is highly recommended that the application sets the KA_PROP_APPLICATION_NAME, KA_PROP_APPLICATION_ID, KA_PROP_APPLICATION_ICON_NAME/KA_PROP_APPLICATION_ICON properties immediately after creating the ka_context, before calling ka_context_open() or ka_context_play().

Its is highly recommended to pass at least KA_PROP_EVENT_ID, KA_PROP_EVENT_DESCRIPTION to ka_context_play() for each event sound generated. For sound events based on mouse inputs events KA_PROP_EVENT_MOUSE_X, KA_PROP_EVENT_MOUSE_Y, KA_PROP_EVENT_MOUSE_HPOS, KA_PROP_EVENT_MOUSE_VPOS, KA_PROP_EVENT_MOUSE_BUTTON should be passed. For sound events attached to a widget on the screen, the KA_PROP_WINDOW_xxx properties should be set.

Functions

ka_finish_callback_t ()

void
(*ka_finish_callback_t) (ka_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 libkanberra 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, ...).

Parameters

c

The libkanberra context this callback is called for

 

id

The numerical id passed to the ka_context_play_full() when starting the event sound playback.

 

error_code

A numerical error code describing the reason this callback is called. If KA_SUCCESS is passed in the playback of the event sound was successfully completed.

 

userdata

Some arbitrary user data the caller of ka_context_play_full() passed in.

 

ka_context_create ()

int
ka_context_create (ka_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 ka_context_open().

Parameters

c

A pointer wheere to fill in the newly created context object.

 

Returns

0 on success, negative error code on error.


ka_context_destroy ()

int
ka_context_destroy (ka_context *c);

Destroy a (connected or unconnected) context object.

Parameters

c

the context to destroy.

 

Returns

0 on success, negative error code on error.


ka_context_open ()

int
ka_context_open (ka_context *c);

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

Parameters

c

the context to connect.

 

Returns

0 on success, negative error code on error.


ka_context_set_driver ()

int
ka_context_set_driver (ka_context *c,
                       const char *driver);

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

Parameters

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.


ka_context_change_device ()

int
ka_context_change_device (ka_context *c,
                          const char *device);

Specify the backend device to use. This function may be called not be called after ka_context_open() suceeded. This function might suceed even when the specified driver backend is not available. Use ka_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..

Parameters

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.


ka_context_change_props ()

int
ka_context_change_props (ka_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 ka_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 ka_context_open() call. Properties that have already been set before will be overwritten.

Parameters

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.


ka_context_change_props_full ()

int
ka_context_change_props_full (ka_context *c,
                              ka_proplist *p);

Similar to ka_context_change_props(), but takes a ka_proplist instead of a variable list of properties. Can be used to set binary properties such as KA_PROP_APPLICATION_ICON.

Parameters

c

the context to set the properties on.

 

p

the property list to set.

 

Returns

0 on success, negative error code on error.


ka_context_play ()

int
ka_context_play (ka_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 ka_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 KA_PROP_KANBERRA_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 ka_context_play_full() to be called before you terminate your application.

The sample to play is identified by the KA_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 ka_context_change_props().

If KA_PROP_EVENT_ID is not defined the sound file passed in the KA_PROP_MEDIA_FILENAME is played.

On Linux/Unix the right sound to play is determined according to KA_PROP_EVENT_ID, KA_PROP_APPLICATION_LANGUAGE/KA_PROP_MEDIA_LANGUAGE, the system locale, KA_PROP_KANBERRA_XDG_THEME_NAME and KA_PROP_KANBERRA_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 KA_PROP_EVENT_ID is played.

Parameters

c

the context to play the event sound on

 

id

an integer id this sound can later be identified with when calling ka_context_cancel()

 

...

additional properties for this sound event.

 

Returns

0 on success, negative error code on error.


ka_context_play_full ()

int
ka_context_play_full (ka_context *c,
                      uint32_t id,
                      ka_proplist *p,
                      ka_finish_callback_t cb,
                      void *userdata);

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

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

Parameters

c

the context to play the event sound on

 

id

an integer id this sound can be later be identified with when calling ka_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.


ka_context_cancel ()

int
ka_context_cancel (ka_context *c,
                   uint32_t id);

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

Parameters

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.


ka_context_cache ()

int
ka_context_cache (ka_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 ka_context_play().

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

Parameters

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.


ka_context_cache_full ()

int
ka_context_cache_full (ka_context *c,
                       ka_proplist *p);

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

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

Parameters

c

The context to use for uploading.

 

p

The property list for this event sound.

 

Returns

0 on success, negative error code on error.


ka_context_playing ()

int
ka_context_playing (ka_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.

Parameters

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


ka_strerror ()

const char *
ka_strerror (int code);

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

Parameters

code

Numerical error code as returned by a libkanberra API function

 

Returns

a human readable error string.


ka_proplist_create ()

int
ka_proplist_create (ka_proplist **p);

Allocate a new empty property list.

Parameters

p

A pointer where to fill in a pointer for the new property list.

 

Returns

0 on success, negative error code on error.


ka_proplist_destroy ()

int
ka_proplist_destroy (ka_proplist *p);

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

Parameters

p

The property list to destroy

 

Returns

0 on success, negative error code on error.


ka_proplist_sets ()

int
ka_proplist_sets (ka_proplist *p,
                  const char *key,
                  const char *value);

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

Parameters

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.


ka_proplist_setf ()

int
ka_proplist_setf (ka_proplist *p,
                  const char *key,
                  const char *format,
                  ...);

Much like ka_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.

Parameters

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.


ka_proplist_set ()

int
ka_proplist_set (ka_proplist *p,
                 const char *key,
                 const void *data,
                 size_t nbytes);

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

Parameters

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.

Types and Values

KA_PROP_MEDIA_NAME

#define KA_PROP_MEDIA_NAME                         "media.name"

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


KA_PROP_MEDIA_TITLE

#define KA_PROP_MEDIA_TITLE                        "media.title"

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


KA_PROP_MEDIA_ARTIST

#define KA_PROP_MEDIA_ARTIST                       "media.artist"

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


KA_PROP_MEDIA_LANGUAGE

#define KA_PROP_MEDIA_LANGUAGE                     "media.language"

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


KA_PROP_MEDIA_FILENAME

#define KA_PROP_MEDIA_FILENAME                     "media.filename"

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


KA_PROP_MEDIA_ICON

#define KA_PROP_MEDIA_ICON                         "media.icon"

An icon for this media in binary PNG format.


KA_PROP_MEDIA_ICON_NAME

#define KA_PROP_MEDIA_ICON_NAME                    "media.icon_name"

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


KA_PROP_MEDIA_ROLE

#define KA_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", ...


KA_PROP_EVENT_ID

#define KA_PROP_EVENT_ID                           "event.id"

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


KA_PROP_EVENT_DESCRIPTION

#define KA_PROP_EVENT_DESCRIPTION                  "event.description"

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


KA_PROP_EVENT_MOUSE_X

#define KA_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.


KA_PROP_EVENT_MOUSE_Y

#define KA_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.


KA_PROP_EVENT_MOUSE_HPOS

#define KA_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.


KA_PROP_EVENT_MOUSE_VPOS

#define KA_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.


KA_PROP_EVENT_MOUSE_BUTTON

#define KA_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.


KA_PROP_WINDOW_NAME

#define KA_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.


KA_PROP_WINDOW_ID

#define KA_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.


KA_PROP_WINDOW_ICON

#define KA_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.


KA_PROP_WINDOW_ICON_NAME

#define KA_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.


KA_PROP_WINDOW_X11_DISPLAY

#define KA_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").


KA_PROP_WINDOW_X11_SCREEN

#define KA_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").


KA_PROP_WINDOW_X11_MONITOR

#define KA_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").


KA_PROP_WINDOW_X11_XID

#define KA_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.


KA_PROP_APPLICATION_NAME

#define KA_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.


KA_PROP_APPLICATION_ID

#define KA_PROP_APPLICATION_ID                     "application.id"

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


KA_PROP_APPLICATION_VERSION

#define KA_PROP_APPLICATION_VERSION                "application.version"

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


KA_PROP_APPLICATION_ICON

#define KA_PROP_APPLICATION_ICON                   "application.icon"

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


KA_PROP_APPLICATION_ICON_NAME

#define KA_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.


KA_PROP_APPLICATION_LANGUAGE

#define KA_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_DEeuro .


KA_PROP_APPLICATION_PROCESS_ID

#define KA_PROP_APPLICATION_PROCESS_ID             "application.process.id"

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


KA_PROP_APPLICATION_PROCESS_BINARY

#define KA_PROP_APPLICATION_PROCESS_BINARY         "application.process.binary"

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


KA_PROP_APPLICATION_PROCESS_USER

#define KA_PROP_APPLICATION_PROCESS_USER           "application.process.user"

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


KA_PROP_APPLICATION_PROCESS_HOST

#define KA_PROP_APPLICATION_PROCESS_HOST           "application.process.host"

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


KA_PROP_KANBERRA_CACHE_CONTROL

#define KA_PROP_KANBERRA_CACHE_CONTROL             "kanberra.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 ka_context_play() it will default to "never". If it is not explicitly passed to ka_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.


KA_PROP_KANBERRA_VOLUME

#define KA_PROP_KANBERRA_VOLUME                    "kanberra.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.


KA_PROP_KANBERRA_XDG_THEME_NAME

#define KA_PROP_KANBERRA_XDG_THEME_NAME            "kanberra.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.


KA_PROP_KANBERRA_XDG_THEME_OUTPUT_PROFILE

#define KA_PROP_KANBERRA_XDG_THEME_OUTPUT_PROFILE  "kanberra.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.


struct ka_context

struct ka_context {
        ka_bool_t opened;
        ka_mutex *mutex;

        ka_proplist *props;

        char *driver;
        char *device;

        void *private;
#ifdef HAVE_DSO
        void *private_dso;
#endif
};

A libkanberra context object.


ka_proplist

typedef struct ka_proplist ka_proplist;

A kanberra property list object. Basically a hashtable.