From 3b82541da6dc907eb3a129f7d521f33b9dfeb69e Mon Sep 17 00:00:00 2001 From: Fingercomp Date: Wed, 17 Sep 2025 22:32:14 +0300 Subject: [PATCH] Have the SoundSource object store factories rather than sources Closes #182. --- lib/ocelot-brain | 2 +- .../scala/ocelot/desktop/audio/Audio.scala | 12 +-- .../ocelot/desktop/audio/BeepGenerator.scala | 2 +- .../desktop/audio/ClickSoundSource.scala | 6 -- .../audio/ClickSoundSourceFactory.scala | 6 ++ .../ocelot/desktop/audio/SoundSource.scala | 98 ++++++++++++------- .../desktop/node/BoomCardFxHandler.scala | 6 +- .../desktop/node/nodes/TapeDriveNode.scala | 2 +- .../ocelot/desktop/ui/widget/Button.scala | 4 +- .../widget/ChangeSimulationSpeedDialog.scala | 4 +- .../ui/widget/CloseConfirmationDialog.scala | 4 +- .../ocelot/desktop/ui/widget/IconButton.scala | 4 +- .../desktop/ui/widget/InputDialog.scala | 4 +- .../desktop/ui/widget/MenuBarButton.scala | 4 +- .../ui/widget/ScreenAspectRatioDialog.scala | 4 +- .../ocelot/desktop/ui/widget/Slider.scala | 4 +- .../desktop/ui/widget/TunnelDialog.scala | 4 +- .../widget/contextmenu/ContextMenuEntry.scala | 10 +- .../ui/widget/settings/SettingsDialog.scala | 4 +- .../verticalmenu/VerticalMenuButton.scala | 4 +- .../desktop/util/AudibleComputerAware.scala | 2 +- .../desktop/windows/ComputerWindow.scala | 4 +- .../ocelot/desktop/windows/RackWindow.scala | 4 +- .../desktop/windows/TapeDriveWindow.scala | 14 +-- 24 files changed, 115 insertions(+), 97 deletions(-) delete mode 100644 src/main/scala/ocelot/desktop/audio/ClickSoundSource.scala create mode 100644 src/main/scala/ocelot/desktop/audio/ClickSoundSourceFactory.scala diff --git a/lib/ocelot-brain b/lib/ocelot-brain index 16b0220..da5dd88 160000 --- a/lib/ocelot-brain +++ b/lib/ocelot-brain @@ -1 +1 @@ -Subproject commit 16b022033a861af41be3c126aa8824a7e3d12396 +Subproject commit da5dd8877035f4994b77047658561d316319b54b diff --git a/src/main/scala/ocelot/desktop/audio/Audio.scala b/src/main/scala/ocelot/desktop/audio/Audio.scala index 7bfce80..b2495c1 100644 --- a/src/main/scala/ocelot/desktop/audio/Audio.scala +++ b/src/main/scala/ocelot/desktop/audio/Audio.scala @@ -30,10 +30,6 @@ object Audio extends Logging { def isDisabled: Boolean = _disabled - def numSources: Int = synchronized { - sources.size - } - def newStream( soundCategory: SoundCategory.Value, pitch: Float = 1f, @@ -81,7 +77,7 @@ object Audio extends Logging { } } - source = SoundSource.fromStream(stream, soundCategory, looping = false, pitch, volume) + source = SoundSource.fromStream(stream, soundCategory, looping = false, pitch, volume).build() (stream, source) } @@ -118,7 +114,7 @@ object Audio extends Logging { tx.onFailure { AL10W.alDeleteSources(sourceId) } source.kind match { - case SoundSource.KindSoundBuffer(buffer) => + case SoundSource.Kind.Buffer(buffer) => buffer.bufferId match { case Some(bufferId) => AL10W.alSourcei(sourceId, AL10.AL_BUFFER, bufferId) @@ -128,14 +124,14 @@ object Audio extends Logging { tx.abort() } - case SoundSource.KindSoundSamples(samples) => + case SoundSource.Kind.Samples(samples) => Transaction.run { innerTx => val bufferId = samples.genBuffer().getOrElse { tx.abort() } innerTx.onFailure { AL10W.alDeleteBuffers(bufferId) } AL10W.alSourceQueueBuffers(sourceId, bufferId) } - case SoundSource.KindStream(_) => + case SoundSource.Kind.Stream(_) => } AL10W.alSourcef(sourceId, AL10.AL_PITCH, source.pitch) diff --git a/src/main/scala/ocelot/desktop/audio/BeepGenerator.scala b/src/main/scala/ocelot/desktop/audio/BeepGenerator.scala index df7f0b4..220bd90 100644 --- a/src/main/scala/ocelot/desktop/audio/BeepGenerator.scala +++ b/src/main/scala/ocelot/desktop/audio/BeepGenerator.scala @@ -3,7 +3,7 @@ package ocelot.desktop.audio import java.nio.ByteBuffer object BeepGenerator { - def newBeep(pattern: String, frequency: Short, duration: Short): SoundSource = { + def newBeep(pattern: String, frequency: Short, duration: Short): SoundSource.Factory = { val sampleCounts = pattern.toCharArray .map(ch => if (ch == '.') duration else 2 * duration) .map(_ * Audio.sampleRate / 1000) diff --git a/src/main/scala/ocelot/desktop/audio/ClickSoundSource.scala b/src/main/scala/ocelot/desktop/audio/ClickSoundSource.scala deleted file mode 100644 index df64177..0000000 --- a/src/main/scala/ocelot/desktop/audio/ClickSoundSource.scala +++ /dev/null @@ -1,6 +0,0 @@ -package ocelot.desktop.audio - -trait ClickSoundSource { - def press: SoundSource - def release: SoundSource -} diff --git a/src/main/scala/ocelot/desktop/audio/ClickSoundSourceFactory.scala b/src/main/scala/ocelot/desktop/audio/ClickSoundSourceFactory.scala new file mode 100644 index 0000000..9b142db --- /dev/null +++ b/src/main/scala/ocelot/desktop/audio/ClickSoundSourceFactory.scala @@ -0,0 +1,6 @@ +package ocelot.desktop.audio + +trait ClickSoundSourceFactory { + def press: SoundSource.Factory + def release: SoundSource.Factory +} diff --git a/src/main/scala/ocelot/desktop/audio/SoundSource.scala b/src/main/scala/ocelot/desktop/audio/SoundSource.scala index 44b45b4..7b99375 100644 --- a/src/main/scala/ocelot/desktop/audio/SoundSource.scala +++ b/src/main/scala/ocelot/desktop/audio/SoundSource.scala @@ -14,10 +14,10 @@ class SoundSource( var position: Vector3D = Vector3D(0, 0, 0), ) { def duration: Option[Duration] = kind match { - case SoundSource.KindSoundBuffer(buffer) => + case SoundSource.Kind.Buffer(buffer) => Some(Duration(buffer.numSamples.toFloat / buffer.sampleRate, TimeUnit.SECONDS)) - case SoundSource.KindSoundSamples(SoundSamples(buffer, rate, format)) => + case SoundSource.Kind.Samples(SoundSamples(buffer, rate, format)) => val bps = format match { case SoundSamples.Format.Stereo16 => 2 case SoundSamples.Format.Mono8 => 1 @@ -26,7 +26,7 @@ class SoundSource( Some(Duration(buffer.limit().toFloat / (rate * bps), TimeUnit.SECONDS)) - case SoundSource.KindStream(_) => + case SoundSource.Kind.Stream(_) => None } @@ -62,26 +62,52 @@ class SoundSource( object SoundSource { sealed trait Kind - case class KindSoundBuffer(buffer: SoundBuffer) extends Kind - - case class KindSoundSamples(samples: SoundSamples) extends Kind - - case class KindStream(stream: SoundStream) extends Kind - - def fromBuffer(buffer: SoundBuffer, soundCategory: SoundCategory.Value, - looping: Boolean = false, pitch: Float = 1f, volume: Float = 1f): SoundSource = { - new SoundSource(SoundSource.KindSoundBuffer(buffer), soundCategory, looping, pitch, volume) + object Kind { + case class Buffer(buffer: SoundBuffer) extends Kind + case class Samples(samples: SoundSamples) extends Kind + case class Stream(stream: SoundStream) extends Kind } - def fromSamples(samples: SoundSamples, soundCategory: SoundCategory.Value, - looping: Boolean = false, pitch: Float = 1f, volume: Float = 1f): SoundSource = { - new SoundSource(SoundSource.KindSoundSamples(samples), soundCategory, looping, pitch, volume) + class Factory( + val kind: Kind, + val soundCategory: SoundCategory.Value, + val looping: Boolean, + val pitch: Float, + val volume: Float, + ) { + def build(): SoundSource = new SoundSource(kind, soundCategory, looping, pitch, volume) + + def play(): SoundSource = { + val source = build() + source.play() + + source + } } - def fromStream(stream: SoundStream, soundCategory: SoundCategory.Value, - looping: Boolean = false, pitch: Float = 1f, volume: Float = 1f): SoundSource = { - new SoundSource(SoundSource.KindStream(stream), soundCategory, looping, pitch, volume) - } + def fromBuffer( + buffer: SoundBuffer, + soundCategory: SoundCategory.Value, + looping: Boolean = false, + pitch: Float = 1f, + volume: Float = 1f, + ): Factory = new Factory(SoundSource.Kind.Buffer(buffer), soundCategory, looping, pitch, volume) + + def fromSamples( + samples: SoundSamples, + soundCategory: SoundCategory.Value, + looping: Boolean = false, + pitch: Float = 1f, + volume: Float = 1f, + ): Factory = new Factory(SoundSource.Kind.Samples(samples), soundCategory, looping, pitch, volume) + + def fromStream( + stream: SoundStream, + soundCategory: SoundCategory.Value, + looping: Boolean = false, + pitch: Float = 1f, + volume: Float = 1f, + ): Factory = new Factory(SoundSource.Kind.Stream(stream), soundCategory, looping, pitch, volume) object Status extends Enumeration { val Playing, Paused, Stopped = Value @@ -89,44 +115,40 @@ object SoundSource { // ---------------------------------------------------------------- - object InterfaceClick extends ClickSoundSource { - override lazy val press: SoundSource = - SoundSource.fromBuffer(SoundBuffers.InterfaceClickPress, SoundCategory.Interface) + object InterfaceClick extends ClickSoundSourceFactory { + override lazy val press: Factory = SoundSource.fromBuffer(SoundBuffers.InterfaceClickPress, SoundCategory.Interface) - override lazy val release: SoundSource = + override lazy val release: Factory = SoundSource.fromBuffer(SoundBuffers.InterfaceClickRelease, SoundCategory.Interface) } - object InterfaceClickLow extends ClickSoundSource { - override lazy val press: SoundSource = + object InterfaceClickLow extends ClickSoundSourceFactory { + override lazy val press: Factory = SoundSource.fromBuffer(SoundBuffers.InterfaceClickPress, SoundCategory.Interface, pitch = 0.8f) - override lazy val release: SoundSource = + override lazy val release: Factory = SoundSource.fromBuffer(SoundBuffers.InterfaceClickRelease, SoundCategory.Interface, pitch = 0.8f) } - object InterfaceTick extends ClickSoundSource { - override lazy val press: SoundSource = - SoundSource.fromBuffer(SoundBuffers.InterfaceTickPress, SoundCategory.Interface) + object InterfaceTick extends ClickSoundSourceFactory { + override lazy val press: Factory = SoundSource.fromBuffer(SoundBuffers.InterfaceTickPress, SoundCategory.Interface) - override lazy val release: SoundSource = + override lazy val release: Factory = SoundSource.fromBuffer(SoundBuffers.InterfaceTickRelease, SoundCategory.Interface) } - lazy val InterfaceShutter: SoundSource = - SoundSource.fromBuffer(SoundBuffers.InterfaceShutter, SoundCategory.Interface) + lazy val InterfaceShutter: Factory = SoundSource.fromBuffer(SoundBuffers.InterfaceShutter, SoundCategory.Interface) - object MinecraftClick extends ClickSoundSource { - override lazy val press: SoundSource = - SoundSource.fromBuffer(SoundBuffers.MinecraftClickPress, SoundCategory.Interface) + object MinecraftClick extends ClickSoundSourceFactory { + override lazy val press: Factory = SoundSource.fromBuffer(SoundBuffers.MinecraftClickPress, SoundCategory.Interface) - override lazy val release: SoundSource = + override lazy val release: Factory = SoundSource.fromBuffer(SoundBuffers.MinecraftClickRelease, SoundCategory.Interface) } - lazy val MachineFloppyInsert: SoundSource = + lazy val MachineFloppyInsert: Factory = SoundSource.fromBuffer(SoundBuffers.MachineFloppyInsert, SoundCategory.Environment) - lazy val MachineFloppyEject: SoundSource = + lazy val MachineFloppyEject: Factory = SoundSource.fromBuffer(SoundBuffers.MachineFloppyEject, SoundCategory.Environment) } diff --git a/src/main/scala/ocelot/desktop/node/BoomCardFxHandler.scala b/src/main/scala/ocelot/desktop/node/BoomCardFxHandler.scala index 7607d48..427d322 100644 --- a/src/main/scala/ocelot/desktop/node/BoomCardFxHandler.scala +++ b/src/main/scala/ocelot/desktop/node/BoomCardFxHandler.scala @@ -5,7 +5,7 @@ import ocelot.desktop.color.Color import ocelot.desktop.util.NumberUtils.ExtendedFloat import ocelot.desktop.graphics.{Graphics, IconSource} import ocelot.desktop.inventory.item.SelfDestructingCardItem -import ocelot.desktop.node.BoomCardFxHandler.{ExpandIntensity, ExpandPeriod, FlickerAlpha, FlickerDuty, GlowAlpha, MaxSize, MinSize} +import ocelot.desktop.node.BoomCardFxHandler._ import ocelot.desktop.ui.UiHandler import ocelot.desktop.ui.event.BrainEvent import ocelot.desktop.{ColorScheme, OcelotDesktop} @@ -15,11 +15,11 @@ trait BoomCardFxHandler extends Node with PositionalSoundSourcesNode with SmokeP private var boomPhase: Float = -1 private lazy val explosionSound = { - SoundSource.fromBuffer(SoundBuffers.MinecraftExplosion, SoundCategory.Environment) + SoundSource.fromBuffer(SoundBuffers.MinecraftExplosion, SoundCategory.Environment).build() } private lazy val countdownBeepSound = { - SoundSource.fromBuffer(SoundBuffers.SelfDestructingCardCountdownBeep, SoundCategory.Environment) + SoundSource.fromBuffer(SoundBuffers.SelfDestructingCardCountdownBeep, SoundCategory.Environment).build() } override def soundSources: Seq[SoundSource] = super.soundSources ++ Seq( diff --git a/src/main/scala/ocelot/desktop/node/nodes/TapeDriveNode.scala b/src/main/scala/ocelot/desktop/node/nodes/TapeDriveNode.scala index 3cdce38..6b16a71 100644 --- a/src/main/scala/ocelot/desktop/node/nodes/TapeDriveNode.scala +++ b/src/main/scala/ocelot/desktop/node/nodes/TapeDriveNode.scala @@ -26,7 +26,7 @@ class TapeDriveNode(val tapeDrive: TapeDrive) SoundBuffers.MachineTapeRewind, SoundCategory.Records, looping = true, - ) + ).build() private lazy val streams: (SoundStream, SoundSource) = Audio.newStream(SoundCategory.Records) private def stream: SoundStream = streams._1 diff --git a/src/main/scala/ocelot/desktop/ui/widget/Button.scala b/src/main/scala/ocelot/desktop/ui/widget/Button.scala index a2e5e77..c1f8938 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/Button.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/Button.scala @@ -1,7 +1,7 @@ package ocelot.desktop.ui.widget import ocelot.desktop.ColorScheme -import ocelot.desktop.audio.{ClickSoundSource, SoundSource} +import ocelot.desktop.audio.{ClickSoundSourceFactory, SoundSource} import ocelot.desktop.color.Color import ocelot.desktop.geometry.Size2D import ocelot.desktop.graphics.Graphics @@ -66,5 +66,5 @@ class Button(tooltip: Option[Tooltip] = None) extends Widget with MouseHandler w g.text(position.x + ((width - textWidth) / 2).round, position.y + 4, text) } - protected def clickSoundSource: ClickSoundSource = SoundSource.InterfaceClick + protected def clickSoundSource: ClickSoundSourceFactory = SoundSource.InterfaceClick } diff --git a/src/main/scala/ocelot/desktop/ui/widget/ChangeSimulationSpeedDialog.scala b/src/main/scala/ocelot/desktop/ui/widget/ChangeSimulationSpeedDialog.scala index b775a38..cc34acb 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/ChangeSimulationSpeedDialog.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/ChangeSimulationSpeedDialog.scala @@ -1,7 +1,7 @@ package ocelot.desktop.ui.widget import ocelot.desktop.OcelotDesktop -import ocelot.desktop.audio.{ClickSoundSource, SoundSource} +import ocelot.desktop.audio.{ClickSoundSourceFactory, SoundSource} import ocelot.desktop.geometry.Padding2D import ocelot.desktop.ui.layout.LinearLayout import ocelot.desktop.ui.widget.ChangeSimulationSpeedDialog.validateIntervalUs @@ -89,7 +89,7 @@ class ChangeSimulationSpeedDialog extends ModalDialog { children :+= new PaddingBox( new Button { override def text: String = "Cancel" - override protected def clickSoundSource: ClickSoundSource = SoundSource.InterfaceClickLow + override protected def clickSoundSource: ClickSoundSourceFactory = SoundSource.InterfaceClickLow override def onClick(): Unit = close() }, Padding2D(right = 8), diff --git a/src/main/scala/ocelot/desktop/ui/widget/CloseConfirmationDialog.scala b/src/main/scala/ocelot/desktop/ui/widget/CloseConfirmationDialog.scala index 2759ca4..160f986 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/CloseConfirmationDialog.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/CloseConfirmationDialog.scala @@ -1,6 +1,6 @@ package ocelot.desktop.ui.widget -import ocelot.desktop.audio.{ClickSoundSource, SoundSource} +import ocelot.desktop.audio.{ClickSoundSourceFactory, SoundSource} import ocelot.desktop.geometry.Padding2D import ocelot.desktop.ui.layout.LinearLayout import ocelot.desktop.ui.widget.modal.ModalDialog @@ -24,7 +24,7 @@ class CloseConfirmationDialog extends ModalDialog { children :+= new PaddingBox( new Button { override def text: String = "Cancel" - override protected def clickSoundSource: ClickSoundSource = SoundSource.InterfaceClickLow + override protected def clickSoundSource: ClickSoundSourceFactory = SoundSource.InterfaceClickLow override def onClick(): Unit = close() }, Padding2D(left = 8), diff --git a/src/main/scala/ocelot/desktop/ui/widget/IconButton.scala b/src/main/scala/ocelot/desktop/ui/widget/IconButton.scala index 4f49bff..873b63e 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/IconButton.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/IconButton.scala @@ -1,7 +1,7 @@ package ocelot.desktop.ui.widget import ocelot.desktop.ColorScheme -import ocelot.desktop.audio.{ClickSoundSource, SoundSource} +import ocelot.desktop.audio.{ClickSoundSourceFactory, SoundSource} import ocelot.desktop.color.Color import ocelot.desktop.geometry.Size2D import ocelot.desktop.graphics.{Graphics, IconSource} @@ -196,7 +196,7 @@ class IconButton( iconMixAnimation.update() } - protected def clickSoundSource: ClickSoundSource = SoundSource.InterfaceClick + protected def clickSoundSource: ClickSoundSourceFactory = SoundSource.InterfaceClick } object IconButton { diff --git a/src/main/scala/ocelot/desktop/ui/widget/InputDialog.scala b/src/main/scala/ocelot/desktop/ui/widget/InputDialog.scala index 0d3edc9..d622a64 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/InputDialog.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/InputDialog.scala @@ -1,6 +1,6 @@ package ocelot.desktop.ui.widget -import ocelot.desktop.audio.{ClickSoundSource, SoundSource} +import ocelot.desktop.audio.{ClickSoundSourceFactory, SoundSource} import ocelot.desktop.geometry.Padding2D import ocelot.desktop.ui.layout.LinearLayout import ocelot.desktop.ui.widget.modal.ModalDialog @@ -43,7 +43,7 @@ class InputDialog( children :+= new Filler children :+= new Button { override def text: String = "Cancel" - override protected def clickSoundSource: ClickSoundSource = SoundSource.InterfaceClickLow + override protected def clickSoundSource: ClickSoundSourceFactory = SoundSource.InterfaceClickLow override def onClick(): Unit = close() } children :+= new PaddingBox( diff --git a/src/main/scala/ocelot/desktop/ui/widget/MenuBarButton.scala b/src/main/scala/ocelot/desktop/ui/widget/MenuBarButton.scala index 364b300..172a802 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/MenuBarButton.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/MenuBarButton.scala @@ -1,7 +1,7 @@ package ocelot.desktop.ui.widget import ocelot.desktop.ColorScheme -import ocelot.desktop.audio.{ClickSoundSource, SoundSource} +import ocelot.desktop.audio.{ClickSoundSourceFactory, SoundSource} import ocelot.desktop.color.Color import ocelot.desktop.geometry.{Padding2D, Size2D} import ocelot.desktop.graphics.Graphics @@ -51,5 +51,5 @@ class MenuBarButton(label: String, handler: () => Unit = () => {}) extends Widge drawChildren(g) } - protected def clickSoundSource: ClickSoundSource = SoundSource.InterfaceClick + protected def clickSoundSource: ClickSoundSourceFactory = SoundSource.InterfaceClick } diff --git a/src/main/scala/ocelot/desktop/ui/widget/ScreenAspectRatioDialog.scala b/src/main/scala/ocelot/desktop/ui/widget/ScreenAspectRatioDialog.scala index 09e9fc2..31e84d0 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/ScreenAspectRatioDialog.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/ScreenAspectRatioDialog.scala @@ -1,6 +1,6 @@ package ocelot.desktop.ui.widget -import ocelot.desktop.audio.{ClickSoundSource, SoundSource} +import ocelot.desktop.audio.{ClickSoundSourceFactory, SoundSource} import ocelot.desktop.geometry.Padding2D import ocelot.desktop.node.nodes.ScreenNode import ocelot.desktop.ui.layout.LinearLayout @@ -77,7 +77,7 @@ class ScreenAspectRatioDialog(screenNode: ScreenNode) extends ModalDialog { children :+= new PaddingBox( new Button { override def text: String = "Cancel" - override protected def clickSoundSource: ClickSoundSource = SoundSource.InterfaceClickLow + override protected def clickSoundSource: ClickSoundSourceFactory = SoundSource.InterfaceClickLow override def onClick(): Unit = close() }, Padding2D(right = 8), diff --git a/src/main/scala/ocelot/desktop/ui/widget/Slider.scala b/src/main/scala/ocelot/desktop/ui/widget/Slider.scala index bfacfbd..8f1c906 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/Slider.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/Slider.scala @@ -1,7 +1,7 @@ package ocelot.desktop.ui.widget import ocelot.desktop.ColorScheme -import ocelot.desktop.audio.{ClickSoundSource, SoundSource} +import ocelot.desktop.audio.{ClickSoundSourceFactory, SoundSource} import ocelot.desktop.color.Color import ocelot.desktop.util.NumberUtils.ExtendedFloat import ocelot.desktop.geometry.Size2D @@ -106,5 +106,5 @@ class Slider(var value: Float, val text: String, val snapPoints: Int = 0) g.text(position.x + ((width - textWidth) / 2).round, position.y + 4, formatText) } - protected def clickSoundSource: ClickSoundSource = SoundSource.InterfaceTick + protected def clickSoundSource: ClickSoundSourceFactory = SoundSource.InterfaceTick } diff --git a/src/main/scala/ocelot/desktop/ui/widget/TunnelDialog.scala b/src/main/scala/ocelot/desktop/ui/widget/TunnelDialog.scala index 6fe6299..3650036 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/TunnelDialog.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/TunnelDialog.scala @@ -1,7 +1,7 @@ package ocelot.desktop.ui.widget import ocelot.desktop.ColorScheme -import ocelot.desktop.audio.{ClickSoundSource, SoundSource} +import ocelot.desktop.audio.{ClickSoundSourceFactory, SoundSource} import ocelot.desktop.geometry.{Padding2D, Size2D} import ocelot.desktop.graphics.IconSource import ocelot.desktop.ui.UiHandler @@ -66,7 +66,7 @@ class TunnelDialog( children :+= new Filler children :+= new Button { override def text: String = "Cancel" - override protected def clickSoundSource: ClickSoundSource = SoundSource.InterfaceClickLow + override protected def clickSoundSource: ClickSoundSourceFactory = SoundSource.InterfaceClickLow override def onClick(): Unit = close() } children :+= new PaddingBox( diff --git a/src/main/scala/ocelot/desktop/ui/widget/contextmenu/ContextMenuEntry.scala b/src/main/scala/ocelot/desktop/ui/widget/contextmenu/ContextMenuEntry.scala index 966870b..32b8b6d 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/contextmenu/ContextMenuEntry.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/contextmenu/ContextMenuEntry.scala @@ -1,7 +1,7 @@ package ocelot.desktop.ui.widget.contextmenu import ocelot.desktop.ColorScheme -import ocelot.desktop.audio.{ClickSoundSource, SoundSource} +import ocelot.desktop.audio.{ClickSoundSourceFactory, SoundSource} import ocelot.desktop.color.Color import ocelot.desktop.geometry.{Padding2D, Size2D} import ocelot.desktop.graphics.{Graphics, IconSource} @@ -16,8 +16,8 @@ class ContextMenuEntry( label: String, icon: Option[ContextMenuIcon] = None, onClick: () => Unit = () => {}, - sound: ClickSoundSource = SoundSource.InterfaceClick, - soundDisabled: ClickSoundSource = SoundSource.InterfaceClickLow, + sound: ClickSoundSourceFactory = SoundSource.InterfaceClick, + soundDisabled: ClickSoundSourceFactory = SoundSource.InterfaceClickLow, ) extends Widget with MouseHandler with HoverHandler { private[contextmenu] val alpha = new ValueAnimation(0f, 10f) @@ -132,7 +132,7 @@ class ContextMenuEntry( g.restore() } - protected def clickSoundSource: ClickSoundSource = + protected def clickSoundSource: ClickSoundSourceFactory = if (isEnabled) sound else soundDisabled } @@ -172,7 +172,7 @@ object ContextMenuEntry { def apply( label: String, icon: IconSource, - sound: ClickSoundSource, + sound: ClickSoundSourceFactory, )(onClick: => Unit): ContextMenuEntry = { new ContextMenuEntry( label, diff --git a/src/main/scala/ocelot/desktop/ui/widget/settings/SettingsDialog.scala b/src/main/scala/ocelot/desktop/ui/widget/settings/SettingsDialog.scala index 2e83b87..1f43246 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/settings/SettingsDialog.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/settings/SettingsDialog.scala @@ -1,7 +1,7 @@ package ocelot.desktop.ui.widget.settings import ocelot.desktop.{ColorScheme, Settings} -import ocelot.desktop.audio.{ClickSoundSource, SoundSource} +import ocelot.desktop.audio.{ClickSoundSourceFactory, SoundSource} import ocelot.desktop.geometry.{Padding2D, Size2D} import ocelot.desktop.graphics.Graphics import ocelot.desktop.ui.layout.LinearLayout @@ -39,7 +39,7 @@ class SettingsDialog extends ModalDialog { children :+= new Button { override def text: String = "Cancel" - override protected def clickSoundSource: ClickSoundSource = SoundSource.InterfaceClickLow + override protected def clickSoundSource: ClickSoundSourceFactory = SoundSource.InterfaceClickLow override def onClick(): Unit = { resetSettings() close() diff --git a/src/main/scala/ocelot/desktop/ui/widget/verticalmenu/VerticalMenuButton.scala b/src/main/scala/ocelot/desktop/ui/widget/verticalmenu/VerticalMenuButton.scala index 58ed193..cd3167c 100644 --- a/src/main/scala/ocelot/desktop/ui/widget/verticalmenu/VerticalMenuButton.scala +++ b/src/main/scala/ocelot/desktop/ui/widget/verticalmenu/VerticalMenuButton.scala @@ -1,7 +1,7 @@ package ocelot.desktop.ui.widget.verticalmenu import ocelot.desktop.ColorScheme -import ocelot.desktop.audio.{ClickSoundSource, SoundSource} +import ocelot.desktop.audio.{ClickSoundSourceFactory, SoundSource} import ocelot.desktop.color.Color import ocelot.desktop.geometry.{Padding2D, Size2D} import ocelot.desktop.graphics.{Graphics, IconSource} @@ -68,5 +68,5 @@ class VerticalMenuButton(icon: IconSource, label: String, handler: VerticalMenuB drawChildren(g) } - protected def clickSoundSource: ClickSoundSource = SoundSource.InterfaceClick + protected def clickSoundSource: ClickSoundSourceFactory = SoundSource.InterfaceClick } diff --git a/src/main/scala/ocelot/desktop/util/AudibleComputerAware.scala b/src/main/scala/ocelot/desktop/util/AudibleComputerAware.scala index d12257f..faeddb5 100644 --- a/src/main/scala/ocelot/desktop/util/AudibleComputerAware.scala +++ b/src/main/scala/ocelot/desktop/util/AudibleComputerAware.scala @@ -7,7 +7,7 @@ trait AudibleComputerAware extends ComputerAware { SoundBuffers.MachineComputerRunning, SoundCategory.Environment, looping = true, - ) + ).build() def updateRunningSound(): Unit = { if (!computer.machine.isRunning && soundComputerRunning.playing) { diff --git a/src/main/scala/ocelot/desktop/windows/ComputerWindow.scala b/src/main/scala/ocelot/desktop/windows/ComputerWindow.scala index 0968127..666c8dc 100644 --- a/src/main/scala/ocelot/desktop/windows/ComputerWindow.scala +++ b/src/main/scala/ocelot/desktop/windows/ComputerWindow.scala @@ -1,6 +1,6 @@ package ocelot.desktop.windows -import ocelot.desktop.audio.{ClickSoundSource, SoundSource} +import ocelot.desktop.audio.{ClickSoundSourceFactory, SoundSource} import ocelot.desktop.geometry.{Padding2D, Size2D} import ocelot.desktop.graphics.{Graphics, IconSource} import ocelot.desktop.inventory.item.ServerItem @@ -219,7 +219,7 @@ class ComputerWindow(computerAware: ComputerAware) extends BasicWindow { override def onReleased(): Unit = computerAware.turnOff() - override protected def clickSoundSource: ClickSoundSource = SoundSource.MinecraftClick + override protected def clickSoundSource: ClickSoundSourceFactory = SoundSource.MinecraftClick } }, Padding2D( diff --git a/src/main/scala/ocelot/desktop/windows/RackWindow.scala b/src/main/scala/ocelot/desktop/windows/RackWindow.scala index ef7e0a3..88cc7c5 100644 --- a/src/main/scala/ocelot/desktop/windows/RackWindow.scala +++ b/src/main/scala/ocelot/desktop/windows/RackWindow.scala @@ -1,7 +1,7 @@ package ocelot.desktop.windows import ocelot.desktop.ColorScheme -import ocelot.desktop.audio.{ClickSoundSource, SoundSource} +import ocelot.desktop.audio.{ClickSoundSourceFactory, SoundSource} import ocelot.desktop.color.Color import ocelot.desktop.geometry.{Padding2D, Rect2D, Size2D} import ocelot.desktop.graphics.{Graphics, IconSource} @@ -256,7 +256,7 @@ class RackWindow(rackNode: RackNode) extends PanelWindow { g.text(x, y, text) } - override protected def clickSoundSource: ClickSoundSource = SoundSource.MinecraftClick + override protected def clickSoundSource: ClickSoundSourceFactory = SoundSource.MinecraftClick }, Padding2D(left = -15, top = 45), ) diff --git a/src/main/scala/ocelot/desktop/windows/TapeDriveWindow.scala b/src/main/scala/ocelot/desktop/windows/TapeDriveWindow.scala index 08d097b..f9416bb 100644 --- a/src/main/scala/ocelot/desktop/windows/TapeDriveWindow.scala +++ b/src/main/scala/ocelot/desktop/windows/TapeDriveWindow.scala @@ -1,6 +1,6 @@ package ocelot.desktop.windows -import ocelot.desktop.audio.{Audio, ClickSoundSource, SoundBuffers, SoundCategory, SoundSource} +import ocelot.desktop.audio.{Audio, ClickSoundSourceFactory, SoundBuffers, SoundCategory, SoundSource} import ocelot.desktop.color.{Color, RGBAColorNorm} import ocelot.desktop.geometry.{Padding2D, Size2D} import ocelot.desktop.graphics.{Graphics, IconSource} @@ -143,7 +143,7 @@ class TapeDriveWindow(val tapeDriveNode: TapeDriveNode) extends PanelWindow { } } - override protected def clickSoundSource: ClickSoundSource = TapeButtonSound + override protected def clickSoundSource: ClickSoundSourceFactory = TapeButtonSound } } @@ -158,17 +158,17 @@ class TapeDriveWindow(val tapeDriveNode: TapeDriveNode) extends PanelWindow { } object TapeDriveWindow { - private object TapeButtonSound extends ClickSoundSource { - override lazy val press: SoundSource = + private object TapeButtonSound extends ClickSoundSourceFactory { + override lazy val press: SoundSource.Factory = SoundSource.fromBuffer(SoundBuffers.MachineTapeButtonPress, SoundCategory.Environment) - override lazy val release: SoundSource = + override lazy val release: SoundSource.Factory = SoundSource.fromBuffer(SoundBuffers.MachineTapeButtonRelease, SoundCategory.Environment) } - private lazy val TapeInsert: SoundSource = + private lazy val TapeInsert: SoundSource.Factory = SoundSource.fromBuffer(SoundBuffers.MachineTapeInsert, SoundCategory.Environment) - private lazy val TapeEject: SoundSource = + private lazy val TapeEject: SoundSource.Factory = SoundSource.fromBuffer(SoundBuffers.MachineTapeEject, SoundCategory.Environment) }