Skip to content

Commit

Permalink
refactor: refcatored methods using AudioTracks
Browse files Browse the repository at this point in the history
  • Loading branch information
Maciej Makowski committed Aug 21, 2024
1 parent 9e31773 commit 1f2158e
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 11 deletions.
24 changes: 17 additions & 7 deletions android/src/main/java/com/audiocontext/context/AudioContext.kt
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,13 @@ class AudioContext() : BaseAudioContext {
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
.build()

return AudioTrack(audioAttributes, audioFormat, Constants.BUFFER_SIZE, AudioTrack.MODE_STREAM, AudioManager.AUDIO_SESSION_ID_GENERATE)
val audioTrack = AudioTrack(audioAttributes, audioFormat, Constants.BUFFER_SIZE, AudioTrack.MODE_STREAM, AudioManager.AUDIO_SESSION_ID_GENERATE)

if (audioTrack.state != AudioTrack.STATE_INITIALIZED) {
throw IllegalStateException("Failed to initialize AudioTrack")
}

return audioTrack
}

override fun getCurrentTime(): Double {
Expand All @@ -76,17 +82,21 @@ class AudioContext() : BaseAudioContext {
override fun getPlaybackParameters(): PlaybackParameters {
val buffer = ShortArray(Constants.BUFFER_SIZE)

if(audioTracksList.isNotEmpty()) {
return PlaybackParameters(audioTracksList.removeFirst(), buffer)
} else {
val audioTrack = initAudioTrack()
synchronized(audioTracksList) {
if(audioTracksList.isNotEmpty()) {
return PlaybackParameters(audioTracksList.removeFirst(), buffer)
} else {
val audioTrack = initAudioTrack()

return PlaybackParameters(audioTrack, buffer)
return PlaybackParameters(audioTrack, buffer)
}
}
}

override fun addAudioTrack(audioTrack: AudioTrack) {
audioTracksList.add(audioTrack)
synchronized(audioTracksList) {
audioTracksList.add(audioTrack)
}
}

override fun createOscillator(): OscillatorNode {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ abstract class AudioScheduledSourceNode(context: BaseAudioContext) : AudioNode(c
override val numberOfInputs: Int = 0
override val numberOfOutputs: Int = 1

protected var playbackParameters: PlaybackParameters = context.getPlaybackParameters()
private var playbackParameters: PlaybackParameters = context.getPlaybackParameters()
@Volatile protected var isPlaying: Boolean = false

private var playbackThread: Thread? = null;
private val stopQueue = PriorityQueue<Double>()

private fun generateSound() {
while(isPlaying) {
generateBuffer()
generateBuffer(playbackParameters)
playbackParameters.reset()
process(playbackParameters)
if(stopQueue.isNotEmpty() && context.getCurrentTime() >= stopQueue.peek()!!) {
Expand All @@ -38,7 +38,7 @@ abstract class AudioScheduledSourceNode(context: BaseAudioContext) : AudioNode(c
playbackThread?.interrupt()
}

protected abstract fun generateBuffer()
protected abstract fun generateBuffer(playbackParameters: PlaybackParameters)

fun start(time: Double) {
playbackThread = Thread {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import androidx.annotation.RequiresApi
import com.audiocontext.context.BaseAudioContext
import com.audiocontext.parameters.AudioParam
import com.audiocontext.nodes.AudioScheduledSourceNode
import com.audiocontext.parameters.PlaybackParameters
import com.audiocontext.utils.Constants
import kotlin.math.pow

Expand All @@ -25,7 +26,7 @@ class OscillatorNode(context: BaseAudioContext) : AudioScheduledSourceNode(conte
}

@RequiresApi(Build.VERSION_CODES.N)
override fun generateBuffer() {
override fun generateBuffer(playbackParameters: PlaybackParameters) {
for(i in playbackParameters.buffer.indices) {
val computedFrequency = frequency.getValueAtTime(context.getCurrentTime()) * 2.0.pow(detune.getValueAtTime(context.getCurrentTime())/ 1200.0)
wavePhase += 2.0 * Math.PI * (computedFrequency / context.sampleRate)
Expand Down

0 comments on commit 1f2158e

Please sign in to comment.