当前位置: 首页 > news >正文

Generate And Play A Tone In Android hacking

 1 /***********************************************************************************
 2  *            Generate And Play A Tone In Android hacking
 3  *   声明:
 4  *      1. 源代码url: http://stackoverflow.com/questions/2413426/playing-an-arbitrary-tone-with-android
 5  *      2. 主要功能是能够让Android手机发出一定频率的声音;
 6  *      3. 当然我们也可以用来做各种波形发生器,这只是一个简单的Demo源码程序;
 7  *
 8  *                              2015-4-27 周一 晴 深圳 平山村 曾剑锋
 9  **********************************************************************************/
10 public class PlaySound extends Activity {
11     // originally from http://marblemice.blogspot.com/2010/04/generate-and-play-tone-in-android.html
12     // and modified by Steve Pomeroy <steve@staticfree.info>
13     /* 声音持续3秒 */
14     private final int duration = 3;       // seconds
15     /* 采用率是8000 */
16     private final int sampleRate = 8000;
17     /* 总共采样多少个点 */
18     private final int numSamples = duration * sampleRate;
19     /* 利用总共采样的点数来生成数据数组 */
20     private final double sample[] = new double[numSamples];
21     /* 声音频率 */
22     private final double freqOfTone = 440; // hz
23 
24     /* 主要是因为采用的16位的数据 */
25     private final byte generatedSnd[] = new byte[2 * numSamples];
26 
27     Handler handler = new Handler();
28 
29     @Override
30     public void onCreate(Bundle savedInstanceState) {
31         super.onCreate(savedInstanceState);
32         setContentView(R.layout.main);
33     }
34 
35     @Override
36     protected void onResume() {
37         super.onResume();
38 
39         // Use a new tread as this can take a while
40         final Thread thread = new Thread(new Runnable() {
41             public void run() {
42                 genTone();
43                 handler.post(new Runnable() {
44 
45                     public void run() {
46                         playSound();
47                     }
48                 });
49             }
50         });
51         thread.start();
52     }
53 
54     /**
55      * 生成上面参数对应的声音数据,保存在数组中
56      */
57     void genTone(){
58         // fill out the array
59         for (int i = 0; i < numSamples; ++i) {
60             /**
61              * 算法解析:
62              *     1. sampleRate/freqOfTone:每个周期才多少个点;
63              *     2. i / (sampleRate/freqOfTone):当前第i个点在整个周期的
64              *         采样点的比重(不知怎么表达 :) );
65              *     3. 2 * Math.PI * i / (sampleRate/freqOfTone):当前第i个点对应的弧度制;
66              *     4. Math.sin(2 * Math.PI * i / (sampleRate/freqOfTone)):-1到1的sin函数值;
67              */
68             sample[i] = Math.sin(2 * Math.PI * i / (sampleRate/freqOfTone));
69         }
70 
71         // convert to 16 bit pcm sound array
72         // assumes the sample buffer is normalised.
73         /**
74          * 将上面-1到1范围的sin函数值,转换成-32767到32767范围的值,
75          * 这个值是16位的值,放在对应的数组中
76          */
77         int idx = 0;
78         for (final double dVal : sample) {
79             // scale to maximum amplitude
80             final short val = (short) ((dVal * 32767));
81             // in 16 bit wav PCM, first byte is the low order byte
82             generatedSnd[idx++] = (byte) (val & 0x00ff);
83             generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
84 
85         }
86     }
87 
88     void playSound(){
89         final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
90                 sampleRate, AudioFormat.CHANNEL_OUT_MONO,
91                 AudioFormat.ENCODING_PCM_16BIT/*16位数据*/, generatedSnd.length,
92                 AudioTrack.MODE_STATIC);
93         //将所有数据写出,相当于是发出声音
94         audioTrack.write(generatedSnd, 0, generatedSnd.length); 
95         audioTrack.play();
96     }
97 }

 

转载于:https://www.cnblogs.com/zengjfgit/p/4458935.html

相关文章:

  • SharePoint 2013实例1—构建三层服务器场10—功能验证
  • MLlib中的vector和线性代数运算
  • HNOI2015 开店
  • LeetCode - Count Primes
  • mysql基础操作(表复制、索引、视图、内置函数、预处理、存储过程、触发器)
  • 深入解析AMS启动
  • 新闻发布系统,B/S模式下的三层应用
  • NTFS 文件系统解析
  • 【汉字乱码】IE下GET形式传递汉字。
  • Linux之convert命令
  • Cordova 安装与使用命令
  • android RelativeLayout 内容居中解决办法
  • 155. Min Stack
  • DataTables ajax重新加载数据
  • SVN更新的问题
  • 【css3】浏览器内核及其兼容性
  • Docker: 容器互访的三种方式
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java,console输出实时的转向GUI textbox
  • JS+CSS实现数字滚动
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 关于Flux,Vuex,Redux的思考
  • 力扣(LeetCode)965
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 如何进阶一名有竞争力的程序员?
  • 什么软件可以剪辑音乐?
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 王永庆:技术创新改变教育未来
  • 用简单代码看卷积组块发展
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • PostgreSQL之连接数修改
  • ​ssh免密码登录设置及问题总结
  • #WEB前端(HTML属性)
  • (1)(1.13) SiK无线电高级配置(五)
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (原創) 物件導向與老子思想 (OO)
  • (转载)Linux 多线程条件变量同步
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Core 中插件式开发实现
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net 托管代码与非托管代码
  • .net快速开发框架源码分享
  • .net中应用SQL缓存(实例使用)
  • /etc/skel 目录作用
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [C语言]——函数递归
  • [Linux] 一文理解HTTPS协议:什么是HTTPS协议、HTTPS协议如何加密数据、什么是CA证书(数字证书)...
  • [Linux](15)线程基础,线程控制,线程的互斥与同步
  • [python开发模拟netcat工具] BHPnet
  • [Spring Cloud 项目] Spring cloud 实现房源查询功能