Unity控制音量/麦克风的两种方式(系统和程序)

  1 using UnityEngine;
  2 using System.Runtime.InteropServices;
  3 using System;
  4
  5 [DisallowMultipleComponent]
  6 public class SoundManger : MonoBehaviour
  7 {
  8     #region System
  9     [DllImport("user32.dll")]
 10     static extern void keybd_event(byte bVk, byte bScan, UInt32 dwFlags, UInt32 dwExtraInfo);
 11
 12     [DllImport("user32.dll")]
 13     static extern Byte MapVirtualKey(UInt32 uCode, UInt32 uMapType);
 14
 15     private const byte VK_VOLUME_MUTE = 0xAD;
 16     private const byte VK_VOLUME_DOWN = 0xAE;
 17     private const byte VK_VOLUME_UP = 0xAF;
 18     private const UInt32 KEYEVENTF_EXTENDEDKEY = 0x0001;
 19     private const UInt32 KEYEVENTF_KEYUP = 0x0002;
 20
 21     /// <summary>
 22     /// 改变系统音量大小,增加
 23     /// </summary>
 24     public void SystemVolumeUp()
 25     {
 26         keybd_event(VK_VOLUME_UP, MapVirtualKey(VK_VOLUME_UP, 0), KEYEVENTF_EXTENDEDKEY, 0);
 27         keybd_event(VK_VOLUME_UP, MapVirtualKey(VK_VOLUME_UP, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
 28     }
 29
 30     /// <summary>
 31     /// 改变系统音量大小,减小
 32     /// </summary>
 33     public void SystemVolumeDown()
 34     {
 35         keybd_event(VK_VOLUME_DOWN, MapVirtualKey(VK_VOLUME_DOWN, 0), KEYEVENTF_EXTENDEDKEY, 0);
 36         keybd_event(VK_VOLUME_DOWN, MapVirtualKey(VK_VOLUME_DOWN, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
 37     }
 38
 39     /// <summary>
 40     /// 改变系统音量大小,静音
 41     /// </summary>
 42     public void SystemMute()
 43     {
 44         keybd_event(VK_VOLUME_MUTE, MapVirtualKey(VK_VOLUME_MUTE, 0), KEYEVENTF_EXTENDEDKEY, 0);
 45         keybd_event(VK_VOLUME_MUTE, MapVirtualKey(VK_VOLUME_MUTE, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
 46     }
 47     #endregion
 48
 49     #region Program
 50     [DllImport("Winmm.dll")]
 51     private static extern int waveOutSetVolume(int hwo, System.UInt32 pdwVolume);
 52
 53     [DllImport("Winmm.dll")]
 54     private static extern uint waveOutGetVolume(int hwo, out System.UInt32 pdwVolume);
 55
 56     private const int volumeMinScope = 0;
 57     private const int volumeMaxScope = 100;
 58
 59     private int lastVolume = 0;
 60     private int volume = 100;
 61
 62     public int Volume
 63     {
 64         get { return volume; }
 65         set
 66         {
 67             volume = value;
 68             SetCurrentVolume();
 69         }
 70     }
 71     private void SetCurrentVolume()
 72     {
 73         volume = volume < volumeMinScope ? volumeMinScope : volume;
 74         volume = volume > volumeMaxScope ? volumeMaxScope : volume;
 75         //先把trackbar的value值映射到0x0000~0xFFFF范围
 76         System.UInt32 Value = (System.UInt32)((double)0xffff * volume / (volumeMaxScope - volumeMinScope));
 77
 78         //限制value的取值范围
 79         Value = Value < 0 ? 0 : Value;
 80         Value = Value > 0xffff ? 0xffff : Value;
 81
 82         System.UInt32 left = Value;     //左声道音量
 83         System.UInt32 right = Value;        //右声道音量
 84         waveOutSetVolume(0, left << 16 | right);        //"<<"左移,“|”逻辑或运算
 85     }
 86
 87     /// <summary>
 88     /// 改变程序音量,增加
 89     /// </summary>
 90     /// <param name="value">增加的幅度</param>
 91     public void ProgramVolumeUp(int value = 2)
 92     {
 93         Volume += value;
 94     }
 95
 96     /// <summary>
 97     /// 改变程序音量,减少
 98     /// </summary>
 99     /// <param name="value">减少的幅度</param>
100     public void ProgramVolumeDown(int value = 2)
101     {
102         Volume -= value;
103     }
104
105     /// <summary>
106     /// 改成程序音量,静音
107     /// </summary>
108     public void ProgramMute()
109     {
110         int temp = lastVolume;
111         lastVolume = volume;
112         Volume = temp;
113     }
114     #endregion
115
116     public enum MangerType
117     {
118         Program,
119         System,
120     }
121
122     public MangerType mangerType = MangerType.Program;
123
124     private void Update()
125     {
126         switch (mangerType)
127         {
128             case MangerType.Program:
129                 if (Input.GetKeyDown(KeyCode.UpArrow))
130                     ProgramVolumeUp();
131                 if (Input.GetKeyDown(KeyCode.DownArrow))
132                     ProgramVolumeDown();
133                 if (Input.GetKeyDown(KeyCode.Space))
134                     ProgramMute();
135                 break;
136             case MangerType.System:
137                 if (Input.GetKeyDown(KeyCode.UpArrow))
138                     SystemVolumeUp();
139                 if (Input.GetKeyDown(KeyCode.DownArrow))
140                     SystemVolumeDown();
141                 if (Input.GetKeyDown(KeyCode.Space))
142                     SystemMute();
143                 break;
144         }
145     }
146 }
时间: 2024-10-17 04:19:21

Unity控制音量/麦克风的两种方式(系统和程序)的相关文章

Unity 读取Json常用的两种方式

使用的是Litjson 1.读取本地Json public void ReadJson() { StreamReader streamReader = new StreamReader(Application.dataPath + "/XXX.json"); string str = streamReader.ReadToEnd(); json = JsonMapper.ToObject(str); } 2.请求http(强烈建议先下载到本地再读取) private IEnumerat

使用两种方式编写多线程程序?

# 方案1 from threading import Thread import time class Sayhi(Thread): def __init__(self,name): super().__init__() self.name=name def run(self): time.sleep(2) print('%s say hello' % self.name) if __name__ == '__main__': t = Sayhi('妹子') t.start() print('

Unity知识三:两种方式实现切水果的刀痕

Unity作为游戏开发平台之一,还是有很多实用的小技巧的,今天来学习一下怎样用两种方式来显示切水果游戏中的刀痕: 1.正常显示下的刀痕: 什么叫正常显示下的呢?我们所接触过的切水果游戏一般都是2D游戏,那我们知道,2D游戏可以用Unity直接来做,还可以使用NGUI.UGUI或者其他方法通过UI来实现. 所以我们第一种方法就是不借助UI来做. 首先来看看我们刀痕的素材:(需要的同学可以右键另存.^_^) 打开Unity: 新建一个空游戏体,命名为"BackGround",然后在组件面板

IoC(控制反转)的主要组件和注入的两种方式

一.IoC的主要组件: (1).Spring框架的两个最基本和最重要的包是org.springframework.beans.factory(该包中的主要接口是BeanFactory)和org.springframework.context包(该包中的主要接口是ApplicationFactory).这两个包中的代码提供了Spring IoC特性的基础. (2).Spring IoC框架的主要组件有:Beans.配置文件(beans.xml或applicationContext.xml).Bea

Unity3D两种方式播放视频

  Unity3D中播放游戏视频的方式有两种,第一种是在游戏对象中播放,就好比在游戏世界中创建一个Plane面对象,摄像机直直的照射在这个面上.第二种是在GUI层面上播放视频.播放视频其实和贴图非常相像,因为播放视频用到的MovieTexture属于贴图Texture的子类,那么本章我们就好好学习一下Unity中播放视频的这两种方式.哇咔咔-           Unity支持的播放视频格式有.mov..mpg..mpeg..mp4..avi和.asf.只需将对应的视频文件拖拽入Project视

untiy 3d ShaderLab_第6章_VertexLit渲染路径_4_顶点照明和Unity存放光源的第三种方式

6.4顶点照明和Unity存放光源的第三种方式 6.4.1   Unity为Vertex Pass准备的光源 是不是绝望了?世界没有光明怎么能行呢?当然不行,光明马上就来,Unity把它放到了unity_LightPosition[4]数组中. 可以简单地告诉你一个结果:在LightMode = Vertex的Pass内,unity_LightPosition[4]和unity_LightColor[4]是存取光源数据最可靠的第一首选手段,无论在Camera的RenderingPath为何,Ve

spring学习一——基本搭建,属性注入的两种方式

今天用spring 3.2.5搭建了基本的环境,spring出的太快了,前段时间才3.2.5,今儿个一瞧已经上了4的版本了,稍后给出spring的jar下载地址,毕竟现在官网上找不到了啊. 废话少说了,spring 3.2.5已经将所有的依赖包都放在了dist的lib下面,并且都有doc包和源码包,很是方便.先导入所需的jar包:core,context,beans,expression 四个jar包,除此之外,还需导入commons-logging. 下一步,新建xml文件,建议名称为 app

生成二维码的两种方式

利用qrcode生成二维码,(qrcode矩形二维码符号) 基于jquery的二维码生成插件qrcode,在页面中调用该插件就能生成对应的二维码.qrcode其实是通过使用jQuery实现图形渲染,画图,支持canvas(HTML5)和table两种方式: 使用插件时 1.首先在页面中加入jquery库文件和qrcode插件. <script type="text/javascript" src="jquery.js"></script> &

Android模拟点击的两种方式

导论 在Android中模拟一个点击事件有两种方式是通过模拟MotionEvent来实现:一种是通过ADB来实现 第一种:模拟MotionEvent 通用方法如下: private void setSimulateClick(View view, float x, float y) { long downTime = SystemClock.uptimeMillis(); final MotionEvent downEvent = MotionEvent.obtain(downTime, dow