//
// Copyright (c) 2019-2021 Ryujinx
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program.  If not, see .
//
using System.Runtime.InteropServices;
using DspAddr = System.UInt64;
namespace Ryujinx.Audio.Renderer.Common
{
    /// 
    /// A wavebuffer used for data source commands.
    /// 
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct WaveBuffer
    {
        /// 
        /// The DSP address of the sample data of the wavebuffer.
        /// 
        public DspAddr Buffer;
        /// 
        /// The DSP address of the context of the wavebuffer.
        /// 
        /// Only used by .
        public DspAddr Context;
        /// 
        /// The size of the sample buffer data.
        /// 
        public uint BufferSize;
        /// 
        /// The size of the context buffer.
        /// 
        public uint ContextSize;
        /// 
        /// First sample to play on the wavebuffer.
        /// 
        public uint StartSampleOffset;
        /// 
        /// Last sample to play on the wavebuffer.
        /// 
        public uint EndSampleOffset;
        /// 
        /// First sample to play when looping the wavebuffer.
        /// 
        /// 
        /// If  or  is equal to zero,, it will default to  and .
        /// 
        public uint LoopStartSampleOffset;
        /// 
        /// Last sample to play when looping the wavebuffer.
        /// 
        /// 
        /// If  or  is equal to zero, it will default to  and .
        /// 
        public uint LoopEndSampleOffset;
        /// 
        /// The max loop count.
        /// 
        public int LoopCount;
        /// 
        /// Set to true if the wavebuffer is looping.
        /// 
        [MarshalAs(UnmanagedType.I1)]
        public bool Looping;
        /// 
        /// Set to true if the wavebuffer is the end of stream.
        /// 
        [MarshalAs(UnmanagedType.I1)]
        public bool IsEndOfStream;
        /// 
        /// Padding/Reserved.
        /// 
        private ushort _padding;
    }
}