ref: 55c0aa70d90735f744edddd0647a8e648db9bf06
parent: dce8fe1d141dd3912143feecdaebcd87374ef8e3
	author: Rob Sykes <robs@users.sourceforge.net>
	date: Mon May  7 06:35:24 EDT 2012
	
check that writable devices can actually be openned for writing, before selecting as the default device. Tested so far with pulseaudio fall-back to alsa; more testing required
--- a/src/sox.c
+++ b/src/sox.c
@@ -2511,19 +2511,37 @@
return name? from_env? from_env : name : NULL;
}
+static char const * try_device(char const * name)
+{+ sox_format_handler_t const * handler = sox_find_format(name, sox_false);
+  if (handler) {+ sox_format_t format, * ft = &format;
+ memset(ft, 0, sizeof(*ft));
+ ft->filename = (char *)device_name(name);
+ ft->priv = lsx_calloc(1, handler->priv_size);
+    if (handler->startwrite(ft) == SOX_SUCCESS) {+ handler->stopwrite(ft);
+ free(ft->priv);
+ return name;
+ }
+ free(ft->priv);
+ }
+ return NULL;
+}
+
static char const * set_default_device(file_t * f)
 {/* Default audio driver type in order of preference: */
   if (!f->filetype) f->filetype = getenv("AUDIODRIVER");-  if (!f->filetype && sox_find_format("coreaudio", sox_false)) f->filetype = "coreaudio";-  if (!f->filetype && sox_find_format("pulseaudio" , sox_false)) f->filetype = "pulseaudio";-  if (!f->filetype && sox_find_format("alsa", sox_false)) f->filetype = "alsa";-  if (!f->filetype && sox_find_format("waveaudio" , sox_false)) f->filetype = "waveaudio";-  if (!f->filetype && sox_find_format("sndio", sox_false)) f->filetype = "sndio";-  if (!f->filetype && sox_find_format("oss" , sox_false)) f->filetype = "oss";-  if (!f->filetype && sox_find_format("sunau",sox_false)) f->filetype = "sunau";-  if (!f->filetype && sox_find_format("ao"  , sox_false) && file_count) /*!rec*/- f->filetype = "ao";
+  if (!f->filetype) f->filetype = try_device("coreaudio");+  if (!f->filetype) f->filetype = try_device("pulseaudio");+  if (!f->filetype) f->filetype = try_device("alsa");+  if (!f->filetype) f->filetype = try_device("waveaudio");+  if (!f->filetype) f->filetype = try_device("sndio");+  if (!f->filetype) f->filetype = try_device("oss");+  if (!f->filetype) f->filetype = try_device("sunau");+ if (!f->filetype && file_count) /*!rec*/
+    f->filetype = try_device("ao");   if (!f->filetype) {     lsx_fail("Sorry, there is no default audio device configured");--
⑨