Android Open Source - glassless Waveform Activity






From Project

Back to project page glassless.

License

The source code is released under:

Apache License

If you think the Android project glassless 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) 2013 Google Inc./*ww w . j ava2  s . c om*/
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.glass.samples.waveform;

import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder.AudioSource;
import android.os.Bundle;
import android.widget.TextView;

import com.mikedg.android.glass.glassless.R;

/**
 * An activity that receives audio input from the microphone and displays a
 * visualization of that data as a waveform on the screen.
 */
public class WaveformActivity extends Activity {

  private static final int SAMPLING_RATE = 44100;

  private WaveformView mWaveformView;
  private TextView mDecibelView;

  private RecordingThread mRecordingThread;
  private int mBufferSize;
  private short[] mAudioBuffer;
  private String mDecibelFormat;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_waveform);
    
    mWaveformView = (WaveformView) findViewById(R.id.waveformView);
    mDecibelView = (TextView) findViewById(R.id.decibelView);

    // Compute the minimum required audio buffer size and allocate the buffer.
    mBufferSize = AudioRecord.getMinBufferSize(SAMPLING_RATE, AudioFormat.CHANNEL_IN_MONO,
        AudioFormat.ENCODING_PCM_16BIT);
    mAudioBuffer = new short[mBufferSize / 2];

    mDecibelFormat = getResources().getString(R.string.decibel_format);
  }

  @Override
  protected void onResume() {
    super.onResume();

    mRecordingThread = new RecordingThread();
    mRecordingThread.start();
  }
  
  @Override
  protected void onPause() {
    super.onPause();

    if (mRecordingThread != null) {
      mRecordingThread.stopRunning();
      mRecordingThread = null;
    }
  }

  /**
   * A background thread that receives audio from the microphone and sends it
   * to the waveform visualizing view.
   */
  private class RecordingThread extends Thread {

    private boolean mShouldContinue = true;

    @Override
    public void run() {
      android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_AUDIO);

      AudioRecord record = new AudioRecord(AudioSource.MIC, SAMPLING_RATE,
          AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, mBufferSize);
      record.startRecording();
      
      while (shouldContinue()) {
        record.read(mAudioBuffer, 0, mBufferSize / 2);
        mWaveformView.updateAudioData(mAudioBuffer);
        updateDecibelLevel();
      }
      
      record.stop();
      record.release();
    }

    /**
     * Gets a value indicating whether the thread should continue running.
     * 
     * @return true if the thread should continue running or false if it
     *     should stop.
     */
    private synchronized boolean shouldContinue() {
      return mShouldContinue;
    }

    /**
     * Notifies the thread that it should stop running at the next
     * opportunity.
     */
    public synchronized void stopRunning() {
      mShouldContinue = false;
    }

    /**
     * Computes the decibel level of the current sound buffer and updates the
     * appropriate text view.
     */
    private void updateDecibelLevel() {
      // Compute the root-mean-squared of the sound buffer and then apply the
      // formula for computing the decibel level, 20 * log_10(rms). This is an
      // uncalibrated calculation that assumes no noise in the samples; with
      // 16-bit recording, it can range from -90 dB to 0 dB.
      double sum = 0;

      for (short rawSample : mAudioBuffer) {
        double sample = rawSample / 32768.0;
        sum += sample * sample;
      }

      double rms = Math.sqrt(sum / mAudioBuffer.length);
      final double db = 20 * Math.log10(rms);
      
      // Update the text view on the main thread.
      mDecibelView.post(new Runnable() {
        @Override
        public void run() {
          mDecibelView.setText(String.format(mDecibelFormat, db));
        }
      });
    }
  }
}




Java Source Code List

com.google.glass.samples.compass.CompassActivity.java
com.google.glass.samples.compass.CompassView.java
com.google.glass.samples.compass.MathUtils.java
com.google.glass.samples.level.LevelActivity.java
com.google.glass.samples.level.LevelView.java
com.google.glass.samples.stopwatch.StopWatchActivity.java
com.google.glass.samples.waveform.WaveformActivity.java
com.google.glass.samples.waveform.WaveformView.java
com.mikedg.android.glass.glassless.MainActivity.java
com.mimming.sugarglider.MainActivity.java