From: Anton Baskanov baskanov@gmail.com
--- dlls/dmusic/instrument.c | 17 ++++++++++++++--- dlls/dmusic/soundfont.h | 8 ++++++++ dlls/dmusic/wave.c | 1 - 3 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/dlls/dmusic/instrument.c b/dlls/dmusic/instrument.c index 666e4215b59..4b965720e98 100644 --- a/dlls/dmusic/instrument.c +++ b/dlls/dmusic/instrument.c @@ -582,11 +582,22 @@ static HRESULT instrument_add_soundfont_region(struct instrument *This, struct s
start_loop = generators->amount[SF_GEN_STARTLOOP_ADDRS_OFFSET].value; end_loop = generators->amount[SF_GEN_ENDLOOP_ADDRS_OFFSET].value; - if (start_loop || end_loop) + region->wave_loop.ulStart = start_loop; + region->wave_loop.ulLength = end_loop - start_loop; + + switch (generators->amount[SF_GEN_SAMPLE_MODES].value & 0x3) { + case SF_UNLOOPED: + case SF_NOTUSED: + break; + case SF_LOOP_DURING_RELEASE: + region->wave_sample.cSampleLoops = 1; + region->wave_loop.ulType = WLOOP_TYPE_FORWARD; + break; + case SF_LOOP_UNTIL_RELEASE: region->wave_sample.cSampleLoops = 1; - region->wave_loop.ulStart = start_loop; - region->wave_loop.ulLength = end_loop - start_loop; + region->wave_loop.ulType = WLOOP_TYPE_RELEASE; + break; }
list_add_tail(&This->regions, ®ion->entry); diff --git a/dlls/dmusic/soundfont.h b/dlls/dmusic/soundfont.h index 338c8c243bf..f36fb633a32 100644 --- a/dlls/dmusic/soundfont.h +++ b/dlls/dmusic/soundfont.h @@ -277,6 +277,14 @@ static inline const char *debugstr_sf_gen(struct sf_gen *gen) } }
+enum +{ + SF_UNLOOPED = 0, + SF_LOOP_DURING_RELEASE = 1, + SF_NOTUSED = 2, + SF_LOOP_UNTIL_RELEASE = 3 +}; + struct sf_instrument /* <inst-rec> */ { char name[20]; diff --git a/dlls/dmusic/wave.c b/dlls/dmusic/wave.c index daa4e1da5a0..d49d1d03a94 100644 --- a/dlls/dmusic/wave.c +++ b/dlls/dmusic/wave.c @@ -361,7 +361,6 @@ HRESULT wave_create_from_soundfont(struct soundfont *soundfont, UINT index, IDir
if (!(sample = calloc(1, offsetof(struct sample, loops[1])))) goto failed; sample->head.cbSize = sizeof(sample->head); - sample->head.cSampleLoops = 1; sample->loops[0].ulStart = sf_sample->start_loop - sf_sample->start; sample->loops[0].ulLength = sf_sample->end_loop - sf_sample->start_loop;