chiark / gitweb /
Only report failure to find OSS devices once, not every time we think
[disorder] / server / speaker-oss.c
index f9a298cc0d26a28af71a7bad8fe26ebabca8b591..36ef4a85c250b9b91b5acdc41cd663575004b15d 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * This file is part of DisOrder
 /*
  * This file is part of DisOrder
- * Copyright (C) 2007 Richard Kettlewell
+ * Copyright (C) 2007, 2008 Richard Kettlewell
+ * Portions copyright (C) 2007 Ross Younger
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -71,6 +72,15 @@ static void oss_activate(void) {
        device = "/dev/dsp";
       else if(access("/dev/audio", W_OK) == 0)
        device = "/dev/audio";
        device = "/dev/dsp";
       else if(access("/dev/audio", W_OK) == 0)
        device = "/dev/audio";
+      else {
+        static int reported;
+        
+        if(!reported) {
+          error(0, "cannot determine default OSS device");
+          reported = 1;
+        }
+        goto failed;
+      }
     } else
       device = config->device; /* just believe the user */
     /* Open the device */
     } else
       device = config->device; /* just believe the user */
     /* Open the device */
@@ -111,8 +121,10 @@ static void oss_activate(void) {
   return;
 failed:
   device_state = device_error;
   return;
 failed:
   device_state = device_error;
-  if(ossfd >= 0)
+  if(ossfd >= 0) {
     xclose(ossfd);
     xclose(ossfd);
+    ossfd = -1;
+  }
 }
 
 /** @brief Play via OSS */
 }
 
 /** @brief Play via OSS */
@@ -136,7 +148,7 @@ static size_t oss_play(size_t frames) {
 static int oss_slot;
 
 /** @brief Fill in poll fd array for OSS */
 static int oss_slot;
 
 /** @brief Fill in poll fd array for OSS */
-static void oss_beforepoll(void) {
+static void oss_beforepoll(int attribute((unused)) *timeoutp) {
   oss_slot = addfd(ossfd, POLLOUT|POLLERR);
 }
 
   oss_slot = addfd(ossfd, POLLOUT|POLLERR);
 }