The Trunk: Sound-dtl.67.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Sound-dtl.67.mcz

commits-2
Marcel Taeumel uploaded a new version of Sound to project The Trunk:
http://source.squeak.org/trunk/Sound-dtl.67.mcz

==================== Summary ====================

Name: Sound-dtl.67
Author: dtl
Time: 10 December 2019, 10:51:04.985835 pm
UUID: ca970845-8428-41f9-b83c-f64a6cc732c1
Ancestors: Sound-eem.66

Sound mixing improvements by Stéphane Rollandin (spfa).
Allow adjusting volume of mixed sounds while playing.
Original discussion at http://forum.world.st/Adjusting-the-volume-of-a-sound-as-it-s-playing-td5102562.html
Patches posted to squeak-dev at http://lists.squeakfoundation.org/pipermail/squeak-dev/2019-December/205440.html

=============== Diff against Sound-eem.66 ===============

Item was changed:
  ----- Method: AbstractSound>>loudness (in category 'volume') -----
  loudness
  "Answer the current volume setting for this sound."
 
+ self hasVolumeEnvelope ifTrue: [^ self volumeEnvelope scale].
+
+ ^ scaledVol asFloat / ScaleFactor!
- ^ scaledVol asFloat / ScaleFactor asFloat!

Item was changed:
  ----- Method: MixedSound>>mixSampleCount:into:startingAt:leftVol:rightVol: (in category 'sound generation') -----
  mixSampleCount: n into: aSoundBuffer startingAt: startIndex leftVol: leftVol rightVol: rightVol
  "Play a number of sounds concurrently. The level of each sound can be set independently for the left and right channels."
 
  | snd left right |
  1 to: sounds size do: [:i |
  (soundDone at: i) ifFalse: [
  snd := sounds at: i.
+ left := (leftVol * (leftVols at: i) * scaledVol / ScaleFactor) // ScaleFactor.
+ right := (rightVol * (rightVols at: i) * scaledVol / ScaleFactor) // ScaleFactor.
- left := (leftVol * (leftVols at: i)) // ScaleFactor.
- right := (rightVol * (rightVols at: i)) // ScaleFactor.
  snd samplesRemaining > 0
  ifTrue: [
  snd mixSampleCount: n into: aSoundBuffer startingAt: startIndex leftVol: left rightVol: right]
  ifFalse: [soundDone at: i put: true]]].
  !

Item was changed:
  ----- Method: RepeatingSound>>mixSampleCount:into:startingAt:leftVol:rightVol: (in category 'sound generation') -----
  mixSampleCount: n into: aSoundBuffer startingAt: startIndex leftVol: leftVol rightVol: rightVol
  "Play a collection of sounds in sequence."
  "(RepeatingSound new
  setSound: FMSound majorScale
  iterations: 2) play"
 
  | i count samplesNeeded |
  iteration <= 0 ifTrue: [^ self].
  i := startIndex.
  samplesNeeded := n.
  [samplesNeeded > 0] whileTrue: [
  count := sound samplesRemaining min: samplesNeeded.
  count = 0 ifTrue: [
  iterationCount == #forever
  ifFalse: [
  iteration := iteration - 1.
  iteration <= 0 ifTrue: [^ self]].  "done"
  sound reset.
  count := sound samplesRemaining min: samplesNeeded.
  count = 0 ifTrue: [^ self]].  "zero length sound"
  sound mixSampleCount: count
  into: aSoundBuffer
  startingAt: i
+ leftVol: leftVol * scaledVol // ScaleFactor
+ rightVol: rightVol * scaledVol // ScaleFactor.
- leftVol: leftVol
- rightVol: rightVol.
  i := i + count.
  samplesNeeded := samplesNeeded - count].
  !

Item was changed:
  ----- Method: SequentialSound>>mixSampleCount:into:startingAt:leftVol:rightVol: (in category 'sound generation') -----
  mixSampleCount: n into: aSoundBuffer startingAt: startIndex leftVol: leftVol rightVol: rightVol
  "Play a collection of sounds in sequence."
  "PluckedSound chromaticScale play"
 
+ | finalIndex i snd remaining count leftScaledVol rightScaledVol |
- | finalIndex i snd remaining count |
  currentIndex = 0 ifTrue: [^ self].  "already done"
+
+ leftScaledVol := leftVol * scaledVol /// ScaleFactor.
+ rightScaledVol := rightVol * scaledVol /// ScaleFactor.
+
  finalIndex := (startIndex + n) - 1.
  i := startIndex.
  [i <= finalIndex] whileTrue: [
  snd := (sounds at: currentIndex).
  [(remaining := snd samplesRemaining) <= 0] whileTrue: [
  "find next undone sound"
  currentIndex < sounds size
  ifTrue: [
  currentIndex := currentIndex + 1.
  snd := (sounds at: currentIndex)]
  ifFalse: [
  currentIndex := 0.
  ^ self]].  "no more sounds"
  count := (finalIndex - i) + 1.
  remaining < count ifTrue: [count := remaining].
+ snd mixSampleCount: count into: aSoundBuffer startingAt: i
+ leftVol: leftScaledVol
+ rightVol: rightScaledVol.
- snd mixSampleCount: count into: aSoundBuffer startingAt: i leftVol: leftVol rightVol: rightVol.
  i := i + count].
  !