Merge branch 'audiorecorder-1.1.1'

This commit is contained in:
Alexey Kuznetsov 2016-03-25 16:42:12 +03:00
commit 1787c3c356
3 changed files with 139 additions and 50 deletions

View file

@ -8,8 +8,8 @@ android {
applicationId "com.github.axet.audiorecorder"
minSdkVersion 16
targetSdkVersion 23
versionCode 21
versionName "1.1.0"
versionCode 22
versionName "1.1.1"
}
signingConfigs {
release {

View file

@ -335,6 +335,7 @@ public class RecordingActivity extends AppCompatActivity {
super.onPause();
Log.d(TAG, "onPause");
updateBufferSize(true);
edit(false);
pitch.pause();
}
@ -368,7 +369,6 @@ public class RecordingActivity extends AppCompatActivity {
void edit(boolean b) {
if (b) {
state.setText("edit");
editPlay(false);
View box = findViewById(R.id.recording_edit_box);
@ -391,9 +391,9 @@ public class RecordingActivity extends AppCompatActivity {
public void onClick(View v) {
if (play != null) {
editPlay(false);
return;
} else {
editPlay(true);
}
editPlay(true);
}
});
@ -407,6 +407,7 @@ public class RecordingActivity extends AppCompatActivity {
} else {
editSample = -1;
state.setText("pause");
editPlay(false);
pitch.pause();
View box = findViewById(R.id.recording_edit_box);
box.setVisibility(View.GONE);
@ -422,7 +423,30 @@ public class RecordingActivity extends AppCompatActivity {
playIndex = editSample;
playUpdate = samplesUpdate;
playUpdate = PitchView.UPDATE_SPEED * sampleRate / 1000;
final Handler handler = new Handler();
AudioTrack.OnPlaybackPositionUpdateListener listener = new AudioTrack.OnPlaybackPositionUpdateListener() {
@Override
public void onMarkerReached(AudioTrack track) {
handler.post(new Runnable() {
@Override
public void run() {
editPlay(false);
}
});
}
@Override
public void onPeriodicNotification(AudioTrack track) {
if (play != null) {
playIndex += playUpdate;
float p = playIndex / (float) samplesUpdate;
pitch.play(p);
}
}
};
RawSamples rs = new RawSamples(storage.getTempRecording());
int len = (int) (rs.getSamples() - editSample);
@ -432,25 +456,13 @@ public class RecordingActivity extends AppCompatActivity {
play = generateTrack(buf, r);
play.play();
play.setPositionNotificationPeriod(playUpdate);
play.setPlaybackPositionUpdateListener(new AudioTrack.OnPlaybackPositionUpdateListener() {
@Override
public void onMarkerReached(AudioTrack track) {
editPlay(false);
pitch.play(-1);
}
@Override
public void onPeriodicNotification(AudioTrack track) {
playIndex += playUpdate;
long p = playIndex / samplesUpdate;
pitch.play(p);
}
});
play.setPlaybackPositionUpdateListener(listener, handler);
} else {
if (play != null) {
play.release();
play = null;
}
pitch.play(-1);
playButton.setImageResource(R.drawable.play);
}
}
@ -533,6 +545,10 @@ public class RecordingActivity extends AppCompatActivity {
Log.e(TAG, "Unable to set Thread Priority " + android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
}
long startTime = System.currentTimeMillis();
// start recording after 0.5 sec
long goTime = startTime + 500;
RawSamples rs = null;
AudioRecord recorder = null;
try {
@ -565,6 +581,8 @@ public class RecordingActivity extends AppCompatActivity {
short[] buffer = null;
while (!Thread.currentThread().isInterrupted()) {
long cur = System.currentTimeMillis();
synchronized (bufferSize) {
if (buffer == null || buffer.length != bufferSize)
buffer = new short[bufferSize];
@ -575,29 +593,31 @@ public class RecordingActivity extends AppCompatActivity {
break;
}
rs.write(buffer);
if (cur > goTime) {
rs.write(buffer);
int pa = getPa(buffer, 0, readSize);
int pa = getPa(buffer, 0, readSize);
int s = CHANNEL_CONFIG == AudioFormat.CHANNEL_IN_MONO ? readSize : readSize / 2;
int s = CHANNEL_CONFIG == AudioFormat.CHANNEL_IN_MONO ? readSize : readSize / 2;
samplesUpdateCount += s;
if (samplesUpdateCount >= samplesUpdate) {
pitch.add(pa);
samplesUpdateCount -= samplesUpdate;
}
samplesUpdateCount += s;
if (samplesUpdateCount >= samplesUpdate) {
pitch.add(pa);
samplesUpdateCount -= samplesUpdate;
}
samplesTime += s;
samplesTimeCount += s;
if (samplesTimeCount > samplesTimeUpdate) {
final long m = samplesTime;
handle.post(new Runnable() {
@Override
public void run() {
updateSamples(m);
}
});
samplesTimeCount -= samplesTimeUpdate;
samplesTime += s;
samplesTimeCount += s;
if (samplesTimeCount > samplesTimeUpdate) {
final long m = samplesTime;
handle.post(new Runnable() {
@Override
public void run() {
updateSamples(m);
}
});
samplesTimeCount -= samplesTimeUpdate;
}
}
}
} catch (final RuntimeException e) {

View file

@ -11,6 +11,7 @@ import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
@ -66,7 +67,9 @@ public class PitchView extends ViewGroup {
// index
int editPos = 0;
int editCount = 0;
int playPos = -1;
// current playing position in samples
float playPos = -1;
Runnable play;
Runnable draw;
Thread thread;
@ -191,7 +194,7 @@ public class PitchView extends ViewGroup {
canvas.drawLine(x, 0, x, getHeight(), editPaint);
}
if (edit != null && playPos != -1) {
if (edit != null && playPos > 0) {
float x = playPos * pitchSize + pitchSize / 2f;
canvas.drawLine(x, 0, x, getHeight(), playPaint);
}
@ -378,6 +381,11 @@ public class PitchView extends ViewGroup {
public void add(int a) {
data.add(a / 100.0f);
// after pause, we still may get one last sample. force view redraw.
if (thread == null) {
draw();
}
}
public void draw() {
@ -447,10 +455,13 @@ public class PitchView extends ViewGroup {
thread.interrupt();
thread = null;
}
if (edit != null)
edit = null;
if (draw != null)
draw = null;
if (play != null)
play = null;
drawEdit();
}
@ -478,6 +489,13 @@ public class PitchView extends ViewGroup {
thread = null;
}
}
edit();
return samples + editPos;
}
public void edit() {
if (thread == null) {
edit = new Runnable() {
@Override
@ -508,8 +526,6 @@ public class PitchView extends ViewGroup {
thread = new Thread(edit, TAG);
thread.start();
}
return samples + editPos;
}
public void resume() {
@ -520,6 +536,13 @@ public class PitchView extends ViewGroup {
thread = null;
}
}
if (play != null) {
play = null;
if (thread != null) {
thread.interrupt();
thread = null;
}
}
if (thread == null) {
draw = new Runnable() {
@Override
@ -548,14 +571,60 @@ public class PitchView extends ViewGroup {
}
}
public void play(long pos) {
// current paying pos in actual samples
public void play(float pos) {
synchronized (this) {
playPos = (int) (pos - samples);
playPos = pos - samples;
editCount = 0;
if (playPos < 0)
playPos = -1;
drawEdit();
if (playPos < 0) {
if (play != null) {
play = null;
if (thread != null) {
thread.interrupt();
thread = null;
}
}
if (thread == null) {
edit();
}
return;
}
}
if (play == null && thread != null) {
thread.interrupt();
thread = null;
}
if (thread == null) {
play = new Runnable() {
@Override
public void run() {
time = System.currentTimeMillis();
while (!Thread.currentThread().isInterrupted()) {
long time = System.currentTimeMillis();
drawEdit();
long cur = System.currentTimeMillis();
long delay = UPDATE_SPEED - (cur - time);
if (delay > 0) {
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
};
thread = new Thread(play, TAG);
thread.start();
}
}
}