1
0
Fork 0

Write audio samples on a worker thread, enqueued on main

This commit is contained in:
Eoin Mcloughlin 2020-05-13 18:15:49 +01:00
parent 632fd007e7
commit 26cc60adf5
3 changed files with 43 additions and 11 deletions

1
TODO
View file

@ -1,5 +1,4 @@
Basic: Basic:
* Multithreaded sounder
* Correct tone length calculation * Correct tone length calculation
* Settings * Settings

View file

@ -5,6 +5,9 @@ import android.media.AudioFormat
import android.media.AudioTrack import android.media.AudioTrack
import android.media.MediaDataSource import android.media.MediaDataSource
import android.view.KeyEvent import android.view.KeyEvent
import java.util.concurrent.ArrayBlockingQueue
import java.util.concurrent.BlockingQueue
import kotlin.concurrent.thread
import kotlin.math.PI import kotlin.math.PI
import kotlin.math.sin import kotlin.math.sin
@ -164,25 +167,42 @@ class DitDahSoundStream {
for(i in 0 until dahLengthInSamples) { for(i in 0 until dahLengthInSamples) {
mDahSound[i] = (0x7fff.toFloat() * sin(2.0f * PI * i * config.toneFrequency * invSampleRate) ).toShort(); mDahSound[i] = (0x7fff.toFloat() * sin(2.0f * PI * i * config.toneFrequency * invSampleRate) ).toShort();
} }
thread() { makeSoundsWorkerThreadFunc() }
} }
fun enqueue(symbols : List<SoundTypes>) { fun enqueue(symbols : List<SoundTypes>) {
// TODO want to be able to call this multi-threaded, while this owns a thread which writes the samples for(sym in symbols) {
for (sym in symbols) { mSymbolQueue.put(sym)
}
}
fun quit() {
mShouldQuit = true;
mSymbolQueue.put(SoundTypes.WORD_SPACE)
}
fun makeSoundsWorkerThreadFunc() {
while(true) {
val sym : SoundTypes = mSymbolQueue.take()
if(mShouldQuit)
return;
when (sym) { when (sym) {
//TODO These sounds should include a blank space
SoundTypes.DIT -> mSoundPlayer.write(mDitSound, 0, mDitSound.size) SoundTypes.DIT -> mSoundPlayer.write(mDitSound, 0, mDitSound.size)
SoundTypes.DAH -> mSoundPlayer.write(mDahSound, 0, mDahSound.size) SoundTypes.DAH -> mSoundPlayer.write(mDahSound, 0, mDahSound.size)
SoundTypes.LETTER_SPACE -> mSoundPlayer.write(mCharacterSpacingSound, 0, mCharacterSpacingSound.size) SoundTypes.LETTER_SPACE -> mSoundPlayer.write( mCharacterSpacingSound, 0, mCharacterSpacingSound.size)
SoundTypes.WORD_SPACE -> mSoundPlayer.write(mWordSpacingSound, 0, mWordSpacingSound.size) SoundTypes.WORD_SPACE -> mSoundPlayer.write( mWordSpacingSound, 0, mWordSpacingSound.size)
} }
if (mSoundPlayer.playState != AudioTrack.PLAYSTATE_PLAYING)
mSoundPlayer.play()
} }
if(mSoundPlayer.playState != AudioTrack.PLAYSTATE_PLAYING)
mSoundPlayer.play()
} }
private var mShouldQuit = false;
private var mSymbolQueue = ArrayBlockingQueue<SoundTypes>(1000);
private val mAudioSampleRate = 44100; private val mAudioSampleRate = 44100;
private val mDitSound : ShortArray; private val mDitSound : ShortArray;

View file

@ -17,10 +17,16 @@ class TrainingActivity : AppCompatActivity() {
mTextViewTest = findViewById<TextView>(R.id.TestEnteredText); mTextViewTest = findViewById<TextView>(R.id.TestEnteredText);
mSoundPlayer = DitDahSoundStream(DitDahGeneratorSettings()) initSoundPlayer()
onKeyUp(KeyEvent.KEYCODE_E, KeyEvent(0,0)) onKeyUp(KeyEvent.KEYCODE_E, KeyEvent(0,0))
} }
override fun onResume() {
super.onResume()
mSoundPlayer = DitDahSoundStream(DitDahGeneratorSettings())
}
fun startTraining(view: View) { fun startTraining(view: View) {
} }
@ -35,6 +41,9 @@ class TrainingActivity : AppCompatActivity() {
override fun onPause() { override fun onPause() {
super.onPause(); super.onPause();
mSoundPlayer?.quit()
mSoundPlayer = null
} }
@ -51,6 +60,10 @@ class TrainingActivity : AppCompatActivity() {
return ret return ret
} }
private fun initSoundPlayer() {
mSoundPlayer = DitDahSoundStream(DitDahGeneratorSettings())
}
private var mTextViewTest : TextView? = null; private var mTextViewTest : TextView? = null;
private var mMediaPlayer : MediaPlayer? = null; private var mMediaPlayer : MediaPlayer? = null;