|
|
| version 1.17, 2006/12/16 22:23:24 | version 1.18, 2006/12/17 17:53:24 |
|---|---|
| Line 1066 VEXTERN void VEXPORT midiout_longmsg(MID | Line 1066 VEXTERN void VEXPORT midiout_longmsg(MID |
| } | } |
| } | } |
| VEXTERN const SINT32 * VEXPORT midiout_get(MIDIHDL hdl, UINT *samples) { | static UINT VERMOUTHCL preparepcm(MIDIHDL hdl, UINT size) { |
| UINT size; | UINT ret; |
| SINT32 *buf; | |
| VOICE v; | VOICE v; |
| VOICE vterm; | VOICE vterm; |
| BOOL playing; | |
| SINT32 *buf; | |
| SAMPLE src; | SAMPLE src; |
| SAMPLE srcterm; | SAMPLE srcterm; |
| UINT cnt; | UINT cnt; |
| UINT pos; | UINT pos; |
| UINT rem; | UINT rem; |
| if ((hdl == NULL) || (samples == NULL)) { | ret = 0; |
| goto moget_err; | size = min(size, hdl->worksize); |
| } | |
| size = min(*samples, hdl->worksize); | |
| if (size == 0) { | |
| goto moget_err; | |
| } | |
| buf = hdl->sampbuf; | buf = hdl->sampbuf; |
| ZeroMemory(buf, size * 2 * sizeof(SINT32)); | ZeroMemory(buf, size * 2 * sizeof(SINT32)); |
| v = VOICEHDLPTR(hdl); | v = VOICEHDLPTR(hdl); |
| vterm = VOICEHDLEND(hdl); | vterm = VOICEHDLEND(hdl); |
| playing = FALSE; | |
| do { | do { |
| if (v->phase != VOICE_FREE) { | if (v->phase != VOICE_FREE) { |
| ret = size; | |
| cnt = size; | cnt = size; |
| if (v->phase & VOICE_REL) { | if (v->phase & VOICE_REL) { |
| voice_setfree(v); | voice_setfree(v); |
| Line 1120 VEXTERN const SINT32 * VEXPORT midiout_g | Line 1114 VEXTERN const SINT32 * VEXPORT midiout_g |
| if (src != srcterm) { | if (src != srcterm) { |
| v->mix(v, buf, src, srcterm); | v->mix(v, buf, src, srcterm); |
| } | } |
| playing = TRUE; | |
| } | } |
| v++; | v++; |
| } while(v < vterm); | } while(v < vterm); |
| return(ret); | |
| if (playing) { | |
| *samples = size; | |
| pos = 0; | |
| do { | |
| buf[pos*2+0] >>= (SAMP_SHIFT + 1); | |
| buf[pos*2+1] >>= (SAMP_SHIFT + 1); | |
| } while(++pos < size); | |
| return(buf); | |
| } | |
| moget_err: | |
| return(NULL); | |
| } | } |
| static UINT VERMOUTHCL preparepcm(MIDIHDL hdl, UINT size) | VEXTERN const SINT32 * VEXPORT midiout_get(MIDIHDL hdl, UINT *samples) { |
| { | |
| UINT step; | UINT size; |
| VOICE v; | |
| VOICE vterm; | |
| SINT32 *buf; | SINT32 *buf; |
| SAMPLE src; | SINT32 *bufterm; |
| SAMPLE srcterm; | |
| UINT cnt; | if ((hdl == NULL) || (samples == NULL)) { |
| UINT pos; | goto moget_err; |
| UINT rem; | } |
| size = *samples; | |
| if (size == 0) { | |
| goto moget_err; | |
| } | |
| size = preparepcm(hdl, size); | |
| if (size == 0) { | |
| goto moget_err; | |
| } | |
| step = min(size, hdl->worksize); | *samples = size; |
| buf = hdl->sampbuf; | buf = hdl->sampbuf; |
| ZeroMemory(buf, step * 2 * sizeof(SINT32)); | bufterm = buf + (size * 2); |
| v = VOICEHDLPTR(hdl); | |
| vterm = VOICEHDLEND(hdl); | |
| do { | do { |
| if (v->phase != VOICE_FREE) { | buf[0] >>= (SAMP_SHIFT + 1); |
| cnt = step; | buf[1] >>= (SAMP_SHIFT + 1); |
| if (v->phase & VOICE_REL) { | buf += 2; |
| voice_setfree(v); | } while(buf < bufterm); |
| if (cnt > REL_COUNT) { | return(hdl->sampbuf); |
| cnt = REL_COUNT; | |
| } | moget_err: |
| } | return(NULL); |
| if (v->flag & VOICE_FIXPITCH) { | |
| pos = v->samppos >> FREQ_SHIFT; | |
| src = v->sample->data + pos; | |
| rem = (v->sample->datasize >> FREQ_SHIFT) - pos; | |
| if (cnt < rem) { | |
| v->samppos += cnt << FREQ_SHIFT; | |
| srcterm = src + cnt; | |
| } | |
| else { | |
| voice_setfree(v); | |
| srcterm = src + rem; | |
| } | |
| } | |
| else { | |
| src = hdl->resampbuf; | |
| srcterm = v->resamp(v, src, src + cnt); | |
| } | |
| if (src != srcterm) { | |
| v->mix(v, buf, src, srcterm); | |
| } | |
| } | |
| v++; | |
| } while(v < vterm); | |
| return(step); | |
| } | } |
| VEXTERN UINT VEXPORT midiout_get16(MIDIHDL hdl, SINT16 *pcm, UINT size) { | VEXTERN UINT VEXPORT midiout_get16(MIDIHDL hdl, SINT16 *pcm, UINT size) { |
| UINT step; | UINT step; |
| VOICE v; | |
| VOICE vterm; | |
| SINT32 *buf; | SINT32 *buf; |
| SAMPLE src; | |
| SAMPLE srcterm; | |
| UINT cnt; | |
| UINT pos; | |
| UINT rem; | |
| SINT32 l; | SINT32 l; |
| SINT32 r; | SINT32 r; |
| if ((hdl != NULL) && (size)) { | if (hdl != NULL) { |
| do { | while(size) { |
| step = min(size, hdl->worksize); | step = preparepcm(hdl, size); |
| if (step == 0) { | |
| break; | |
| } | |
| size -= step; | size -= step; |
| buf = hdl->sampbuf; | buf = hdl->sampbuf; |
| ZeroMemory(buf, step * 2 * sizeof(SINT32)); | |
| v = VOICEHDLPTR(hdl); | |
| vterm = VOICEHDLEND(hdl); | |
| do { | |
| if (v->phase != VOICE_FREE) { | |
| cnt = step; | |
| if (v->phase & VOICE_REL) { | |
| voice_setfree(v); | |
| if (cnt > REL_COUNT) { | |
| cnt = REL_COUNT; | |
| } | |
| } | |
| if (v->flag & VOICE_FIXPITCH) { | |
| pos = v->samppos >> FREQ_SHIFT; | |
| src = v->sample->data + pos; | |
| rem = (v->sample->datasize >> FREQ_SHIFT) - pos; | |
| if (cnt < rem) { | |
| v->samppos += cnt << FREQ_SHIFT; | |
| srcterm = src + cnt; | |
| } | |
| else { | |
| voice_setfree(v); | |
| srcterm = src + rem; | |
| } | |
| } | |
| else { | |
| src = hdl->resampbuf; | |
| srcterm = v->resamp(v, src, src + cnt); | |
| } | |
| if (src != srcterm) { | |
| v->mix(v, buf, src, srcterm); | |
| } | |
| } | |
| v++; | |
| } while(v < vterm); | |
| do { | do { |
| l = pcm[0]; | l = pcm[0]; |
| r = pcm[1]; | r = pcm[1]; |
| Line 1267 VEXTERN UINT VEXPORT midiout_get16(MIDIH | Line 1189 VEXTERN UINT VEXPORT midiout_get16(MIDIH |
| buf += 2; | buf += 2; |
| pcm += 2; | pcm += 2; |
| } while(--step); | } while(--step); |
| } while(size); | } |
| } | } |
| return(0);} | return(0); |
| } | |
| VEXTERN UINT VEXPORT midiout_get32(MIDIHDL hdl, SINT32 *pcm, UINT size) { | VEXTERN UINT VEXPORT midiout_get32(MIDIHDL hdl, SINT32 *pcm, UINT size) { |
| UINT step; | UINT step; |
| VOICE v; | |
| VOICE vterm; | |
| SINT32 *buf; | SINT32 *buf; |
| SAMPLE src; | |
| SAMPLE srcterm; | |
| UINT cnt; | |
| UINT pos; | |
| UINT rem; | |
| if ((hdl != NULL) && (size)) { | if (hdl != NULL) { |
| do { | while(size) { |
| step = preparepcm(hdl, size); | |
| step = min(size, hdl->worksize); | if (step == 0) { |
| break; | |
| } | |
| size -= step; | size -= step; |
| buf = hdl->sampbuf; | buf = hdl->sampbuf; |
| ZeroMemory(buf, step * 2 * sizeof(SINT32)); | |
| v = VOICEHDLPTR(hdl); | |
| vterm = VOICEHDLEND(hdl); | |
| do { | |
| if (v->phase != VOICE_FREE) { | |
| cnt = step; | |
| if (v->phase & VOICE_REL) { | |
| voice_setfree(v); | |
| if (cnt > REL_COUNT) { | |
| cnt = REL_COUNT; | |
| } | |
| } | |
| if (v->flag & VOICE_FIXPITCH) { | |
| pos = v->samppos >> FREQ_SHIFT; | |
| src = v->sample->data + pos; | |
| rem = (v->sample->datasize >> FREQ_SHIFT) - pos; | |
| if (cnt < rem) { | |
| v->samppos += cnt << FREQ_SHIFT; | |
| srcterm = src + cnt; | |
| } | |
| else { | |
| voice_setfree(v); | |
| srcterm = src + rem; | |
| } | |
| } | |
| else { | |
| src = hdl->resampbuf; | |
| srcterm = v->resamp(v, src, src + cnt); | |
| } | |
| if (src != srcterm) { | |
| v->mix(v, buf, src, srcterm); | |
| } | |
| } | |
| v++; | |
| } while(v < vterm); | |
| do { | do { |
| pcm[0] += buf[0] >> (SAMP_SHIFT + 1); | pcm[0] += buf[0] >> (SAMP_SHIFT + 1); |
| pcm[1] += buf[1] >> (SAMP_SHIFT + 1); | pcm[1] += buf[1] >> (SAMP_SHIFT + 1); |
| buf += 2; | buf += 2; |
| pcm += 2; | pcm += 2; |
| } while(--step); | } while(--step); |
| } while(size); | } |
| } | } |
| return(0); | return(0); |
| } | } |