--- a/src/sox.c 2012-02-19 20:51:31.000000000 -0500 +++ b/src/sox.c 2012-05-19 13:49:32.465109560 -0400 @@ -2537,21 +2537,39 @@ 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"); exit(1);