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;
        }