メインのアクティビティでAudioRecodoを用いてマイクから一定間隔で音声データ(配列のデータ)を取得して、
それをサーフェスビューで波形を描画して視覚的に音声データを確認したいのですが、
クラス間での配列データの受け渡し?移動?の仕方がわかりません。詳しい方教えてください。
↓MainPage メインのアクティビティ
java
import android.Manifest; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.database.sqlite.SQLiteDatabase; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.Window; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; public class MainPage extends Activity { public boolean loop = true;//loop用 public Thread thread; public int co=0;//loop用のカウント private int PERMISSIONS_REQUEST_RECORD_AUDIO = 99; // オーディオレコード定数 public AudioRecord record; public int count=0; public static final int AUDIO_SAMPLE_FREQ = 44100;//サンプリング周波数 public static final int AUDIO_BUFFER_SIZE = AudioRecord.getMinBufferSize(AUDIO_SAMPLE_FREQ, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); //オーディオレコード用バッファのサイズ public static final int FRAME_BUFFER_SIZE = AUDIO_BUFFER_SIZE / 2; public short data[] = new short[FRAME_BUFFER_SIZE]; public short test[] = new short[32];//配列テスト public void onCreate(Bundle bundle) { super.onCreate(bundle); requestWindowFeature(Window.FEATURE_NO_TITLE); for(int i=0; i<32; i++) //格納 { test[i]= (short) i; } Log.d("MainPage", "onCreate起動時"); for(int i=0; i<32; i++) // test { Log.d("MainPage", "" + test[i]);//配列logcat表示 } setContentView(new MySurfaceView(this));//サーフェスビュー thread = new Thread(new Runnable()//ループ { private Handler handler = new Handler(getMainLooper()); @Override public void run() { record = new AudioRecord(MediaRecorder.AudioSource.MIC, AUDIO_SAMPLE_FREQ, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, AUDIO_BUFFER_SIZE); // マルチスレッドにしたい処理 ここから while(loop) { try { co++; thread.sleep(5000); handler.post(new Runnable() { @Override public void run() { Log.d("MainPage", "ループNo." + co); // 録音開始 record.startRecording(); record.read(data, 0, FRAME_BUFFER_SIZE); for(int i=0; i<FRAME_BUFFER_SIZE; i++) { Log.d("MainPage", "data["+ i +"] = " + data[i]);//音声データ配列 logcat表示 } } }); } catch (InterruptedException e) { } }//while末 // マルチスレッドにしたい処理 ここまで }//Run末 });//thread末 int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO); if (permissionCheck == PackageManager.PERMISSION_GRANTED) // すでにユーザーがパーミッションを許可 { thread.start(); } else // ユーザーはパーミッションを許可していない { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, PERMISSIONS_REQUEST_RECORD_AUDIO); } }//onCreate末 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == PERMISSIONS_REQUEST_RECORD_AUDIO) { if (grantResults[0] != android.content.pm.PackageManager.PERMISSION_GRANTED) // ユーザが許可しなかったらアプリを終了する { finish(); } else { thread.start(); } } } }//MainPage末
↓MySurfaceView 波形描画用のサーフェスビュー
java
import android.content.Context; import android.content.Intent; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.view.SurfaceHolder; import android.view.SurfaceView; import java.util.Calendar; import java.util.Random; public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable { private Thread thread; private SurfaceHolder holder; public int count = 0; private float screenWidth, screenHeight; public short frn[] = new short[32];//配列 public MySurfaceView(Context context) { super(context); holder = getHolder(); holder.addCallback(this); holder.setFixedSize(getWidth(), getHeight()); } @Override public void surfaceChanged(SurfaceHolder holder, int f, int w, int h) { screenWidth = w; screenHeight = h; thread = new Thread(this); thread.start(); } @Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } @Override public void run() { while (thread != null) { long nextTime = System.currentTimeMillis()+250;//250msec try { Thread.sleep(nextTime - System.currentTimeMillis()); } catch (Exception e) { } for (int i=0; i<32; i++)//とりあえずは乱数を入れてそれっぽく ここに音声データを置き換えたい { Random r = new Random(); // https://kazukii777.blogspot.com/2013/05/android_6460.html 乱数生成 frn[i] = (short) r.nextInt(255); } doDraw(holder); } } private void doDraw(SurfaceHolder holder) { Canvas canvas = holder.lockCanvas(); if (canvas != null) { count++; Paint paint = new Paint(); paint.setAntiAlias(true); canvas.drawColor(Color.BLACK); paint.setStrokeWidth(2);//線幅 paint.setStyle(Paint.Style.STROKE); paint.setColor(Color.RED); Path path =new Path(); for (int i=0; i<32; i++) { if (i==0) { path.moveTo((screenWidth/32)*i,screenHeight/2 +frn[i]);//開始座標 } else { path.lineTo((screenWidth/32)*i,screenHeight/2 + frn[i]); } } canvas.drawPath(path,paint); paint.setAntiAlias(true); paint.setTextSize(120); paint.setColor(Color.WHITE); canvas.drawText("Surface_View_Count",0,400,paint); paint.setAntiAlias(true); paint.setTextSize(120); paint.setColor(Color.WHITE); canvas.drawText("-"+count+"-",0,600,paint); holder.unlockCanvasAndPost(canvas); } } }
とりあえずは乱数で波形を動かしているのですが、これを音声データに置き換えたいです。
まだ回答がついていません
会員登録して回答してみよう