Mercurial > pidgin.yaz
comparison pidgin/gtksound.c @ 22836:56a38b60576e
Kill off sound playing child processes if they are still around after 15
seconds, as they will be if we are piling up children due to blocking on
the audio device. This prevents a barrage of sounds when the device becomes
available.
author | Stu Tomlinson <stu@nosnilmot.com> |
---|---|
date | Wed, 07 May 2008 19:06:28 +0000 |
parents | cc8903c59d6b |
children | 5b27a807abf9 |
comparison
equal
deleted
inserted
replaced
22834:485689a88b61 | 22836:56a38b60576e |
---|---|
382 } | 382 } |
383 return TRUE; | 383 return TRUE; |
384 } | 384 } |
385 #endif | 385 #endif |
386 | 386 |
387 #ifndef _WIN32 | |
388 static gboolean | |
389 expire_old_child(gpointer data) | |
390 { | |
391 pid_t pid = GPOINTER_TO_INT(data); | |
392 | |
393 if (waitpid(pid, NULL, WNOHANG | WUNTRACED) < 0) { | |
394 if (errno == ECHILD) | |
395 return FALSE; | |
396 else | |
397 purple_debug_warning("gtksound", "Child is ill, pid: %d (%s)\n", pid, strerror(errno)); | |
398 } | |
399 | |
400 if (kill(pid, SIGKILL) < 0) | |
401 purple_debug_error("gtksound", "Killing process %d failed (%s)\n", pid, strerror(errno)); | |
402 | |
403 return FALSE; | |
404 } | |
405 #endif | |
406 | |
387 static void | 407 static void |
388 pidgin_sound_play_file(const char *filename) | 408 pidgin_sound_play_file(const char *filename) |
389 { | 409 { |
390 const char *method; | 410 const char *method; |
391 #ifdef USE_GSTREAMER | 411 #ifdef USE_GSTREAMER |
416 #ifndef _WIN32 | 436 #ifndef _WIN32 |
417 if (!strcmp(method, "custom")) { | 437 if (!strcmp(method, "custom")) { |
418 const char *sound_cmd; | 438 const char *sound_cmd; |
419 char *command; | 439 char *command; |
420 char *esc_filename; | 440 char *esc_filename; |
441 char **argv = NULL; | |
421 GError *error = NULL; | 442 GError *error = NULL; |
443 GPid pid; | |
422 | 444 |
423 sound_cmd = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/sound/command"); | 445 sound_cmd = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/sound/command"); |
424 | 446 |
425 if (!sound_cmd || *sound_cmd == '\0') { | 447 if (!sound_cmd || *sound_cmd == '\0') { |
426 purple_debug_error("gtksound", | 448 purple_debug_error("gtksound", |
434 if(strstr(sound_cmd, "%s")) | 456 if(strstr(sound_cmd, "%s")) |
435 command = purple_strreplace(sound_cmd, "%s", esc_filename); | 457 command = purple_strreplace(sound_cmd, "%s", esc_filename); |
436 else | 458 else |
437 command = g_strdup_printf("%s %s", sound_cmd, esc_filename); | 459 command = g_strdup_printf("%s %s", sound_cmd, esc_filename); |
438 | 460 |
439 if(!g_spawn_command_line_async(command, &error)) { | 461 if (!g_shell_parse_argv(command, NULL, &argv, &error)) { |
440 purple_debug_error("gtksound", "sound command could not be launched: %s\n", error->message); | 462 purple_debug_error("gtksound", "error parsing command %s (%s)\n", |
463 command, error->message); | |
441 g_error_free(error); | 464 g_error_free(error); |
442 } | 465 g_free(esc_filename); |
443 | 466 g_free(command); |
467 return; | |
468 } | |
469 | |
470 if (!g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, | |
471 NULL, NULL, &pid, &error)) { | |
472 purple_debug_error("gtksound", "sound command could not be launched: %s\n", | |
473 error->message); | |
474 g_error_free(error); | |
475 } else { | |
476 purple_timeout_add_seconds(15, expire_old_child, GINT_TO_POINTER(pid)); | |
477 } | |
478 | |
479 g_strfreev(argv); | |
444 g_free(esc_filename); | 480 g_free(esc_filename); |
445 g_free(command); | 481 g_free(command); |
446 return; | 482 return; |
447 } | 483 } |
448 #endif /* _WIN32 */ | 484 #endif /* _WIN32 */ |