Welcome,
try this patch.
I observe that quake3 with this patch works with aoss.
Regards
--
Adam Tla/lka mailto:[EMAIL PROTECTED] ^v^ ^v^ ^v^
System & Network Administration Group ~~~~~~
Computer Center, Gdansk University of Technology, Poland
PGP public key: finger [EMAIL PROTECTED]
diff -ru alsa-20040226-orig/alsa-oss/alsa/alsa-oss.c
alsa-20040226/alsa-oss/alsa/alsa-oss.c
--- alsa-20040226-orig/alsa-oss/alsa/alsa-oss.c 2004-02-19 17:02:20.000000000 +0100
+++ alsa-20040226/alsa-oss/alsa/alsa-oss.c 2004-02-26 20:26:39.000000000 +0100
@@ -196,10 +196,8 @@
if (!strncmp(file, "/dev/dsp", 8) ||
!strncmp(file, "/dev/adsp", 9) ||
!strncmp(file, "/dev/audio", 10)) {
- fd = lib_oss_pcm_open(file, oflag);
- if (fd >= 0) {
- fds[fd] = calloc(sizeof(fd_t), 1);
- if (fds[fd] == NULL) {
+ if ((fd = lib_oss_pcm_open(file, oflag)) >= 0) {
+ if (!(fds[fd] = calloc(sizeof(fd_t), 1))) {
ops[FD_OSS_DSP].close(fd);
errno = ENOMEM;
return -1;
@@ -209,10 +207,8 @@
poll_fds_add += lib_oss_pcm_poll_fds(fd);
}
} else if (!strncmp(file, "/dev/mixer", 10)) {
- fd = lib_oss_mixer_open(file, oflag);
- if (fd >= 0) {
- fds[fd] = calloc(sizeof(fd_t), 1);
- if (fds[fd] == NULL) {
+ if ((fd = lib_oss_mixer_open(file, oflag)) >= 0) {
+ if (!(fds[fd] = calloc(sizeof(fd_t), 1))) {
ops[FD_OSS_MIXER].close(fd);
errno = ENOMEM;
return -1;
@@ -220,11 +216,8 @@
fds[fd]->class = FD_OSS_MIXER;
fds[fd]->oflags = oflag;
}
- } else {
- fd = _open(file, oflag, mode);
- if (fd >= 0)
+ } else if ((fd = _open(file, oflag, mode)) >= 0)
assert(fds[fd] == NULL);
- }
return fd;
}
@@ -671,18 +664,11 @@
static void initialize()
{
- char *s = getenv("ALSA_OSS_WRAPPER");
- if (s == NULL)
- return;
- s = getenv("ALSA_OSS_DEBUG");
- if (s)
- alsa_oss_debug = 1;
- open_max = sysconf(_SC_OPEN_MAX);
- if (open_max < 0)
- exit(1);
- fds = calloc(open_max, sizeof(*fds));
- if (!fds)
+ if ((open_max = sysconf(_SC_OPEN_MAX)) < 0 ||
+ !(fds = calloc(open_max, sizeof(*fds))))
exit(1);
+ if (getenv("ALSA_OSS_DEBUG"))
+ alsa_oss_debug = 1;
_open = dlsym(RTLD_NEXT, "open");
_close = dlsym(RTLD_NEXT, "close");
_write = dlsym(RTLD_NEXT, "write");
diff -ru alsa-20040226-orig/alsa-oss/alsa/pcm.c alsa-20040226/alsa-oss/alsa/pcm.c
--- alsa-20040226-orig/alsa-oss/alsa/pcm.c 2004-02-21 21:39:54.000000000 +0100
+++ alsa-20040226/alsa-oss/alsa/pcm.c 2004-02-26 23:18:46.000000000 +0100
@@ -39,6 +39,7 @@
#include <alsa/asoundlib.h>
#include "alsa-oss-emul.h"
+#define RETERR(_code_) if ((err = _code_) < 0) return err;
int alsa_oss_debug = 0;
snd_output_t *alsa_oss_debug_out = NULL;
@@ -71,6 +72,7 @@
} oss_dsp_stream_t;
typedef struct {
+ unsigned char hwset;
unsigned int channels;
unsigned int rate;
unsigned int oss_format;
@@ -203,7 +205,8 @@
static int oss_dsp_hw_params(oss_dsp_t *dsp)
{
- int k;
+ int k, dir;
+ snd_pcm_uframes_t size;
for (k = 1; k >= 0; --k) {
oss_dsp_stream_t *str = &dsp->streams[k];
snd_pcm_t *pcm = str->pcm;
@@ -217,20 +220,12 @@
snd_pcm_hw_params_any(pcm, hw);
dsp->format = oss_format_to_alsa(dsp->oss_format);
- err = snd_pcm_hw_params_set_format(pcm, hw, dsp->format);
- if (err < 0)
- return err;
- err = snd_pcm_hw_params_set_channels(pcm, hw, dsp->channels);
- if (err < 0)
- return err;
+ RETERR(snd_pcm_hw_params_set_format(pcm, hw, dsp->format))
+ RETERR(snd_pcm_hw_params_set_channels(pcm, hw, dsp->channels))
rate = dsp->rate;
- err = snd_pcm_hw_params_set_rate_near(pcm, hw, &rate, 0);
- if (err < 0)
- return err;
+ RETERR(snd_pcm_hw_params_set_rate_near(pcm, hw, &rate, 0))
#if 0
- err = snd_pcm_hw_params_set_periods_integer(pcm, hw);
- if (err < 0)
- return err;
+ RETERR(snd_pcm_hw_params_set_periods_integer(pcm, hw))
#endif
if (str->mmap_buffer) {
@@ -240,41 +235,29 @@
snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_INTERLEAVED);
snd_pcm_access_mask_set(mask,
SND_PCM_ACCESS_MMAP_NONINTERLEAVED);
snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_COMPLEX);
- err = snd_pcm_hw_params_set_access_mask(pcm, hw, mask);
- if (err < 0)
- return err;
- err = snd_pcm_hw_params_set_period_size(pcm, hw,
str->alsa.mmap_period_bytes / str->frame_bytes, 0);
- if (err < 0)
- return err;
- err = snd_pcm_hw_params_set_buffer_size(pcm, hw,
str->alsa.mmap_buffer_bytes / str->frame_bytes);
- if (err < 0)
- return err;
- err = snd_pcm_hw_params_set_access(pcm, hw,
SND_PCM_ACCESS_MMAP_INTERLEAVED);
- if (err < 0)
- return err;
+ RETERR(snd_pcm_hw_params_set_access_mask(pcm, hw, mask))
+ dir = 0;
+ size = str->alsa.mmap_period_bytes / str->frame_bytes;
+ RETERR(snd_pcm_hw_params_set_period_size_near(pcm, hw, &size,
&dir))
+ size = str->alsa.mmap_buffer_bytes / str->frame_bytes;
+ RETERR(snd_pcm_hw_params_set_buffer_size_near(pcm, hw, &size))
+ RETERR(snd_pcm_hw_params_set_access(pcm, hw,
SND_PCM_ACCESS_MMAP_INTERLEAVED))
} else {
- err = snd_pcm_hw_params_set_access(pcm, hw,
SND_PCM_ACCESS_RW_INTERLEAVED);
- if (err < 0)
- return err;
+ RETERR(snd_pcm_hw_params_set_access(pcm, hw,
SND_PCM_ACCESS_RW_INTERLEAVED))
periods_min = 2;
- err = snd_pcm_hw_params_set_periods_min(pcm, hw, &periods_min,
0);
- if (err < 0)
- return err;
+ RETERR(snd_pcm_hw_params_set_periods_min(pcm, hw,
&periods_min, 0))
if (dsp->maxfrags > 0) {
unsigned int periods_max = dsp->maxfrags;
- err = snd_pcm_hw_params_set_periods_max(pcm, hw,
- &periods_max,
0);
- if (err < 0)
- return err;
+ RETERR(snd_pcm_hw_params_set_periods_max(pcm, hw,
&periods_max, 0))
}
if (dsp->fragshift > 0) {
snd_pcm_uframes_t s = (1 << dsp->fragshift) /
str->frame_bytes;
s *= 16;
while (s >= 1024 && (err =
snd_pcm_hw_params_set_buffer_size(pcm, hw, s)) < 0)
- s /= 2;
+ s >>= 1;
s = (1 << dsp->fragshift) / str->frame_bytes;
while (s >= 256 && (err =
snd_pcm_hw_params_set_period_size(pcm, hw, s, 0)) < 0)
- s /= 2;
+ s >>= 1;
if (err < 0) {
s = (1 << dsp->fragshift) / str->frame_bytes;
err =
snd_pcm_hw_params_set_period_size_near(pcm, hw, &s, 0);
@@ -282,13 +265,13 @@
} else {
snd_pcm_uframes_t s = 16, old_s;
while (s * 2 < dsp->rate / 2)
- s *= 2;
- old_s = s = s / 2;
+ s <<= 1;
+ old_s = s = s >> 1;
while (s >= 1024 && (err =
snd_pcm_hw_params_set_buffer_size(pcm, hw, s)) < 0)
- s /= 2;
+ s >>= 1;
s = old_s;
while (s >= 256 && (err =
snd_pcm_hw_params_set_period_size(pcm, hw, s, 0)) < 0)
- s /= 2;
+ s >>= 1;
if (err < 0) {
s = old_s;
err =
snd_pcm_hw_params_set_period_size_near(pcm, hw, &s, 0);
@@ -297,22 +280,16 @@
if (err < 0)
return err;
}
- err = snd_pcm_hw_params(pcm, hw);
- if (err < 0)
- return err;
+ RETERR(snd_pcm_hw_params(pcm, hw))
#if 0
if (alsa_oss_debug)
snd_pcm_dump_setup(pcm, stderr);
-#endif
if (err < 0)
return err;
+#endif
dsp->oss_format = alsa_format_to_oss(dsp->format);
- err = snd_pcm_hw_params_get_period_size(hw, &str->alsa.period_size, 0);
- if (err < 0)
- return err;
- err = snd_pcm_hw_params_get_buffer_size(hw, &str->alsa.buffer_size);
- if (err < 0)
- return err;
+ RETERR(snd_pcm_hw_params_get_period_size(hw, &str->alsa.period_size,
0))
+ RETERR(snd_pcm_hw_params_get_buffer_size(hw, &str->alsa.buffer_size))
str->oss.buffer_size = 1 << ld2(str->alsa.buffer_size);
if (str->oss.buffer_size < str->alsa.buffer_size)
str->oss.buffer_size *= 2;
@@ -375,15 +352,9 @@
snd_pcm_sw_params_set_silence_size(pcm, sw,
str->alsa.period_size);
#endif
- err = snd_pcm_sw_params(pcm, sw);
- if (err < 0)
- return err;
- err = snd_pcm_sw_params_current(pcm, sw);
- if (err < 0)
- return err;
- err = snd_pcm_sw_params_get_boundary(sw, &str->alsa.boundary);
- if (err < 0)
- return err;
+ RETERR(snd_pcm_sw_params(pcm, sw))
+ RETERR(snd_pcm_sw_params_current(pcm, sw))
+ RETERR(snd_pcm_sw_params_get_boundary(sw, &str->alsa.boundary))
}
return 0;
}
@@ -391,12 +362,10 @@
static int oss_dsp_params(oss_dsp_t *dsp)
{
int err;
- err = oss_dsp_hw_params(dsp);
- if (err < 0)
- return err;
- err = oss_dsp_sw_params(dsp);
- if (err < 0)
- return err;
+ dsp->hwset = 0;
+ RETERR(oss_dsp_hw_params(dsp))
+ dsp->hwset++;
+ RETERR(oss_dsp_sw_params(dsp))
#if 0
if (alsa_oss_debug && alsa_oss_debug_out) {
int k;
@@ -462,33 +431,24 @@
int result;
char name[64];
- char *s = getenv("ALSA_OSS_DEBUG");
- if (s) {
+ if (getenv("ALSA_OSS_DEBUG")) {
alsa_oss_debug = 1;
if (alsa_oss_debug_out == NULL) {
if (snd_output_stdio_attach(&alsa_oss_debug_out, stderr, 0) <
0)
alsa_oss_debug_out = NULL;
}
}
- switch (device) {
- case OSS_DEVICE_DSP:
+
+ if (device == OSS_DEVICE_DSP)
format = AFMT_U8;
- sprintf(name, "dsp%d", card);
- break;
- case OSS_DEVICE_DSPW:
+ else if (device == OSS_DEVICE_DSPW)
format = AFMT_S16_LE;
- sprintf(name, "dspW%d", card);
- break;
- case OSS_DEVICE_AUDIO:
- sprintf(name, "audio%d", card);
- break;
- case OSS_DEVICE_ADSP:
- sprintf(name, "adsp%d", card);
- break;
- default:
- errno = ENOENT;
- return -1;
- }
+
+ if (!card)
+ strcpy(name, "default");
+ else
+ sprintf(name, "plughw:%d", card);
+
if (mode & O_NONBLOCK)
pcm_mode = SND_PCM_NONBLOCK;
switch (oflag & O_ACCMODE) {
@@ -506,21 +466,19 @@
errno = EINVAL;
return -1;
}
- fd = open("/dev/null", oflag & O_ACCMODE);
- if (fd < 0)
+ if ((fd = open("/dev/null", oflag & O_ACCMODE)) < 0)
return -1;
- xfd = calloc(1, sizeof(fd_t));
- if (!xfd) {
- close(fd);
+ if (!(xfd = calloc(1, sizeof(fd_t)))) {
errno = ENOMEM;
+ _error1:
+ close(fd);
return -1;
}
- dsp = calloc(1, sizeof(oss_dsp_t));
- if (!dsp) {
- close(fd);
- free(xfd);
+ if (!(dsp = calloc(1, sizeof(oss_dsp_t)))) {
errno = ENOMEM;
- return -1;
+ _error2:
+ free(xfd);
+ goto _error1;
}
xfd->dsp = dsp;
dsp->channels = 1;
@@ -530,53 +488,30 @@
for (k = 0; k < 2; ++k) {
if (!(streams & (1 << k)))
continue;
- result = snd_pcm_open(&dsp->streams[k].pcm, name, k, pcm_mode);
- if (result < 0) {
- if (k == 1 && dsp->streams[0].pcm != NULL) {
- dsp->streams[1].pcm = NULL;
- streams &= ~(1 << SND_PCM_STREAM_CAPTURE);
- result = 0;
- }
- break;
- }
+ if ((result = snd_pcm_open(&dsp->streams[k].pcm, name, k, pcm_mode)) <
0)
+ goto _error3;
}
- if (result < 0) {
- result = 0;
- for (k = 0; k < 2; ++k) {
- if (dsp->streams[k].pcm) {
- snd_pcm_close(dsp->streams[k].pcm);
- dsp->streams[k].pcm = NULL;
- }
- }
- /* try to open the default pcm as fallback */
- if (card == 0 && (device == OSS_DEVICE_DSP || device ==
OSS_DEVICE_AUDIO))
- strcpy(name, "default");
- else
- sprintf(name, "plughw:%d", card);
- for (k = 0; k < 2; ++k) {
- if (!(streams & (1 << k)))
- continue;
- result = snd_pcm_open(&dsp->streams[k].pcm, name, k, pcm_mode);
- if (result < 0)
- goto _error;
- }
- }
- result = oss_dsp_params(dsp);
- if (result < 0)
- goto _error;
+ if ((result = oss_dsp_params(dsp)) < 0)
+ goto _error3;
xfd->fileno = fd;
insert_fd(xfd);
return fd;
- _error:
- close(fd);
+ _error3:
+ for (k = 0; k < 2; ++k) {
+ if (dsp->streams[k].pcm) {
+ snd_pcm_close(dsp->streams[k].pcm);
+ dsp->streams[k].pcm = NULL;
+ }
+ }
errno = -result;
- return -1;
+ free(dsp);
+ goto _error2;
}
ssize_t lib_oss_pcm_write(int fd, const void *buf, size_t n)
{
- ssize_t result;
+ ssize_t result = -1;
oss_dsp_t *dsp = look_for_dsp(fd);
oss_dsp_stream_t *str;
snd_pcm_t *pcm;
@@ -584,14 +519,11 @@
if (dsp == NULL) {
errno = EBADFD;
- result = -1;
goto _end;
}
str = &dsp->streams[SND_PCM_STREAM_PLAYBACK];
- pcm = str->pcm;
- if (!pcm) {
+ if (!(pcm = str->pcm)) {
errno = EBADFD;
- result = -1;
goto _end;
}
frames = n / str->frame_bytes;
@@ -629,7 +561,7 @@
ssize_t lib_oss_pcm_read(int fd, void *buf, size_t n)
{
- ssize_t result;
+ ssize_t result = -1;
oss_dsp_t *dsp = look_for_dsp(fd);
oss_dsp_stream_t *str;
snd_pcm_t *pcm;
@@ -637,14 +569,11 @@
if (dsp == NULL) {
errno = EBADFD;
- result = -1;
goto _end;
}
str = &dsp->streams[SND_PCM_STREAM_CAPTURE];
- pcm = str->pcm;
- if (!pcm) {
+ if (!(pcm = str->pcm)) {
errno = EBADFD;
- result = -1;
goto _end;
}
frames = n / str->frame_bytes;
@@ -680,7 +609,7 @@
return result;
}
-#define USE_REWIND 1
+#define USE_REWIND 0
static void oss_dsp_mmap_update(oss_dsp_t *dsp, snd_pcm_stream_t stream,
snd_pcm_sframes_t delay)
@@ -700,15 +629,13 @@
// fprintf(stderr, "mmap_advance=%ld\n", str->mmap_advance);
}
#if USE_REWIND
- err = snd_pcm_rewind(pcm, str->alsa.buffer_size);
- if (err < 0) {
+ if ((err = snd_pcm_rewind(pcm, str->alsa.buffer_size)) < 0) {
/* fallback to not very accurate method */
size = str->mmap_advance - delay;
} else {
size = str->mmap_advance;
}
-// fprintf(stderr, "delay=%ld rewind=%ld forward=%ld\n",
-// delay, err, size);
+// fprintf(stderr, "delay=%ld rewind=%ld forward=%ld\n", delay, err,
size);
#else
size = str->mmap_advance - delay;
#endif
@@ -716,18 +643,16 @@
snd_pcm_uframes_t ofs;
snd_pcm_uframes_t frames = size;
snd_pcm_mmap_begin(pcm, &areas, &ofs, &frames);
- if (frames == 0)
+ if (!frames)
break;
// fprintf(stderr, "copy %ld %ld %d\n", ofs, frames, dsp->format);
snd_pcm_areas_copy(areas, ofs, str->mmap_areas, ofs,
dsp->channels, frames,
dsp->format);
- err = snd_pcm_mmap_commit(pcm, ofs, frames);
- assert(err == (snd_pcm_sframes_t) frames);
- if (err < 0)
+ if ((err = snd_pcm_mmap_commit(pcm, ofs, frames)) <= 0)
break;
- size -= frames;
- str->alsa.appl_ptr += frames;
+ size -= err;
+ str->alsa.appl_ptr += err;
str->alsa.appl_ptr %= str->alsa.boundary;
}
break;
@@ -762,17 +687,16 @@
{
int k;
DEBUG("SNDCTL_DSP_RESET)\n");
+ if (!dsp->hwset)
+ return -1;
result = 0;
for (k = 0; k < 2; ++k) {
str = &dsp->streams[k];
- pcm = str->pcm;
- if (!pcm)
+ if (!(pcm = str->pcm))
continue;
- err = snd_pcm_drop(pcm);
- if (err >= 0)
- err = snd_pcm_prepare(pcm);
- if (err < 0)
- result = err;
+ if ((err = snd_pcm_drop(pcm)) >= 0)
+ if ((err = snd_pcm_prepare(pcm)) < 0)
+ result = err;
str->oss.bytes = 0;
str->oss.hw_bytes = 0;
str->alsa.appl_ptr = 0;
@@ -788,11 +712,9 @@
result = 0;
for (k = 0; k < 2; ++k) {
str = &dsp->streams[k];
- pcm = str->pcm;
- if (!pcm)
+ if (!(pcm = str->pcm))
continue;
- err = snd_pcm_drain(pcm);
- if (err >= 0)
+ if ((err = snd_pcm_drain(pcm)) >= 0)
err = snd_pcm_prepare(pcm);
if (err < 0)
result = err;
@@ -820,8 +742,7 @@
break;
case SNDCTL_DSP_CHANNELS:
dsp->channels = (*(int *)arg);
- err = oss_dsp_params(dsp);
- if (err < 0)
+ if ((err = oss_dsp_params(dsp)) < 0)
break;
DEBUG("SNDCTL_DSP_CHANNELS, %p[%d]) -> [%d]\n", arg, *(int *)arg,
dsp->channels);
*(int *)arg = dsp->channels;
@@ -897,8 +818,7 @@
if (snd_pcm_state(pcm) == SND_PCM_STATE_RUNNING)
s |= PCM_ENABLE_OUTPUT;
}
- pcm = dsp->streams[SND_PCM_STREAM_CAPTURE].pcm;
- if (pcm) {
+ if ((pcm = dsp->streams[SND_PCM_STREAM_CAPTURE].pcm)) {
if (snd_pcm_state(pcm) == SND_PCM_STATE_RUNNING)
s |= PCM_ENABLE_INPUT;
}
@@ -911,41 +831,33 @@
DEBUG("SNDCTL_DSP_SETTRIGGER, %p[%d])\n", arg, *(int*)arg);
result = *(int*) arg;
str = &dsp->streams[SND_PCM_STREAM_CAPTURE];
- pcm = str->pcm;
- if (pcm) {
+ if ((pcm = str->pcm)) {
if (result & PCM_ENABLE_INPUT) {
if (str->stopped) {
str->stopped = 0;
- err = oss_dsp_sw_params(dsp);
- if (err < 0)
+ if ((err = oss_dsp_sw_params(dsp)) < 0)
break;
- err = snd_pcm_start(pcm);
- if (err < 0)
+ if ((err = snd_pcm_start(pcm)) < 0)
break;
}
} else {
if (!str->stopped) {
str->stopped = 1;
- err = snd_pcm_drop(pcm);
- if (err < 0)
+ if ((err = snd_pcm_drop(pcm)) < 0)
break;
- err = oss_dsp_sw_params(dsp);
- if (err < 0)
+ if ((err = oss_dsp_sw_params(dsp)) < 0)
break;
- err = snd_pcm_prepare(pcm);
- if (err < 0)
+ if ((err = snd_pcm_prepare(pcm)) < 0)
break;
}
}
}
str = &dsp->streams[SND_PCM_STREAM_PLAYBACK];
- pcm = str->pcm;
- if (pcm) {
+ if ((pcm = str->pcm)) {
if (result & PCM_ENABLE_OUTPUT) {
if (str->stopped) {
str->stopped = 0;
- err = oss_dsp_sw_params(dsp);
- if (err < 0)
+ if ((err = oss_dsp_sw_params(dsp)) < 0)
break;
if (str->mmap_buffer) {
const snd_pcm_channel_area_t *areas;
@@ -956,27 +868,22 @@
snd_pcm_areas_copy(areas, 0,
str->mmap_areas, 0,
dsp->channels, size,
dsp->format);
- cres = snd_pcm_mmap_commit(pcm,
offset, size);
- if (cres > 0) {
+ if ((cres = snd_pcm_mmap_commit(pcm,
offset, size)) > 0) {
str->alsa.appl_ptr += cres;
str->alsa.appl_ptr %=
str->alsa.boundary;
}
}
- err = snd_pcm_start(pcm);
- if (err < 0)
+ if ((err = snd_pcm_start(pcm)) < 0)
break;
}
} else {
if (!str->stopped) {
str->stopped = 1;
- err = snd_pcm_drop(pcm);
- if (err < 0)
+ if ((err = snd_pcm_drop(pcm)) < 0)
break;
- err = oss_dsp_sw_params(dsp);
- if (err < 0)
+ if ((err = oss_dsp_sw_params(dsp)) < 0)
break;
- err = snd_pcm_prepare(pcm);
- if (err < 0)
+ if ((err = snd_pcm_prepare(pcm)) < 0)
break;
}
}
@@ -986,22 +893,18 @@
case SNDCTL_DSP_GETISPACE:
{
snd_pcm_sframes_t avail, delay;
- snd_pcm_state_t state;
audio_buf_info *info = arg;
str = &dsp->streams[SND_PCM_STREAM_CAPTURE];
- pcm = str->pcm;
- if (!pcm) {
+ if (!(pcm = str->pcm)) {
err = -EINVAL;
break;
}
- state = snd_pcm_state(pcm);
- if (state == SND_PCM_STATE_RUNNING) {
+ if (snd_pcm_state(pcm) == SND_PCM_STATE_RUNNING) {
snd_pcm_delay(pcm, &delay);
if (str->mmap_buffer)
oss_dsp_mmap_update(dsp, SND_PCM_STREAM_CAPTURE,
delay);
}
- avail = snd_pcm_avail_update(pcm);
- if (avail < 0)
+ if ((avail = snd_pcm_avail_update(pcm)) < 0)
avail = 0;
if ((snd_pcm_uframes_t)avail > str->oss.buffer_size)
avail = str->oss.buffer_size;
@@ -1022,8 +925,7 @@
snd_pcm_state_t state;
audio_buf_info *info = arg;
str = &dsp->streams[SND_PCM_STREAM_PLAYBACK];
- pcm = str->pcm;
- if (!pcm) {
+ if (!(pcm = str->pcm)) {
err = -EINVAL;
break;
}
@@ -1034,8 +936,8 @@
if (str->mmap_buffer)
oss_dsp_mmap_update(dsp, SND_PCM_STREAM_PLAYBACK,
delay);
}
- avail = snd_pcm_avail_update(pcm);
- if (avail < 0 || (snd_pcm_uframes_t)avail > str->oss.buffer_size)
+ if ((avail = snd_pcm_avail_update(pcm)) < 0 ||
+ (snd_pcm_uframes_t)avail > str->oss.buffer_size)
avail = str->oss.buffer_size;
info->fragsize = str->oss.period_size * str->frame_bytes;
info->fragstotal = str->oss.periods;
@@ -1052,16 +954,13 @@
{
snd_pcm_sframes_t delay = 0, avail, diff;
snd_pcm_uframes_t hw_ptr;
- snd_pcm_state_t state;
count_info *info = arg;
str = &dsp->streams[SND_PCM_STREAM_CAPTURE];
- pcm = str->pcm;
- if (!pcm) {
+ if (!(pcm = str->pcm)) {
err = -EINVAL;
break;
}
- state = snd_pcm_state(pcm);
- if (state == SND_PCM_STATE_RUNNING) {
+ if (snd_pcm_state(pcm) == SND_PCM_STATE_RUNNING) {
snd_pcm_delay(pcm, &delay);
if (str->mmap_buffer)
oss_dsp_mmap_update(dsp, SND_PCM_STREAM_CAPTURE,
delay);
@@ -1097,8 +996,7 @@
snd_pcm_state_t state;
count_info *info = arg;
str = &dsp->streams[SND_PCM_STREAM_PLAYBACK];
- pcm = str->pcm;
- if (!pcm) {
+ if (!(pcm = str->pcm)) {
err = -EINVAL;
break;
}
@@ -1138,8 +1036,7 @@
snd_pcm_sframes_t delay = 0;
snd_pcm_state_t state;
str = &dsp->streams[SND_PCM_STREAM_PLAYBACK];
- pcm = str->pcm;
- if (!pcm) {
+ if (!(pcm = str->pcm)) {
err = -EINVAL;
break;
}
@@ -1222,8 +1119,7 @@
int err;
if (!pcm)
continue;
- err = snd_pcm_nonblock(pcm, nonblock);
- if (err < 0) {
+ if ((err = snd_pcm_nonblock(pcm, nonblock)) < 0) {
errno = -err;
return -1;
}
@@ -1264,9 +1160,13 @@
result = MAP_FAILED;
goto _end;
}
- assert(!str->mmap_buffer);
- result = malloc(len);
- if (!result) {
+// assert(!str->mmap_buffer);
+ if (str->mmap_buffer) {
+ free(str->mmap_buffer);
+ str->mmap_buffer = NULL;
+ str->mmap_bytes = 0;
+ }
+ if (!(result = malloc(len))) {
result = MAP_FAILED;
goto _end;
}
@@ -1274,8 +1174,7 @@
str->mmap_bytes = len;
str->alsa.mmap_period_bytes = str->oss.period_size * str->frame_bytes;
str->alsa.mmap_buffer_bytes = str->oss.buffer_size * str->frame_bytes;
- err = oss_dsp_params(dsp);
- if (err < 0) {
+ if ((err = oss_dsp_params(dsp)) < 0) {
free(result);
errno = -err;
result = MAP_FAILED;
@@ -1304,8 +1203,7 @@
free(str->mmap_buffer);
str->mmap_buffer = 0;
str->mmap_bytes = 0;
- err = oss_dsp_params(dsp);
- if (err < 0) {
+ if ((err = oss_dsp_params(dsp)) < 0) {
errno = -err;
return -1;
}
@@ -1330,16 +1228,14 @@
continue;
if ((fmode & O_ACCMODE) == O_WRONLY && snd_pcm_stream(pcm) ==
SND_PCM_STREAM_CAPTURE)
continue;
- count = snd_pcm_poll_descriptors_count(pcm);
- if (count < 0) {
+ if ((count = snd_pcm_poll_descriptors_count(pcm)) < 0) {
errno = -count;
return -1;
}
{
struct pollfd ufds[count];
int j;
- err = snd_pcm_poll_descriptors(pcm, ufds, count);
- if (err < 0) {
+ if ((err = snd_pcm_poll_descriptors(pcm, ufds, count)) < 0) {
errno = -err;
return -1;
}
@@ -1383,8 +1279,7 @@
int err, count;
if (!pcm)
continue;
- count = snd_pcm_poll_descriptors_count(pcm);
- if (count < 0) {
+ if ((count = snd_pcm_poll_descriptors_count(pcm)) < 0) {
errno = -count;
return -1;
}
@@ -1392,8 +1287,7 @@
struct pollfd ufds[count];
int j;
unsigned short revents;
- err = snd_pcm_poll_descriptors(pcm, ufds, count);
- if (err < 0) {
+ if ((err = snd_pcm_poll_descriptors(pcm, ufds, count)) < 0) {
errno = -err;
return -1;
}
@@ -1408,8 +1302,7 @@
revents |= POLLERR;
ufds[j].revents = revents;
}
- err = snd_pcm_poll_descriptors_revents(pcm, ufds, count,
&revents);
- if (err < 0) {
+ if ((err = snd_pcm_poll_descriptors_revents(pcm, ufds, count,
&revents)) < 0) {
errno = -err;
return -1;
}
@@ -1438,8 +1331,7 @@
int err;
if (!pcm)
continue;
- err = snd_pcm_poll_descriptors_count(pcm);
- if (err < 0) {
+ if ((err = snd_pcm_poll_descriptors_count(pcm)) < 0) {
errno = -err;
return -1;
}
@@ -1466,13 +1358,11 @@
continue;
if ((fmode & O_ACCMODE) == O_WRONLY && snd_pcm_stream(pcm) ==
SND_PCM_STREAM_CAPTURE)
continue;
- count = snd_pcm_poll_descriptors_count(pcm);
- if (count < 0) {
+ if ((count = snd_pcm_poll_descriptors_count(pcm)) < 0) {
errno = -count;
return -1;
}
- err = snd_pcm_poll_descriptors(pcm, ufds, count);
- if (err < 0) {
+ if ((err = snd_pcm_poll_descriptors(pcm, ufds, count)) < 0) {
errno = -err;
return -1;
}
@@ -1497,13 +1387,11 @@
unsigned short revents;
if (!pcm)
continue;
- count = snd_pcm_poll_descriptors_count(pcm);
- if (count < 0) {
+ if ((count = snd_pcm_poll_descriptors_count(pcm)) < 0) {
errno = -count;
return -1;
}
- err = snd_pcm_poll_descriptors_revents(pcm, ufds, count, &revents);
- if (err < 0) {
+ if ((err = snd_pcm_poll_descriptors_revents(pcm, ufds, count,
&revents)) < 0) {
errno = -err;
return -1;
}
@@ -1539,26 +1427,17 @@
va_start(args, oflag);
mode = va_arg(args, mode_t);
va_end(args);
- result = stat(file, &s);
- if (result < 0) {
- if (!strncmp(file, "/dev/dsp", 8))
- minor = (atoi(file + 8) << 4) | OSS_DEVICE_DSP;
- else if (!strncmp(file, "/dev/dspW", 9))
- minor = (atoi(file + 9) << 4) | OSS_DEVICE_DSPW;
- else if (!strncmp(file, "/dev/adsp", 9))
- minor = (atoi(file + 9) << 4) | OSS_DEVICE_ADSP;
- else if (!strncmp(file, "/dev/audio", 10))
- minor = (atoi(file + 10) << 4) | OSS_DEVICE_AUDIO;
- else {
- errno = ENOENT;
- return -1;
- }
- } else {
- if (!S_ISCHR(s.st_mode) || ((s.st_rdev >> 8) & 0xff) != OSS_MAJOR) {
- errno = ENOENT;
- return -1;
- }
- minor = s.st_rdev & 0xff;
+ if (!strncmp(file, "/dev/dsp", 8))
+ minor = (atoi(file + 8) << 4) | OSS_DEVICE_DSP;
+ else if (!strncmp(file, "/dev/dspW", 9))
+ minor = (atoi(file + 9) << 4) | OSS_DEVICE_DSPW;
+ else if (!strncmp(file, "/dev/adsp", 9))
+ minor = (atoi(file + 9) << 4) | OSS_DEVICE_ADSP;
+ else if (!strncmp(file, "/dev/audio", 10))
+ minor = (atoi(file + 10) << 4) | OSS_DEVICE_AUDIO;
+ else {
+ errno = ENOENT;
+ return -1;
}
if (! alsa_oss_debug)
snd_lib_error_set_handler(error_handler);