/*
* Copyright 2012 Greg Milette and Adam Stroud
*
* 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 root.gast.audio.util;
import java.io.IOException;
import java.io.PrintWriter;
import android.content.Context;
import android.content.pm.PackageManager;
import android.media.MediaRecorder;
import android.os.Environment;
import android.util.Log;
/**
* various utility methods for audio processing
* @author Greg Milette <<a href="mailto:gregorym@gmail.com">gregorym@gmail.com</a>>
*/
public class AudioUtil
{
private static final String TAG = "AudioUtil";
/**
* creates a media recorder, or throws a {@link IOException} if
* the path is not valid.
* @param sdCardPath should contain a .3gp extension
*/
public static MediaRecorder prepareRecorder(String sdCardPath)
throws IOException
{
if (!isStorageReady())
{
throw new IOException("SD card is not available");
}
MediaRecorder recorder = new MediaRecorder();
//set a custom listener that just logs any messages
RecorderErrorLoggerListener recorderListener =
new RecorderErrorLoggerListener();
recorder.setOnErrorListener(recorderListener);
recorder.setOnInfoListener(recorderListener);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
Log.d(TAG, "recording to: " + sdCardPath);
recorder.setOutputFile(sdCardPath);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.prepare();
return recorder;
}
private static boolean isStorageReady()
{
String cardstatus = Environment.getExternalStorageState();
if (cardstatus.equals(Environment.MEDIA_REMOVED)
|| cardstatus.equals(Environment.MEDIA_UNMOUNTED)
|| cardstatus.equals(Environment.MEDIA_UNMOUNTABLE)
|| cardstatus.equals(Environment.MEDIA_MOUNTED_READ_ONLY))
{
return false;
}
else
{
if (cardstatus.equals(Environment.MEDIA_MOUNTED))
{
return true;
}
else
{
return false;
}
}
}
public static boolean hasMicrophone(Context context)
{
return context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_MICROPHONE);
}
public static boolean isSilence(short [] data)
{
boolean silence = false;
int RMS_SILENCE_THRESHOLD = 2000;
if (rootMeanSquared(data) < RMS_SILENCE_THRESHOLD)
{
silence = true;
}
return silence;
}
public static double rootMeanSquared(short[] nums)
{
double ms = 0;
for (int i = 0; i < nums.length; i++)
{
ms += nums[i] * nums[i];
}
ms /= nums.length;
return Math.sqrt(ms);
}
public static int countZeros(short [] audioData)
{
int numZeros = 0;
for (int i = 0; i < audioData.length; i++)
{
if (audioData[i] == 0)
{
numZeros++;
}
}
return numZeros;
}
public static double secondsPerSample(int sampleRate)
{
return 1.0/(double)sampleRate;
}
public static int numSamplesInTime(int sampleRate, float seconds)
{
return (int)((float)sampleRate * (float)seconds);
}
public static void outputData(short [] data, PrintWriter writer)
{
for (int i = 0; i < data.length; i++)
{
writer.println(String.valueOf(data[i]));
}
if (writer.checkError())
{
Log.w(TAG, "Error writing sensor event data");
}
}
}