前提・実現したいこと
android studioを使って、シークバーの値によって周波数、継続時間を調節した後、startボタンを押した瞬間に音が鳴るようにしたいです。
発生している問題・エラーメッセージ
エラーははいてないのですがstartボタンを押したときにタップ音のような音が数回鳴るだけでうまく音が鳴ってくれません。
また警告として39行目に'constructor AudioTrack(Int, Int, Int, Int, Int, Int)' is deprecated. Deprecated in Java とでます。
該当のソースコード
kotlin
1package com.example.speaker 2 3 4import android.app.Activity 5import android.media.AudioFormat 6import android.media.AudioManager 7import android.media.AudioTrack 8import android.os.Bundle 9import android.view.Menu 10import android.view.View 11import android.widget.SeekBar 12import kotlinx.android.synthetic.main.activity_main.* 13import kotlin.String 14import java.util.* 15import kotlin.math.ceil 16import kotlin.math.sin 17 18 19class DigitalSoundGenerator( 20 21 private val sampleRate: Int, bufferSize: Int) { 22 val audioTrack: AudioTrack 23 private val bufferSize: Int 24 25 fun getSound(frequency: Double, soundLength: Double): ByteArray { 26 val buffer = ByteArray(ceil(bufferSize * soundLength).toInt()) 27 for (i in buffer.indices) { 28 var wave = i / (sampleRate / frequency) * (Math.PI * 2) 29 wave = sin(wave) 30 buffer[i] = (if (wave > 0.0) Byte.MAX_VALUE else Byte.MIN_VALUE) 31 } 32 return buffer 33 } 34 35 init { 36 val sampleRate = 44100 37 this.bufferSize = bufferSize 38 39 audioTrack = AudioTrack( 40 AudioManager.STREAM_MUSIC, 41 sampleRate, // サンプルレート 42 AudioFormat.CHANNEL_OUT_MONO, 43 AudioFormat.ENCODING_DEFAULT, 44 bufferSize, 45 AudioTrack.MODE_STREAM) 46 } 47} 48 49class SoundDto( 50 var sound: ByteArray, 51 var length: Double) { 52 init { 53 length = length 54 } 55} 56 57 58class MainActivity : Activity(), Runnable { 59 60 private var soundGenerator: DigitalSoundGenerator? = null 61 private var audioTrack: AudioTrack? = null 62 private val soundList: MutableList<SoundDto> = ArrayList() 63 private fun initScoreData() { 64 soundList.add(SoundDto(generateSound(soundGenerator, FREQ, HALF_NOTE), HALF_NOTE)) 65 66 } 67 68 override fun onCreate(savedInstanceState: Bundle?) { 69 super.onCreate(savedInstanceState) 70 setContentView(R.layout.activity_main) 71 setupSeekBart() 72 setupSeekBarh() 73 soundGenerator = DigitalSoundGenerator(44100, 44100) 74 audioTrack = soundGenerator!!.audioTrack 75 findViewById<View>(R.id.start).setOnClickListener(object : View.OnClickListener { 76 override fun onClick(v: View?) { 77 val th = Thread(this@MainActivity) 78 th.start() 79 } 80 }) 81 82 initScoreData() 83 } 84 85 private fun setupSeekBart() 86 { 87 seekbartime.progress = 0 88 seekbartime.max = 1000 89 seekbartime.setOnSeekBarChangeListener( 90 object : SeekBar.OnSeekBarChangeListener { 91 override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { 92 val strt = String.format(Locale.US, "%d", progress) 93 timedown.setText(strt) 94 gTime = strt.toDouble() 95 } 96 override fun onStartTrackingTouch(seekBar: SeekBar) { 97 } 98 override fun onStopTrackingTouch(seekBar: SeekBar) { 99 } 100 }) 101 } 102 103 private fun setupSeekBarh() 104 { 105 seekbarhz.progress = 0 106 seekbarhz.max = 10000 107 seekbarhz.setOnSeekBarChangeListener( 108 object : SeekBar.OnSeekBarChangeListener { 109 override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { 110 val strh = String.format(Locale.US, "%d", progress) 111 hzdown.setText(strh) 112 gHz = strh.toDouble() 113 } 114 override fun onStartTrackingTouch(seekBar: SeekBar) { 115 } 116 override fun onStopTrackingTouch(seekBar: SeekBar) { 117 } 118 }) 119 } 120 121 override fun onDestroy() { 122 super.onDestroy() 123 if (audioTrack!!.playState == AudioTrack.PLAYSTATE_PLAYING) { 124 audioTrack!!.stop() 125 audioTrack!!.release() 126 } 127 } 128 129 override fun onCreateOptionsMenu(menu: Menu?): Boolean { 130 menuInflater.inflate(R.menu.option, menu) 131 return true 132 } 133 fun generateSound(gen: DigitalSoundGenerator?, freq: Double, length: Double): ByteArray { 134 return gen!!.getSound(freq, length) 135 } 136 137 override fun run() { 138 if (audioTrack!!.playState == AudioTrack.PLAYSTATE_PLAYING) { 139 audioTrack!!.stop() 140 audioTrack!!.reloadStaticData() 141 } 142 audioTrack!!.play() 143 for (dto in soundList) { 144 audioTrack!!.write(dto.sound, 0, dto.sound.size) 145 } 146 audioTrack!!.stop() 147 } 148 149 companion object { 150 private var gTime: Double = 1.0 151 var HALF_NOTE = gTime 152 private var gHz: Double = 1.0 153 var FREQ = gHz 154 } 155}
試したこと
音の鳴らし方はhttps://dev.classmethod.jp/articles/andoid_sound_generator_xmas/を参考にさせていただきました。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー