ossaudio: do not use global variables
Signed-off-by: Kővágó, Zoltán <DirtY.iCE.hu@gmail.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
		
							parent
							
								
									765b37da3f
								
							
						
					
					
						commit
						4045a85ad1
					
				
							
								
								
									
										110
									
								
								audio/ossaudio.c
									
									
									
									
									
								
							
							
						
						
									
										110
									
								
								audio/ossaudio.c
									
									
									
									
									
								
							@ -38,6 +38,17 @@
 | 
				
			|||||||
#define USE_DSP_POLICY
 | 
					#define USE_DSP_POLICY
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct OSSConf {
 | 
				
			||||||
 | 
					    int try_mmap;
 | 
				
			||||||
 | 
					    int nfrags;
 | 
				
			||||||
 | 
					    int fragsize;
 | 
				
			||||||
 | 
					    const char *devpath_out;
 | 
				
			||||||
 | 
					    const char *devpath_in;
 | 
				
			||||||
 | 
					    int debug;
 | 
				
			||||||
 | 
					    int exclusive;
 | 
				
			||||||
 | 
					    int policy;
 | 
				
			||||||
 | 
					} OSSConf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct OSSVoiceOut {
 | 
					typedef struct OSSVoiceOut {
 | 
				
			||||||
    HWVoiceOut hw;
 | 
					    HWVoiceOut hw;
 | 
				
			||||||
    void *pcm_buf;
 | 
					    void *pcm_buf;
 | 
				
			||||||
@ -47,6 +58,7 @@ typedef struct OSSVoiceOut {
 | 
				
			|||||||
    int fragsize;
 | 
					    int fragsize;
 | 
				
			||||||
    int mmapped;
 | 
					    int mmapped;
 | 
				
			||||||
    int pending;
 | 
					    int pending;
 | 
				
			||||||
 | 
					    OSSConf *conf;
 | 
				
			||||||
} OSSVoiceOut;
 | 
					} OSSVoiceOut;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct OSSVoiceIn {
 | 
					typedef struct OSSVoiceIn {
 | 
				
			||||||
@ -55,28 +67,9 @@ typedef struct OSSVoiceIn {
 | 
				
			|||||||
    int fd;
 | 
					    int fd;
 | 
				
			||||||
    int nfrags;
 | 
					    int nfrags;
 | 
				
			||||||
    int fragsize;
 | 
					    int fragsize;
 | 
				
			||||||
 | 
					    OSSConf *conf;
 | 
				
			||||||
} OSSVoiceIn;
 | 
					} OSSVoiceIn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct {
 | 
					 | 
				
			||||||
    int try_mmap;
 | 
					 | 
				
			||||||
    int nfrags;
 | 
					 | 
				
			||||||
    int fragsize;
 | 
					 | 
				
			||||||
    const char *devpath_out;
 | 
					 | 
				
			||||||
    const char *devpath_in;
 | 
					 | 
				
			||||||
    int debug;
 | 
					 | 
				
			||||||
    int exclusive;
 | 
					 | 
				
			||||||
    int policy;
 | 
					 | 
				
			||||||
} conf = {
 | 
					 | 
				
			||||||
    .try_mmap = 0,
 | 
					 | 
				
			||||||
    .nfrags = 4,
 | 
					 | 
				
			||||||
    .fragsize = 4096,
 | 
					 | 
				
			||||||
    .devpath_out = "/dev/dsp",
 | 
					 | 
				
			||||||
    .devpath_in = "/dev/dsp",
 | 
					 | 
				
			||||||
    .debug = 0,
 | 
					 | 
				
			||||||
    .exclusive = 0,
 | 
					 | 
				
			||||||
    .policy = 5
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct oss_params {
 | 
					struct oss_params {
 | 
				
			||||||
    int freq;
 | 
					    int freq;
 | 
				
			||||||
    audfmt_e fmt;
 | 
					    audfmt_e fmt;
 | 
				
			||||||
@ -272,18 +265,18 @@ static int oss_get_version (int fd, int *version, const char *typ)
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int oss_open (int in, struct oss_params *req,
 | 
					static int oss_open (int in, struct oss_params *req,
 | 
				
			||||||
                     struct oss_params *obt, int *pfd)
 | 
					                     struct oss_params *obt, int *pfd, OSSConf* conf)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int fd;
 | 
					    int fd;
 | 
				
			||||||
    int oflags = conf.exclusive ? O_EXCL : 0;
 | 
					    int oflags = conf->exclusive ? O_EXCL : 0;
 | 
				
			||||||
    audio_buf_info abinfo;
 | 
					    audio_buf_info abinfo;
 | 
				
			||||||
    int fmt, freq, nchannels;
 | 
					    int fmt, freq, nchannels;
 | 
				
			||||||
    int setfragment = 1;
 | 
					    int setfragment = 1;
 | 
				
			||||||
    const char *dspname = in ? conf.devpath_in : conf.devpath_out;
 | 
					    const char *dspname = in ? conf->devpath_in : conf->devpath_out;
 | 
				
			||||||
    const char *typ = in ? "ADC" : "DAC";
 | 
					    const char *typ = in ? "ADC" : "DAC";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Kludge needed to have working mmap on Linux */
 | 
					    /* Kludge needed to have working mmap on Linux */
 | 
				
			||||||
    oflags |= conf.try_mmap ? O_RDWR : (in ? O_RDONLY : O_WRONLY);
 | 
					    oflags |= conf->try_mmap ? O_RDWR : (in ? O_RDONLY : O_WRONLY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fd = open (dspname, oflags | O_NONBLOCK);
 | 
					    fd = open (dspname, oflags | O_NONBLOCK);
 | 
				
			||||||
    if (-1 == fd) {
 | 
					    if (-1 == fd) {
 | 
				
			||||||
@ -317,20 +310,20 @@ static int oss_open (int in, struct oss_params *req,
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef USE_DSP_POLICY
 | 
					#ifdef USE_DSP_POLICY
 | 
				
			||||||
    if (conf.policy >= 0) {
 | 
					    if (conf->policy >= 0) {
 | 
				
			||||||
        int version;
 | 
					        int version;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!oss_get_version (fd, &version, typ)) {
 | 
					        if (!oss_get_version (fd, &version, typ)) {
 | 
				
			||||||
            if (conf.debug) {
 | 
					            if (conf->debug) {
 | 
				
			||||||
                dolog ("OSS version = %#x\n", version);
 | 
					                dolog ("OSS version = %#x\n", version);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (version >= 0x040000) {
 | 
					            if (version >= 0x040000) {
 | 
				
			||||||
                int policy = conf.policy;
 | 
					                int policy = conf->policy;
 | 
				
			||||||
                if (ioctl (fd, SNDCTL_DSP_POLICY, &policy)) {
 | 
					                if (ioctl (fd, SNDCTL_DSP_POLICY, &policy)) {
 | 
				
			||||||
                    oss_logerr2 (errno, typ,
 | 
					                    oss_logerr2 (errno, typ,
 | 
				
			||||||
                                 "Failed to set timing policy to %d\n",
 | 
					                                 "Failed to set timing policy to %d\n",
 | 
				
			||||||
                                 conf.policy);
 | 
					                                 conf->policy);
 | 
				
			||||||
                    goto err;
 | 
					                    goto err;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                setfragment = 0;
 | 
					                setfragment = 0;
 | 
				
			||||||
@ -434,6 +427,7 @@ static int oss_run_out (HWVoiceOut *hw, int live)
 | 
				
			|||||||
    struct audio_buf_info abinfo;
 | 
					    struct audio_buf_info abinfo;
 | 
				
			||||||
    struct count_info cntinfo;
 | 
					    struct count_info cntinfo;
 | 
				
			||||||
    int bufsize;
 | 
					    int bufsize;
 | 
				
			||||||
 | 
					    OSSConf *conf = oss->conf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bufsize = hw->samples << hw->info.shift;
 | 
					    bufsize = hw->samples << hw->info.shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -458,7 +452,7 @@ static int oss_run_out (HWVoiceOut *hw, int live)
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (abinfo.bytes > bufsize) {
 | 
					        if (abinfo.bytes > bufsize) {
 | 
				
			||||||
            if (conf.debug) {
 | 
					            if (conf->debug) {
 | 
				
			||||||
                dolog ("warning: Invalid available size, size=%d bufsize=%d\n"
 | 
					                dolog ("warning: Invalid available size, size=%d bufsize=%d\n"
 | 
				
			||||||
                       "please report your OS/audio hw to av1474@comtv.ru\n",
 | 
					                       "please report your OS/audio hw to av1474@comtv.ru\n",
 | 
				
			||||||
                       abinfo.bytes, bufsize);
 | 
					                       abinfo.bytes, bufsize);
 | 
				
			||||||
@ -467,7 +461,7 @@ static int oss_run_out (HWVoiceOut *hw, int live)
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (abinfo.bytes < 0) {
 | 
					        if (abinfo.bytes < 0) {
 | 
				
			||||||
            if (conf.debug) {
 | 
					            if (conf->debug) {
 | 
				
			||||||
                dolog ("warning: Invalid available size, size=%d bufsize=%d\n",
 | 
					                dolog ("warning: Invalid available size, size=%d bufsize=%d\n",
 | 
				
			||||||
                       abinfo.bytes, bufsize);
 | 
					                       abinfo.bytes, bufsize);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -520,16 +514,17 @@ static int oss_init_out(HWVoiceOut *hw, struct audsettings *as,
 | 
				
			|||||||
    int fd;
 | 
					    int fd;
 | 
				
			||||||
    audfmt_e effective_fmt;
 | 
					    audfmt_e effective_fmt;
 | 
				
			||||||
    struct audsettings obt_as;
 | 
					    struct audsettings obt_as;
 | 
				
			||||||
 | 
					    OSSConf *conf = drv_opaque;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    oss->fd = -1;
 | 
					    oss->fd = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    req.fmt = aud_to_ossfmt (as->fmt, as->endianness);
 | 
					    req.fmt = aud_to_ossfmt (as->fmt, as->endianness);
 | 
				
			||||||
    req.freq = as->freq;
 | 
					    req.freq = as->freq;
 | 
				
			||||||
    req.nchannels = as->nchannels;
 | 
					    req.nchannels = as->nchannels;
 | 
				
			||||||
    req.fragsize = conf.fragsize;
 | 
					    req.fragsize = conf->fragsize;
 | 
				
			||||||
    req.nfrags = conf.nfrags;
 | 
					    req.nfrags = conf->nfrags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (oss_open (0, &req, &obt, &fd)) {
 | 
					    if (oss_open (0, &req, &obt, &fd, conf)) {
 | 
				
			||||||
        return -1;
 | 
					        return -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -556,7 +551,7 @@ static int oss_init_out(HWVoiceOut *hw, struct audsettings *as,
 | 
				
			|||||||
    hw->samples = (obt.nfrags * obt.fragsize) >> hw->info.shift;
 | 
					    hw->samples = (obt.nfrags * obt.fragsize) >> hw->info.shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    oss->mmapped = 0;
 | 
					    oss->mmapped = 0;
 | 
				
			||||||
    if (conf.try_mmap) {
 | 
					    if (conf->try_mmap) {
 | 
				
			||||||
        oss->pcm_buf = mmap (
 | 
					        oss->pcm_buf = mmap (
 | 
				
			||||||
            NULL,
 | 
					            NULL,
 | 
				
			||||||
            hw->samples << hw->info.shift,
 | 
					            hw->samples << hw->info.shift,
 | 
				
			||||||
@ -616,6 +611,7 @@ static int oss_init_out(HWVoiceOut *hw, struct audsettings *as,
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    oss->fd = fd;
 | 
					    oss->fd = fd;
 | 
				
			||||||
 | 
					    oss->conf = conf;
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -687,15 +683,16 @@ static int oss_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque)
 | 
				
			|||||||
    int fd;
 | 
					    int fd;
 | 
				
			||||||
    audfmt_e effective_fmt;
 | 
					    audfmt_e effective_fmt;
 | 
				
			||||||
    struct audsettings obt_as;
 | 
					    struct audsettings obt_as;
 | 
				
			||||||
 | 
					    OSSConf *conf = drv_opaque;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    oss->fd = -1;
 | 
					    oss->fd = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    req.fmt = aud_to_ossfmt (as->fmt, as->endianness);
 | 
					    req.fmt = aud_to_ossfmt (as->fmt, as->endianness);
 | 
				
			||||||
    req.freq = as->freq;
 | 
					    req.freq = as->freq;
 | 
				
			||||||
    req.nchannels = as->nchannels;
 | 
					    req.nchannels = as->nchannels;
 | 
				
			||||||
    req.fragsize = conf.fragsize;
 | 
					    req.fragsize = conf->fragsize;
 | 
				
			||||||
    req.nfrags = conf.nfrags;
 | 
					    req.nfrags = conf->nfrags;
 | 
				
			||||||
    if (oss_open (1, &req, &obt, &fd)) {
 | 
					    if (oss_open (1, &req, &obt, &fd, conf)) {
 | 
				
			||||||
        return -1;
 | 
					        return -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -729,6 +726,7 @@ static int oss_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    oss->fd = fd;
 | 
					    oss->fd = fd;
 | 
				
			||||||
 | 
					    oss->conf = conf;
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -848,69 +846,83 @@ static int oss_ctl_in (HWVoiceIn *hw, int cmd, ...)
 | 
				
			|||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static OSSConf glob_conf = {
 | 
				
			||||||
 | 
					    .try_mmap = 0,
 | 
				
			||||||
 | 
					    .nfrags = 4,
 | 
				
			||||||
 | 
					    .fragsize = 4096,
 | 
				
			||||||
 | 
					    .devpath_out = "/dev/dsp",
 | 
				
			||||||
 | 
					    .devpath_in = "/dev/dsp",
 | 
				
			||||||
 | 
					    .debug = 0,
 | 
				
			||||||
 | 
					    .exclusive = 0,
 | 
				
			||||||
 | 
					    .policy = 5
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void *oss_audio_init (void)
 | 
					static void *oss_audio_init (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (access(conf.devpath_in, R_OK | W_OK) < 0 ||
 | 
					    OSSConf *conf = g_malloc(sizeof(OSSConf));
 | 
				
			||||||
        access(conf.devpath_out, R_OK | W_OK) < 0) {
 | 
					    *conf = glob_conf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (access(conf->devpath_in, R_OK | W_OK) < 0 ||
 | 
				
			||||||
 | 
					        access(conf->devpath_out, R_OK | W_OK) < 0) {
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return &conf;
 | 
					    return conf;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void oss_audio_fini (void *opaque)
 | 
					static void oss_audio_fini (void *opaque)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    (void) opaque;
 | 
					    g_free(opaque);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct audio_option oss_options[] = {
 | 
					static struct audio_option oss_options[] = {
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        .name  = "FRAGSIZE",
 | 
					        .name  = "FRAGSIZE",
 | 
				
			||||||
        .tag   = AUD_OPT_INT,
 | 
					        .tag   = AUD_OPT_INT,
 | 
				
			||||||
        .valp  = &conf.fragsize,
 | 
					        .valp  = &glob_conf.fragsize,
 | 
				
			||||||
        .descr = "Fragment size in bytes"
 | 
					        .descr = "Fragment size in bytes"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        .name  = "NFRAGS",
 | 
					        .name  = "NFRAGS",
 | 
				
			||||||
        .tag   = AUD_OPT_INT,
 | 
					        .tag   = AUD_OPT_INT,
 | 
				
			||||||
        .valp  = &conf.nfrags,
 | 
					        .valp  = &glob_conf.nfrags,
 | 
				
			||||||
        .descr = "Number of fragments"
 | 
					        .descr = "Number of fragments"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        .name  = "MMAP",
 | 
					        .name  = "MMAP",
 | 
				
			||||||
        .tag   = AUD_OPT_BOOL,
 | 
					        .tag   = AUD_OPT_BOOL,
 | 
				
			||||||
        .valp  = &conf.try_mmap,
 | 
					        .valp  = &glob_conf.try_mmap,
 | 
				
			||||||
        .descr = "Try using memory mapped access"
 | 
					        .descr = "Try using memory mapped access"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        .name  = "DAC_DEV",
 | 
					        .name  = "DAC_DEV",
 | 
				
			||||||
        .tag   = AUD_OPT_STR,
 | 
					        .tag   = AUD_OPT_STR,
 | 
				
			||||||
        .valp  = &conf.devpath_out,
 | 
					        .valp  = &glob_conf.devpath_out,
 | 
				
			||||||
        .descr = "Path to DAC device"
 | 
					        .descr = "Path to DAC device"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        .name  = "ADC_DEV",
 | 
					        .name  = "ADC_DEV",
 | 
				
			||||||
        .tag   = AUD_OPT_STR,
 | 
					        .tag   = AUD_OPT_STR,
 | 
				
			||||||
        .valp  = &conf.devpath_in,
 | 
					        .valp  = &glob_conf.devpath_in,
 | 
				
			||||||
        .descr = "Path to ADC device"
 | 
					        .descr = "Path to ADC device"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        .name  = "EXCLUSIVE",
 | 
					        .name  = "EXCLUSIVE",
 | 
				
			||||||
        .tag   = AUD_OPT_BOOL,
 | 
					        .tag   = AUD_OPT_BOOL,
 | 
				
			||||||
        .valp  = &conf.exclusive,
 | 
					        .valp  = &glob_conf.exclusive,
 | 
				
			||||||
        .descr = "Open device in exclusive mode (vmix wont work)"
 | 
					        .descr = "Open device in exclusive mode (vmix wont work)"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
#ifdef USE_DSP_POLICY
 | 
					#ifdef USE_DSP_POLICY
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        .name  = "POLICY",
 | 
					        .name  = "POLICY",
 | 
				
			||||||
        .tag   = AUD_OPT_INT,
 | 
					        .tag   = AUD_OPT_INT,
 | 
				
			||||||
        .valp  = &conf.policy,
 | 
					        .valp  = &glob_conf.policy,
 | 
				
			||||||
        .descr = "Set the timing policy of the device, -1 to use fragment mode",
 | 
					        .descr = "Set the timing policy of the device, -1 to use fragment mode",
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        .name  = "DEBUG",
 | 
					        .name  = "DEBUG",
 | 
				
			||||||
        .tag   = AUD_OPT_BOOL,
 | 
					        .tag   = AUD_OPT_BOOL,
 | 
				
			||||||
        .valp  = &conf.debug,
 | 
					        .valp  = &glob_conf.debug,
 | 
				
			||||||
        .descr = "Turn on some debugging messages"
 | 
					        .descr = "Turn on some debugging messages"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    { /* End of list */ }
 | 
					    { /* End of list */ }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user