public static unsafe float[,] GetMatrixMixMap(AudioChannelLayout inputLayout, AudioChannelLayout outputLayout) { if (inputLayout == null) throw new ArgumentNullException ("inputLayout"); if (outputLayout == null) throw new ArgumentNullException ("outputLayout"); var channels_count_output = GetNumberOfChannels (outputLayout); if (channels_count_output == null) throw new ArgumentException ("outputLayout"); var channels_count_input = GetNumberOfChannels (inputLayout); if (channels_count_input == null) throw new ArgumentException ("inputLayout"); int ptr_size; var input_ptr = inputLayout.ToBlock (out ptr_size); var output_ptr = outputLayout.ToBlock (out ptr_size); var array = new IntPtr[] { input_ptr, output_ptr }; ptr_size = sizeof (IntPtr) * array.Length; float[,] value; AudioFormatError res; fixed (IntPtr* ptr = &array[0]) { value = new float[channels_count_input.Value, channels_count_output.Value]; var size = sizeof (float) * channels_count_input.Value * channels_count_output.Value; fixed (float* value_ptr = &value[0, 0]) { res = AudioFormatPropertyNative.AudioFormatGetProperty (AudioFormatProperty.MatrixMixMap, ptr_size, ptr, ref size, value_ptr); } } Marshal.FreeHGlobal (input_ptr); Marshal.FreeHGlobal (output_ptr); return res == 0 ? value : null; }