diff --git a/src/main/resources/ocelot/desktop/sounds/minecraft/countdown_beep.ogg b/src/main/resources/ocelot/desktop/sounds/minecraft/countdown_beep.ogg index d0105c9..85ca9c9 100644 Binary files a/src/main/resources/ocelot/desktop/sounds/minecraft/countdown_beep.ogg and b/src/main/resources/ocelot/desktop/sounds/minecraft/countdown_beep.ogg differ diff --git a/src/main/resources/ocelot/desktop/sounds/minecraft/explosion.ogg b/src/main/resources/ocelot/desktop/sounds/minecraft/explosion.ogg index dc55636..0062f0e 100644 Binary files a/src/main/resources/ocelot/desktop/sounds/minecraft/explosion.ogg and b/src/main/resources/ocelot/desktop/sounds/minecraft/explosion.ogg differ diff --git a/src/main/scala/ocelot/desktop/audio/AL10W.scala b/src/main/scala/ocelot/desktop/audio/AL10W.scala index 3b0c7ee..52e7e6e 100644 --- a/src/main/scala/ocelot/desktop/audio/AL10W.scala +++ b/src/main/scala/ocelot/desktop/audio/AL10W.scala @@ -21,7 +21,7 @@ object AL10W extends Logging { val exc = OpenAlException(func, errName, err) if (Settings.get.logAudioErrorStacktrace) { - logger.error(exc) + logger.error(exc.getMessage, exc) } else { logger.error(exc.getMessage) } diff --git a/src/main/scala/ocelot/desktop/audio/SoundSource.scala b/src/main/scala/ocelot/desktop/audio/SoundSource.scala index 0081f61..44b45b4 100644 --- a/src/main/scala/ocelot/desktop/audio/SoundSource.scala +++ b/src/main/scala/ocelot/desktop/audio/SoundSource.scala @@ -34,15 +34,15 @@ class SoundSource( Audio.getSourceStatus(this) } - def isPlaying: Boolean = { + def playing: Boolean = { status == SoundSource.Status.Playing } - def isPaused: Boolean = { + def paused: Boolean = { status == SoundSource.Status.Paused } - def isStopped: Boolean = { + def stopped: Boolean = { status == SoundSource.Status.Stopped } @@ -124,15 +124,9 @@ object SoundSource { SoundSource.fromBuffer(SoundBuffers.MinecraftClickRelease, SoundCategory.Interface) } - lazy val MinecraftExplosion: SoundSource = - SoundSource.fromBuffer(SoundBuffers.MinecraftExplosion, SoundCategory.Environment) - lazy val MachineFloppyInsert: SoundSource = SoundSource.fromBuffer(SoundBuffers.MachineFloppyInsert, SoundCategory.Environment) lazy val MachineFloppyEject: SoundSource = SoundSource.fromBuffer(SoundBuffers.MachineFloppyEject, SoundCategory.Environment) - - lazy val SelfDestructingCardCountdownBeep: SoundSource = - SoundSource.fromBuffer(SoundBuffers.SelfDestructingCardCountdownBeep, SoundCategory.Environment) } diff --git a/src/main/scala/ocelot/desktop/entity/OpenFMRadio.scala b/src/main/scala/ocelot/desktop/entity/OpenFMRadio.scala index cd93ba6..0153c38 100644 --- a/src/main/scala/ocelot/desktop/entity/OpenFMRadio.scala +++ b/src/main/scala/ocelot/desktop/entity/OpenFMRadio.scala @@ -152,7 +152,7 @@ class OpenFMRadio extends Entity with Environment with DeviceInfo with Logging { } def isPlaying: Boolean = - playbackSoundSource.isDefined && playbackSoundSource.get.isPlaying || playbackThread.isDefined + playbackSoundSource.isDefined && playbackSoundSource.get.playing || playbackThread.isDefined @Callback() def start(context: Context, args: Arguments): Array[AnyRef] = diff --git a/src/main/scala/ocelot/desktop/node/BoomCardFxHandler.scala b/src/main/scala/ocelot/desktop/node/BoomCardFxHandler.scala index 2db727c..9a5cf0c 100644 --- a/src/main/scala/ocelot/desktop/node/BoomCardFxHandler.scala +++ b/src/main/scala/ocelot/desktop/node/BoomCardFxHandler.scala @@ -1,6 +1,6 @@ package ocelot.desktop.node -import ocelot.desktop.audio.SoundSource +import ocelot.desktop.audio.{SoundBuffers, SoundCategory, SoundSource} import ocelot.desktop.color.Color import ocelot.desktop.geometry.FloatUtils.ExtendedFloat import ocelot.desktop.graphics.{Graphics, IconSource} @@ -14,15 +14,23 @@ import totoro.ocelot.brain.event.SelfDestructingCardBoomEvent trait BoomCardFxHandler extends Node with PositionalSoundSourcesNode with SmokeParticleNode { private var boomPhase: Float = -1 + private lazy val explosionSound = { + SoundSource.fromBuffer(SoundBuffers.MinecraftExplosion, SoundCategory.Environment) + } + + private lazy val countdownBeepSound = { + SoundSource.fromBuffer(SoundBuffers.SelfDestructingCardCountdownBeep, SoundCategory.Environment) + } + override def soundSources: Seq[SoundSource] = super.soundSources ++ Seq( - SoundSource.MinecraftExplosion, - SoundSource.SelfDestructingCardCountdownBeep, + explosionSound, + countdownBeepSound, ) eventHandlers += { case BrainEvent(_: SelfDestructingCardBoomEvent) => OcelotDesktop.updateThreadTasks.add(() => { - SoundSource.MinecraftExplosion.play() + explosionSound.play() emitSmoke() destroy() }) @@ -44,7 +52,7 @@ trait BoomCardFxHandler extends Node with PositionalSoundSourcesNode with SmokeP boomPhase = boomPhase.max(1 - item.card.time.toFloat / item.card.initialTime) if (item.card.lastBeepTime < 0 || item.card.lastBeepTime - item.card.time >= 20) { - SoundSource.SelfDestructingCardCountdownBeep.play() + countdownBeepSound.play() item.card.lastBeepTime = item.card.time flickerPhase = FlickerDuty } diff --git a/src/main/scala/ocelot/desktop/node/PositionalSoundSourcesNode.scala b/src/main/scala/ocelot/desktop/node/PositionalSoundSourcesNode.scala index 377c24e..dfce7a5 100644 --- a/src/main/scala/ocelot/desktop/node/PositionalSoundSourcesNode.scala +++ b/src/main/scala/ocelot/desktop/node/PositionalSoundSourcesNode.scala @@ -4,6 +4,12 @@ import ocelot.desktop.audio.SoundSource import ocelot.desktop.geometry.Vector3D import ocelot.desktop.{OcelotDesktop, Settings} +/** + * Updates sound sources' position depending on where the camera is. + * + * @note OpenAL only applies positioning to mono sources! + * If your source is stereo, this trait will have no audible effect. + */ trait PositionalSoundSourcesNode extends Node { // Every node can have multiple sound sources playing at the same time def soundSources: Seq[SoundSource] = Seq() diff --git a/src/main/scala/ocelot/desktop/node/nodes/TapeDriveNode.scala b/src/main/scala/ocelot/desktop/node/nodes/TapeDriveNode.scala index f097b64..92cac49 100644 --- a/src/main/scala/ocelot/desktop/node/nodes/TapeDriveNode.scala +++ b/src/main/scala/ocelot/desktop/node/nodes/TapeDriveNode.scala @@ -57,9 +57,9 @@ class TapeDriveNode(val tapeDrive: TapeDrive) val isRewinding = tapeDrive.state.state == TapeDriveState.State.Rewinding || tapeDrive.state.state == TapeDriveState.State.Forwarding - if (!isRewinding && soundTapeRewind.isPlaying) { + if (!isRewinding && soundTapeRewind.playing) { soundTapeRewind.stop() - } else if (isRewinding && !soundTapeRewind.isPlaying && !Audio.isDisabled) { + } else if (isRewinding && !soundTapeRewind.playing && !Audio.isDisabled) { soundTapeRewind.play() } } diff --git a/src/main/scala/ocelot/desktop/util/AudibleComputerAware.scala b/src/main/scala/ocelot/desktop/util/AudibleComputerAware.scala index fe601a9..d12257f 100644 --- a/src/main/scala/ocelot/desktop/util/AudibleComputerAware.scala +++ b/src/main/scala/ocelot/desktop/util/AudibleComputerAware.scala @@ -10,9 +10,9 @@ trait AudibleComputerAware extends ComputerAware { ) def updateRunningSound(): Unit = { - if (!computer.machine.isRunning && soundComputerRunning.isPlaying) { + if (!computer.machine.isRunning && soundComputerRunning.playing) { soundComputerRunning.stop() - } else if (computer.machine.isRunning && !soundComputerRunning.isPlaying && !Audio.isDisabled) { + } else if (computer.machine.isRunning && !soundComputerRunning.playing && !Audio.isDisabled) { soundComputerRunning.play() } }