提交 4045a85a 编写于 作者: K Kővágó, Zoltán 提交者: Gerd Hoffmann

ossaudio: do not use global variables

Signed-off-by: NKővágó, Zoltán <DirtY.iCE.hu@gmail.com>
Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
上级 765b37da
...@@ -38,6 +38,17 @@ ...@@ -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 { ...@@ -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 { ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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, ...) ...@@ -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 */ }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册