diff --git a/gnome-settings-daemon/ChangeLog b/gnome-settings-daemon/ChangeLog index 509b97ba7..922430a89 100644 --- a/gnome-settings-daemon/ChangeLog +++ b/gnome-settings-daemon/ChangeLog @@ -1,3 +1,10 @@ +2004-07-16 Bastien Nocera + + * actions/acme-volume-alsa.c: (acme_volume_alsa_finalize), + (acme_volume_alsa_close_real), (acme_volume_alsa_open), + (acme_volume_alsa_init): fix a crash when there aren't any ALSA mixers + (or soundcards) present on the system + 2004-07-15 Bastien Nocera * actions/acme-volume-oss.c: fix OSS compilation on NetBSD diff --git a/gnome-settings-daemon/actions/acme-volume-alsa.c b/gnome-settings-daemon/actions/acme-volume-alsa.c index 8bbcbd475..b6db06727 100644 --- a/gnome-settings-daemon/actions/acme-volume-alsa.c +++ b/gnome-settings-daemon/actions/acme-volume-alsa.c @@ -63,9 +63,6 @@ acme_volume_alsa_finalize (GObject *object) { AcmeVolumeAlsa *self; - g_return_if_fail (object != NULL); - g_return_if_fail (ACME_IS_VOLUME_ALSA (object)); - self = ACME_VOLUME_ALSA (object); if (self->_priv) @@ -78,6 +75,7 @@ acme_volume_alsa_finalize (GObject *object) acme_volume_alsa_close_real (self); g_free (self->_priv); + self->_priv = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); @@ -185,6 +183,9 @@ acme_volume_alsa_set_volume (AcmeVolume *vol, int val) static gboolean acme_volume_alsa_close_real (AcmeVolumeAlsa *self) { + if (self->_priv == NULL) + return FALSE; + if (self->_priv->handle != NULL) { snd_mixer_detach (self->_priv->handle, DEFAULT_CARD); @@ -268,7 +269,7 @@ acme_volume_alsa_open (AcmeVolumeAlsa *self) return TRUE; bail: - acme_volume_alsa_close (self); + acme_volume_alsa_close_real (self); return FALSE; } @@ -284,14 +285,17 @@ acme_volume_alsa_init (AcmeVolumeAlsa *self) { self->_priv = g_new0 (AcmeVolumeAlsaPrivate, 1); - acme_volume_alsa_open (self); - if (self->_priv->handle != NULL) { - acme_volume_alsa_close (self); + if (acme_volume_alsa_open (self) == FALSE) + { + g_free (self->_priv); + self->_priv = NULL; return; } - g_free (self->_priv); - self->_priv = NULL; + if (self->_priv->handle != NULL) { + acme_volume_alsa_close_real (self); + return; + } } static void