メインのアクティビティでAudioRecodoを用いてマイクから一定間隔で音声データ(配列のデータ)を取得して、
それをサーフェスビューで波形を描画して視覚的に音声データを確認したいのですが、
クラス間での配列データの受け渡し?移動?の仕方がわかりません。詳しい方教えてください。
↓MainPage メインのアクティビティ
java
1import android.Manifest; 2import android.app.Activity; 3import android.content.Intent; 4import android.content.pm.PackageManager; 5import android.database.sqlite.SQLiteDatabase; 6import android.media.AudioFormat; 7import android.media.AudioRecord; 8import android.media.MediaRecorder; 9import android.os.Bundle; 10import android.os.Handler; 11import android.util.Log; 12import android.view.Window; 13 14import androidx.core.app.ActivityCompat; 15import androidx.core.content.ContextCompat; 16 17public class MainPage extends Activity 18{ 19 public boolean loop = true;//loop用 20 public Thread thread; 21 public int co=0;//loop用のカウント 22 23 private int PERMISSIONS_REQUEST_RECORD_AUDIO = 99; 24 25 // オーディオレコード定数 26 public AudioRecord record; 27 28 public int count=0; 29 30 public static final int AUDIO_SAMPLE_FREQ = 44100;//サンプリング周波数 31 32 public static final int AUDIO_BUFFER_SIZE = AudioRecord.getMinBufferSize(AUDIO_SAMPLE_FREQ, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); //オーディオレコード用バッファのサイズ 33 34 public static final int FRAME_BUFFER_SIZE = AUDIO_BUFFER_SIZE / 2; 35 36 public short data[] = new short[FRAME_BUFFER_SIZE]; 37 38 public short test[] = new short[32];//配列テスト 39 40 public void onCreate(Bundle bundle) 41 { 42 super.onCreate(bundle); 43 requestWindowFeature(Window.FEATURE_NO_TITLE); 44 45 for(int i=0; i<32; i++) //格納 46 { 47 test[i]= (short) i; 48 } 49 50 Log.d("MainPage", "onCreate起動時"); 51 52 for(int i=0; i<32; i++) // test 53 { 54 Log.d("MainPage", "" + test[i]);//配列logcat表示 55 } 56 57 setContentView(new MySurfaceView(this));//サーフェスビュー 58 59 60 thread = new Thread(new Runnable()//ループ 61 { 62 private Handler handler = new Handler(getMainLooper()); 63 64 @Override 65 public void run() 66 { 67 record = new AudioRecord(MediaRecorder.AudioSource.MIC, 68 AUDIO_SAMPLE_FREQ, AudioFormat.CHANNEL_IN_MONO, 69 AudioFormat.ENCODING_PCM_16BIT, AUDIO_BUFFER_SIZE); 70 71 // マルチスレッドにしたい処理 ここから 72 while(loop) 73 { 74 try 75 { 76 co++; 77 78 thread.sleep(5000); 79 80 handler.post(new Runnable() 81 { 82 @Override 83 public void run() 84 { 85 Log.d("MainPage", "ループNo." + co); 86 // 録音開始 87 record.startRecording(); 88 89 record.read(data, 0, FRAME_BUFFER_SIZE); 90 91 for(int i=0; i<FRAME_BUFFER_SIZE; i++) 92 { 93 Log.d("MainPage", "data["+ i +"] = " + data[i]);//音声データ配列 logcat表示 94 } 95 96 97 } 98 }); 99 100 } 101 catch (InterruptedException e) 102 { 103 } 104 105 }//while末 106 107 // マルチスレッドにしたい処理 ここまで 108 109 }//Run末 110 111 });//thread末 112 113 114 115 int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO); 116 117 if (permissionCheck == PackageManager.PERMISSION_GRANTED) // すでにユーザーがパーミッションを許可 118 { 119 thread.start(); 120 } 121 else // ユーザーはパーミッションを許可していない 122 { 123 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, PERMISSIONS_REQUEST_RECORD_AUDIO); 124 } 125 126 127 }//onCreate末 128 129 @Override 130 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 131 { 132 if (requestCode == PERMISSIONS_REQUEST_RECORD_AUDIO) 133 { 134 if (grantResults[0] != android.content.pm.PackageManager.PERMISSION_GRANTED) // ユーザが許可しなかったらアプリを終了する 135 { 136 finish(); 137 } 138 else 139 { 140 thread.start(); 141 } 142 } 143 } 144 145}//MainPage末
↓MySurfaceView 波形描画用のサーフェスビュー
java
1import android.content.Context; 2import android.content.Intent; 3import android.graphics.Canvas; 4import android.graphics.Color; 5import android.graphics.Paint; 6import android.graphics.Path; 7import android.view.SurfaceHolder; 8import android.view.SurfaceView; 9 10import java.util.Calendar; 11import java.util.Random; 12 13public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable 14{ 15 private Thread thread; 16 private SurfaceHolder holder; 17 18 public int count = 0; 19 20 private float screenWidth, screenHeight; 21 22 23 public short frn[] = new short[32];//配列 24 25 public MySurfaceView(Context context) 26 { 27 super(context); 28 holder = getHolder(); 29 holder.addCallback(this); 30 holder.setFixedSize(getWidth(), getHeight()); 31 } 32 33 @Override 34 public void surfaceChanged(SurfaceHolder holder, int f, int w, int h) 35 { 36 screenWidth = w; 37 screenHeight = h; 38 39 thread = new Thread(this); 40 thread.start(); 41 } 42 43 @Override 44 public void surfaceCreated(SurfaceHolder holder) 45 { 46 } 47 48 @Override 49 public void surfaceDestroyed(SurfaceHolder holder) 50 { 51 } 52 53 @Override 54 public void run() 55 { 56 while (thread != null) 57 { 58 long nextTime = System.currentTimeMillis()+250;//250msec 59 try 60 { 61 Thread.sleep(nextTime - System.currentTimeMillis()); 62 } 63 catch (Exception e) 64 { 65 } 66 67 68 for (int i=0; i<32; i++)//とりあえずは乱数を入れてそれっぽく ここに音声データを置き換えたい 69 { 70 Random r = new Random(); // https://kazukii777.blogspot.com/2013/05/android_6460.html 乱数生成 71 frn[i] = (short) r.nextInt(255); 72 } 73 74 doDraw(holder); 75 } 76 } 77 78 private void doDraw(SurfaceHolder holder) 79 { 80 81 Canvas canvas = holder.lockCanvas(); 82 83 if (canvas != null) 84 { 85 count++; 86 87 Paint paint = new Paint(); 88 paint.setAntiAlias(true); 89 canvas.drawColor(Color.BLACK); 90 91 92 paint.setStrokeWidth(2);//線幅 93 paint.setStyle(Paint.Style.STROKE); 94 paint.setColor(Color.RED); 95 Path path =new Path(); 96 for (int i=0; i<32; i++) 97 { 98 if (i==0) 99 { 100 path.moveTo((screenWidth/32)*i,screenHeight/2 +frn[i]);//開始座標 101 } 102 else 103 { 104 path.lineTo((screenWidth/32)*i,screenHeight/2 + frn[i]); 105 } 106 107 } 108 canvas.drawPath(path,paint); 109 110 111 112 paint.setAntiAlias(true); 113 paint.setTextSize(120); 114 paint.setColor(Color.WHITE); 115 canvas.drawText("Surface_View_Count",0,400,paint); 116 117 paint.setAntiAlias(true); 118 paint.setTextSize(120); 119 paint.setColor(Color.WHITE); 120 canvas.drawText("-"+count+"-",0,600,paint); 121 122 123 124 holder.unlockCanvasAndPost(canvas); 125 } 126 } 127}
とりあえずは乱数で波形を動かしているのですが、これを音声データに置き換えたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/01 09:21
2021/10/01 09:24
2021/10/01 11:36 編集
2021/10/04 08:52
2021/10/04 10:45 編集
2021/10/05 00:51
2021/10/05 03:02 編集
2021/10/05 04:39
2021/10/05 05:56
2021/10/05 09:06
2021/10/05 09:28
2021/10/05 09:31
2021/10/05 09:55
2021/10/05 14:33 編集
2021/10/06 02:11