Android Open Source - cwp-morse-mangle Sin Audio Loop






From Project

Back to project page cwp-morse-mangle.

License

The source code is released under:

Copyright (C) 2012 Jussi Kivilinna <jussi.kivilinna@gmail.com> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "S...

If you think the Android project cwp-morse-mangle listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2012 Jussi Kivilinna <jussi.kivilinna@gmail.com>
 */*  ww  w. ja  va 2s  .co m*/
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 */

package fi_81.cwp_morse_mangle;

import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;

/* Based on example from http://stackoverflow.com/questions/2413426/playing-an-arbitrary-tone-with-android */
public class SinAudioLoop {
  private static final int sampleRate = 8000;

  private final byte[] soundBuffer = initSoundBuffer();
  private AudioTrack audioTrack;
  private float audioMaxVolume;
  private float audioMinVolume;

  private byte[] initSoundBuffer() {
    final double freqOfTone = 400;
    final int loopLengthMs = 1000;
    final int sampleLen = loopLengthMs * sampleRate / 1000;
    final int maxSampleHeight = 0x7fff;
    final byte[] soundBuffer = new byte[2 * sampleLen];

    /* Generate audio buffer as 16 bit pcm sound array */
    for (int i = 0; i < sampleLen; i++) {
      double sample = Math.sin(2 * Math.PI * i
          / (sampleRate / freqOfTone));
      int val = (int) Math.round(sample * maxSampleHeight);

      if (val < -maxSampleHeight)
        val = -maxSampleHeight;
      else if (val > maxSampleHeight)
        val = maxSampleHeight;

      soundBuffer[i * 2 + 0] = (byte) (val & 0xff);
      soundBuffer[i * 2 + 1] = (byte) ((val >> 8) & 0xff);
    }

    return soundBuffer;
  }

  public SinAudioLoop() {
    /* Setup audio track for looped sound-effect */
    audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
        AudioFormat.CHANNEL_CONFIGURATION_MONO,
        AudioFormat.ENCODING_PCM_16BIT, soundBuffer.length / 2,
        AudioTrack.MODE_STATIC);

    audioTrack.write(soundBuffer, 0, soundBuffer.length);
    audioTrack.setLoopPoints(0, soundBuffer.length / 4, -1);

    audioMinVolume = AudioTrack.getMinVolume();
    audioMaxVolume = AudioTrack.getMaxVolume();

    audioTrack.setStereoVolume(audioMinVolume, audioMinVolume);
    audioTrack.play();
  }

  public void play() {
    audioTrack.setStereoVolume(audioMaxVolume, audioMaxVolume);
  }

  public void stop() {
    audioTrack.setStereoVolume(audioMinVolume, audioMinVolume);
  }

  public void release() {
    audioTrack.setStereoVolume(audioMinVolume, audioMinVolume);
    audioTrack.stop();
    audioTrack.release();
  }
}




Java Source Code List

fi_81.cwp_morse_mangle.CWPControlService.java
fi_81.cwp_morse_mangle.CWPControlThread.java
fi_81.cwp_morse_mangle.DefaultSettings.java
fi_81.cwp_morse_mangle.EventLog.java
fi_81.cwp_morse_mangle.MainActivity.java
fi_81.cwp_morse_mangle.MainSettingsActivity.java
fi_81.cwp_morse_mangle.SinAudioLoop.java
fi_81.cwp_morse_mangle.cwp.CWFrequencyChange.java
fi_81.cwp_morse_mangle.cwp.CWInputQueue.java
fi_81.cwp_morse_mangle.cwp.CWInput.java
fi_81.cwp_morse_mangle.cwp.CWOutput.java
fi_81.cwp_morse_mangle.cwp.CWStateChangeQueueFromMorseCode.java
fi_81.cwp_morse_mangle.cwp.CWStateChange.java
fi_81.cwp_morse_mangle.cwp.CWaveQueueToMorseCode.java
fi_81.cwp_morse_mangle.cwp.CWave.java
fi_81.cwp_morse_mangle.morse.BitString.java
fi_81.cwp_morse_mangle.morse.MorseCharList.java
fi_81.cwp_morse_mangle.morse.MorseChar.java
fi_81.cwp_morse_mangle.morse.MorseCodec.java