11package baaahs.plugin.midi
22
3- import baaahs.PubSub
43import baaahs.ShowPlayer
54import baaahs.gl.GlContext
65import baaahs.gl.data.EngineFeedContext
@@ -14,8 +13,8 @@ import baaahs.plugin.*
1413import baaahs.show.Feed
1514import baaahs.show.FeedBuilder
1615import baaahs.sim.BridgeClient
16+ import baaahs.sim.SimulatorSettingsManager
1717import baaahs.ui.Observable
18- import baaahs.ui.addObserver
1918import baaahs.util.Logger
2019import baaahs.util.RefCounted
2120import baaahs.util.RefCounter
@@ -25,8 +24,10 @@ import kotlinx.cli.default
2524import kotlinx.serialization.SerialName
2625
2726class MidiPlugin internal constructor(
28- internal val midiSource : MidiSource ,
27+ internal val midiSystem : MidiSystem ,
2928) : OpenServerPlugin, OpenClientPlugin {
29+ private val midiSource = midiSystem.midiSources.firstOrNull() ? : MidiSource .None
30+
3031 override val packageName: String = MidiPlugin .id
3132 override val title: String = " Midi"
3233
@@ -98,7 +99,6 @@ class MidiPlugin internal constructor(
9899
99100 interface Args {
100101 val enableMidi: Boolean
101- val midiSource: MidiSource ? get() = null
102102 }
103103
104104 companion object : Plugin <Args >, SimulatorPlugin {
@@ -120,90 +120,52 @@ class MidiPlugin internal constructor(
120120 override fun getArgs (parser : ArgParser ): Args = ParserArgs (parser)
121121
122122 override fun openForServer (pluginContext : PluginContext , args : Args ): OpenServerPlugin {
123- val midiSource = if (args.enableMidi) {
124- args.midiSource ? : createServerMidiSource(pluginContext)
125- } else MidiSource .None
126- return MidiPlugin (
127- PubSubPublisher (midiSource, pluginContext)
128- )
123+ val midiSystem = if (args.enableMidi) {
124+ createMidiSystem(pluginContext)
125+ } else MidiSystem .None
126+
127+ return MidiPlugin (midiSystem)
129128 }
130129
131130 override fun openForClient (pluginContext : PluginContext ): OpenClientPlugin =
132- MidiPlugin (PubSubSubscriber (pluginContext.pubSub) )
131+ MidiPlugin (MidiSystem . None )
133132
134- override fun openForSimulator (): OpenSimulatorPlugin =
133+ override fun openForSimulator (
134+ simulatorSettingsManager : SimulatorSettingsManager
135+ ): OpenSimulatorPlugin =
135136 object : OpenSimulatorPlugin {
136- override fun getBridgePlugin (pluginContext : PluginContext ): OpenBridgePlugin =
137- MidiBridgePlugin (createServerMidiSource(pluginContext), pluginContext)
137+ private val midiHardwareSimulator = MidiHardwareSimulator (simulatorSettingsManager)
138+
139+ override fun getBridgePlugin (pluginContext : PluginContext ): OpenBridgePlugin ? = null
138140
139141 override fun getServerPlugin (pluginContext : PluginContext , bridgeClient : BridgeClient ) =
140- MidiPlugin (
141- PubSubPublisher (
142- PubSubSubscriber (bridgeClient.pubSub, simulatorDefaultMidi),
143- pluginContext
144- )
145- )
142+ MidiPlugin (midiHardwareSimulator)
146143
147144 override fun getClientPlugin (pluginContext : PluginContext ): OpenClientPlugin =
148145 openForClient(pluginContext)
149- }
150-
151- private val midiDataTopic = PubSub .Topic (" plugins/$id /midiData" , MidiData .serializer())
152- }
153-
154- /* * Copy beat data from [midiSource] to a bridge PubSub channel. */
155- class MidiBridgePlugin (
156- private val midiSource : MidiSource ,
157- pluginContext : PluginContext
158- ) : OpenBridgePlugin {
159- private val channel = pluginContext.pubSub.openChannel(midiDataTopic, unknownMidi) { }
160-
161- init {
162- midiSource.addObserver { channel.onChange(it.getMidiData()) }
163- }
164- }
165146
166- class PubSubPublisher (
167- midiSource : MidiSource ,
168- pluginContext : PluginContext
169- ) : Observable(), MidiSource {
170- private var midiData: MidiData = midiSource.getMidiData()
171-
172- val channel = pluginContext.pubSub.openChannel(midiDataTopic, midiData) {
173- logger.warn { " MidiData update from client? Huh?" }
174- midiData = it
175- notifyChanged()
176- }
177-
178- init {
179- midiSource.addObserver {
180- val newMidiData = it.getMidiData()
181- midiData = newMidiData
182- notifyChanged()
183- channel.onChange(newMidiData)
147+ override fun getHardwareSimulators (): List <HardwareSimulator > =
148+ listOf (midiHardwareSimulator)
184149 }
185- }
186-
187- override fun getMidiData (): MidiData = midiData
188-
189150 }
151+ }
190152
191- class PubSubSubscriber (
192- pubSub : PubSub .Endpoint ,
193- defaultMidiData : MidiData = unknownMidi
194- ) : Observable(), MidiSource {
195- private var midiData: MidiData = defaultMidiData
153+ class MidiHardwareSimulator (
154+ private val simulatorSettingsManager : SimulatorSettingsManager
155+ ) : HardwareSimulator, MidiSystem, Observable() {
156+ override val title: String = " MIDI"
196157
197- init {
198- pubSub.openChannel(midiDataTopic, midiData) {
199- midiData = it
200- notifyChanged()
201- }
202- }
158+ override val midiSources: List <MidiSource >
159+ get() = TODO (" not implemented" )
203160
204- override fun getMidiData (): MidiData = midiData
161+ override suspend fun start () {
162+ logger.info { " Starting MIDI hardware simulator." }
163+ // simulatorSettingsManager
164+ }
205165
166+ companion object {
167+ private val logger = Logger <MidiHardwareSimulator >()
206168 }
207169}
208170
209- internal expect fun createServerMidiSource (pluginContext : PluginContext ): MidiSource
171+ internal expect fun createMidiSystem (pluginContext : PluginContext ): MidiSystem
0 commit comments