Update of /cvsroot/alsa/alsa-lib/src/pcm
In directory sc8-pr-cvs1:/tmp/cvs-serv25851
Modified Files:
pcm_route.c
Log Message:
Fixed bug: added limit for source channels.
Index: pcm_route.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_route.c,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -r1.73 -r1.74
--- pcm_route.c 25 Jul 2003 17:02:04 -0000 1.73
+++ pcm_route.c 12 Aug 2003 12:30:53 -0000 1.74
@@ -74,6 +74,7 @@
snd_pcm_uframes_t dst_offset,
const snd_pcm_channel_area_t *src_areas,
snd_pcm_uframes_t src_offset,
+ unsigned int src_channels,
snd_pcm_uframes_t frames,
const snd_pcm_route_ttable_dst_t *ttable,
const snd_pcm_route_params_t *params);
@@ -107,6 +108,7 @@
snd_pcm_uframes_t dst_offset,
const snd_pcm_channel_area_t *src_areas
ATTRIBUTE_UNUSED,
snd_pcm_uframes_t src_offset ATTRIBUTE_UNUSED,
+ unsigned int src_channels ATTRIBUTE_UNUSED,
snd_pcm_uframes_t frames,
const snd_pcm_route_ttable_dst_t* ttable
ATTRIBUTE_UNUSED,
const snd_pcm_route_params_t *params)
@@ -120,6 +122,7 @@
snd_pcm_uframes_t dst_offset,
const snd_pcm_channel_area_t *src_areas,
snd_pcm_uframes_t src_offset,
+ unsigned int src_channels,
snd_pcm_uframes_t frames,
const snd_pcm_route_ttable_dst_t* ttable,
const snd_pcm_route_params_t *params)
@@ -133,14 +136,18 @@
const char *src;
char *dst;
int src_step, dst_step;
- for (srcidx = 0; srcidx < ttable->nsrcs; ++srcidx) {
- src_area = &src_areas[ttable->srcs[srcidx].channel];
+ for (srcidx = 0; srcidx < ttable->nsrcs && srcidx < src_channels; ++srcidx) {
+ unsigned int channel = ttable->srcs[srcidx].channel;
+ if (channel >= src_channels)
+ continue;
+ src_area = &src_areas[channel];
if (src_area->addr != NULL)
break;
}
- if (srcidx == ttable->nsrcs) {
+ if (srcidx == ttable->nsrcs || srcidx == src_channels) {
snd_pcm_route_convert1_zero(dst_area, dst_offset,
src_areas, src_offset,
+ src_channels,
frames, ttable, params);
return;
}
@@ -165,6 +172,7 @@
snd_pcm_uframes_t dst_offset,
const snd_pcm_channel_area_t *src_areas,
snd_pcm_uframes_t src_offset,
+ unsigned int src_channels,
snd_pcm_uframes_t frames,
const snd_pcm_route_ttable_dst_t* ttable,
const snd_pcm_route_params_t *params)
@@ -179,14 +187,18 @@
char *dst;
int src_step, dst_step;
u_int32_t sample = 0;
- for (srcidx = 0; srcidx < ttable->nsrcs; ++srcidx) {
- src_area = &src_areas[ttable->srcs[srcidx].channel];
+ for (srcidx = 0; srcidx < ttable->nsrcs && srcidx < src_channels; ++srcidx) {
+ unsigned int channel = ttable->srcs[srcidx].channel;
+ if (channel >= src_channels)
+ continue;
+ src_area = &src_areas[channel];
if (src_area->addr != NULL)
break;
}
- if (srcidx == ttable->nsrcs) {
+ if (srcidx == ttable->nsrcs || srcidx == src_channels) {
snd_pcm_route_convert1_zero(dst_area, dst_offset,
src_areas, src_offset,
+ src_channels,
frames, ttable, params);
return;
}
@@ -212,6 +224,7 @@
snd_pcm_uframes_t dst_offset,
const snd_pcm_channel_area_t *src_areas,
snd_pcm_uframes_t src_offset,
+ unsigned int src_channels,
snd_pcm_uframes_t frames,
const snd_pcm_route_ttable_dst_t* ttable,
const snd_pcm_route_params_t *params)
@@ -273,8 +286,12 @@
snd_pcm_route_ttable_src_t src_tt[nsrcs];
int32_t sample = 0;
int srcidx, srcidx1 = 0;
- for (srcidx = 0; srcidx < nsrcs; ++srcidx) {
- const snd_pcm_channel_area_t *src_area =
&src_areas[ttable->srcs[srcidx].channel];
+ for (srcidx = 0; srcidx < nsrcs && (unsigned)srcidx < src_channels; ++srcidx) {
+ const snd_pcm_channel_area_t *src_area;
+ unsigned int channel = ttable->srcs[srcidx].channel;
+ if (channel >= src_channels)
+ continue;
+ src_area = &src_areas[channel];
srcs[srcidx1] = snd_pcm_channel_area_addr(src_area, src_offset);
src_steps[srcidx1] = snd_pcm_channel_area_step(src_area);
src_tt[srcidx1] = ttable->srcs[srcidx];
@@ -284,16 +301,19 @@
if (nsrcs == 0) {
snd_pcm_route_convert1_zero(dst_area, dst_offset,
src_areas, src_offset,
+ src_channels,
frames, ttable, params);
return;
} else if (nsrcs == 1 && src_tt[0].as_int == SND_PCM_PLUGIN_ROUTE_RESOLUTION) {
if (params->use_getput)
snd_pcm_route_convert1_one_getput(dst_area, dst_offset,
src_areas, src_offset,
+ src_channels,
frames, ttable, params);
else
snd_pcm_route_convert1_one(dst_area, dst_offset,
src_areas, src_offset,
+ src_channels,
frames, ttable, params);
return;
}
@@ -456,7 +476,8 @@
snd_pcm_uframes_t dst_offset,
const snd_pcm_channel_area_t *src_areas,
snd_pcm_uframes_t src_offset,
- snd_pcm_uframes_t dst_channels,
+ unsigned int src_channels,
+ unsigned int dst_channels,
snd_pcm_uframes_t frames,
snd_pcm_route_params_t *params)
{
@@ -470,10 +491,12 @@
if (dst_channel >= params->ndsts)
snd_pcm_route_convert1_zero(dst_area, dst_offset,
src_areas, src_offset,
+ src_channels,
frames, dstp, params);
else
dstp->func(dst_area, dst_offset,
src_areas, src_offset,
+ src_channels,
frames, dstp, params);
dstp++;
dst_area++;
@@ -653,7 +676,9 @@
size = *slave_sizep;
snd_pcm_route_convert(slave_areas, slave_offset,
areas, offset,
- slave->channels, size, &route->params);
+ pcm->channels,
+ slave->channels,
+ size, &route->params);
*slave_sizep = size;
return size;
}
@@ -668,11 +693,14 @@
snd_pcm_uframes_t *slave_sizep)
{
snd_pcm_route_t *route = pcm->private_data;
+ snd_pcm_t *slave = route->plug.slave;
if (size > *slave_sizep)
size = *slave_sizep;
snd_pcm_route_convert(areas, offset,
slave_areas, slave_offset,
- pcm->channels, size, &route->params);
+ slave->channels,
+ pcm->channels,
+ size, &route->params);
*slave_sizep = size;
return size;
}
-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog