160 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Linq;
 | 
						|
using System.Runtime.InteropServices;
 | 
						|
 | 
						|
namespace NAudio.Dmo.Effect
 | 
						|
{
 | 
						|
    internal struct DsFxGargle
 | 
						|
    {
 | 
						|
        public uint RateHz;
 | 
						|
        public GargleWaveShape WaveShape;
 | 
						|
    }
 | 
						|
 | 
						|
    [ComImport,
 | 
						|
     System.Security.SuppressUnmanagedCodeSecurity,
 | 
						|
     Guid("d616f352-d622-11ce-aac5-0020af0b99a3"),
 | 
						|
     InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
 | 
						|
    interface IDirectSoundFXGargle
 | 
						|
    {
 | 
						|
        [PreserveSig]
 | 
						|
        int SetAllParameters([In] ref DsFxGargle param);
 | 
						|
 | 
						|
        [PreserveSig]
 | 
						|
        int GetAllParameters(out DsFxGargle param);
 | 
						|
    }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// DMO Gargle Effect
 | 
						|
    /// </summary>
 | 
						|
    public class DmoGargle : IDmoEffector<DmoGargle.Params>
 | 
						|
    {
 | 
						|
        /// <summary>
 | 
						|
        /// DMO Gargle Params
 | 
						|
        /// </summary>
 | 
						|
        public struct Params
 | 
						|
        {
 | 
						|
            /// <summary>
 | 
						|
            /// DSFXGARGLE_RATEHZ_MIN
 | 
						|
            /// </summary>
 | 
						|
            public const uint RateHzMin = 1;
 | 
						|
            /// <summary>
 | 
						|
            /// DSFXGARGLE_RATEHZ_MAX
 | 
						|
            /// </summary>
 | 
						|
            public const uint RateHzMax = 1000;
 | 
						|
            /// <summary>
 | 
						|
            /// DSFXGARGLE_RATEHZ_DEFAULT
 | 
						|
            /// </summary>
 | 
						|
            public const uint RateHzDefault = 20;
 | 
						|
 | 
						|
            /// <summary>
 | 
						|
            /// DSFXGARGLE_WAVE_DEFAULT
 | 
						|
            /// </summary>
 | 
						|
            public const GargleWaveShape WaveShapeDefault = GargleWaveShape.Triangle;
 | 
						|
 | 
						|
            /// <summary>
 | 
						|
            /// Rate of modulation in hz
 | 
						|
            /// </summary>
 | 
						|
            public uint RateHz
 | 
						|
            {
 | 
						|
                get
 | 
						|
                {
 | 
						|
                    var param = GetAllParameters();
 | 
						|
                    return param.RateHz;
 | 
						|
                }
 | 
						|
                set
 | 
						|
                {
 | 
						|
                    var param = GetAllParameters();
 | 
						|
                    param.RateHz = Math.Max(Math.Min(RateHzMax, value), RateHzMin);
 | 
						|
                    SetAllParameters(param);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            /// <summary>
 | 
						|
            /// Gargle Wave Shape
 | 
						|
            /// </summary>
 | 
						|
            public GargleWaveShape WaveShape
 | 
						|
            {
 | 
						|
                get
 | 
						|
                {
 | 
						|
                    var param = GetAllParameters();
 | 
						|
                    return param.WaveShape;
 | 
						|
                }
 | 
						|
                set
 | 
						|
                {
 | 
						|
                    var param = GetAllParameters();
 | 
						|
                    if (Enum.IsDefined(typeof(GargleWaveShape), value))
 | 
						|
                    {
 | 
						|
                        param.WaveShape = value;
 | 
						|
                    }
 | 
						|
                    SetAllParameters(param);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            private readonly IDirectSoundFXGargle fxGargle;
 | 
						|
 | 
						|
            internal Params(IDirectSoundFXGargle dsFxObject)
 | 
						|
            {
 | 
						|
                fxGargle = dsFxObject;
 | 
						|
            }
 | 
						|
 | 
						|
            private void SetAllParameters(DsFxGargle param)
 | 
						|
            {
 | 
						|
                Marshal.ThrowExceptionForHR(fxGargle.SetAllParameters(ref param));
 | 
						|
            }
 | 
						|
 | 
						|
            private DsFxGargle GetAllParameters()
 | 
						|
            {
 | 
						|
                Marshal.ThrowExceptionForHR(fxGargle.GetAllParameters(out var param));
 | 
						|
                return param;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private readonly MediaObject mediaObject;
 | 
						|
        private readonly MediaObjectInPlace mediaObjectInPlace;
 | 
						|
        private readonly Params effectParams;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Media Object
 | 
						|
        /// </summary>
 | 
						|
        public MediaObject MediaObject => mediaObject;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Media Object InPlace
 | 
						|
        /// </summary>
 | 
						|
        public MediaObjectInPlace MediaObjectInPlace => mediaObjectInPlace;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Effect Parameter
 | 
						|
        /// </summary>
 | 
						|
        public Params EffectParams => effectParams;
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Create new DMO Gargle
 | 
						|
        /// </summary>
 | 
						|
        public DmoGargle()
 | 
						|
        {
 | 
						|
            var guidGargle = new Guid("DAFD8210-5711-4B91-9FE3-F75B7AE279BF");
 | 
						|
 | 
						|
            var targetDescriptor = DmoEnumerator.GetAudioEffectNames().First(descriptor =>
 | 
						|
                Equals(descriptor.Clsid, guidGargle));
 | 
						|
 | 
						|
            if (targetDescriptor != null)
 | 
						|
            {
 | 
						|
                var mediaComObject = Activator.CreateInstance(Type.GetTypeFromCLSID(targetDescriptor.Clsid));
 | 
						|
 | 
						|
                mediaObject = new MediaObject((IMediaObject) mediaComObject);
 | 
						|
                mediaObjectInPlace = new MediaObjectInPlace((IMediaObjectInPlace) mediaComObject);
 | 
						|
                effectParams = new Params((IDirectSoundFXGargle) mediaComObject);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Dispose code
 | 
						|
        /// </summary>
 | 
						|
        public void Dispose()
 | 
						|
        {
 | 
						|
            mediaObjectInPlace?.Dispose();
 | 
						|
            mediaObject?.Dispose();
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |