diff --git a/app/Locabean/res/layout/activity_node.xml b/app/Locabean/res/layout/activity_node.xml
index 1506c62..d4d0d98 100644
--- a/app/Locabean/res/layout/activity_node.xml
+++ b/app/Locabean/res/layout/activity_node.xml
@@ -8,24 +8,40 @@
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".NodeActivity" >
-
+ android:layout_marginTop="17dp"
+ android:text="@string/fingerprint"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
+
+
+ android:layout_above="@+id/btnStop"
+ android:layout_alignLeft="@+id/btnStop"
+ android:layout_marginBottom="23dp"
+ android:text="@string/record" />
+
+
\ No newline at end of file
diff --git a/app/Locabean/res/values/strings.xml b/app/Locabean/res/values/strings.xml
index be91c67..67467d9 100644
--- a/app/Locabean/res/values/strings.xml
+++ b/app/Locabean/res/values/strings.xml
@@ -4,5 +4,8 @@
Locabean
Settings
Hello world!
+ Record
+ Stop
+ Fingerprint:
diff --git a/app/Locabean/src/com/locaudio/locabean/NodeActivity.java b/app/Locabean/src/com/locaudio/locabean/NodeActivity.java
index eef85b2..7aa49f8 100644
--- a/app/Locabean/src/com/locaudio/locabean/NodeActivity.java
+++ b/app/Locabean/src/com/locaudio/locabean/NodeActivity.java
@@ -1,45 +1,42 @@
package com.locaudio.locabean;
import java.io.File;
-import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import android.app.Activity;
-import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
+import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.Button;
+import android.widget.TextView;
import com.musicg.wave.Wave;
public class NodeActivity extends Activity {
- private static final int RECORDER_BPP = 16;
private static final String AUDIO_RECORDER_FILE_EXT_WAV = ".wav";
private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder";
private static final String AUDIO_RECORDER_TEMP_FILE = "record_temp.raw";
- private static final int RECORDER_SAMPLERATE = 44100;
- private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_CONFIGURATION_MONO;
- private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private AudioRecord recorder = null;
- private int bufferSize = 0;
private Thread recordingThread = null;
private boolean isRecording = false;
+ private TextView fingerprintTextView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_node);
- bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,
- RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);
+
setButtonHandlers();
enableButtons(false);
+ fingerprintTextView = (TextView) findViewById(R.id.fingerprintText);
+ fingerprintTextView.setMovementMethod(new ScrollingMovementMethod());
}
private void setButtonHandlers() {
@@ -85,8 +82,8 @@ private String getTempFilename() {
private void startRecording() {
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
- RECORDER_SAMPLERATE, RECORDER_CHANNELS,
- RECORDER_AUDIO_ENCODING, bufferSize);
+ WaveWriter.RECORDER_SAMPLERATE, WaveWriter.RECORDER_CHANNELS,
+ WaveWriter.RECORDER_AUDIO_ENCODING, WaveWriter.BUFFER_SIZE);
int i = recorder.getState();
if (i == 1)
@@ -106,7 +103,7 @@ public void run() {
}
private void writeAudioDataToFile() {
- byte data[] = new byte[bufferSize];
+ byte data[] = new byte[WaveWriter.BUFFER_SIZE];
String filename = getTempFilename();
FileOutputStream os = null;
@@ -121,7 +118,7 @@ private void writeAudioDataToFile() {
if (null != os) {
while (isRecording) {
- read = recorder.read(data, 0, bufferSize);
+ read = recorder.read(data, 0, WaveWriter.BUFFER_SIZE);
if (AudioRecord.ERROR_INVALID_OPERATION != read) {
try {
@@ -153,7 +150,7 @@ private void stopRecording() {
recordingThread = null;
}
- copyWaveFile(getTempFilename(), getFilename());
+ WaveWriter.copyWaveFile(getTempFilename(), getFilename());
deleteTempFile();
}
@@ -163,95 +160,6 @@ private void deleteTempFile() {
file.delete();
}
- private void copyWaveFile(String inFilename, String outFilename) {
- FileInputStream in = null;
- FileOutputStream out = null;
- long totalAudioLen = 0;
- long totalDataLen = totalAudioLen + 36;
- long longSampleRate = RECORDER_SAMPLERATE;
- int channels = 1;
- long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels / 8;
-
- byte[] data = new byte[bufferSize];
-
- try {
- in = new FileInputStream(inFilename);
- out = new FileOutputStream(outFilename);
- totalAudioLen = in.getChannel().size();
- totalDataLen = totalAudioLen + 36;
-
- System.out.println("File size: " + totalDataLen);
-
- WriteWaveFileHeader(out, totalAudioLen, totalDataLen,
- longSampleRate, channels, byteRate);
-
- while (in.read(data) != -1) {
- out.write(data);
- }
-
- in.close();
- out.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- private void WriteWaveFileHeader(FileOutputStream out, long totalAudioLen,
- long totalDataLen, long longSampleRate, int channels, long byteRate)
- throws IOException {
-
- byte[] header = new byte[44];
-
- header[0] = 'R'; // RIFF/WAVE header
- header[1] = 'I';
- header[2] = 'F';
- header[3] = 'F';
- header[4] = (byte) (totalDataLen & 0xff);
- header[5] = (byte) ((totalDataLen >> 8) & 0xff);
- header[6] = (byte) ((totalDataLen >> 16) & 0xff);
- header[7] = (byte) ((totalDataLen >> 24) & 0xff);
- header[8] = 'W';
- header[9] = 'A';
- header[10] = 'V';
- header[11] = 'E';
- header[12] = 'f'; // 'fmt ' chunk
- header[13] = 'm';
- header[14] = 't';
- header[15] = ' ';
- header[16] = 16; // 4 bytes: size of 'fmt ' chunk
- header[17] = 0;
- header[18] = 0;
- header[19] = 0;
- header[20] = 1; // format = 1
- header[21] = 0;
- header[22] = (byte) channels;
- header[23] = 0;
- header[24] = (byte) (longSampleRate & 0xff);
- header[25] = (byte) ((longSampleRate >> 8) & 0xff);
- header[26] = (byte) ((longSampleRate >> 16) & 0xff);
- header[27] = (byte) ((longSampleRate >> 24) & 0xff);
- header[28] = (byte) (byteRate & 0xff);
- header[29] = (byte) ((byteRate >> 8) & 0xff);
- header[30] = (byte) ((byteRate >> 16) & 0xff);
- header[31] = (byte) ((byteRate >> 24) & 0xff);
- header[32] = (byte) (2 * 16 / 8); // block align
- header[33] = 0;
- header[34] = RECORDER_BPP; // bits per sample
- header[35] = 0;
- header[36] = 'd';
- header[37] = 'a';
- header[38] = 't';
- header[39] = 'a';
- header[40] = (byte) (totalAudioLen & 0xff);
- header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
- header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
- header[43] = (byte) ((totalAudioLen >> 24) & 0xff);
-
- out.write(header, 0, 44);
- }
-
private View.OnClickListener btnClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -259,7 +167,7 @@ public void onClick(View v) {
case R.id.btnStart: {
System.out.println("Start Recording");
enableButtons(true);
-
+
startRecording();
break;
@@ -270,7 +178,7 @@ public void onClick(View v) {
stopRecording();
Wave wave = new Wave(getFilename());
- System.out.println(Arrays.toString(wave.getFingerprint()));
+ fingerprintTextView.setText(Arrays.toString(wave.getFingerprint()));
break;
}
}
diff --git a/app/Locabean/src/com/locaudio/locabean/WaveWriter.java b/app/Locabean/src/com/locaudio/locabean/WaveWriter.java
new file mode 100644
index 0000000..60f8198
--- /dev/null
+++ b/app/Locabean/src/com/locaudio/locabean/WaveWriter.java
@@ -0,0 +1,110 @@
+package com.locaudio.locabean;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import android.media.AudioFormat;
+import android.media.AudioRecord;
+
+public class WaveWriter {
+ @SuppressWarnings("deprecation")
+ protected static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_CONFIGURATION_MONO;
+ protected static final int RECORDER_BPP = 16;
+ protected static final int RECORDER_SAMPLERATE = 44100;
+ protected static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
+
+ protected static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(
+ RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);
+
+ protected static void writeWaveFileHeader(FileOutputStream out,
+ long totalAudioLen, long totalDataLen, long longSampleRate,
+ int channels, long byteRate, int bitsPerSample) throws IOException {
+
+ byte[] header = new byte[44];
+
+ header[0] = 'R'; // RIFF/WAVE header
+ header[1] = 'I';
+ header[2] = 'F';
+ header[3] = 'F';
+ header[4] = (byte) (totalDataLen & 0xff);
+ header[5] = (byte) ((totalDataLen >> 8) & 0xff);
+ header[6] = (byte) ((totalDataLen >> 16) & 0xff);
+ header[7] = (byte) ((totalDataLen >> 24) & 0xff);
+ header[8] = 'W';
+ header[9] = 'A';
+ header[10] = 'V';
+ header[11] = 'E';
+ header[12] = 'f'; // 'fmt ' chunk
+ header[13] = 'm';
+ header[14] = 't';
+ header[15] = ' ';
+ header[16] = 16; // 4 bytes: size of 'fmt ' chunk
+ header[17] = 0;
+ header[18] = 0;
+ header[19] = 0;
+ header[20] = 1; // format = 1
+ header[21] = 0;
+ header[22] = (byte) channels;
+ header[23] = 0;
+ header[24] = (byte) (longSampleRate & 0xff);
+ header[25] = (byte) ((longSampleRate >> 8) & 0xff);
+ header[26] = (byte) ((longSampleRate >> 16) & 0xff);
+ header[27] = (byte) ((longSampleRate >> 24) & 0xff);
+ header[28] = (byte) (byteRate & 0xff);
+ header[29] = (byte) ((byteRate >> 8) & 0xff);
+ header[30] = (byte) ((byteRate >> 16) & 0xff);
+ header[31] = (byte) ((byteRate >> 24) & 0xff);
+ header[32] = (byte) (2 * 16 / 8); // block align
+ header[33] = 0;
+ header[34] = (byte) bitsPerSample; // bits per sample
+ header[35] = 0;
+ header[36] = 'd';
+ header[37] = 'a';
+ header[38] = 't';
+ header[39] = 'a';
+ header[40] = (byte) (totalAudioLen & 0xff);
+ header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
+ header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
+ header[43] = (byte) ((totalAudioLen >> 24) & 0xff);
+
+ out.write(header, 0, 44);
+ }
+
+ protected static void copyWaveFile(String inFilename, String outFilename) {
+ FileInputStream in = null;
+ FileOutputStream out = null;
+ long totalAudioLen = 0;
+ long totalDataLen = totalAudioLen + 36;
+ long longSampleRate = RECORDER_SAMPLERATE;
+ int channels = 1;
+ long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels / 8;
+
+ byte[] data = new byte[BUFFER_SIZE];
+
+ try {
+ in = new FileInputStream(inFilename);
+ out = new FileOutputStream(outFilename);
+ totalAudioLen = in.getChannel().size();
+ totalDataLen = totalAudioLen + 36;
+
+ System.out.println("File size: " + totalDataLen);
+
+ writeWaveFileHeader(out, totalAudioLen, totalDataLen,
+ longSampleRate, channels, byteRate, RECORDER_BPP);
+
+ while (in.read(data) != -1) {
+ out.write(data);
+ }
+
+ in.close();
+ out.close();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+}