美文网首页
Android 莫尔斯密码发声器2:使用ToneGenerato

Android 莫尔斯密码发声器2:使用ToneGenerato

作者: silencefun | 来源:发表于2018-12-19 22:36 被阅读27次

发出滴滴答答的声音,参考了一些其他的作品,最后选择使用ToneGenerator发声。通过控制时长来发出滴答对应的长度的声响。

创建发音的类 其中 两个数组来存放 字母的 长码 短码的 电码。

private static final String KEYS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!";
private static final String[] CODES_LONG = new String[]{
        // numbers 0 .. 9
        "-----", ".----", "..---", "...--", "....-",
        ".....", "-....", "--...", "---..", "----.",
        // characters A .. Z
        ".-", "-...", "-.-.", "-..", ".", "..-.", "--.",
        "....", "..", ".---", "-.-", ".-..", "--", "-.",
        "---", ".--.", "--.-", ".-.", "...", "-", "..-",
        "...-", ".--", "-..-", "-.--", "--..",
        // special characters
        "...-."
};
private static final String[] CODES = new String[]{
        // numbers 0 .. 9
        "-", ".-", "..-", "...--", "....-",
        ".", "-.", "--...", "-..", "-.",
        // characters A .. Z
        ".-", "-...", "-.-.", "-..", ".", "..-.", "--.",
        "....", "..", ".---", "-.-", ".-..", "--", "-.",
        "---", ".--.", "--.-", ".-.", "...", "-", "..-",
        "...-", ".--", "-..-", "-.--", "--..",
        // special characters
        "...-."
};
//=================================================================

private int dur = 100;                // (short) beep length (in ms)
private int tone = ToneGenerator.TONE_CDMA_DIAL_TONE_LITE;
private ToneGenerator gen = null;

声明 发音的声音选择 和时间间隔 的 时长 毫秒,构造方法来设定间隔和声音大小。

 * @param dur int - speed parameter (duration of short beep in ms)
 * @param vol int - speaker volume (0..100)
 */
public Morse(int dur, int vol) {
    this.dur = dur;
    gen = new ToneGenerator(AudioManager.STREAM_ALARM, vol);
}

初始化之后,把要播放的 字符串 拆分成单个字符 来分开播放或暂停,即当前线程暂停来实现

  public void sendCode(String s) {

    if (s == null)
        return;
    int len = s.length();

    for (int i = 0; i < len; i++) {
        if (Character.isSpaceChar(s.charAt(i))) {
            int pause = 4;
            delay(dur * pause);
        } else sendChar(s.charAt(i));
    }

}

其中 delay 方法

 private void delay(int t) {
    try {
        Thread.sleep(t);
    } catch (Exception e) {
    }
}

其中 sendchar用来匹配字符对应的 电码来进行 发声;

 private void sendChar(char ch) {

    // 找到字符对应位置
    int pos = KEYS.indexOf(ch);
    if (pos != -1) {
        //找到对应的电码符号
        String code = CODES[pos];
        int len = code.length();
        // 遍历对应的电码字符串
        for (int i = 0; i < len; i++) {
            int pause = 0;
            switch (code.charAt(i)) {
                case '.':
                    gen.startTone(tone, dur);//1倍的长度
                    pause = 2;
                    break;
                case '-':
                    gen.startTone(tone, 3 * dur);//三倍的长度
                    pause = 4;
                    break;

            }
            delay(pause * dur);
        }
        delay(4 * dur);
    }
}

这样在 调用的时候

                Morse beeper = new Morse(speed, volume);
          
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        beeper.sendCode(et_input.getText().toString());
                    }
                });

第一步,实现发声的功能实现了。

相关文章

网友评论

      本文标题:Android 莫尔斯密码发声器2:使用ToneGenerato

      本文链接:https://www.haomeiwen.com/subject/ummskqtx.html