From: Anton Baskanov baskanov@gmail.com
--- dlls/dmusic/wave.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/dmusic/wave.c b/dlls/dmusic/wave.c index 2c8ccbc2170..daa4e1da5a0 100644 --- a/dlls/dmusic/wave.c +++ b/dlls/dmusic/wave.c @@ -365,7 +365,7 @@ HRESULT wave_create_from_soundfont(struct soundfont *soundfont, UINT index, IDir sample->loops[0].ulStart = sf_sample->start_loop - sf_sample->start; sample->loops[0].ulLength = sf_sample->end_loop - sf_sample->start_loop;
- data_size = sf_sample->end - sf_sample->start; + data_size = (sf_sample->end - sf_sample->start) * format->nBlockAlign; if (FAILED(hr = CreateStreamOnHGlobal(NULL, TRUE, &stream))) goto failed; offset = sf_sample->start * format->nBlockAlign / format->nChannels; if (FAILED(hr = IStream_Write(stream, soundfont->sdta + offset, data_size, &data_size))) goto failed;
From: Anton Baskanov baskanov@gmail.com
--- dlls/dmusic/instrument.c | 2 -- 1 file changed, 2 deletions(-)
diff --git a/dlls/dmusic/instrument.c b/dlls/dmusic/instrument.c index a524ab2c627..666e4215b59 100644 --- a/dlls/dmusic/instrument.c +++ b/dlls/dmusic/instrument.c @@ -59,7 +59,6 @@ struct region WAVELINK wave_link; WSMPL wave_sample; WLOOP wave_loop; - BOOL loop_present; };
static void region_destroy(struct region *region) @@ -585,7 +584,6 @@ static HRESULT instrument_add_soundfont_region(struct instrument *This, struct s end_loop = generators->amount[SF_GEN_ENDLOOP_ADDRS_OFFSET].value; if (start_loop || end_loop) { - region->loop_present = TRUE; region->wave_sample.cSampleLoops = 1; region->wave_loop.ulStart = start_loop; region->wave_loop.ulLength = end_loop - start_loop;
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;
From: Anton Baskanov baskanov@gmail.com
--- dlls/dmusic/instrument.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/dmusic/instrument.c b/dlls/dmusic/instrument.c index 4b965720e98..fd14983c6b1 100644 --- a/dlls/dmusic/instrument.c +++ b/dlls/dmusic/instrument.c @@ -582,8 +582,8 @@ 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; - region->wave_loop.ulStart = start_loop; - region->wave_loop.ulLength = end_loop - start_loop; + region->wave_loop.ulStart = sample->start_loop + start_loop - sample->start; + region->wave_loop.ulLength = sample->end_loop + end_loop - sample->start_loop;
switch (generators->amount[SF_GEN_SAMPLE_MODES].value & 0x3) {
From: Anton Baskanov baskanov@gmail.com
--- dlls/dmusic/instrument.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/dlls/dmusic/instrument.c b/dlls/dmusic/instrument.c index fd14983c6b1..8fcd69bdac4 100644 --- a/dlls/dmusic/instrument.c +++ b/dlls/dmusic/instrument.c @@ -581,7 +581,9 @@ static HRESULT instrument_add_soundfont_region(struct instrument *This, struct s region->wave_sample.lAttenuation = sample->correction;
start_loop = generators->amount[SF_GEN_STARTLOOP_ADDRS_OFFSET].value; + start_loop += generators->amount[SF_GEN_STARTLOOP_ADDRS_COARSE_OFFSET].value * 32768; end_loop = generators->amount[SF_GEN_ENDLOOP_ADDRS_OFFSET].value; + end_loop += generators->amount[SF_GEN_ENDLOOP_ADDRS_COARSE_OFFSET].value * 32768; region->wave_loop.ulStart = sample->start_loop + start_loop - sample->start; region->wave_loop.ulLength = sample->end_loop + end_loop - sample->start_loop;
From: Anton Baskanov baskanov@gmail.com
--- dlls/dmusic/instrument.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/dmusic/instrument.c b/dlls/dmusic/instrument.c index 8fcd69bdac4..1710cbc690d 100644 --- a/dlls/dmusic/instrument.c +++ b/dlls/dmusic/instrument.c @@ -575,7 +575,7 @@ static HRESULT instrument_add_soundfont_region(struct instrument *This, struct s region->wave_link.ulTableIndex = sample_index;
unity_note = generators->amount[SF_GEN_OVERRIDING_ROOT_KEY].value; - if (unity_note == -1) unity_note = sample->original_key; + if (unity_note == (WORD)-1) unity_note = sample->original_key; region->wave_sample.usUnityNote = unity_note; region->wave_sample.sFineTune = generators->amount[SF_GEN_FINE_TUNE].value; region->wave_sample.lAttenuation = sample->correction;
This merge request was approved by Rémi Bernon.
This merge request was approved by Michael Stefaniuc.