XAudio2 upmixing matrices

Post Reply
spacy51
Senior Member
Posts: 371
Joined: Tue Mar 18, 2008 9:59 am

XAudio2 upmixing matrices

Post by spacy51 »

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.

 




Code: Select all

#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
Last edited by spacy51 on Mon Jul 14, 2008 6:47 am, edited 1 time in total.
Squall Leonhart
Posting Freak
Posts: 1217
Joined: Tue Mar 18, 2008 2:21 am

XAudio2 upmixing matrices

Post by Squall Leonhart »

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.
spacy51
Senior Member
Posts: 371
Joined: Tue Mar 18, 2008 9:59 am

XAudio2 upmixing matrices

Post by spacy51 »

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.




Squall Leonhart
Posting Freak
Posts: 1217
Joined: Tue Mar 18, 2008 2:21 am

XAudio2 upmixing matrices

Post by Squall Leonhart »

you should totally make an Xaudio plugin for Project64 [img]<fileStore.core_Emoticons>/emoticons/tongue.png[/img]/emoticons/tongue@2x.png 2x" width="20" height="20" />
Post Reply