Opened 14 years ago

Closed 14 years ago

Last modified 14 years ago

#2612 closed defect (fixed)

FF: ADPCM sound is broken in DXA cutscenes

Reported by: eriktorbjorn Owned by: Kirben
Priority: normal Component: Engine: AGOS
Keywords: Cc:
Game: The Feeble Files

Description

It has been known for some time now that ADPCM-sound is
not supported in The Feeble File's DXA cutscenes. I
think I see why, but I can't decide on what's the
correct way of fixing it. As far as I can tell, the
problem is twofold:

* The startSound() function in FF's DXA player uses
makeWAVStream() to create a WAV stream from a memory
stream. Then it frees the original memory buffer, so it
assumes that makeWAVStream() will make a copy of the
data. The memory stream is a local variable.

* In the case of ADPCM files, an ADPCM stream is
created from the memory stream. The data is not copied.

So, unless I'm mistaken, when the mixer tries to stream
the sound from the WAV stream, the memory stream is no
longer alive, and even if it was alive it would point
to a memory block that has been freed.

From what I've seen, in the other cases where we use
ADPCM streams, we use them to decode the entire sample
and then play it with playRaw(). But that seems
wasteful on a sample that could be several megabytes.
Even if that's what we do when playing standard WAV
data for the cutscenes.

It probably makes sense to keep the DXA sound chunk in
memory to avoid seeking back and forth, though.

Ticket imported from: #1493475. Ticket imported from: bugs/2612.

Change History (4)

comment:1 by eriktorbjorn, 14 years ago

Component: Engine: AGOS
Game: The Feeble Files

comment:2 by eriktorbjorn, 14 years ago

Owner: set to Kirben

comment:3 by Kirben, 14 years ago

Compressed sound support in makeWAVStream() was never
really tested, since it was not used at all for long time.
Based on original code of fuction, it should copy the data
in all cases. It will increase memory usage, but we already
use large amount of memory during cutscenes, so doubt it
will make much difference.

In other places where ADPCM streams are used (HE Games and
FF in game), sound looping is required. Which is only
supported by playRaw() at the moment.

comment:4 by Kirben, 14 years ago

Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.