mirror of https://github.com/xemu-project/xemu.git
oss: OSS v4 support
a. Use SNDCTL_DSP_POLICY instead of SNDCTL_DSP_SETFRAGMENT b. Add ability to open device in exclusive mode, thus bypassing vmix Signed-off-by: malc <av1474@comtv.ru>
This commit is contained in:
parent
2305411129
commit
0b3652bc70
|
@ -64,13 +64,17 @@ static struct {
|
||||||
const char *devpath_out;
|
const char *devpath_out;
|
||||||
const char *devpath_in;
|
const char *devpath_in;
|
||||||
int debug;
|
int debug;
|
||||||
|
int exclusive;
|
||||||
|
int policy;
|
||||||
} conf = {
|
} conf = {
|
||||||
.try_mmap = 0,
|
.try_mmap = 0,
|
||||||
.nfrags = 4,
|
.nfrags = 4,
|
||||||
.fragsize = 4096,
|
.fragsize = 4096,
|
||||||
.devpath_out = "/dev/dsp",
|
.devpath_out = "/dev/dsp",
|
||||||
.devpath_in = "/dev/dsp",
|
.devpath_in = "/dev/dsp",
|
||||||
.debug = 0
|
.debug = 0,
|
||||||
|
.exclusive = 0,
|
||||||
|
.policy = 5
|
||||||
};
|
};
|
||||||
|
|
||||||
struct oss_params {
|
struct oss_params {
|
||||||
|
@ -234,15 +238,16 @@ static int oss_open (int in, struct oss_params *req,
|
||||||
struct oss_params *obt, int *pfd)
|
struct oss_params *obt, int *pfd)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
int oflags;
|
int version;
|
||||||
int mmmmssss;
|
int oflags = conf.exclusive ? O_EXCL : 0;
|
||||||
audio_buf_info abinfo;
|
audio_buf_info abinfo;
|
||||||
int fmt, freq, nchannels;
|
int fmt, freq, nchannels;
|
||||||
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) {
|
||||||
oss_logerr2 (errno, typ, "Failed to open `%s'\n", dspname);
|
oss_logerr2 (errno, typ, "Failed to open `%s'\n", dspname);
|
||||||
|
@ -274,11 +279,33 @@ static int oss_open (int in, struct oss_params *req,
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
mmmmssss = (req->nfrags << 16) | ctz32 (req->fragsize);
|
if (ioctl (fd, OSS_GETVERSION, &version)) {
|
||||||
if (ioctl (fd, SNDCTL_DSP_SETFRAGMENT, &mmmmssss)) {
|
oss_logerr2 (errno, typ, "Failed to get OSS version\n");
|
||||||
oss_logerr2 (errno, typ, "Failed to set buffer length (%d, %d)\n",
|
version = 0;
|
||||||
req->nfrags, req->fragsize);
|
}
|
||||||
goto err;
|
|
||||||
|
if (conf.debug) {
|
||||||
|
dolog ("OSS version = %#x\n", version);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef SNDCTL_DSP_POLICY
|
||||||
|
if (conf.policy >= 0 && version >= 0x040000) {
|
||||||
|
int policy = conf.policy;
|
||||||
|
if (ioctl (fd, SNDCTL_DSP_POLICY, &policy)) {
|
||||||
|
oss_logerr2 (errno, typ, "Failed to set timing policy to %d\n",
|
||||||
|
conf.policy);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
int mmmmssss = (req->nfrags << 16) | ctz32 (req->fragsize);
|
||||||
|
if (ioctl (fd, SNDCTL_DSP_SETFRAGMENT, &mmmmssss)) {
|
||||||
|
oss_logerr2 (errno, typ, "Failed to set buffer length (%d, %d)\n",
|
||||||
|
req->nfrags, req->fragsize);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ioctl (fd, in ? SNDCTL_DSP_GETISPACE : SNDCTL_DSP_GETOSPACE, &abinfo)) {
|
if (ioctl (fd, in ? SNDCTL_DSP_GETISPACE : SNDCTL_DSP_GETOSPACE, &abinfo)) {
|
||||||
|
@ -839,6 +866,20 @@ static struct audio_option oss_options[] = {
|
||||||
.valp = &conf.devpath_in,
|
.valp = &conf.devpath_in,
|
||||||
.descr = "Path to ADC device"
|
.descr = "Path to ADC device"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "EXCLUSIVE",
|
||||||
|
.tag = AUD_OPT_BOOL,
|
||||||
|
.valp = &conf.exclusive,
|
||||||
|
.descr = "Open device in exclusive mode (vmix wont work)"
|
||||||
|
},
|
||||||
|
#ifdef SNDCTL_DSP_POLICY
|
||||||
|
{
|
||||||
|
.name = "POLICY",
|
||||||
|
.tag = AUD_OPT_INT,
|
||||||
|
.valp = &conf.policy,
|
||||||
|
.descr = "Set the timing policy of the device, -1 to use fragment mode",
|
||||||
|
},
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
.name = "DEBUG",
|
.name = "DEBUG",
|
||||||
.tag = AUD_OPT_BOOL,
|
.tag = AUD_OPT_BOOL,
|
||||||
|
|
Loading…
Reference in New Issue