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 */