첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170

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
    }
}
728x90
반응형
그리드형
Posted by 사용자 icodebroker
TAG , ,

댓글을 달아 주세요