Initial commit
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
package nl.astraeus.vst.chip.audio
|
||||
|
||||
import nl.astraeus.vst.chip.AudioContext
|
||||
|
||||
object AudioContextHandler {
|
||||
val audioContext: dynamic = AudioContext()
|
||||
|
||||
|
||||
|
||||
}
|
||||
88
src/jsMain/kotlin/nl/astraeus/vst/chip/audio/AudioModule.kt
Normal file
88
src/jsMain/kotlin/nl/astraeus/vst/chip/audio/AudioModule.kt
Normal file
@@ -0,0 +1,88 @@
|
||||
package nl.astraeus.vst.chip.audio
|
||||
|
||||
import nl.astraeus.vst.chip.AudioWorkletNode
|
||||
import nl.astraeus.vst.chip.AudioWorkletNodeParameters
|
||||
import nl.astraeus.vst.chip.audio.AudioContextHandler.audioContext
|
||||
import org.w3c.dom.MessageEvent
|
||||
import org.w3c.dom.MessagePort
|
||||
|
||||
enum class ModuleStatus {
|
||||
INIT,
|
||||
LOADING,
|
||||
READY
|
||||
}
|
||||
|
||||
class AudioModule(
|
||||
val jsFile: String
|
||||
) {
|
||||
var status = ModuleStatus.INIT
|
||||
var module: dynamic = null
|
||||
|
||||
fun load(action: () -> Unit = {}) {
|
||||
if (module == null && status == ModuleStatus.INIT) {
|
||||
status = ModuleStatus.LOADING
|
||||
|
||||
module = audioContext.audioWorklet.addModule(
|
||||
jsFile
|
||||
)
|
||||
module.then {
|
||||
status = ModuleStatus.READY
|
||||
action()
|
||||
}
|
||||
} else if (status == ModuleStatus.READY) {
|
||||
action()
|
||||
} else {
|
||||
console.log("Module not yet loaded")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
abstract class AudioNode(
|
||||
val jsFile: String,
|
||||
val processorName: String,
|
||||
val numberOfInputs: Int = 0,
|
||||
val outputChannelCount: Array<Int> = arrayOf(2),
|
||||
val destination: dynamic = null,
|
||||
val outputIndex: Int = 0,
|
||||
val inputIndex: Int = 0
|
||||
) {
|
||||
val module = AudioModule(jsFile)
|
||||
var created = false
|
||||
var node: dynamic = null
|
||||
var port: MessagePort? = null
|
||||
|
||||
abstract fun onMessage(message: MessageEvent)
|
||||
|
||||
open fun postMessage(msg: Any) {
|
||||
port?.postMessage(msg)
|
||||
}
|
||||
|
||||
// call from user gesture
|
||||
fun create(done: (node: dynamic) -> Unit) {
|
||||
module.load {
|
||||
node = AudioWorkletNode(
|
||||
audioContext,
|
||||
processorName,
|
||||
AudioWorkletNodeParameters(
|
||||
numberOfInputs,
|
||||
outputChannelCount
|
||||
)
|
||||
)
|
||||
|
||||
if (destination == null) {
|
||||
node.connect(audioContext.destination)
|
||||
} else {
|
||||
node.connect(destination, outputIndex, inputIndex)
|
||||
}
|
||||
|
||||
node.port.onmessage = ::onMessage
|
||||
|
||||
port = node.port as? MessagePort
|
||||
|
||||
created = true
|
||||
|
||||
done(node)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package nl.astraeus.vst.chip.audio
|
||||
|
||||
import org.w3c.dom.MessageEvent
|
||||
|
||||
object VstChipWorklet : AudioNode(
|
||||
"vst-chip-worklet.js",
|
||||
"vst-chip-processor"
|
||||
) {
|
||||
|
||||
override fun onMessage(message: MessageEvent) {
|
||||
console.log("Message from worklet: ", message)
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user