Thanks Daniel, that works! Plus using soundarray should be faster than
first converting to raw.

So far I don't need to cache, but rollback netcode demands lots of CPU so I
suspect I probably will end up optimizing this to improve robustness vs lag.

A pity mixer won't let you start Channels partway through a Sound, as then
there'd be no CPU cost.

On Wed, Jul 14, 2021 at 9:15 AM Daniel Foerster <pydsig...@gmail.com> wrote:

> Instead of using the raw sound binary data and winging the slice, I'd
> recommend throwing things into a sndarray.
>
>
> def clip_sound(sound, start_time):
>     freq = pygame.mixer.get_init()[0]
>     offset = round(freq * start_time)
>     arr = pygame.sndarray.array(sound)
>     clipped = arr[offset:]
>     return pygame.sndarray.make_sound(clipped)
>
>
> It would be worthwhile probably to cache the frequency and the converted
> array and only do the slice + flip back to Sound but that's premature
> optimization right now.
>
> On Wed, Jul 14, 2021, 03:15 Jasper Phillips <jasperisja...@gmail.com>
> wrote:
>
>> Alas, that is precisely what I did:
>>
>> def clipEffect( effect, startTime ):
>>     raw       = effect.get_raw()
>>     rawStart  = int( len(raw) * startTime / effect.get_length() )
>>     return mixer.Sound( raw[rawStart:] )
>>
>> Depending on what sound effect I play the code either:
>> - Works fine!
>> - Horribly distorts the audio, though the original Sound plays fine...
>>
>> Hi Jasper. Try the fourth answer here
>>> <https://stackoverflow.com/questions/57960451/how-can-i-play-a-portion-of-an-audio-file-in-a-loop-in-pygame>,
>>> by Ted Klein Bergman.
>>> On 7/13/2021 4:24 PM, Jasper Phillips wrote:
>>>
>>> I'm working on a networked action game with rollback netcode, and so I
>>> need to play sound effects starting an arbitrary amount of time from the
>>> beginning of the file so they sync up with game events.
>>>
>>> pygame.mixer.music does this via set_pos()... but apparently there's no
>>> corresponding method when playing effects directly via a Channel.
>>> Unfortunate, as I need to use Channels!
>>>
>>> The best I've come up with is to use Sound.get_raw(), trim the starting
>>> bytes off then, create a new Sound.  But this fails several different ways,
>>> I'm guessing because I'm arbitrarily slicing the bytes and there's some
>>> format details I don't know.
>>>
>>>
>>> Does anyone have any tips for hacking raw Sound data, or perhaps some
>>> better approach?
>>>
>>> -Jasper
>>>
>>>

Reply via email to