Update of /cvsroot/alsa/alsa-oss/oss-redir In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29266
Modified Files: oss-redir.c oss-redir.h Log Message: More complete code Index: oss-redir.c =================================================================== RCS file: /cvsroot/alsa/alsa-oss/oss-redir/oss-redir.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- oss-redir.c 9 Feb 2004 12:36:39 -0000 1.1 +++ oss-redir.c 9 Feb 2004 13:07:27 -0000 1.2 @@ -25,6 +25,7 @@ #include <sys/poll.h> #include <sys/ioctl.h> #include <sys/mman.h> +#include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> @@ -35,10 +36,14 @@ static int initialized = 0; static int native_oss = 1; +static int open_count = 0; static char hal[64]; +static void *dl_handle = NULL; -int (*oss_pcm_open)(const char *pathname, int flags, ...); -int (*oss_pcm_close)(int fd); +static void initialize(void); + +static int (*x_oss_pcm_open)(const char *pathname, int flags); +static int (*x_oss_pcm_close)(int fd); ssize_t (*oss_pcm_read)(int fd, void *buf, size_t count); ssize_t (*oss_pcm_write)(int fd, const void *buf, size_t count); void * (*oss_pcm_mmap)(void *start, size_t length, int prot, int flags, int fd, off_t offset); @@ -50,8 +55,8 @@ int (*oss_pcm_poll_prepare)(int fd, struct pollfd *ufds); int (*oss_pcm_poll_result)(int fd, struct pollfd *ufds); -int (*oss_mixer_open)(const char *pathname, int flags, ...); -int (*oss_mixer_close)(int fd); +static int (*x_oss_mixer_open)(const char *pathname, int flags); +static int (*x_oss_mixer_close)(int fd); int (*oss_mixer_ioctl)(int fd, unsigned long int request, ...); int native_pcm_select_prepare(int fd, fd_set *readfds, fd_set *writefds) @@ -107,7 +112,79 @@ return result; } -static void initialize() +static inline void check_initialized(void) +{ + if (!initialized) + initialize(); +} + +int oss_pcm_open(const char *pathname, int flags, ...) +{ + int result; + + check_initialized(); + if (native_oss) + return open(pathname, flags); + result = x_oss_pcm_open(pathname, flags); + if (result >= 0) { + open_count++; + } else { + if (open_count == 0) { + dlclose(dl_handle); + dl_handle = NULL; + } + } + return result; +} + +int oss_pcm_close(int fd) +{ + int result; + + if (native_oss) + return close(fd); + result = x_oss_pcm_close(fd); + if (--open_count) + dlclose(dl_handle); + return result; +} + +int oss_mixer_open(const char *pathname, int flags, ...) +{ + int result; + + check_initialized(); + if (native_oss) + return open(pathname, flags); + result = x_oss_mixer_open(pathname, flags); + if (result >= 0) { + open_count++; + } else { + if (open_count == 0) { + dlclose(dl_handle); + dl_handle = NULL; + } + } + return result; +} + +int oss_mixer_close(int fd) +{ + int result; + + if (fd < 0) + return -EINVAL; + if (native_oss) + return close(fd); + result = x_oss_mixer_close(fd); + if (--open_count) { + dlclose(dl_handle); + dl_handle = NULL; + } + return result; +} + +static void initialize(void) { char *s = getenv("OSS_REDIRECTOR"); if (s) { @@ -119,9 +196,8 @@ native_oss = 1; } if (native_oss) { - oss_pcm_open = open; - oss_pcm_close = close; - oss_pcm_read = read; + __native: + oss_pcm_read = read; oss_pcm_write = write; oss_pcm_mmap = mmap; oss_pcm_munmap = munmap; @@ -131,14 +207,29 @@ oss_pcm_poll_fds = native_pcm_poll_fds; oss_pcm_poll_prepare = native_pcm_poll_prepare; oss_pcm_poll_result = native_pcm_poll_result; - oss_mixer_open = open; - oss_mixer_close = close; oss_mixer_ioctl = ioctl; + } else { + dl_handle = dlopen(hal, RTLD_NOW); + if (dl_handle == NULL) { + fprintf(stderr, "ERROR: dlopen failed for sound (OSS) redirector: %s\n", dlerror()); + fprintf(stderr, " reverting to native OSS mode\n"); + native_oss = 1; + goto __native; + } + x_oss_pcm_open = dlsym(dl_handle, "lib_oss_pcm_open"); + x_oss_pcm_close = dlsym(dl_handle, "lib_oss_pcm_close"); + oss_pcm_read = dlsym(dl_handle, "lib_oss_pcm_read"); + oss_pcm_write = dlsym(dl_handle, "lib_oss_pcm_write"); + oss_pcm_mmap = dlsym(dl_handle, "lib_oss_pcm_mmap"); + oss_pcm_munmap = dlsym(dl_handle, "lib_oss_pcm_munmap"); + oss_pcm_ioctl = dlsym(dl_handle, "lib_oss_pcm_ioctl"); + oss_pcm_select_prepare = dlsym(dl_handle, "lib_oss_select_prepare"); + oss_pcm_select_result = dlsym(dl_handle, "lib_oss_select_result"); + oss_pcm_poll_fds = dlsym(dl_handle, "lib_oss_poll_fds"); + oss_pcm_poll_prepare = dlsym(dl_handle, "lib_oss_poll_prepare"); + oss_pcm_poll_result = dlsym(dl_handle, "lib_oss_poll_result"); + x_oss_mixer_open = dlsym(dl_handle, "lib_oss_mixer_open"); + x_oss_mixer_close = dlsym(dl_handle, "lib_oss_mixer_close"); + oss_mixer_ioctl = dlsym(dl_handle, "lib_oss_mixer_ioctl"); } } - -static inline void check_initialized(void) -{ - if (!initialized) - initialize(); -} Index: oss-redir.h =================================================================== RCS file: /cvsroot/alsa/alsa-oss/oss-redir/oss-redir.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- oss-redir.h 9 Feb 2004 12:36:39 -0000 1.1 +++ oss-redir.h 9 Feb 2004 13:07:27 -0000 1.2 @@ -28,8 +28,8 @@ #define OSS_WAIT_EVENT_READ (1<<0) #define OSS_WAIT_EVENT_WRITE (1<<1) -extern int (*oss_pcm_open)(const char *pathname, int flags, ...); -extern int (*oss_pcm_close)(int fd); +extern int oss_pcm_open(const char *pathname, int flags, ...); +extern int oss_pcm_close(int fd); extern ssize_t (*oss_pcm_read)(int fd, void *buf, size_t count); extern ssize_t (*oss_pcm_write)(int fd, const void *buf, size_t count); extern void * (*oss_pcm_mmap)(void *start, size_t length, int prot, int flags, int fd, off_t offset); @@ -41,8 +41,8 @@ extern int (*oss_pcm_poll_prepare)(int fd, struct pollfd *ufds); extern int (*oss_pcm_poll_result)(int fd, struct pollfd *ufds); -extern int (*oss_mixer_open)(const char *pathname, int flags, ...); -extern int (*oss_mixer_close)(int fd); +extern int oss_mixer_open(const char *pathname, int flags, ...); +extern int oss_mixer_close(int fd); extern int (*oss_mixer_ioctl)(int fd, unsigned long int request, ...); ------------------------------------------------------- The SF.Net email is sponsored by EclipseCon 2004 Premiere Conference on Open Tools Development and Integration See the breadth of Eclipse activity. February 3-5 in Anaheim, CA. http://www.eclipsecon.org/osdn _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog