ผมพัฒนาฮาร์ดแวร์แบบ irig ได้แล้ว (ลอง rec ผ่าน ringdroid เสียงกีต้าร์เข้าไปได้ไม่มีปัญหา) อยากจะเริ่มต้นการปรับเสียง และ encode เสียงแบบ raw ที่อัดมาให้แปลงคลื่นสัญญาณเสียงแบบเอฟเฟกกีต้าเหมือนโปรแกรม amplitube ขอคำแนะนำด้วยครับ ซึ่งตอนนี้พัฒนาโปรแกรมจากคำแนะนำที่อื่นๆ ตามหนังสือบ้าง ได้ประมาณนี้คัรบ (มีวิธีที่ไม่เอาลงบัฟเฟอร์ แต่เอาเสียงที่อัดออกมาเล่นเลยได้รึเปล่าครับ ขอบคุณครับ
package test.bb;
import android.app.Activity;
import android.os.Bundle;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class TestActivity extends Activity implements Runnable {
private TextView statusText;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
statusText = (TextView) findViewById(R.id.status);
Button actionButton = (Button) findViewById(R.id.record);
actionButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
record_thread();
}
});
Button replayButton = (Button) findViewById(R.id.play);
replayButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
Thread thread = new Thread(TestActivity.this);
thread.start();
}
});
}
String text_string;
final Handler mHandler = new Handler();
final Runnable mUpdateResults = new Runnable(){
public void run(){
updateResultsInUi(text_string);
}
};
private void updateResultsInUi(String update_txt){
statusText.setText(update_txt);
}
private void record_thread(){
Thread thread = new Thread(new Runnable(){
public void run(){
text_string = “Starting”;
mHandler.post(mUpdateResults);
record();
text_string = “Done”;
mHandler.post(mUpdateResults);
}
});
thread.start();
}
private int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
int frequency = 11025;
int bufferSize = 100*AudioTrack.getMinBufferSize(frequency,AudioFormat.CHANNEL_OUT_MONO, audioEncoding);
public AudioRecord audioRecord = new AudioRecord(
MediaRecorder.AudioSource.DEFAULT,frequency,AudioFormat.CHANNEL_IN_MONO,audioEncoding,bufferSize);
public AudioTrack audioTrack = new AudioTrack(
AudioManager.STREAM_MUSIC,frequency,AudioFormat.CHANNEL_OUT_MONO,audioEncoding,4096,AudioTrack.MODE_STREAM);
short[] buffer = new short[bufferSize];
public void record(){
try{
audioRecord.startRecording();
audioRecord.read(buffer,0,bufferSize);
audioRecord.stop();
}catch(Throwable t){
Log.e(“TestActivity”,”Recording Failed”);
}
}
public void run(){
audioTrack.play();
int i=0;
while(i<bufferSize){
audioTrack.write(buffer,i++,1);
}
return;
}
protected void onPause() {
if(audioTrack!=null){
if(audioTrack.getPlayState()==AudioTrack.PLAYSTATE_PLAYING){
audioTrack.pause();
}
}
super.onPause();
}
}