--- sourceforge.net/trunk/rdesktop/rdpsnd.c 2006/09/17 20:06:37 1265 +++ sourceforge.net/trunk/rdesktop/rdpsnd.c 2006/10/19 11:27:40 1298 @@ -19,6 +19,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include + #include "rdesktop.h" #include "rdpsnd.h" #include "rdpsnd_dsp.h" @@ -276,38 +278,37 @@ } } -BOOL -rdpsnd_init(void) -{ - rdpsnd_channel = - channel_register("rdpsnd", CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP, - rdpsnd_process); - - return (rdpsnd_channel != NULL); -} - -BOOL +static BOOL rdpsnd_auto_open(void) { - current_driver = drivers; - while (current_driver != NULL) + static BOOL failed = False; + + if (!failed) { - DEBUG(("trying %s...\n", current_driver->name)); - if (current_driver->wave_out_open()) + struct audio_driver *auto_driver = current_driver; + + current_driver = drivers; + while (current_driver != NULL) { - DEBUG(("selected %s\n", current_driver->name)); - return True; + DEBUG(("trying %s...\n", current_driver->name)); + if (current_driver->wave_out_open()) + { + DEBUG(("selected %s\n", current_driver->name)); + return True; + } + g_dsp_fd = 0; + current_driver = current_driver->next; } - g_dsp_fd = 0; - current_driver = current_driver->next; - } - warning("no working audio-driver found\n"); + warning("no working audio-driver found\n"); + failed = True; + current_driver = auto_driver; + } return False; } -void +static void rdpsnd_register_drivers(char *options) { struct audio_driver **reg; @@ -317,33 +318,67 @@ reg = &drivers; #if defined(RDPSND_ALSA) *reg = alsa_register(options); + assert(*reg); reg = &((*reg)->next); #endif #if defined(RDPSND_SUN) *reg = sun_register(options); + assert(*reg); reg = &((*reg)->next); #endif #if defined(RDPSND_OSS) *reg = oss_register(options); + assert(*reg); reg = &((*reg)->next); #endif #if defined(RDPSND_SGI) *reg = sgi_register(options); + assert(*reg); reg = &((*reg)->next); #endif #if defined(RDPSND_LIBAO) *reg = libao_register(options); + assert(*reg); reg = &((*reg)->next); #endif } BOOL -rdpsnd_select_driver(char *driver, char *options) +rdpsnd_init(char *optarg) { static struct audio_driver auto_driver; struct audio_driver *pos; + char *driver = NULL, *options = NULL; drivers = NULL; + + rdpsnd_channel = + channel_register("rdpsnd", CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP, + rdpsnd_process); + + if (rdpsnd_channel == NULL) + { + error("channel_register\n"); + return False; + } + + if (optarg != NULL && strlen(optarg) > 0) + { + driver = options = optarg; + + while (*options != '\0' && *options != ':') + options++; + + if (*options == ':') + { + *options = '\0'; + options++; + } + + if (*options == '\0') + options = NULL; + } + rdpsnd_register_drivers(options); if (!driver) @@ -382,13 +417,13 @@ } } -inline void +void rdpsnd_play(void) { current_driver->wave_out_play(); } -void +inline void rdpsnd_queue_write(STREAM s, uint16 tick, uint8 index) { struct audio_packet *packet = &packet_queue[queue_hi];