첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

■ IMMDevice 인터페이스 : 볼륨 설정하기/구하기

------------------------------------------------------------------------------------------------------------------------


TestProject.zip


IMMDevice.cs

 

 

using System;

using System.Runtime.InteropServices;

 

namespace TestProject

{

    /// <summary>

    /// 멀티 미디어 디바이스 인터페이스

    /// </summary>

    [Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

    public interface IMMDevice

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

 

        #region 활성화하기 - Activate(interfaceID, classContext, activationParameter, interfaceObject)

 

        /// <summary>

        /// 활성화하기

        /// </summary>

        /// <param name="interfaceID">인터페이스 ID</param>

        /// <param name="classContext">클래스 컨텍스트</param>

        /// <param name="activationParameter">활성화 매개 변수</param>

        /// <param name="interfaceObject">인터페이스 객체</param>

        /// <returns>처리 결과</returns>

        int Activate

        (

            [MarshalAs(UnmanagedType.LPStruct)] Guid      interfaceID,

            int                                           classContext,

            IntPtr                                        activationParameter,

            [MarshalAs(UnmanagedType.IUnknown)] out object interfaceObject

        );

 

        #endregion

    }

}

 

 

IMMDeviceEnumerator.cs

 

 

using System;

using System.Runtime.InteropServices;

 

namespace TestProject

{

    /// <summary>

    /// 멀티 미디어 디바이스 열거자 인터페이스

    /// </summary>

    [ComImport]

    [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

    public interface IMMDeviceEnumerator

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

 

        #region ??? - _VtblGap1_1()

 

        /// <summary>

        /// ???

        /// </summary>

        void _VtblGap1_1();

 

        #endregion

        #region 디폴트 오디오 종점 구하기 - GetDefaultAudioEndpoint(dataFlow, role, mmDevice)

 

        /// <summary>

        /// 디폴트 오디오 종점 구하기

        /// </summary>

        /// <param name="dataFlow">데이터 플로우</param>

        /// <param name="role">역할</param>

        /// <param name="mmDevice">멀티 미디어 디바이스</param>

        /// <returns>처리 결과</returns>

        int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice mmDevice);

 

        #endregion

    }

}

 

 

IAudioEndpointVolume.cs

 

 

using System;

using System.Runtime.InteropServices;

 

namespace TestProject

{

    /// <summary>

    /// 오디오 종점 볼륨 인터페이스

    /// </summary>

    [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

    public interface IAudioEndpointVolume

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

 

        #region 컨트롤 변경 통지 등록하기 - RegisterControlChangeNotify(audioEndpointVolumeCallbackHandle)

 

        /// <summary>

        /// 컨트롤 변경 통지 등록하기

        /// </summary>

        /// <param name="audioEndpointVolumeCallbackHandle">오디오 종점 볼륨 콜백 핸들</param>

        /// <returns>처리 결과</returns>

        int RegisterControlChangeNotify(IntPtr audioEndpointVolumeCallbackHandle);

 

        #endregion

        #region 컨트롤 변경 통지 등록 취소하기 - UnregisterControlChangeNotify(audioEndpointVolumeCallbackHandle)

 

        /// <summary>

        /// 컨트롤 변경 통지 등록 취소하기

        /// </summary>

        /// <param name="audioEndpointVolumeCallbackHandle">오디오 종점 볼륨 콜백 핸들</param>

        /// <returns>처리 결과</returns>

        int UnregisterControlChangeNotify(IntPtr audioEndpointVolumeCallbackHandle);

 

        #endregion

        #region 채널 수 구하기 - GetChannelCount(channelCount)

 

        /// <summary>

        /// 채널 수 구하기

        /// </summary>

        /// <param name="channelCount">채널 수</param>

        /// <returns>처리 결과</returns>

        int GetChannelCount(ref uint channelCount);

 

        #endregion

        #region 마스터 볼륨 레벨 설정하기 - SetMasterVolumeLevel(levelDB, eventContextGUID)

 

        /// <summary>

        /// 마스터 볼륨 레벨 설정하기

        /// </summary>

        /// <param name="levelDB">레벨(단위 : DB)</param>

        /// <param name="eventContextGUID">이벤트 컨텍스트 GUID</param>

        /// <returns>처리 결과</returns>

        int SetMasterVolumeLevel(float levelDB, Guid eventContextGUID);

 

        #endregion

        #region 마스터 볼륨 레벨 스칼라 설정하기 - SetMasterVolumeLevelScalar(level, eventContextGUID)

 

        /// <summary>

        /// 마스터 볼륨 레벨 스칼라 설정하기

        /// </summary>

        /// <param name="level">레벨</param>

        /// <param name="eventContextGUID">이벤트 컨텍스트 GUID</param>

        /// <returns>처리 결과</returns>

        int SetMasterVolumeLevelScalar(float level, Guid eventContextGUID);

 

        #endregion

        #region 마스터 볼륨 레벨 구하기 - GetMasterVolumeLevel(levelDB)

 

        /// <summary>

        /// 마스터 볼륨 레벨 구하기

        /// </summary>

        /// <param name="levelDB">레벨 (단위 : decibel)</param>

        /// <returns>처리 결과</returns>

        int GetMasterVolumeLevel(ref float levelDB);

 

        #endregion

        #region 마스터 볼륨 레벨 스칼라 구하기 - GetMasterVolumeLevelScalar(level)

 

        /// <summary>

        /// 마스터 볼륨 레벨 스칼라 구하기

        /// </summary>

        /// <param name="level">레벨</param>

        /// <returns>처리 결과</returns>

        int GetMasterVolumeLevelScalar(ref float level);

 

        #endregion

    }

}

 

 

MMDeviceEnumeratorFactory.cs

 

 

using System;

 

namespace TestProject

{

    /// <summary>

    /// 멀티 미디어 열거자 팩토리

    /// </summary>

    public static class MMDeviceEnumeratorFactory

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Static

        //////////////////////////////////////////////////////////////////////////////// Public

 

        #region 인스턴스 생성하기 - CreateInstance()

 

        /// <summary>

        /// 인스턴스 생성하기

        /// </summary>

        /// <returns>인스턴스</returns>

        public static IMMDeviceEnumerator CreateInstance()

        {

            return (IMMDeviceEnumerator)Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")));

        }

 

        #endregion

    }

}

 

 

SoundVolumeHelper.cs

 

 

using System;

 

namespace TestProject

{

    /// <summary>

    /// 사운드 볼륨 헬퍼

    /// </summary>

    public static class SoundVolumeHelper

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Static

        //////////////////////////////////////////////////////////////////////////////// Public

 

        #region 사운드 볼륨 설정하기 - SetSoundVolume(volume)

 

        /// <summary>

        /// 사운드 볼륨 설정하기

        /// </summary>

        /// <param name="volume">볼륨</param>

        /// <returns>처리 결과</returns>

        public static bool SetSoundVolume(int volume)

        {

            bool result = false;

 

            try

            {

                IMMDeviceEnumerator enumerator = MMDeviceEnumeratorFactory.CreateInstance();

 

                IMMDevice device;

 

                const int RENDER     = 0;

                const int MULTIMEDIA = 1;

 

                enumerator.GetDefaultAudioEndpoint(RENDER, MULTIMEDIA, out device);

 

                object interfaceObject;

 

                device.Activate(typeof(IAudioEndpointVolume).GUID, 0, IntPtr.Zero, out interfaceObject);

 

                IAudioEndpointVolume audioEndpointVolume = (IAudioEndpointVolume)interfaceObject;

 

                Guid zeroGuid = new Guid();

 

                audioEndpointVolume.SetMasterVolumeLevelScalar(volume / 100f, zeroGuid);

 

                result = true;

            }

            catch

            {

            }

 

            return result;

        }

 

        #endregion

        #region 사운드 볼륨 구하기 - GetSoundVolume(volume)

 

        /// <summary>

        /// 사운드 볼륨 구하기

        /// </summary>

        /// <param name="volume">볼륨</param>

        /// <returns>처리 결과</returns>

        public static bool GetSoundVolume(out int volume)

        {

            bool result = false;

 

            volume = -1;

 

            try

            {

                IMMDeviceEnumerator enumerator = MMDeviceEnumeratorFactory.CreateInstance();

 

                IMMDevice device;

 

                const int RENDER     = 0;

                const int MULTIMEDIA = 1;

 

                enumerator.GetDefaultAudioEndpoint(RENDER, MULTIMEDIA, out device);

 

                object intrefaceObject;

 

                device.Activate(typeof(IAudioEndpointVolume).GUID, 0, IntPtr.Zero, out intrefaceObject);

 

                IAudioEndpointVolume audioEndpointVolume = (IAudioEndpointVolume)intrefaceObject;

 

                float currentVolume = 0;

 

                audioEndpointVolume.GetMasterVolumeLevelScalar(ref currentVolume);

 

                volume = Convert.ToInt32(currentVolume * 100f);

 

                result = true;

            }

            catch

            {

            }

 

            return result;

        }

 

        #endregion

    }

}

 

 

MainForm.cs

 

 

using System;

using System.Windows.Forms;

 

namespace TestProject

{

    /// <summary>

    /// 메인 폼

    /// </summary>

    public partial class MainForm : Form

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 생성자 - MainForm()

 

        /// <summary>

        /// 생성자

        /// </summary>

        public MainForm()

        {

            InitializeComponent();

 

            this.setVolumeButton.Click += setVolumeButton_Click;

            this.getVolumeButton.Click += getVolumeButton_Click;

        }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Private

 

        #region 볼륨 설정하기 버튼 클릭시 처리하기 - setVolumeButton_Click(sender, e)

 

        /// <summary>

        /// 볼륨 설정하기 버튼 클릭시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void setVolumeButton_Click(object sender, EventArgs e)

        {

            SoundVolumeHelper.SetSoundVolume(100);

        }

 

        #endregion

        #region 볼륨 구하기 버튼 클릭시 처리하기 - getVolumeButton_Click(sender, e)

 

        /// <summary>

        /// 볼륨 구하기 버튼 클릭시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void getVolumeButton_Click(object sender, EventArgs e)

        {

            int volume;

 

            SoundVolumeHelper.GetSoundVolume(out volume);

 

            MessageBox.Show(volume.ToString());

        }

 

        #endregion

    }

}

 

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요