aboutsummaryrefslogtreecommitdiff
path: root/audio/ossaudio.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio/ossaudio.c')
-rw-r--r--audio/ossaudio.c27
1 files changed, 5 insertions, 22 deletions
diff --git a/audio/ossaudio.c b/audio/ossaudio.c
index 559c44260d..ecb88395b7 100644
--- a/audio/ossaudio.c
+++ b/audio/ossaudio.c
@@ -45,7 +45,6 @@ typedef struct OSSVoiceOut {
int nfrags;
int fragsize;
int mmapped;
- int old_optr;
} OSSVoiceOut;
typedef struct OSSVoiceIn {
@@ -54,7 +53,6 @@ typedef struct OSSVoiceIn {
int fd;
int nfrags;
int fragsize;
- int old_optr;
} OSSVoiceIn;
static struct {
@@ -366,7 +364,7 @@ static int oss_run_out (HWVoiceOut *hw)
bufsize = hw->samples << hw->info.shift;
if (oss->mmapped) {
- int bytes;
+ int bytes, pos;
err = ioctl (oss->fd, SNDCTL_DSP_GETOPTR, &cntinfo);
if (err < 0) {
@@ -374,20 +372,8 @@ static int oss_run_out (HWVoiceOut *hw)
return 0;
}
- if (cntinfo.ptr == oss->old_optr) {
- if (abs (hw->samples - live) < 64) {
- dolog ("warning: Overrun\n");
- }
- return 0;
- }
-
- if (cntinfo.ptr > oss->old_optr) {
- bytes = cntinfo.ptr - oss->old_optr;
- }
- else {
- bytes = bufsize + cntinfo.ptr - oss->old_optr;
- }
-
+ pos = hw->rpos << hw->info.shift;
+ bytes = audio_ring_dist (cntinfo.ptr, pos, bufsize);
decr = audio_MIN (bytes >> hw->info.shift, live);
}
else {
@@ -462,9 +448,6 @@ static int oss_run_out (HWVoiceOut *hw)
rpos = (rpos + convert_samples) % hw->samples;
samples -= convert_samples;
}
- if (oss->mmapped) {
- oss->old_optr = cntinfo.ptr;
- }
hw->rpos = rpos;
return decr;
@@ -550,7 +533,8 @@ static int oss_init_out (HWVoiceOut *hw, struct audsettings *as)
if (oss->pcm_buf == MAP_FAILED) {
oss_logerr (errno, "Failed to map %d bytes of DAC\n",
hw->samples << hw->info.shift);
- } else {
+ }
+ else {
int err;
int trig = 0;
if (ioctl (fd, SNDCTL_DSP_SETTRIGGER, &trig) < 0) {
@@ -749,7 +733,6 @@ static int oss_run_in (HWVoiceIn *hw)
bufs[0].len = dead << hwshift;
}
-
for (i = 0; i < 2; ++i) {
ssize_t nread;