Back to project page glassless.
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.
/* * 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)); } }); } } }