libgnome r3752 - in trunk: . libgnome
- From: fejj svn gnome org
- To: svn-commits-list gnome org
- Subject: libgnome r3752 - in trunk: . libgnome
- Date: Tue, 15 Jul 2008 16:48:53 +0000 (UTC)
Author: fejj
Date: Tue Jul 15 16:48:53 2008
New Revision: 3752
URL: http://svn.gnome.org/viewvc/libgnome?rev=3752&view=rev
Log:
2008-07-09 Jeffrey Stedfast <fejj novell com>
* libgnome/gnome-sound.c (gnome_sound_sample_load): Poll the esd
connection to check that it's still alive. Set it to -1 if it's
not.
(gnome_sound_play): Make sure the connection is still alive before
trying to play the sound file.
Modified:
trunk/ChangeLog
trunk/libgnome/gnome-sound.c
Modified: trunk/libgnome/gnome-sound.c
==============================================================================
--- trunk/libgnome/gnome-sound.c (original)
+++ trunk/libgnome/gnome-sound.c Tue Jul 15 16:48:53 2008
@@ -30,8 +30,12 @@
#include <stdio.h>
#include <stdlib.h>
+#include <sys/types.h>
#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
#include <time.h>
+#include <poll.h>
#ifdef HAVE_ESD
#include <esd.h>
@@ -413,6 +417,55 @@
}
#endif
+#ifdef HAVE_ESD
+static int
+send_all (int fd, const char *buf, size_t buflen)
+{
+ struct pollfd pfd[1];
+ size_t nwritten = 0;
+ int flags, rv;
+ ssize_t n;
+
+ if ((flags = fcntl (fd, F_GETFL)) == -1)
+ return -1;
+
+ fcntl (fd, F_SETFL, flags | O_NONBLOCK);
+
+ pfd[0].events = POLLOUT;
+ pfd[0].fd = fd;
+
+ do {
+ do {
+ pfd[0].revents = 0;
+ rv = poll (pfd, 1, 100);
+ } while (rv == -1 && errno == EINTR);
+
+ if (pfd[0].revents & POLLOUT) {
+ /* socket is ready for writing */
+ do {
+ n = write (fd, buf + nwritten, buflen - nwritten);
+ } while (n == -1 && errno == EINTR);
+
+ if (n > 0)
+ nwritten += n;
+ } else if (pfd[0].revents & (POLLERR | POLLHUP)) {
+ /* we /just/ lost the esd connection */
+ esd_close (fd);
+ fd = -1;
+ break;
+ } else if (rv == -1 && errno == EBADF) {
+ /* socket is bad */
+ fd = -1;
+ break;
+ }
+ } while (nwritten < buflen);
+
+ if (fd != -1 && flags != -1)
+ fcntl (fd, F_SETFL, flags);
+
+ return fd;
+}
+#endif
/**
* gnome_sound_sample_load:
@@ -469,21 +522,23 @@
* file, or event type, for later identification */
s->id = esd_sample_cache (gnome_sound_connection, s->format, s->rate,
size, (char *)sample_name);
- write (gnome_sound_connection, s->data, size);
- confirm = esd_confirm_sample_cache (gnome_sound_connection);
+
+ gnome_sound_connection = send_all (gnome_sound_connection, (const char *) s->data, size);
+ if (gnome_sound_connection != -1)
+ confirm = esd_confirm_sample_cache (gnome_sound_connection);
+
if (s->id <= 0 || confirm != s->id)
{
g_warning ("error caching sample <%d>!\n", s->id);
s->id = 0;
}
- g_free (s->data);
- s->data = NULL;
}
}
sample_id = s->id;
- g_free(s->data); g_free(s);
+ g_free(s->data);
+ g_free(s);
return sample_id;
#else
@@ -521,9 +576,12 @@
sample = gnome_sound_sample_load (buf, filename);
- esd_sample_play(gnome_sound_connection, sample);
- fsync (gnome_sound_connection);
- esd_sample_free(gnome_sound_connection, sample);
+ if (gnome_sound_connection != -1 && sample > 0)
+ {
+ esd_sample_play(gnome_sound_connection, sample);
+ fsync (gnome_sound_connection);
+ esd_sample_free(gnome_sound_connection, sample);
+ }
#endif
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]