[PATCH] Make snd_hctl_wait() respect the API

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



snd_hctl_wait() currently makes a lot of assumptions that fall outside
the defined API. snd_pcm_wait(), however, follows the API nicely so the
new version is based on that.

Signed-off-by: Pierre Ossman <ossman@xxxxxxxxx>

Index: hcontrol.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/control/hcontrol.c,v
retrieving revision 1.37
diff -u -r1.37 hcontrol.c
--- hcontrol.c	27 Feb 2006 09:58:32 -0000	1.37
+++ hcontrol.c	25 May 2006 22:52:59 -0000
@@ -657,22 +657,52 @@
  * \brief Wait for a HCTL to become ready (i.e. at least one event pending)
  * \param hctl HCTL handle
  * \param timeout maximum time in milliseconds to wait
- * \return 0 otherwise a negative error code on failure
+ * \return a positive value on success otherwise a negative error code
+ * \retval 0 timeout occurred
+ * \retval 1 an event is pending
  */
 int snd_hctl_wait(snd_hctl_t *hctl, int timeout)
 {
-	struct pollfd pfd;
-	int err;
-	err = snd_hctl_poll_descriptors(hctl, &pfd, 1);
+	struct pollfd *pfd;
+	unsigned short *revents;
+	int i, npfds, pollio, err, err_poll;
+	
+	npfds = snd_hctl_poll_descriptors_count(hctl);
+	if (npfds <= 0 || npfds >= 16) {
+		SNDERR("Invalid poll_fds %d\n", npfds);
+		return -EIO;
+	}
+	pfd = alloca(sizeof(*pfd) * npfds);
+	revents = alloca(sizeof(*revents) * npfds);
+	err = snd_hctl_poll_descriptors(hctl, pfd, npfds);
 	if (err < 0)
 		return err;
-	if (! err)
-		return 0;
-	assert(err == 1);
-	err = poll(&pfd, 1, timeout);
-	if (err < 0)
-		return -errno;
-	return 0;
+	if (err != npfds) {
+		SNDMSG("invalid poll descriptors %d\n", err);
+		return -EIO;
+	}
+	do {
+		pollio = 0;
+		err_poll = poll(pfd, npfds, timeout);
+		if (err_poll < 0) {
+			if (errno == EINTR)
+				continue;
+			return -errno;
+		}
+		if (! err_poll)
+			break;
+		err = snd_hctl_poll_descriptors_revents(hctl, pfd, npfds, revents);
+		if (err < 0)
+			return err;
+		for (i = 0; i < npfds; i++) {
+			if (revents[i] & (POLLERR | POLLNVAL))
+				return -EIO;
+			if ((revents[i] & (POLLIN | POLLOUT)) == 0)
+				continue;
+			pollio++;
+		}
+	} while (! pollio);
+	return err_poll > 0 ? 1 : 0;
 }
 
 /**

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/alsa-devel

[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux