using Ryujinx.Audio.Renderer.Common;
using Ryujinx.Common.Utilities;
using System;
using System.Runtime.InteropServices;
namespace Ryujinx.Audio.Renderer.Parameter
{
    /// 
    /// Input information for an effect version 2. (added with REV9)
    /// 
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct EffectInParameterVersion2 : IEffectInParameter
    {
        /// 
        /// Type of the effect.
        /// 
        public EffectType Type;
        /// 
        /// Set to true if the effect is new.
        /// 
        [MarshalAs(UnmanagedType.I1)]
        public bool IsNew;
        /// 
        /// Set to true if the effect must be active.
        /// 
        [MarshalAs(UnmanagedType.I1)]
        public bool IsEnabled;
        /// 
        /// Reserved/padding.
        /// 
        private byte _reserved1;
        /// 
        /// The target mix id of the effect.
        /// 
        public int MixId;
        /// 
        /// Address of the processing workbuffer.
        /// 
        /// This is additional data that could be required by the effect processing.
        public ulong BufferBase;
        /// 
        /// Size of the processing workbuffer.
        /// 
        /// This is additional data that could be required by the effect processing.
        public ulong BufferSize;
        /// 
        /// Position of the effect while processing effects.
        /// 
        public uint ProcessingOrder;
        /// 
        /// Reserved/padding.
        /// 
        private uint _reserved2;
        /// 
        /// Specific data storage.
        /// 
        private SpecificDataStruct _specificDataStart;
        [StructLayout(LayoutKind.Sequential, Size = 0xA0, Pack = 1)]
        private struct SpecificDataStruct { }
        public Span SpecificData => SpanHelpers.AsSpan(ref _specificDataStart);
        EffectType IEffectInParameter.Type => Type;
        bool IEffectInParameter.IsNew => IsNew;
        bool IEffectInParameter.IsEnabled => IsEnabled;
        int IEffectInParameter.MixId => MixId;
        ulong IEffectInParameter.BufferBase => BufferBase;
        ulong IEffectInParameter.BufferSize => BufferSize;
        uint IEffectInParameter.ProcessingOrder => ProcessingOrder;
        /// 
        ///  Check if the given channel count is valid.
        /// 
        /// The channel count to check
        /// Returns true if the channel count is valid.
        public static bool IsChannelCountValid(int channelCount)
        {
            return channelCount == 1 || channelCount == 2 || channelCount == 4 || channelCount == 6;
        }
    }
}