我用directsound开发了一个简单的播放程序,想实现类似windows的加大音量功能,不知道该如何做,请各高手多多指教。
我补充一下,我需要调整的是声音的增益,分不够可以再加。巨急!!!救命呀!!!

解决方案 »

  1.   

    VB DirectSound详细说明
    http://bbs.gameres.com/showthread.asp?postid=7516
      

  2.   

    很久以前写的一个控制系统音量的组件,看看吧
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;namespace StartsSystemVolumeContrlLib
    {
        public partial class StartsSystemVolumeContrl
        {
            #region SetWave Const
            /*************************      waveVolume   const ******************************/
            private const int MMSYSERR_NOERROR = 0;
            private const int MAXPNAMELEN = 32;
            private const int MIXER_LONG_NAME_CHARS = 64;
            private const int MIXER_SHORT_NAME_CHARS = 16;        private const int MIXER_GETLINEINFOF_COMPONENTTYPE = 0x3;
            private const int MIXER_GETCONTROLDETAILSF_VALUE = 0x0;
            private const int MIXER_GETLINECONTROLSF_ONEBYTYPE = 0x2;        private const int MIXER_SETCONTROLDETAILSF_VALUE = 0x0;        private const int MIXERLINE_COMPONENTTYPE_DST_FIRST = 0x0;
            private const int MIXERLINE_COMPONENTTYPE_DST_SPEAKERS = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 4);        private const int MIXERLINE_COMPONENTTYPE_SRC_FIRST = 0x1000;
            private const int MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3);
            private const int MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 8);        private const int MIXERCONTROL_CT_UNITS_BOOLEAN = 0x10000;
            private const int MIXERCONTROL_CT_UNITS_UNSIGNED = 0x30000;        private const int MIXERCONTROL_CT_CLASS_SWITCH = 0x20000000;
            private const int MIXERCONTROL_CT_CLASS_FADER = 0x50000000;        private const int MIXERCONTROL_CT_SC_SWITCH_BOOLEAN = 0x0;        private const int MIXER_OBJECTF_MIXER = 0x00000000;        private const int MIXERCONTROL_CONTROLTYPE_FADER = (MIXERCONTROL_CT_CLASS_FADER | MIXERCONTROL_CT_UNITS_UNSIGNED);
            private const int MIXERCONTROL_CONTROLTYPE_VOLUME = (MIXERCONTROL_CONTROLTYPE_FADER + 1);
            private const int MIXERCONTROL_CONTROLTYPE_BOOLEAN = MIXERCONTROL_CT_CLASS_SWITCH | MIXERCONTROL_CT_SC_SWITCH_BOOLEAN | MIXERCONTROL_CT_UNITS_BOOLEAN;
            private const int MIXERCONTROL_CONTROLTYPE_MUTE = MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2;        private const int CALLBACK_WINDOW = 0x00010000;
            private const int MM_MIXM_LINE_CHANGE = 0x3D0;
            private const int MM_MIXM_CONTROL_CHANGE = 0x3D1;
            /*************************      waveVolume   const ******************************/
            #endregion        #region   SetWave  API
            [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
            private static extern int mixerOpen(out int phmx, int uMxId, int dwCallback, int dwInstance, int fdwOpen);        [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
            private static extern int mixerClose(int hmx);        [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
            private static extern int mixerGetControlDetailsA(int hmxobj, ref MIXERCONTROLDETAILS pmxcd, int fdwDetails);        [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
            private static extern int mixerGetDevCapsA(int uMxId, ref MIXERCAPS pmxcaps, int cbmxcaps);        [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
            private static extern int mixerGetID(int hmxobj, int pumxID, int fdwId);        [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
            private static extern int mixerGetLineControlsA(int hmxobj, ref MIXERLINECONTROLS pmxlc, int fdwControls);        [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
            private static extern int mixerGetLineInfoA(int hmxobj, ref MIXERLINE pmxl, int fdwInfo);        [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
            private static extern int mixerGetNumDevs();        [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
            private static extern int mixerMessage(int hmx, int uMsg, int dwParam1, int dwParam2);        [DllImport("winmm.dll", CharSet = CharSet.Ansi)]
            private static extern int mixerSetControlDetails(int hmxobj, ref MIXERCONTROLDETAILS pmxcd, int fdwDetails);        [StructLayout(LayoutKind.Sequential)]
            private struct MIXERCAPS
            {
                public int wMid;
                public int wPid;
                public int vDriverVersion;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAXPNAMELEN)]
                public string szPname;
                public int fdwSupport;
                public int cDestinations;
            }        [StructLayout(LayoutKind.Sequential)]
            private struct MIXERCONTROL
            {
                public int cbStruct;
                public int dwControlID;
                public int dwControlType;
                public int fdwControl;
                public int cMultipleItems;
                [MarshalAs(UnmanagedType.ByValTStr,
                     SizeConst = MIXER_SHORT_NAME_CHARS)]
                public string szShortName;
                [MarshalAs(UnmanagedType.ByValTStr,
                     SizeConst = MIXER_LONG_NAME_CHARS)]
                public string szName;
                public int lMinimum;
                public int lMaximum;
                [MarshalAs(UnmanagedType.U4, SizeConst = 10)]
                public int reserved;
            }        [StructLayout(LayoutKind.Sequential)]
            private struct MIXERCONTROLDETAILS
            {
                public int cbStruct;
                public int dwControlID;
                public int cChannels;
                public int item;
                public int cbDetails;
                public IntPtr paDetails;
            }        [StructLayout(LayoutKind.Sequential)]
            private struct MIXERCONTROLDETAILS_UNSIGNED
            {
                public int dwValue;
            }        [StructLayout(LayoutKind.Sequential)]
            private struct MIXERCONTROLDETAILS_UNSIGNED1
            {
                public int dwValueL;
                public int dwValueR;
            }        [StructLayout(LayoutKind.Sequential)]
            private struct MIXERCONTROLDETAILS_BOOLEAN
            {
                public int fValue;
            }        [StructLayout(LayoutKind.Sequential)]
            private struct MIXERLINE
            {
                public int cbStruct;
                public int dwDestination;
                public int dwSource;
                public int dwLineID;
                public int fdwLine;
                public int dwUser;
                public int dwComponentType;
                public int cChannels;
                public int cConnections;
                public int cControls;
                [MarshalAs(UnmanagedType.ByValTStr,
                     SizeConst = MIXER_SHORT_NAME_CHARS)]
                public string szShortName;
                [MarshalAs(UnmanagedType.ByValTStr,
                     SizeConst = MIXER_LONG_NAME_CHARS)]
                public string szName;
                public int dwType;
                public int dwDeviceID;
                public int wMid;
                public int wPid;
                public int vDriverVersion;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAXPNAMELEN)]
                public string szPname;
            }        [StructLayout(LayoutKind.Sequential)]
            private struct MIXERLINECONTROLS
            {
                public int cbStruct;
                public int dwLineID;            public int dwControl;
                public int cControls;
                public int cbmxctrl;
                public IntPtr pamxctrl;
            }
            #endregion
        }
    }
      

  3.   

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Drawing;namespace StartsSystemVolumeContrlLib
    {
        #region Enum    /// <summary>
        /// 控制声音类型。
        /// </summary>
        public enum MixerLineComponeType
        {
            /// <summary>
            /// 主音控制。
            /// </summary>
            SPEAKERS = 0x0004,
            /// <summary>
            /// 麦克风控制。
            /// </summary>
            MICROPHONE = 0x1003,
            /// <summary>
            /// 波形控制。
            /// </summary>
            WAVEOUT = 0x1008,
        }    /// <summary>
        /// 声道。
        /// </summary>
        public enum AudioSource : int
        {
            /// <summary>
            /// 左声道。
            /// </summary>
            Left = 1,
            /// <summary>
            /// 立体声。
            /// </summary>
            Stereo = 0,
            /// <summary>
            /// 右声道。
            /// </summary>
            Right = 2
        }
        #endregion    #region EventHandler
        /// <summary>
        /// 表示将处理 SystemVolumeContrlLib.SystemVolumeContrl 对象的 SystemVolumeContrl 的声音音量改变事件的方法。
        /// </summary>
        /// <param name="volume">声音音量。</param>
        public delegate void SystemVolumeChangeEventHandler(int volume);    /// <summary>
        /// 表示将处理 SystemVolumeContrlLib.SystemVolumeContrl 对象的 SystemVolumeContrl 的声音静间改变事件的方法。
        /// </summary>
        /// <param name="mute">是否静音。</param>
        public delegate void SystemVolumeMuteEventHandler(bool mute);    #endregion    #region
        /// <summary>
        /// 系统声音控制组件。
        /// </summary>
        [ToolboxItem(true)]
        [ToolboxBitmap(typeof(StartsSystemVolumeContrl), "Player.ico")]
        [Description("StartsSystemVolumeContrl 控制系统声音组件。")]
        [DefaultProperty("SystemVolumeStep")]
        [DefaultEvent("SystemSpeakersVolumeChange")]
        public partial class StartsSystemVolumeContrl : Component
        {
            #region 变量        private int systemVolumeStep = 15;
            private int hmixer = 0;
            private IntPtr handle = IntPtr.Zero;        #endregion        #region Event        /// <summary>
            /// 主声音音量改变。
            /// </summary>
            [Category("系统声音")]
            [Description("Speakers 音量改变。")]
            public event SystemVolumeChangeEventHandler SystemSpeakersVolumeChange;        /// <summary>
            /// 主声音静音改变。
            /// </summary>
            [Category("系统声音")]
            [Description("Speakers 音静音改变。")]
            public event SystemVolumeMuteEventHandler SystemSpeakersMuteChange;        /// <summary>
            /// WAVE 音量改变。
            /// </summary>
            [Category("系统声音")]
            [Description("WAVE 音量改变。")]
            public event SystemVolumeChangeEventHandler SystemWaveVolumeChange;        /// <summary>
            /// WAVE 静音改变。
            /// </summary>
            [Category("系统声音")]
            [Description("WAVE 静音改变。")]
            public event SystemVolumeMuteEventHandler SystemWaveMuteChange;        /// <summary>
            /// MicroPhone 音量改变。
            /// </summary>
            [Category("系统声音")]
            [Description("MicroPhone 音量改变。")]
            public event SystemVolumeChangeEventHandler SystemMicroPhoneVolumeChange;        /// <summary>
            /// MicroPhone 静音改变。
            /// </summary>
            [Category("系统声音")]
            [Description("MicroPhone 静音改变。")]
            public event SystemVolumeMuteEventHandler SystemMicroPhoneMuteChange;        #endregion        #region 属性        #region 构造函数        /// <summary>
            /// 初始化一个 StartsSystemVolumeContrlLib.StartsSystemVolumeContrl 实例。
            /// </summary>
            public StartsSystemVolumeContrl()
            {
            }        /// <summary>
            /// 初始化一个 StartsSystemVolumeContrlLib.StartsSystemVolumeContrl 实例。
            /// </summary>
            /// <param name="container">容器的接口。</param>
            public StartsSystemVolumeContrl(IContainer container)
            {
                container.Add(this);
            }        /// <summary>
            /// 初始化一个 StartsSystemVolumeContrlLib.StartsSystemVolumeContrl 实例。
            /// </summary>
            /// <param name="handle">接受系统声音改变消息的窗口的句柄。</param>
            public StartsSystemVolumeContrl(IntPtr handle)
            {
                this.handle = handle;
            }        #endregion        /// <summary>
            /// 获取系统 WAVE 声音的音量值(最大音量为255)。
            /// </summary>
            [Category("系统音量设置")]
            [Description("获取系统波形声音音量值(最大音量为255)。")]
            [DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden)]
            public int SystemWaveVolume
            {
                get
                {
                    return GetSystemVolume(MixerLineComponeType.WAVEOUT);
                }
                set
                {
                    int volume = 0;
                    if (value > 255)
                        volume = 255;
                    else if (value < 0)
                        volume = 0;
                    else
                        volume = value;
                    SetSystemVolume(MixerLineComponeType.WAVEOUT, value);
                }
            }        /// <summary>
            /// 获取系统主声音的音量值(最大音量为255)。
            /// </summary>
            [Category("系统音量设置")]
            [Description("获取系统主声音音量值(最大音量为255)。")]
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
            public int SystemSpeakersVolume
            {
                get
                {
                    return GetSystemVolume(MixerLineComponeType.SPEAKERS);
                }
                set
                {
                    int volume = 0;
                    if (value > 255)
                        volume = 255;
                    else if (value < 0)
                        volume = 0;
                    else
                        volume = value;
                    SetSystemVolume(MixerLineComponeType.SPEAKERS, value);
                }
            }        /// <summary>
            /// 获取系统麦克风声音的音量值(最大音量为255)。
            /// </summary>
            [Browsable(false)]
            [Category("系统音量设置")]
            [Description("获取系统麦克风声音音量值(最大音量为255)。")]
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
            public int SystemMicroPhoneVolume
            {
                get
                {
                    return GetSystemVolume(MixerLineComponeType.MICROPHONE);
                }
                set
                {
                    int volume = 0;
                    if (value > 255)
                        volume = 255;
                    else if (value < 0)
                        volume = 0;
                    else
                        volume = value;
                    SetSystemVolume(MixerLineComponeType.MICROPHONE, value);
                }
            }        /// <summary>
            /// 获取和设置系统波形声音声道。
            /// </summary>
            [Category("系统音量设置")]
            [Description("获取和设置系统波形声音声道。")]
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
            public AudioSource SystemWaveAudioSource
            {
                get
                {
                    int volL, volR;
                    GetSystemVolume(out volL, out volR, MixerLineComponeType.WAVEOUT, false);                if (volL > volR)
                        return AudioSource.Left;
                    else if (volL < volR)
                        return AudioSource.Right;
                    else
                        return AudioSource.Stereo;
                }
                set
                {
                    SetSystemVolSource(MixerLineComponeType.WAVEOUT, value);
                }
            }
      

  4.   

    /// <summary>
            /// 获取和设置系统主声音声道。
            /// </summary>
            [Category("系统音量设置")]
            [Description("获取和设置系统主声音声道。")]
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
            public AudioSource SystemSpeakersAudioSource
            {
                get
                {
                    int volL, volR;
                    GetSystemVolume(out volL, out volR, MixerLineComponeType.SPEAKERS, false);                if (volL > volR)
                        return AudioSource.Left;
                    else if (volL < volR)
                        return AudioSource.Right;
                    else
                        return AudioSource.Stereo;
                }
                set
                {
                    SetSystemVolSource(MixerLineComponeType.SPEAKERS, value);
                }
            }        /// <summary>
            /// 获取或设置系统 WAVE 静音。true:静音;false:取消静音。
            /// </summary>
            [Category("系统音量设置")]
            [Description("获取或设置系统 WAVE 静音。true:静音;false:取消静音。")]
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
            public bool SystemWaveMute
            {
                get
                {
                    return GetSystemMute(MixerLineComponeType.WAVEOUT);
                }
                set
                {
                    SetSystemMute(MixerLineComponeType.WAVEOUT, value);
                }
            }        /// <summary>
            /// 获取或设置系统主声音静音。true:静音;false:取消静音。
            /// </summary>
            [Category("系统音量设置")]
            [Description("获取或设置系统主声音静音。true:静音;false:取消静音。")]
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
            public bool SystemSpeakersMute
            {
                get
                {
                    return GetSystemMute(MixerLineComponeType.SPEAKERS);
                }
                set
                {
                    SetSystemMute(MixerLineComponeType.SPEAKERS, value);
                }
            }        /// <summary>
            /// 获取或设置系统麦克风声音静音。true:静音;false:取消静音。
            /// </summary>
            [Browsable(false)]
            [Category("系统音量设置")]
            [Description("获取或设置系统麦克风声音静音。true:静音;false:取消静音。")]
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
            public bool SystemMicroPhoneMute
            {
                get
                {
                    return GetSystemMute(MixerLineComponeType.MICROPHONE);
                }
                set
                {
                    SetSystemMute(MixerLineComponeType.MICROPHONE, value);
                }
            }        /// <summary>
            /// 获取或设置每次增加或减少的音量值(默认15)。注意:这个是直接调节系统的音量。
            /// </summary>
            [Category("系统音量设置")]
            [Description("获取或设置每次增加或减少的音量值(默认15)。注意:这个是直接调节系统的音量。")]
            [DefaultValue(15)]
            public int SystemVolumeStep
            {
                get
                {
                    return systemVolumeStep;
                }
                set
                {
                    systemVolumeStep = value;
                }
            }        #endregion        #region SetSystemVolume 函数        /// <summary>
            ///  打开系统声音控制;
            /// </summary>
            private void MixerOpen()
            {
                mixerOpen(out hmixer, 0, (int)handle, 0, CALLBACK_WINDOW);
            }        private bool GetLineContrl(int componentType, int ctrlType, out MIXERCONTROL mxc)
            {
                MIXERLINECONTROLS mxlc = new MIXERLINECONTROLS();
                MIXERLINE mxl = new MIXERLINE();
                mxc = new MIXERCONTROL();
                int rc = -1;
                bool retValue = false;            if (hmixer < 1)
                {
                    MixerOpen();
                }
                if (hmixer > 0)
                {
                    mxl.cbStruct = Marshal.SizeOf(mxl);
                    mxl.dwComponentType = componentType;                rc = mixerGetLineInfoA(hmixer, ref mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);
                    if (rc == MMSYSERR_NOERROR)
                    {
                        int sizeofMIXERCONTROL = 152;
                        int ctrl = Marshal.SizeOf(typeof(MIXERCONTROL));
                        mxlc.pamxctrl = Marshal.AllocCoTaskMem(sizeofMIXERCONTROL);
                        mxlc.cbStruct = Marshal.SizeOf(mxlc);
                        mxlc.dwLineID = mxl.dwLineID;
                        mxlc.dwControl = ctrlType;
                        mxlc.cControls = 1;
                        mxlc.cbmxctrl = sizeofMIXERCONTROL;                    // Allocate a buffer for the control 
                        mxc.cbStruct = sizeofMIXERCONTROL;                    // Get the control 
                        rc = mixerGetLineControlsA(hmixer, ref mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);                    if (rc == MMSYSERR_NOERROR)
                        {
                            retValue = true;
                            // Copy the control into the destination structure 
                            mxc = (MIXERCONTROL)Marshal.PtrToStructure(mxlc.pamxctrl, typeof(MIXERCONTROL));
                        }
                    }
                }
                return retValue;
            }        private void GetControlID(MixerLineComponeType mixerLCT, out int VolumeControlID, out int MuteControlID)
            {
                MIXERCONTROL mxcVol = new MIXERCONTROL();
                MIXERCONTROL mxcMute = new MIXERCONTROL();            VolumeControlID = -1;
                MuteControlID = -1;
                int componentType = (int)mixerLCT;
                int ctrlTypeVol = MIXERCONTROL_CONTROLTYPE_VOLUME;
                int ctrlTypeMute = MIXERCONTROL_CONTROLTYPE_MUTE;            GetLineContrl(componentType, ctrlTypeVol, out mxcVol);
                GetLineContrl(componentType, ctrlTypeMute, out mxcMute);            VolumeControlID = mxcVol.dwControlID;
                MuteControlID = mxcMute.dwControlID;
            }
      

  5.   

     starts_2000 对不起有好几天没有上线了,你能发邮箱给我吗?[email protected]