Update of /cvsroot/alsa/alsa-lib/src/pcm
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4289
Modified Files:
pcm.c pcm_file.c pcm_local.h pcm_mmap.c pcm_plug.c
Log Message:
Fixed file plugin - mmap access was broken and revents were not handled correctly
Index: pcm.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm.c,v
retrieving revision 1.268
retrieving revision 1.269
diff -u -r1.268 -r1.269
--- pcm.c 6 Feb 2004 09:38:49 -0000 1.268
+++ pcm.c 8 Feb 2004 10:19:52 -0000 1.269
@@ -2257,6 +2257,8 @@
char *dst;
int width;
int src_step, dst_step;
+ if (dst_area == src_area && dst_offset == src_offset)
+ return 0;
if (!src_area->addr)
return snd_pcm_area_silence(dst_area, dst_offset, samples, format);
src = snd_pcm_channel_area_addr(src_area, src_offset);
Index: pcm_file.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_file.c,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -r1.60 -r1.61
--- pcm_file.c 25 Jul 2003 17:02:03 -0000 1.60
+++ pcm_file.c 8 Feb 2004 10:20:02 -0000 1.61
@@ -138,6 +138,12 @@
return snd_pcm_async(file->slave, sig, pid);
}
+static int snd_pcm_file_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned
int nfds, unsigned short *revents)
+{
+ snd_pcm_file_t *file = pcm->private_data;
+ return snd_pcm_poll_descriptors_revents(file->slave, pfds, nfds, revents);
+}
+
static int snd_pcm_file_info(snd_pcm_t *pcm, snd_pcm_info_t * info)
{
snd_pcm_file_t *file = pcm->private_data;
@@ -345,6 +351,19 @@
return snd_pcm_hw_refine(file->slave, params);
}
+static int snd_pcm_file_hw_free(snd_pcm_t *pcm)
+{
+ snd_pcm_file_t *file = pcm->private_data;
+ if (file->wbuf) {
+ free(file->wbuf);
+ if (file->wbuf_areas)
+ free(file->wbuf_areas);
+ file->wbuf = 0;
+ file->wbuf_areas = 0;
+ }
+ return snd_pcm_hw_free(file->slave);
+}
+
static int snd_pcm_file_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t * params)
{
snd_pcm_file_t *file = pcm->private_data;
@@ -358,7 +377,15 @@
file->wbuf_size_bytes = snd_pcm_frames_to_bytes(slave, file->wbuf_size);
assert(!file->wbuf);
file->wbuf = malloc(file->wbuf_size_bytes);
+ if (file->wbuf == NULL) {
+ snd_pcm_file_hw_free(pcm);
+ return -ENOMEM;
+ }
file->wbuf_areas = malloc(sizeof(*file->wbuf_areas) * slave->channels);
+ if (file->wbuf_areas == NULL) {
+ snd_pcm_file_hw_free(pcm);
+ return -ENOMEM;
+ }
file->appl_ptr = file->file_ptr_bytes = 0;
for (channel = 0; channel < slave->channels; ++channel) {
snd_pcm_channel_area_t *a = &file->wbuf_areas[channel];
@@ -369,18 +396,6 @@
return 0;
}
-static int snd_pcm_file_hw_free(snd_pcm_t *pcm)
-{
- snd_pcm_file_t *file = pcm->private_data;
- if (file->wbuf) {
- free(file->wbuf);
- free(file->wbuf_areas);
- file->wbuf = 0;
- file->wbuf_areas = 0;
- }
- return snd_pcm_hw_free(file->slave);
-}
-
static int snd_pcm_file_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t * params)
{
snd_pcm_file_t *file = pcm->private_data;
@@ -389,11 +404,23 @@
static int snd_pcm_file_mmap(snd_pcm_t *pcm ATTRIBUTE_UNUSED)
{
+ snd_pcm_file_t *file = pcm->private_data;
+ snd_pcm_t *slave = file->slave;
+ pcm->running_areas = slave->running_areas;
+ pcm->stopped_areas = slave->stopped_areas;
+ pcm->mmap_channels = slave->mmap_channels;
+ pcm->mmap_shadow = 1;
return 0;
}
static int snd_pcm_file_munmap(snd_pcm_t *pcm ATTRIBUTE_UNUSED)
{
+ snd_pcm_file_t *file = pcm->private_data;
+ snd_pcm_t *slave = file->slave;
+ pcm->mmap_channels = NULL;
+ pcm->running_areas = NULL;
+ pcm->stopped_areas = NULL;
+ pcm->mmap_shadow = 0;
return 0;
}
@@ -423,6 +450,7 @@
.dump = snd_pcm_file_dump,
.nonblock = snd_pcm_file_nonblock,
.async = snd_pcm_file_async,
+ .poll_revents = snd_pcm_file_poll_revents,
.mmap = snd_pcm_file_mmap,
.munmap = snd_pcm_file_munmap,
};
@@ -512,6 +540,7 @@
pcm->private_data = file;
pcm->poll_fd = slave->poll_fd;
pcm->poll_events = slave->poll_events;
+ pcm->mmap_shadow = 1;
snd_pcm_link_hw_ptr(pcm, slave);
snd_pcm_link_appl_ptr(pcm, slave);
*pcmp = pcm;
Index: pcm_local.h
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_local.h,v
retrieving revision 1.131
retrieving revision 1.132
diff -u -r1.131 -r1.132
--- pcm_local.h 31 Jan 2004 12:16:33 -0000 1.131
+++ pcm_local.h 8 Feb 2004 10:20:02 -0000 1.132
@@ -200,9 +200,9 @@
snd_pcm_rbptr_t appl;
snd_pcm_rbptr_t hw;
snd_pcm_uframes_t min_align;
- int mmap_rw;
- int shadow_mmap;
- int donot_close;
+ int mmap_rw: 1,
+ mmap_shadow: 1,
+ donot_close: 1;
snd_pcm_channel_info_t *mmap_channels;
snd_pcm_channel_area_t *running_areas;
snd_pcm_channel_area_t *stopped_areas;
Index: pcm_mmap.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_mmap.c,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -r1.70 -r1.71
--- pcm_mmap.c 24 Jan 2004 16:35:34 -0000 1.70
+++ pcm_mmap.c 8 Feb 2004 10:20:02 -0000 1.71
@@ -295,7 +295,7 @@
err = pcm->ops->mmap(pcm);
if (err < 0)
return err;
- if (pcm->shadow_mmap)
+ if (pcm->mmap_shadow)
return 0;
pcm->mmap_channels = calloc(pcm->channels, sizeof(pcm->mmap_channels[0]));
if (!pcm->mmap_channels)
@@ -434,7 +434,7 @@
unsigned int c;
assert(pcm);
assert(pcm->mmap_channels);
- if (pcm->shadow_mmap)
+ if (pcm->mmap_shadow)
return pcm->ops->munmap(pcm);
for (c = 0; c < pcm->channels; ++c) {
snd_pcm_channel_info_t *i = &pcm->mmap_channels[c];
Index: pcm_plug.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_plug.c,v
retrieving revision 1.124
retrieving revision 1.125
diff -u -r1.124 -r1.125
--- pcm_plug.c 8 Aug 2003 09:06:41 -0000 1.124
+++ pcm_plug.c 8 Feb 2004 10:20:03 -0000 1.125
@@ -943,7 +943,7 @@
pcm->mmap_channels = plug->slave->mmap_channels;
pcm->running_areas = plug->slave->running_areas;
pcm->stopped_areas = plug->slave->stopped_areas;
- pcm->shadow_mmap = 1;
+ pcm->mmap_shadow = 1;
return 0;
}
@@ -953,7 +953,7 @@
pcm->mmap_channels = NULL;
pcm->running_areas = NULL;
pcm->stopped_areas = NULL;
- pcm->shadow_mmap = 0;
+ pcm->mmap_shadow = 0;
return 0;
}
-------------------------------------------------------
The SF.Net email is sponsored by EclipseCon 2004
Premiere Conference on Open Tools Development and Integration
See the breadth of Eclipse activity. February 3-5 in Anaheim, CA.
http://www.eclipsecon.org/osdn
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog