| ![[Previous]](../prev.gif) | ![[Contents]](../contents.gif) | ![[Index]](../keyword_index.gif) | ![[Next]](../next.gif) | 
List of mixer callback functions
typedef struct snd_mixer_callbacks {
    void *private_data; /* should be used with an application */
    void (*rebuild) (void *private_data);
    void (*element) (void *private_data, int cmd,
                     snd_mixer_eid_t *eid);
    void (*group) (void *private_data, int cmd,
                   snd_mixer_gid_t *gid);
    void *reserved[28]; /* reserved for future use - must be NULL!!! */
} snd_mixer_callbacks_t;
The snd_mixer_callbacks_t structure defines a list of callbacks that you can provide to handle events read by snd_mixer_read(). The members include:
|  | Make sure that you zero-fill any members that you aren't interested in. You can zero-fill the entire snd_mixer_callbacks_t structure if you aren't interested in tracking any of these events. The wave.c example does this. | 
The rebuild callback is called whenever the mixer is rebuilt. Its only argument is the private_data that you specified in this structure.
The element callback is called whenever an element event occurs. The arguments to this function are:
The group callback is called whenever a group event occurs. The arguments are:
static void
mixer_callback_group (void *private_data, int cmd, snd_mixer_gid_t * gid)
{
    Control_t *control, *prev;
    PtWidget_t *above_wgt;
    int     i;
    switch (cmd)
    {
    case SND_MIXER_READ_GROUP_VALUE:
        for (control = control_head; control; control = control->next)
        {
            if (strcmp (control->group.gid.name, gid->name) == 0 &&
                control->group.gid.index == gid->index)
            {
                if (snd_mixer_group_read (mixer_handle, &control->group) == 0)
                    base_update_control (control, NULL);
            }
        }
        break;
    case SND_MIXER_READ_GROUP_ADD:
        if ((control = mixer_create_control (gid, control_tail)))
        {
            if (control->group.caps & SND_MIXER_GRPCAP_PLAY_GRP)
                above_wgt = PtWidgetBrotherBehind (ABW_base_capture_pane);
            else
                above_wgt = PtWidgetBrotherBehind (ABW_base_status);
            PtContainerHold (ABW_base_controls);
            base_create_control (ABW_base_controls, &above_wgt, control);
            PtContainerRelease (ABW_base_controls);
        }
        break;
    case SND_MIXER_READ_GROUP_REMOVE:
        for (prev = NULL, control = control_head; control; 
                            prev = control, control = control->next)
        {
            if (strcmp (control->group.gid.name, gid->name) == 0 &&
                control->group.gid.index == gid->index)
                mixer_delete_control (control, prev);
        }
        break;
    }
}
int
mixer_update (int fd, void *data, unsigned mode)
{
    snd_mixer_callbacks_t callbacks = { 0, 0, 0, 0 };
    callbacks.group = mixer_callback_group;
    snd_mixer_read (mixer_handle, &callbacks);
    return (Pt_CONTINUE);
}
QNX Neutrino
snd_mixer_eid_t, snd_mixer_gid_t, snd_mixer_read()
| ![[Previous]](../prev.gif) | ![[Contents]](../contents.gif) | ![[Index]](../keyword_index.gif) | ![[Next]](../next.gif) |