Skip to content

Commit

Permalink
Changed layout
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexander James Wallar committed Jan 19, 2014
1 parent 8747a60 commit a6c266d
Show file tree
Hide file tree
Showing 4 changed files with 155 additions and 118 deletions.
42 changes: 29 additions & 13 deletions app/Locabean/res/layout/activity_node.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,40 @@
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".NodeActivity" >

<Button
android:id="@+id/btnStart"
<TextView
android:id="@+id/fingerprintLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/btnStop"
android:layout_alignBottom="@+id/btnStop"
android:layout_alignParentLeft="true"
android:layout_marginLeft="37dp"
android:text="Record" />
android:layout_marginTop="17dp"
android:text="@string/fingerprint"
android:textAppearance="?android:attr/textAppearanceLarge" />

<Button
android:id="@+id/btnStop"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/fingerprintText"
android:layout_alignParentBottom="true"
android:layout_marginBottom="37dp"
android:text="@string/stop" />

<Button
android:id="@+id/btnStart"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="80dp"
android:layout_marginTop="55dp"
android:layout_toRightOf="@+id/btnStart"
android:text="Stop" />
android:layout_above="@+id/btnStop"
android:layout_alignLeft="@+id/btnStop"
android:layout_marginBottom="23dp"
android:text="@string/record" />

<TextView
android:id="@+id/fingerprintText"
android:layout_width="match_parent"
android:layout_height="500dp"
android:layout_alignLeft="@+id/fingerprintLabel"
android:layout_below="@+id/fingerprintLabel"
android:layout_marginTop="36dp"
android:maxLines="100"
android:scrollbars="vertical" />

</RelativeLayout>
3 changes: 3 additions & 0 deletions app/Locabean/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,8 @@
<string name="app_name">Locabean</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="record">Record</string>
<string name="stop">Stop</string>
<string name="fingerprint"><b>Fingerprint:</b></string>

</resources>
118 changes: 13 additions & 105 deletions app/Locabean/src/com/locaudio/locabean/NodeActivity.java
Original file line number Diff line number Diff line change
@@ -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() {
Expand Down Expand Up @@ -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)
Expand All @@ -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;

Expand All @@ -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 {
Expand Down Expand Up @@ -153,7 +150,7 @@ private void stopRecording() {
recordingThread = null;
}

copyWaveFile(getTempFilename(), getFilename());
WaveWriter.copyWaveFile(getTempFilename(), getFilename());
deleteTempFile();
}

Expand All @@ -163,103 +160,14 @@ 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) {
switch (v.getId()) {
case R.id.btnStart: {
System.out.println("Start Recording");
enableButtons(true);

startRecording();

break;
Expand All @@ -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;
}
}
Expand Down
110 changes: 110 additions & 0 deletions app/Locabean/src/com/locaudio/locabean/WaveWriter.java
Original file line number Diff line number Diff line change
@@ -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();
}
}

}

0 comments on commit a6c266d

Please sign in to comment.