Re: auto upmix in .asoundrc

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



At Thu, 03 Dec 2009 14:39:21 +0100,
Christopher Schramm wrote:
> 
> Takashi Iwai wrote:
> > At Mon, 30 Nov 2009 10:51:17 +0100,
> > Yes, I meant to add some codes to the plugin :)
> > It's easy to write the code to send silence to the side speakers
> > except for 7.1.
> 
> Your right. I just did that. If somebody's interested here's how:
> 
> 
> Go into alsa-plugins' mix/pcm_upmix.c.
> 
> 
> In SND_PCM_PLUGIN_DEFINE_FUNC(upmix) add ' && channels != 8' to
> 
> if (channels != 4 && channels != 6 && channels != 0) {
> 
> so the plugin will accept the channels configuration parameter to be 8. 
> You also have to replace the 6 with 8 within
> 
> snd_pcm_extplug_set_param_minmax(&mix->ext, SND_PCM_EXTPLUG_HW_CHANNELS, 
> 1, 6);
> 
> 
> In upmix_init add an additional stype value for 8 channels config:
> 
> switch (ext->slave_channels) {
> 	case 6:
> 		stype = 1;
> 		break;
> 	case 8:
> 		stype = 2;
> 		break;
> 	default:
> 		stype = 0;
> }
> 
> and allow ctype to be up to 7:
> 
> if (ctype < 0 || ctype > 7) {
> 
> 
> Now you can extend the do_upmix matrix, which determines what function 
> to call on what input-output situation. Mine looks like this:
> 
> static const upmixer_t do_upmix[8][3] = {
> 	{ upmix_1_to_40, upmix_1_to_51, upmix_1_to_71 },
> 	{ upmix_2_to_40, upmix_2_to_51, upmix_2_to_71 },
> 	{ upmix_3_to_40, upmix_3_to_51, upmix_3_to_51 },
> 	{ upmix_4_to_40, upmix_4_to_51, upmix_4_to_51 },
> 	{ upmix_4_to_40, upmix_5_to_51, upmix_5_to_51 },
> 	{ upmix_4_to_40, upmix_6_to_51, upmix_6_to_51 },
> 	{ upmix_4_to_40, upmix_6_to_51, upmix_6_to_51 },
> 	{ upmix_4_to_40, upmix_6_to_51, upmix_8_to_71 },
> };
> 
> The third column is for stype 2 (8 channels output), the two additional 
> rows are for ctypes 6 and 7 (7 and 8 channels input).
> 
> 
> Explanation:
> 
> 
> If there is 1 channel input, a modified copy of upmix_1_to_51 is used 
> with i < 8 instead of 6, so the source gets copied to the additional two 
> channels as well.
> 
> 
> If there are 2 channels, a modified copy of upmix_2_to_51 is used. It 
> includes the additional line
> 
> snd_pcm_areas_copy(dst_areas + 6, dst_offset, src_areas, src_offset, 2, 
> size, SND_PCM_FORMAT_S16);
> 
> that copies front left and right to side left and right.
> 
> 
> I've just ignored channel counts 3 and 7 since they don't make too much 
> sense to me.
> 
> 
> If the source has 4 to 6 channels, the side speakers aren't used, so the 
> signal sounds like it is intended to.
> 
> 
> And finally if the source has got 8 channels, a copy of upmix_6_to_51 is 
> used, in which param 6 is replaced with 8.
> 
> 
> Simple thing and works great

And sharing your joy with everyone would be more great :)
Could you post a patch so that I can apply it to GIT tree?


thanks,

Takashi

------------------------------------------------------------------------------
Join us December 9, 2009 for the Red Hat Virtual Experience,
a free event focused on virtualization and cloud computing. 
Attend in-depth sessions from your desk. Your couch. Anywhere.
http://p.sf.net/sfu/redhat-sfdev2dev
_______________________________________________
Alsa-user mailing list
Alsa-user@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/alsa-user

[Index of Archives]     [ALSA Devel]     [Linux Audio Users]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]

  Powered by Linux