Jump to content
Visual Boy Advance-M
Sign in to follow this  
spacy51

XAudio2 upmixing matrices

Recommended Posts

Hey there, I just added the feature to upmix the GB's/GBA's stereo sound to the number of speakers which are attached to the souncard.

 

I took this inof sheet as a reference:

http://ac3filter.net/guides/mixing_matrix

 

And this for the speaker order:

http://msdn.microsoft.com/en-us/library/bb694506.aspx

 

 

Here are my matrices. Since I entered them by hand, it would be good if everyone who is into that stuff could tell me if they're good.

Is it OK if I leave the LFE always at 0 since it would receive frequencies higher than for ex. 120Hz?

I can still hear my LFE because my sound driver uses a crossover frequency to get the subwoofer signal from the low-freq part of the other channels.

 

#ifdef STEREO_UPMIXING
// set up stereo upmixing
XAUDIO2_DEVICE_DETAILS dd;
ZeroMemory( &dd, sizeof( dd ) );
hr = xaud->GetDeviceDetails( 0, &dd );
ASSERT( hr == S_OK );
float *matrix = NULL;
matrix = (float*)malloc( sizeof( float ) * 2 * dd.OutputFormat.Format.nChannels );
switch( dd.OutputFormat.Format.nChannels ) {
	case 4: // 4.0
//Speaker \ Left Source           Right Source
/*Front L*/	matrix[0] = 1.0000f;  matrix[1] = 0.0000f;
/*Front R*/	matrix[2] = 0.0000f;  matrix[3] = 1.0000f;
/*Back  L*/	matrix[4] = 1.0000f;  matrix[5] = 0.0000f;
/*Back  R*/	matrix[6] = 0.0000f;  matrix[7] = 1.0000f;
		break;
	case 5: // 5.0
//Speaker \ Left Source           Right Source
/*Front L*/	matrix[0] = 1.0000f;  matrix[1] = 0.0000f;
/*Front R*/	matrix[2] = 0.0000f;  matrix[3] = 1.0000f;
/*Front C*/	matrix[4] = 0.7071f;  matrix[5] = 0.7071f;
/*Side  L*/	matrix[6] = 1.0000f;  matrix[7] = 0.0000f;
/*Side  R*/	matrix[8] = 0.0000f;  matrix[9] = 1.0000f;
		break;
	case 6: // 5.1
//Speaker \ Left Source           Right Source
/*Front L*/	matrix[0] = 1.0000f;  matrix[1] = 0.0000f;
/*Front R*/	matrix[2] = 0.0000f;  matrix[3] = 1.0000f;
/*Front C*/	matrix[4] = 0.7071f;  matrix[5] = 0.7071f;
/*LFE    */	matrix[6] = 0.0000f;  matrix[7] = 0.0000f;
/*Side  L*/	matrix[8] = 1.0000f;  matrix[9] = 0.0000f;
/*Side  R*/	matrix[10] = 0.0000f;  matrix[11] = 1.0000f;
		break;
	case 7: // 6.1
//Speaker \ Left Source           Right Source
/*Front L*/	matrix[0] = 1.0000f;  matrix[1] = 0.0000f;
/*Front R*/	matrix[2] = 0.0000f;  matrix[3] = 1.0000f;
/*Front C*/	matrix[4] = 0.7071f;  matrix[5] = 0.7071f;
/*LFE    */	matrix[6] = 0.0000f;  matrix[7] = 0.0000f;
/*Side  L*/	matrix[8] = 1.0000f;  matrix[9] = 0.0000f;
/*Side  R*/	matrix[10] = 0.0000f;  matrix[11] = 1.0000f;
/*Back  C*/	matrix[12] = 0.7071f;  matrix[13] = 0.7071f;
		break;
	case 8: // 7.1
//Speaker \ Left Source           Right Source
/*Front L*/	matrix[0] = 1.0000f;  matrix[1] = 0.0000f;
/*Front R*/	matrix[2] = 0.0000f;  matrix[3] = 1.0000f;
/*Front C*/	matrix[4] = 0.7071f;  matrix[5] = 0.7071f;
/*LFE    */	matrix[6] = 0.0000f;  matrix[7] = 0.0000f;
/*Back  L*/	matrix[8] = 1.0000f;  matrix[9] = 0.0000f;
/*Back  R*/	matrix[10] = 0.0000f;  matrix[11] = 1.0000f;
/*Side  L*/	matrix[12] = 1.0000f;  matrix[13] = 0.0000f;
/*Side  R*/	matrix[14] = 0.0000f;  matrix[15] = 1.0000f;
		break;
}
hr = sVoice->SetOutputMatrix( NULL, 2, dd.OutputFormat.Format.nChannels, matrix );
ASSERT( hr == S_OK );
free( matrix );
matrix = NULL;
#endif

Share this post


Link to post
Share on other sites

LFE crossmixing should be made adjustable, as not all sound drivers mix LFE channels.

 

my main pc's Logitech Z640 and creative SB Live make a virtual surround already, though since i've been gaming on my other pc lately, i use my HTS's DPLII mixing.

Share this post


Link to post
Share on other sites

Well, the problem is I have no idea if setting up a crossover frequency is possible with XAudio2.

 

 

LFE crossmixing should be made adjustable, as not all sound drivers mix LFE channels.

 

my main pc's Logitech Z640 and creative SB Live make a virtual surround already, though since i've been gaming on my other pc lately, i use my HTS's DPLII mixing.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×