]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Fixed handle_events
authorAbramo Bagnara <abramo@alsa-project.org>
Sun, 11 Feb 2001 17:46:03 +0000 (17:46 +0000)
committerAbramo Bagnara <abramo@alsa-project.org>
Sun, 11 Feb 2001 17:46:03 +0000 (17:46 +0000)
src/control/control_hw.c
src/control/hcontrol.c
src/mixer/mixer.c
src/mixer/mixer_local.h

index 81af011a67064a7a70558342083e057c1b63e0b8..09a9cdd03a863c1ea1695c61bdea0eea4b3f09af 100644 (file)
@@ -220,7 +220,7 @@ static int snd_ctl_hw_read(snd_ctl_t *handle, snd_ctl_event_t *event)
        snd_ctl_hw_t *hw = handle->private_data;
        ssize_t res = read(hw->fd, event, sizeof(*event));
        if (res <= 0)
-               return res;
+               return -errno;
        assert(res == sizeof(*event));
        return 1;
 }
index 55748e2eb211a6c080ef067dfc2cc539e93546ca..323feaf0685676018f0ee7197d7e0ee4a915967d 100644 (file)
@@ -491,17 +491,20 @@ int snd_hctl_handle_events(snd_hctl_t *hctl)
 {
        snd_ctl_event_t event;
        int res;
+       unsigned int count = 0;
        
        assert(hctl);
        assert(hctl->ctl);
-       while ((res = snd_ctl_read(hctl->ctl, &event)) != 0) {
+       while ((res = snd_ctl_read(hctl->ctl, &event)) != 0 &&
+              res != -EAGAIN) {
                if (res < 0)
                        return res;
                res = snd_hctl_handle_event(hctl, &event);
                if (res < 0)
                        return res;
+               count++;
        }
-       return 0;
+       return count;
 }
 
 int snd_hctl_elem_info(snd_hctl_elem_t *elem, snd_ctl_elem_info_t *info)
index c99ff686e50e582e0bd94e3542f5b55f47875bdd..ebd339ae15df56a8bb0eb789b2e1028fa8ce89b1 100644 (file)
@@ -200,6 +200,7 @@ int snd_mixer_detach(snd_mixer_t *mixer, const char *name)
 int snd_mixer_throw_event(snd_mixer_t *mixer, snd_ctl_event_type_t event,
                          snd_mixer_elem_t *elem)
 {
+       mixer->events++;
        if (mixer->callback)
                return mixer->callback(mixer, event, elem);
        return 0;
@@ -208,6 +209,7 @@ int snd_mixer_throw_event(snd_mixer_t *mixer, snd_ctl_event_type_t event,
 int snd_mixer_elem_throw_event(snd_mixer_elem_t *elem,
                               snd_ctl_event_type_t event)
 {
+       elem->class->mixer->events++;
        if (elem->callback)
                return elem->callback(elem, event);
        return 0;
@@ -379,6 +381,7 @@ int snd_mixer_handle_events(snd_mixer_t *mixer)
 {
        struct list_head *pos, *next;
        assert(mixer);
+       mixer->events = 0;
        list_for_each(pos, next, &mixer->slaves) {
                int err;
                snd_mixer_slave_t *s;
@@ -387,6 +390,6 @@ int snd_mixer_handle_events(snd_mixer_t *mixer)
                if (err < 0)
                        return err;
        }
-       return 0;
+       return mixer->events;
 }
 
index f779476b8c8d82b2acf3b03524676bd1cced31c1..17eabd9f3ff12863abb8d3a8af3bad4061e974e9 100644 (file)
@@ -65,8 +65,8 @@ struct _snd_mixer {
        struct list_head slaves;        /* list of all slaves */
        struct list_head classes;       /* list of all elem classes */
        struct list_head elems;         /* list of all elems */
-       
        unsigned int count;
+       unsigned int events;
        snd_mixer_callback_t callback;
        void *callback_private;
 };