|
|
| version 1.2, 2004/08/05 11:46:26 | version 1.6, 2008/06/02 20:07:32 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| // #include "wavefile.h" | |
| #if !defined(DISABLE_SOUND) | |
| #include "wavefile.h" | |
| #include "dosio.h" | #include "dosio.h" |
| #include "soundmng.h" | #include "soundmng.h" |
| // #include "cpucore.h" | #include "z80core.h" |
| // #include "pccore.h" | #include "pccore.h" |
| // #include "iocore.h" | |
| #include "sound.h" | #include "sound.h" |
| #include "sndcsec.h" | #include "sndcsec.h" |
| // #include "getsnd.h" | /* #include "getsnd.h" */ |
| SOUNDCFG soundcfg; | SOUNDCFG soundcfg; |
| Line 65 static void streamprepare(UINT samples) | Line 67 static void streamprepare(UINT samples) |
| #if defined(SUPPORT_WAVEREC) | #if defined(SUPPORT_WAVEREC) |
| // ---- wave rec | /* wave rec */ |
| BOOL sound_recstart(const char *filename) { | BRESULT sound_recstart(const OEMCHAR *filename) { |
| WAVEWR rec; | WAVEWR rec; |
| Line 124 static void streamfilewrite(UINT samples | Line 126 static void streamfilewrite(UINT samples |
| else if (samp < -32768) { | else if (samp < -32768) { |
| samp = -32768; | samp = -32768; |
| } | } |
| // little endianなので satuation_s16は使えない | /* little endianなので satuation_s16は使えない */ |
| buf[i*2+0] = (UINT8)samp; | buf[i*2+0] = (UINT8)samp; |
| buf[i*2+1] = (UINT8)(samp >> 8); | buf[i*2+1] = (UINT8)(samp >> 8); |
| } | } |
| Line 164 static void filltailsample(UINT count) { | Line 166 static void filltailsample(UINT count) { |
| #endif | #endif |
| // ---- | /* ---- */ |
| BOOL sound_create(UINT rate, UINT ms) { | BRESULT sound_create(UINT rate, UINT ms) { |
| UINT samples; | UINT samples; |
| UINT reserve; | UINT reserve; |
| Line 179 BOOL sound_create(UINT rate, UINT ms) { | Line 181 BOOL sound_create(UINT rate, UINT ms) { |
| soundmng_reset(); | soundmng_reset(); |
| soundcfg.rate = rate; | soundcfg.rate = rate; |
| sound_changeclock(); | |
| #if defined(SOUNDRESERVE) | #if defined(SOUNDRESERVE) |
| reserve = rate * SOUNDRESERVE / 1000; | reserve = rate * SOUNDRESERVE / 1000; |
| Line 225 void sound_reset(void) { | Line 226 void sound_reset(void) { |
| if (sndstream.buffer) { | if (sndstream.buffer) { |
| soundmng_reset(); | soundmng_reset(); |
| streamreset(); | streamreset(); |
| soundcfg.length = 0; | soundcfg.lastclock = CPU_CLOCK; |
| // soundcfg.lastclock = CPU_CLOCK; | |
| } | } |
| } | } |
| void sound_changeclock(void) { | void sound_changeclock(void) { |
| #if 0 | |
| UINT32 clock; | UINT32 clock; |
| UINT hz; | UINT hz; |
| UINT hzmax; | UINT hzmax; |
| Line 241 void sound_changeclock(void) { | Line 240 void sound_changeclock(void) { |
| return; | return; |
| } | } |
| // とりあえず 25で割り切れる。 | /* とりあえず 25で割り切れる。 */ |
| clock = pccore.realclock / 25; | clock = pccore.realclock / 25; |
| hz = soundcfg.rate / 25; | hz = soundcfg.rate / 25; |
| // で、クロック数に合せて調整。(64bit演算しろよな的) | /* で、クロック数に合せて調整。(64bit演算しろよな的) */ |
| hzmax = (1 << (32 - 8)) / (clock >> 8); | hzmax = (1 << (32 - 8)) / (clock >> 8); |
| while(hzmax < hz) { | while(hzmax < hz) { |
| clock = (clock + 1) >> 1; | clock = (clock + 1) >> 1; |
| Line 256 void sound_changeclock(void) { | Line 255 void sound_changeclock(void) { |
| soundcfg.clockbase = clock; | soundcfg.clockbase = clock; |
| soundcfg.minclock = 2 * clock / hz; | soundcfg.minclock = 2 * clock / hz; |
| soundcfg.lastclock = CPU_CLOCK; | soundcfg.lastclock = CPU_CLOCK; |
| #endif | |
| } | } |
| void sound_streamregist(void *hdl, SOUNDCB cbfn) { | void sound_streamregist(void *hdl, SOUNDCB cbfn) { |
| Line 272 void sound_streamregist(void *hdl, SOUND | Line 270 void sound_streamregist(void *hdl, SOUND |
| } | } |
| // ---- | /* ---- */ |
| #if 0 | |
| void sound_sync(void) { | void sound_sync(void) { |
| UINT32 length; | UINT32 length; |
| Line 282 void sound_sync(void) { | Line 279 void sound_sync(void) { |
| if (sndstream.buffer == NULL) { | if (sndstream.buffer == NULL) { |
| return; | return; |
| } | } |
| length = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK - soundcfg.lastclock; | length = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK - soundcfg.lastclock; |
| if (length < soundcfg.minclock) { | if (length < soundcfg.minclock) { |
| return; | return; |
| Line 300 void sound_sync(void) { | Line 296 void sound_sync(void) { |
| #endif | #endif |
| streamprepare(length); | streamprepare(length); |
| soundcfg.lastclock += length * soundcfg.clockbase / soundcfg.hzbase; | soundcfg.lastclock += length * soundcfg.clockbase / soundcfg.hzbase; |
| beep_eventreset(); | |
| SNDCSEC_LEAVE; | |
| soundcfg.writecount += length; | |
| if (soundcfg.writecount >= 100) { | |
| soundcfg.writecount = 0; | |
| soundmng_sync(); | |
| } | |
| } | |
| #endif | |
| void sound_makesample(UINT length) { | |
| soundcfg.length += length; | |
| } | |
| void sound_sync(void) { | |
| UINT length; | |
| length = soundcfg.length; | |
| if (length == 0) { | |
| return; | |
| } | |
| if (sndstream.buffer == NULL) { | |
| return; | |
| } | |
| SNDCSEC_ENTER; | |
| #if defined(SUPPORT_WAVEREC) | |
| if (sndstream.rec) { | |
| streamfilewrite(length); | |
| } | |
| else | |
| #endif | |
| streamprepare(length); | |
| // soundcfg.lastclock += length * soundcfg.clockbase / soundcfg.hzbase; | |
| soundcfg.length = 0; | |
| SNDCSEC_LEAVE; | SNDCSEC_LEAVE; |
| soundcfg.writecount += length; | soundcfg.writecount += length; |
| Line 354 const SINT32 *sound_pcmlock(void) { | Line 313 const SINT32 *sound_pcmlock(void) { |
| const SINT32 *ret; | const SINT32 *ret; |
| if (locks) { | if (locks) { |
| // TRACEOUT(("sound pcm lock: already locked")); | /* TRACEOUT(("sound pcm lock: already locked")); */ |
| return(NULL); | return(NULL); |
| } | } |
| locks++; | locks++; |
| Line 370 const SINT32 *ret; | Line 329 const SINT32 *ret; |
| #endif | #endif |
| { | { |
| streamprepare(sndstream.remain - sndstream.reserve); | streamprepare(sndstream.remain - sndstream.reserve); |
| soundcfg.length = 0; | soundcfg.lastclock = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK; |
| // soundcfg.lastclock = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK; | |
| } | } |
| } | } |
| else { | else { |
| Line 393 void sound_pcmunlock(const SINT32 *hdl) | Line 351 void sound_pcmunlock(const SINT32 *hdl) |
| } | } |
| sndstream.ptr = sndstream.buffer + (leng * 2); | sndstream.ptr = sndstream.buffer + (leng * 2); |
| sndstream.remain = sndstream.samples + sndstream.reserve - leng; | sndstream.remain = sndstream.samples + sndstream.reserve - leng; |
| // sndstream.remain += sndstream.samples; | /* sndstream.remain += sndstream.samples; */ |
| SNDCSEC_LEAVE; | SNDCSEC_LEAVE; |
| locks--; | locks--; |
| } | } |
| } | } |
| #endif | |