Thank you! Thank you! Thank you! Freaking awesome! You fixed two bugs in one! I can now use recent ALSA versions (and linux distros), AND I can combine the two cards at 24 bits resolution, at any buffer size, instead of 16 bits (because mmap was requiring me to use really small buffers). |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | I.O.U. | One case of <your favourite beverage> | Or one bottle of <something special> | | Expires: Never. |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| OK, sure, I know I should run out and buy one of the newer 24 bit Creative cards so I don't have to convert, but hey, there's a lot of SBLive! cards out there... I need it for the hardware soundfonts only. Fluidsynth is good but a software solution. * Anyways, initial tests are good. * I will test this weekend and let you know how it goes, * and after you can commit the patch for good. A final 'note': The envy24control app's Master Clock - Signal/No Signal seems broken again. I know the cards are locked, but it still says 'No signal' when S/PDIF is selected. Some weirdness happening, seems to not actually lock sometimes, forcing me to switch back and forth between Int48000 and S/PDIF. But at least it mostly works. I really appreciate you listening to me and taking the time to fix things. I know that given precise information, you always squash these bugs quickly. Tim. On Friday 23 November 2007 09:35:35 am you wrote: > At Fri, 23 Nov 2007 14:41:43 +0100, > > I wrote: > > Try the patch below. This should fix the problem. Now the multi > > plugin just shadows the slave buffers via mmap. > > There was a minor bug in the last patch. The revised version is > below. > > > Takashi > > diff -r 3539f279ec38 src/pcm/pcm_multi.c > --- a/src/pcm/pcm_multi.c Wed Nov 21 12:19:43 2007 +0100 > +++ b/src/pcm/pcm_multi.c Fri Nov 23 15:34:16 2007 +0100 > @@ -690,13 +690,44 @@ static snd_pcm_sframes_t snd_pcm_multi_m > return size; > } > > -static int snd_pcm_multi_mmap(snd_pcm_t *pcm ATTRIBUTE_UNUSED) > +static int snd_pcm_multi_munmap(snd_pcm_t *pcm) > { > + free(pcm->mmap_channels); > + free(pcm->running_areas); > + pcm->mmap_channels = NULL; > + pcm->running_areas = NULL; > return 0; > } > > -static int snd_pcm_multi_munmap(snd_pcm_t *pcm ATTRIBUTE_UNUSED) > +static int snd_pcm_multi_mmap(snd_pcm_t *pcm) > { > + snd_pcm_multi_t *multi = pcm->private_data; > + unsigned int c; > + > + pcm->mmap_channels = calloc(pcm->channels, > + sizeof(pcm->mmap_channels[0])); > + pcm->running_areas = calloc(pcm->channels, > + sizeof(pcm->running_areas[0])); > + if (!pcm->mmap_channels || !pcm->running_areas) { > + snd_pcm_multi_munmap(pcm); > + return -ENOMEM; > + } > + > + /* Copy the slave mmapped buffer data */ > + for (c = 0; c < pcm->channels; c++) { > + snd_pcm_multi_channel_t *chan = &multi->channels[c]; > + snd_pcm_t *slave; > + if (chan->slave_idx < 0) { > + snd_pcm_multi_munmap(pcm); > + return -ENXIO; > + } > + slave = multi->slaves[chan->slave_idx].pcm; > + pcm->mmap_channels[c] = > + slave->mmap_channels[chan->slave_channel]; > + pcm->mmap_channels[c].channel = c; > + pcm->running_areas[c] = > + slave->running_areas[chan->slave_channel]; > + } > return 0; > } > > @@ -850,6 +881,7 @@ int snd_pcm_multi_open(snd_pcm_t **pcmp, > return err; > } > pcm->mmap_rw = 1; > + pcm->mmap_shadow = 1; /* has own mmap method */ > pcm->ops = &snd_pcm_multi_ops; > pcm->fast_ops = &snd_pcm_multi_fast_ops; > pcm->private_data = multi; _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel