Update of /cvsroot/alsa/alsa-oss/alsa
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5774
Modified Files:
pcm.c
Log Message:
- a try to fix the period_size and buffer_size mangling
- removed use of the "hidden" alsa-lib functions
Index: pcm.c
===================================================================
RCS file: /cvsroot/alsa/alsa-oss/alsa/pcm.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- pcm.c 19 Feb 2004 16:02:21 -0000 1.6
+++ pcm.c 21 Feb 2004 20:39:54 -0000 1.7
@@ -40,9 +40,6 @@
#include "alsa-oss-emul.h"
-snd_pcm_uframes_t _snd_pcm_boundary(snd_pcm_t *pcm);
-snd_pcm_uframes_t _snd_pcm_mmap_hw_ptr(snd_pcm_t *pcm);
-
int alsa_oss_debug = 0;
snd_output_t *alsa_oss_debug_out = NULL;
@@ -53,6 +50,7 @@
snd_pcm_uframes_t period_size;
snd_pcm_uframes_t buffer_size;
snd_pcm_uframes_t boundary;
+ snd_pcm_uframes_t appl_ptr;
snd_pcm_uframes_t old_hw_ptr;
size_t mmap_buffer_bytes;
size_t mmap_period_bytes;
@@ -62,6 +60,8 @@
unsigned int periods;
snd_pcm_uframes_t buffer_size;
size_t bytes;
+ size_t hw_bytes;
+ size_t boundary;
} oss;
unsigned int stopped:1;
void *mmap_buffer;
@@ -339,6 +339,10 @@
a->step = bits_per_frame;
}
}
+ str->oss.hw_bytes = 0;
+ str->oss.boundary = (0x3fffffff / str->oss.buffer_size) *
str->oss.buffer_size;
+ str->alsa.appl_ptr = 0;
+ str->alsa.old_hw_ptr = 0;
}
return 0;
}
@@ -374,7 +378,12 @@
err = snd_pcm_sw_params(pcm, sw);
if (err < 0)
return err;
- str->alsa.boundary = _snd_pcm_boundary(pcm);
+ 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;
}
return 0;
}
@@ -603,6 +612,9 @@
errno = -result;
result = -1;
goto _end;
+ } else {
+ str->alsa.appl_ptr += result;
+ str->alsa.appl_ptr %= str->alsa.boundary;
}
result *= str->frame_bytes;
str->oss.bytes += result;
@@ -653,6 +665,9 @@
errno = -result;
result = -1;
goto _end;
+ } else {
+ str->alsa.appl_ptr += result;
+ str->alsa.appl_ptr %= str->alsa.boundary;
}
result *= str->frame_bytes;
str->oss.bytes += result;
@@ -709,7 +724,11 @@
dsp->format);
err = snd_pcm_mmap_commit(pcm, ofs, frames);
assert(err == (snd_pcm_sframes_t) frames);
+ if (err < 0)
+ break;
size -= frames;
+ str->alsa.appl_ptr += frames;
+ str->alsa.appl_ptr %= str->alsa.boundary;
}
break;
case SND_PCM_STREAM_CAPTURE:
@@ -755,6 +774,9 @@
if (err < 0)
result = err;
str->oss.bytes = 0;
+ str->oss.hw_bytes = 0;
+ str->alsa.appl_ptr = 0;
+ str->alsa.old_hw_ptr = 0;
}
err = result;
break;
@@ -774,7 +796,9 @@
err = snd_pcm_prepare(pcm);
if (err < 0)
result = err;
-
+ str->oss.hw_bytes = 0;
+ str->alsa.appl_ptr = 0;
+ str->alsa.old_hw_ptr = 0;
}
err = result;
break;
@@ -927,11 +951,16 @@
const snd_pcm_channel_area_t *areas;
snd_pcm_uframes_t offset;
snd_pcm_uframes_t size =
str->alsa.buffer_size;
+ ssize_t cres;
snd_pcm_mmap_begin(pcm, &areas,
&offset, &size);
snd_pcm_areas_copy(areas, 0,
str->mmap_areas, 0,
dsp->channels, size,
dsp->format);
- snd_pcm_mmap_commit(pcm, offset, size);
+ cres = snd_pcm_mmap_commit(pcm,
offset, size);
+ if (cres > 0) {
+ str->alsa.appl_ptr += cres;
+ str->alsa.appl_ptr %=
str->alsa.boundary;
+ }
}
err = snd_pcm_start(pcm);
if (err < 0)
@@ -1021,7 +1050,7 @@
}
case SNDCTL_DSP_GETIPTR:
{
- snd_pcm_sframes_t delay = 0;
+ snd_pcm_sframes_t delay = 0, avail, diff;
snd_pcm_uframes_t hw_ptr;
snd_pcm_state_t state;
count_info *info = arg;
@@ -1037,21 +1066,24 @@
if (str->mmap_buffer)
oss_dsp_mmap_update(dsp, SND_PCM_STREAM_CAPTURE,
delay);
}
- /* FIXME */
- snd_pcm_avail_update(pcm);
- hw_ptr = _snd_pcm_mmap_hw_ptr(pcm);
- info->bytes = hw_ptr;
- info->bytes *= str->frame_bytes;
- info->ptr = hw_ptr % str->oss.buffer_size;
- info->ptr *= str->frame_bytes;
+ avail = snd_pcm_avail_update(pcm);
+ hw_ptr = (str->alsa.appl_ptr + avail) % str->alsa.boundary;
+ diff = hw_ptr - str->alsa.old_hw_ptr;
+ if (diff < 0)
+ diff += str->alsa.boundary;
+ str->oss.hw_bytes += diff;
+ str->oss.hw_bytes %= str->oss.boundary;
+ info->bytes = str->oss.hw_bytes * str->frame_bytes;
+ info->ptr = info->bytes % (str->oss.buffer_size * str->frame_bytes);
if (str->mmap_buffer) {
ssize_t n = (hw_ptr / str->oss.period_size) -
(str->alsa.old_hw_ptr / str->oss.period_size);
if (n < 0)
n += str->alsa.boundary / str->oss.period_size;
info->blocks = n;
- str->alsa.old_hw_ptr = hw_ptr;
- } else
+ } else {
info->blocks = delay / str->oss.period_size;
+ }
+ str->alsa.old_hw_ptr = hw_ptr;
DEBUG("SNDCTL_DSP_GETIPTR, %p) -> {%d %d %d}\n", arg,
info->bytes,
info->blocks,
@@ -1060,7 +1092,7 @@
}
case SNDCTL_DSP_GETOPTR:
{
- snd_pcm_sframes_t delay = 0;
+ snd_pcm_sframes_t delay = 0, avail, diff;
snd_pcm_uframes_t hw_ptr;
snd_pcm_state_t state;
count_info *info = arg;
@@ -1077,21 +1109,24 @@
if (str->mmap_buffer)
oss_dsp_mmap_update(dsp, SND_PCM_STREAM_PLAYBACK,
delay);
}
- /* FIXME */
- snd_pcm_avail_update(pcm);
- hw_ptr = _snd_pcm_mmap_hw_ptr(pcm);
- info->bytes = hw_ptr;
- info->bytes *= str->frame_bytes;
- info->ptr = hw_ptr % str->oss.buffer_size;
- info->ptr *= str->frame_bytes;
+ avail = snd_pcm_avail_update(pcm);
+ hw_ptr = (str->alsa.appl_ptr - (str->alsa.buffer_size - avail)) %
str->alsa.boundary;
+ diff = hw_ptr - str->alsa.old_hw_ptr;
+ if (diff < 0)
+ diff += str->alsa.boundary;
+ str->oss.hw_bytes += diff;
+ str->oss.hw_bytes %= str->oss.boundary;
+ info->bytes = str->oss.hw_bytes * str->frame_bytes;
+ info->ptr = info->bytes % (str->oss.buffer_size * str->frame_bytes);
if (str->mmap_buffer) {
ssize_t n = (hw_ptr / str->oss.period_size) -
(str->alsa.old_hw_ptr / str->oss.period_size);
if (n < 0)
n += str->alsa.boundary / str->oss.period_size;
info->blocks = n;
- str->alsa.old_hw_ptr = hw_ptr;
- } else
+ } else {
info->blocks = delay / str->oss.period_size;
+ }
+ str->alsa.old_hw_ptr = hw_ptr;
DEBUG("SNDCTL_DSP_GETOPTR, %p) -> {%d %d %d}\n", arg,
info->bytes,
info->blocks,
-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog