On Thu, 26 Jan 2017 15:14:41 +0100, Jörg Müller wrote: > > I need to combine two HDSPe MADI FX cards to one virtual device. I > have a working driver, which is alsa-compatible. I can select each > single card in any alsa-compatible application and all channels work > flawless. > For combining the MADI FX cards to one virtual device, I created an > .asoundrc with 194 inputs for each card. When I start that virtual > device via > jackd -R -d alsa -C madifx_record_all -P madifx_playback_all > > I get this error: > > creating alsa driver ... > > madifx_playback_all|madifx_record_all|1024|2|48000|0|0|nomon|swmeter|-|32bit > > jackd: pcm_multi.c:1060: snd_pcm_multi_open: Assertion `!slave_map[sidxs[i]][schannels[i]]' failed. > > However, it works when I reduce the amount from 194 to 64 channels per > card. I tried to use 128 channels per card, but that fails the same > way. See my alsa-info here http://pastebin.com/4hq1B3wZ , which also > includes the .asoundrc content. > > I also found this, which might be related: > https://ccrma.stanford.edu/mirrors/lalists/lad/2005/06/0202.html > > To me, this looks like a bug. What do you think? Yes, it's a bug, the multi plugin has some weird check with a static table in the fixed size 64x64, and it overflowed. It looks nothing more like a sanity check, so we can get rid of it, I suppose. Could you try the patch below? thanks, Takashi --- diff --git a/src/pcm/pcm_multi.c b/src/pcm/pcm_multi.c index c4b1fba32cac..991f8540b62e 100644 --- a/src/pcm/pcm_multi.c +++ b/src/pcm/pcm_multi.c @@ -1015,7 +1015,6 @@ int snd_pcm_multi_open(snd_pcm_t **pcmp, const char *name, snd_pcm_multi_t *multi; unsigned int i; snd_pcm_stream_t stream; - char slave_map[64][64] = { { 0 } }; int err; assert(pcmp); @@ -1051,17 +1050,7 @@ int snd_pcm_multi_open(snd_pcm_t **pcmp, const char *name, slave->channels_count = schannels_count[i]; slave->close_slave = close_slaves; } - for (i = 0; i < channels_count; ++i) { - snd_pcm_multi_channel_t *bind = &multi->channels[i]; - assert(sidxs[i] < (int)slaves_count); - assert(schannels[i] < schannels_count[sidxs[i]]); - bind->slave_idx = sidxs[i]; - bind->slave_channel = schannels[i]; - if (sidxs[i] < 0) - continue; - assert(!slave_map[sidxs[i]][schannels[i]]); - slave_map[sidxs[i]][schannels[i]] = 1; - } + multi->channels_count = channels_count; err = snd_pcm_new(&pcm, SND_PCM_TYPE_MULTI, name, stream, _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel