[squeak-dev] The Trunk: Sound-eem.74.mcz
Eliot Miranda
eliot.miranda at gmail.com
Mon Sep 21 19:50:12 UTC 2020
Hi Christoph,
On Mon, Sep 21, 2020 at 12:35 PM Thiede, Christoph <
Christoph.Thiede at student.hpi.uni-potsdam.de> wrote:
> Underscore selectors in the Trunk? Is this really necessary?
>
No, but it leads to a much nicer sounding selector name than any of
sixtyFourBitMixSampleCount:into:startingAt:leftVol:rightVol:, m
ix64BitSampleCount:into:startingAt:leftVol:rightVol:, or mixSampleCount64:
into:startingAt:leftVol:rightVol:. I can change it if it really offends
you, but I did it for a reason. I wanted it to read as "this is the 64-bit
version of mixSampleCount:into:startingAt:leftVol:rightVol:", and I didn't
want it to be over long. Note that "mix64BitSampleCOunt:" et al are
ambiguous. The samples are not 64-bits, the algorithm is for 64-bits. But
remember that this is a strange method anyway, a translated primitive, with
lots of C weirdness in it. Complaining about the selector is the least of
the problems with it ;-)
Depending on your preferences, you might not even be able to load this
> code, and I would not consider this Smalltalkish at all ... Is this a known
> idiom? :-)
>
Well, underscores have neen allowed in Smalltalk for a long time now. It
does lead to some nice usage when interfacing with C. I certwinly do not
use it for normal SMalltalk code. But I would miss it badly if it
didn't exist. I use selectors such as strcpy:_:_: (which maps to
strcpy(3)) routinely in the VMMaker.
> Best,
>
> Christoph
> ------------------------------
> *Von:* Squeak-dev <squeak-dev-bounces at lists.squeakfoundation.org> im
> Auftrag von commits at source.squeak.org <commits at source.squeak.org>
> *Gesendet:* Samstag, 19. September 2020 18:11:42
> *An:* squeak-dev at lists.squeakfoundation.org;
> packages at lists.squeakfoundation.org
> *Betreff:* [squeak-dev] The Trunk: Sound-eem.74.mcz
>
> Eliot Miranda uploaded a new version of Sound to project The Trunk:
> http://source.squeak.org/trunk/Sound-eem.74.mcz
>
> ==================== Summary ====================
>
> Name: Sound-eem.74
> Author: eem
> Time: 19 September 2020, 9:11:40.666386 am
> UUID: 42a3c2d9-0bed-4310-bcf1-cbe0f3d0653b
> Ancestors: Sound-eem.73
>
> Oops! stopPlayerProcess *must* stop the sound system when sent from
> startPlayerProcessBufferSize:rate:stereo:sound:. Spo refactor a bit,
> renaming stopPlayerProcess to stopPlayerProcess: to take a hardStop
> boolean. When quitting the argument is false.
>
> Add a 64-bit specific, integer-overflow agnostic version of
> mixSampleCount:into:startingAt:leftVol:rightVol:, for creating a simpler
> inline primitive in the 64-bit VM.
>
> =============== Diff against Sound-eem.73 ===============
>
> Item was changed:
> ----- Method: AbstractSound class>>translatedPrimitives (in category
> 'primitive generation') -----
> translatedPrimitives
> ^#(
> (FMSound mixSampleCount:into:startingAt:leftVol:rightVol:)
> (PluckedSound
> mixSampleCount:into:startingAt:leftVol:rightVol:)
> (LoopedSampledSound
> mixSampleCount:into:startingAt:leftVol:rightVol:)
> (SampledSound
> mixSampleCount:into:startingAt:leftVol:rightVol:)
> + (SampledSound
> _64bitMixSampleCount:into:startingAt:leftVol:rightVol:)
> (ReverbSound applyReverbTo:startingAt:count:)
> ).
> !
>
> Item was added:
> + ----- Method:
> SampledSound>>_64bitMixSampleCount:into:startingAt:leftVol:rightVol: (in
> category 'playing') -----
> + _64bitMixSampleCount: n into: aSoundBuffer startingAt: startIndex
> leftVol: leftVol rightVol: rightVol
> + "Mix the given number of samples with the samples already in the
> given buffer starting at the given index.
> + Assume that the buffer size is at least (index + count) - 1."
> +
> + | lastIndex outIndex sampleIndex sample i s |
> + <inline: #always>
> + <var: #aSoundBuffer type: #'short int *'>
> + <var: #samples type: #'short int *'>
> +
> + lastIndex := (startIndex + n) - 1.
> + outIndex := startIndex. "index of next stereo output sample
> pair"
> + sampleIndex := indexHighBits + (scaledIndex >>
> IncrementFractionBits).
> + [(sampleIndex <= samplesSize) and: [outIndex <= lastIndex]]
> whileTrue:
> + [sample := ((samples at: sampleIndex) * scaledVol) //
> ScaleFactor.
> + leftVol > 0 ifTrue:
> + [i := (2 * outIndex) - 1.
> + s := (aSoundBuffer at: i) + ((sample * leftVol)
> // ScaleFactor).
> + s > 32767 ifTrue: [s := 32767]. "clipping!!"
> + s < -32767 ifTrue: [s := -32767]. "clipping!!"
> + aSoundBuffer at: i put: s].
> + rightVol > 0 ifTrue:
> + [i := 2 * outIndex.
> + s := (aSoundBuffer at: i) + ((sample * rightVol)
> // ScaleFactor).
> + s > 32767 ifTrue: [s := 32767]. "clipping!!"
> + s < -32767 ifTrue: [s := -32767]. "clipping!!"
> + aSoundBuffer at: i put: s].
> +
> + scaledVolIncr ~= 0 ifTrue:
> + [scaledVol := scaledVol + scaledVolIncr.
> + ((scaledVolIncr > 0 and: [scaledVol >=
> scaledVolLimit]) or:
> + [scaledVolIncr < 0 and: [scaledVol <=
> scaledVolLimit]])
> + ifTrue: "reached the limit; stop
> incrementing"
> + [scaledVol := scaledVolLimit.
> + scaledVolIncr := 0]].
> +
> + scaledIndex := scaledIndex + scaledIncrement.
> +
> + sampleIndex := indexHighBits + (scaledIndex >>
> IncrementFractionBits).
> + outIndex := outIndex + 1].
> + count := count - n
> + !
>
> Item was changed:
> ----- Method:
> SampledSound>>mixSampleCount:into:startingAt:leftVol:rightVol: (in category
> 'playing') -----
> mixSampleCount: n into: aSoundBuffer startingAt: startIndex leftVol:
> leftVol rightVol: rightVol
> + "Mix the given number of samples with the samples already in the
> given buffer starting at the given index.
> + Assume that the buffer size is at least (index + count) - 1."
> - "Mix the given number of samples with the samples already in the
> given buffer starting at the given index. Assume that the buffer size is at
> least (index + count) - 1."
>
> | lastIndex outIndex sampleIndex sample i s overflow |
> + <primitive:'primitiveMixSampledSound' module:
> 'SoundGenerationPlugin'>
> + <var: #aSoundBuffer type: #'short int *'>
> + <var: #samples type: #'short int *'>
> - <primitive:'primitiveMixSampledSound'
> module:'SoundGenerationPlugin'>
> - <var: #aSoundBuffer declareC: 'short int *aSoundBuffer'>
> - <var: #samples declareC: 'short int *samples'>
>
> + SmallInteger maxVal > 16r3FFFFFFF ifTrue: "In 64-bits we don't
> have to worry about 2^15 * 2^15 overflow"
> + [^self _64bitMixSampleCount: n into: aSoundBuffer
> startingAt: startIndex leftVol: leftVol rightVol: rightVol].
> lastIndex := (startIndex + n) - 1.
> outIndex := startIndex. "index of next stereo output sample
> pair"
> sampleIndex := indexHighBits + (scaledIndex >>
> IncrementFractionBits).
> [(sampleIndex <= samplesSize) and: [outIndex <= lastIndex]]
> whileTrue: [
> sample := ((samples at: sampleIndex) * scaledVol) //
> ScaleFactor.
> leftVol > 0 ifTrue: [
> i := (2 * outIndex) - 1.
> s := (aSoundBuffer at: i) + ((sample * leftVol)
> // ScaleFactor).
> s > 32767 ifTrue: [s := 32767]. "clipping!!"
> s < -32767 ifTrue: [s := -32767]. "clipping!!"
> aSoundBuffer at: i put: s].
> rightVol > 0 ifTrue: [
> i := 2 * outIndex.
> s := (aSoundBuffer at: i) + ((sample * rightVol)
> // ScaleFactor).
> s > 32767 ifTrue: [s := 32767]. "clipping!!"
> s < -32767 ifTrue: [s := -32767]. "clipping!!"
> aSoundBuffer at: i put: s].
>
> scaledVolIncr ~= 0 ifTrue: [
> scaledVol := scaledVol + scaledVolIncr.
> ((scaledVolIncr > 0 and: [scaledVol >=
> scaledVolLimit]) or:
> [scaledVolIncr < 0 and: [scaledVol <=
> scaledVolLimit]])
> ifTrue: [ "reached the limit; stop
> incrementing"
> scaledVol := scaledVolLimit.
> scaledVolIncr := 0]].
>
> scaledIndex := scaledIndex + scaledIncrement.
> scaledIndex >= ScaledIndexOverflow ifTrue: [
> overflow := scaledIndex >> IncrementFractionBits.
> indexHighBits := indexHighBits + overflow.
> scaledIndex := scaledIndex - (overflow <<
> IncrementFractionBits)].
>
> sampleIndex := indexHighBits + (scaledIndex >>
> IncrementFractionBits).
> outIndex := outIndex + 1].
> + count := count - n!
> - count := count - n.
> - !
>
> Item was changed:
> ----- Method: SoundPlayer class>>shutDown: (in category 'snapshotting')
> -----
> shutDown: quitting
> "Stop player process, for example before snapshotting."
>
> + quitting ifTrue:
> + [self stopPlayerProcess: false.
> + ReverbState := nil]!
> - quitting ifTrue: [
> - self stopPlayerProcess.
> - ReverbState := nil].!
>
> Item was changed:
> ----- Method: SoundPlayer
> class>>startPlayerProcessBufferSize:rate:stereo:sound: (in category 'player
> process') -----
> startPlayerProcessBufferSize: bufferSize rate: samplesPerSecond stereo:
> stereoFlag sound: aSound
> "Start the sound player process. Terminate the old process, if
> any."
> "SoundPlayer startPlayerProcessBufferSize: 1000 rate: 11025
> stereo: false"
>
> + self stopPlayerProcess: true.
> + aSound ifNotNil: "stopPlayerProcess: ensures ActiveSounds are
> empty..."
> + [ActiveSounds add: aSound].
> - self stopPlayerProcess.
> - aSound
> - ifNil:[ActiveSounds := OrderedCollection new]
> - ifNotNil:[ActiveSounds := OrderedCollection with: aSound].
> Buffer := SoundBuffer newStereoSampleCount: (bufferSize // 4) * 4.
> + LastBuffer ifNotNil:
> + [LastBuffer := SoundBuffer basicNew: Buffer basicSize].
> - LastBuffer ifNotNil:[LastBuffer := SoundBuffer basicNew: Buffer
> basicSize].
> PlayerSemaphore := Semaphore forMutualExclusion.
> SamplingRate := samplesPerSecond.
> Stereo := stereoFlag.
> SoundSupported := true. "Assume so"
> UseReadySemaphore := true. "set to false if ready semaphore not
> supported by VM"
> Smalltalk newExternalSemaphoreDo: [ :semaphore :index |
> ReadyForBuffer := semaphore.
> self primSoundStartBufferSize: Buffer stereoSampleCount
> rate: samplesPerSecond
> stereo: Stereo
> semaIndex: index ].
> "Check if sound start prim was successful"
> SoundSupported ifFalse:[
> Smalltalk unregisterExternalObject: ReadyForBuffer.
> ReadyForBuffer := nil.
> ^self ].
> UseReadySemaphore
> ifTrue: [PlayerProcess := [SoundPlayer playLoop]
> newProcess]
> ifFalse: [PlayerProcess := [SoundPlayer oldStylePlayLoop]
> newProcess].
> UseReverb ifTrue: [self startReverb].
>
> PlayerProcess
> name: 'Sound Player (', ActiveSounds size asString, ')';
> priority: Processor userInterruptPriority;
> resume!
>
> Item was removed:
> - ----- Method: SoundPlayer class>>stopPlayerProcess (in category 'player
> process') -----
> - stopPlayerProcess
> - "Stop the sound player process."
> - "SoundPlayer stopPlayerProcess"
> -
> - PlayerProcess ifNotNil:
> - [PlayerProcess ~~ Processor activeProcess ifTrue:
> - [PlayerProcess terminate].
> - PlayerProcess := nil].
> - "Don't load the SoundPlugin if it is not in use..."
> - self soundPluginActive ifTrue: [self primSoundStop].
> - ActiveSounds isEmpty ifFalse:
> - [ActiveSounds := OrderedCollection new].
> - Buffer := nil.
> - PlayerSemaphore isEmpty ifFalse:
> - [PlayerSemaphore := Semaphore forMutualExclusion].
> - ReadyForBuffer ifNotNil:
> - [Smalltalk unregisterExternalObject: ReadyForBuffer.
> - ReadyForBuffer := nil]!
>
> Item was added:
> + ----- Method: SoundPlayer class>>stopPlayerProcess: (in category 'player
> process') -----
> + stopPlayerProcess: hardStop
> + "Stop the sound player process."
> + "SoundPlayer stopPlayerProcess"
> +
> + PlayerProcess ifNotNil:
> + [PlayerProcess ~~ Processor activeProcess ifTrue:
> + [PlayerProcess terminate].
> + PlayerProcess := nil].
> + (hardStop or: [self soundPluginActive]) ifTrue: [self
> primSoundStop].
> + ActiveSounds isEmpty ifFalse:
> + [ActiveSounds := OrderedCollection new].
> + Buffer := nil.
> + PlayerSemaphore isEmpty ifFalse:
> + [PlayerSemaphore := Semaphore forMutualExclusion].
> + ReadyForBuffer ifNotNil:
> + [Smalltalk unregisterExternalObject: ReadyForBuffer.
> + ReadyForBuffer := nil]!
>
>
>
>
--
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20200921/e797939a/attachment.html>
More information about the Squeak-dev
mailing list
|