A new version of Sound was added to project The Inbox:
http://source.squeak.org/inbox/Sound-ct.71.mcz ==================== Summary ==================== Name: Sound-ct.71 Author: ct Time: 1 September 2020, 2:07:15.07999 am UUID: 0d91a1bf-41cb-834c-ab0c-fa2ad832e408 Ancestors: Sound-nice.69 Fixes wave sound streaming on non-filestream objects. The endianness was inverted because #int16: already uses Big Endian. This did not sound well - listen yourself in an unpatched image: :-) array := ByteArray streamContents: [:stream | PluckedSound bachFugue storeWAVSamplesOn: stream]. (FileStream fileNamed: 'bachFugue.wav') binary in: [:stream | [array do: [:ea | stream nextPut: ea]] ensure: [stream close]]. (SampledSound fromWaveFileNamed: 'bachFugue.wav') play. Please review in detail as this is one of my first contacts to the Sound system! =============== Diff against Sound-nice.69 =============== Item was changed: ----- Method: AbstractSound>>storeSampleCount:bigEndian:on: (in category 'file i/o') ----- storeSampleCount: samplesToStore bigEndian: bigEndianFlag on: aBinaryStream "Store my samples on the given stream at the current SoundPlayer sampling rate. If bigFlag is true, then each 16-bit sample is stored most-significant byte first (AIFF files), otherwise it is stored least-significant byte first (WAV files). If self isStereo is true, both channels are stored, creating a stereo file. Otherwise, only the left channel is stored, creating a mono file." + | bufSize stereoBuffer reverseBytes streamDirect | - | bufSize stereoBuffer reverseBytes | self reset. bufSize := (2 * self samplingRate rounded) min: samplesToStore. "two second buffer" stereoBuffer := SoundBuffer newStereoSampleCount: bufSize. + streamDirect := aBinaryStream isKindOf: StandardFileStream. + reverseBytes := (bigEndianFlag xor: Smalltalk isBigEndian) xor: streamDirect not. - reverseBytes := bigEndianFlag ~= (Smalltalk isBigEndian). 'Storing audio...' displayProgressFrom: 0 to: samplesToStore during: [:bar | | remaining out | remaining := samplesToStore. [remaining > 0] whileTrue: [ bar value: samplesToStore - remaining. stereoBuffer primFill: 0. "clear the buffer" self playSampleCount: (bufSize min: remaining) into: stereoBuffer startingAt: 1. out := self isStereo ifTrue: [stereoBuffer] ifFalse: [stereoBuffer extractLeftChannel]. reverseBytes ifTrue: [out reverseEndianness]. + streamDirect - (aBinaryStream isKindOf: StandardFileStream) ifTrue: [ "optimization for files: write sound buffer directly to file" aBinaryStream next: (out size // 2) putAll: out startingAt: 1] "size in words" ifFalse: [ "for non-file streams:" 1 to: out monoSampleCount do: [:i | aBinaryStream int16: (out at: i)]]. + remaining := remaining - bufSize]].! - remaining := remaining - bufSize]]. - ! |
Free forum by Nabble | Edit this page |