diff options
author | Benjamin Barenblat <bbaren@mit.edu> | 2015-01-19 16:47:31 -0500 |
---|---|---|
committer | Benjamin Barenblat <bbaren@mit.edu> | 2015-01-19 16:47:31 -0500 |
commit | d9c28a178bd5fbab4b949664d9ec48c83d6df092 (patch) | |
tree | 33e25ce8d694479ceff267ec9c696982d1adf506 /plugins/ao/eng_qsf/qsound.c | |
parent | 69b7e9b21892b684d93c335bc143b3998c53ad2b (diff) |
Make DFSG-clean0.6.2+dfsgdfsg_clean
Diffstat (limited to 'plugins/ao/eng_qsf/qsound.c')
-rw-r--r-- | plugins/ao/eng_qsf/qsound.c | 442 |
1 files changed, 0 insertions, 442 deletions
diff --git a/plugins/ao/eng_qsf/qsound.c b/plugins/ao/eng_qsf/qsound.c deleted file mode 100644 index b11829d4..00000000 --- a/plugins/ao/eng_qsf/qsound.c +++ /dev/null @@ -1,442 +0,0 @@ -/*************************************************************************** - - Capcom System QSound(tm) - ======================== - - Driver by Paul Leaman (paul@vortexcomputing.demon.co.uk) - and Miguel Angel Horna (mahorna@teleline.es) - - A 16 channel stereo sample player. - - QSpace position is simulated by panning the sound in the stereo space. - - Register - 0 xxbb xx = unknown bb = start high address - 1 ssss ssss = sample start address - 2 pitch - 3 unknown (always 0x8000) - 4 loop offset from end address - 5 end - 6 master channel volume - 7 not used - 8 Balance (left=0x0110 centre=0x0120 right=0x0130) - 9 unknown (most fixed samples use 0 for this register) - - Many thanks to CAB (the author of Amuse), without whom this probably would - never have been finished. - - If anybody has some information about this hardware, please send it to me - to mahorna@teleline.es or 432937@cepsz.unizar.es. - http://teleline.terra.es/personal/mahorna - -***************************************************************************/ - -#include <math.h> -#include "cpuintrf.h" -#include "qsound.h" - -#if 0 -#if QSOUND_DRIVER2 -void setchannel(int channel,signed short *buffer,int length,int vol,int pan); -void setchloop(int channel,int loops,int loope); -void stopchan(int channel); -void calcula_mix(int channel); -#endif -#endif - -qsound_state_t *qsound_sh_start( struct QSound_interface *qsintf ) -{ - qsound_state_t *qs = malloc (sizeof (qsound_state_t)); - memset (qs, 0, sizeof (qsound_state_t)); - memcpy (&qs->intf, qsintf, sizeof (struct QSound_interface)); - - int i; - - qs->qsound_sample_rom = (QSOUND_SRC_SAMPLE *)qs->intf.sample_rom; - - memset(qs->qsound_channel, 0, sizeof(qs->qsound_channel)); - -#if QSOUND_DRIVER1 - qs->qsound_frq_ratio = ((float)qs->intf.clock / (float)QSOUND_CLOCKDIV) / - (float) 44100; - qs->qsound_frq_ratio *= 16.0; - - /* Create pan table */ - for (i=0; i<33; i++) - { - qs->qsound_pan_table[i]=(int)((256/sqrt(32)) * sqrt(i)); - } -#else - i=0; -#endif - -#if LOG_QSOUND - logerror("Pan table\n"); - for (i=0; i<33; i++) - logerror("%02x ", qs->qsound_pan_table[i]); -#endif -#if 0 - { - /* Allocate stream */ -#define CHANNELS ( 2 ) - char buf[CHANNELS][40]; - const char *name[CHANNELS]; - int vol[2]; - name[0] = buf[0]; - name[1] = buf[1]; - sprintf( buf[0], "%s L", sound_name(msound) ); - sprintf( buf[1], "%s R", sound_name(msound) ); - vol[0]=MIXER(intf->mixing_level[0], MIXER_PAN_LEFT); - vol[1]=MIXER(intf->mixing_level[1], MIXER_PAN_RIGHT); - qsound_stream = stream_init_multi( - CHANNELS, - name, - vol, - Machine->sample_rate, - 0, - qsound_update ); - } -#endif -#if LOG_WAVE - qs->fpRawDataR=fopen("qsoundr.raw", "w+b"); - qs->fpRawDataL=fopen("qsoundl.raw", "w+b"); - if (!qs->fpRawDataR || !qs->fpRawDataL) - { - return NULL; - } -#endif - - return qs; -} - -void qsound_sh_stop (qsound_state_t *qs) -{ - if (qs) { -#if LOG_WAVE - if (qs->fpRawDataR) - { - fclose(qs->fpRawDataR); - } - if (qs->fpRawDataL) - { - fclose(qs->fpRawDataL); - } -#endif - free (qs); - } -} - -void qsound_data_h_w(qsound_state_t *qs, int data) -{ - qs->qsound_data=(qs->qsound_data&0xff)|(data<<8); -} - -void qsound_data_l_w(qsound_state_t *qs, int data) -{ - qs->qsound_data=(qs->qsound_data&0xff00)|data; -} - -void qsound_cmd_w(qsound_state_t *qs, int data) -{ -// printf("QS: cmd %x, data %x\n", data, qs->qsound_data); - qsound_set_command(qs, data, qs->qsound_data); -} - -int qsound_status_r(qsound_state_t *qs) -{ - /* Port ready bit (0x80 if ready) */ - return 0x80; -} - -void qsound_set_command(qsound_state_t *qs, int data, int value) -{ - int ch=0,reg=0; - if (data < 0x80) - { - ch=data>>3; - reg=data & 0x07; - } - else - { - if (data < 0x90) - { - ch=data-0x80; - reg=8; - } - else - { - if (data >= 0xba && data < 0xca) - { - ch=data-0xba; - reg=9; - } - else - { - /* Unknown registers */ - ch=99; - reg=99; - } - } - } - - switch (reg) - { - case 0: /* Bank */ - ch=(ch+1)&0x0f; /* strange ... */ - qs->qsound_channel[ch].bank=(value&0x7f)<<16; - qs->qsound_channel[ch].bank /= LENGTH_DIV; -#ifdef MAME_DEBUG - if (!value & 0x8000) - { - char baf[40]; - sprintf(baf,"Register3=%04x",value); - usrintf_showmessage(baf); - } -#endif - - break; - case 1: /* start */ -// printf("QS: key on ch %02d\n", ch); - qs->qsound_channel[ch].address=value; - qs->qsound_channel[ch].address/=LENGTH_DIV; - break; - case 2: /* pitch */ -#if QSOUND_DRIVER1 - qs->qsound_channel[ch].pitch=(long) - ((float)value * qs->qsound_frq_ratio ); - qs->qsound_channel[ch].pitch/=LENGTH_DIV; -#else - qs->qsound_channel[ch].factor=((float) (value*(6/LENGTH_DIV)) / - (float) Machine->sample_rate)*256.0; - -#endif - if (!value) - { - /* Key off */ -// printf("QS: key off ch %02d\n", ch); - qs->qsound_channel[ch].key=0; - } - break; - case 3: /* unknown */ - qs->qsound_channel[ch].reg3=value; -#ifdef MAME_DEBUG - if (value != 0x8000) - { - char baf[40]; - sprintf(baf,"Register3=%04x",value); - usrintf_showmessage(baf); - } -#endif - break; - case 4: /* loop offset */ - qs->qsound_channel[ch].loop=value/LENGTH_DIV; - break; - case 5: /* end */ - qs->qsound_channel[ch].end=value/LENGTH_DIV; - break; - case 6: /* master volume */ - if (value==0) - { - /* Key off */ - qs->qsound_channel[ch].key=0; - } - else if (qs->qsound_channel[ch].key==0) - { - /* Key on */ - qs->qsound_channel[ch].key=1; -#if QSOUND_DRIVER1 - qs->qsound_channel[ch].offset=0; - qs->qsound_channel[ch].lastdt=0; -#else - qs->qsound_channel[ch].cursor=qs->qsound_channel[ch].address <<8 ; - qs->qsound_channel[ch].buffer=qsound_sample_rom+ - qs->qsound_channel[ch].bank; -#endif - } - qs->qsound_channel[ch].vol=value; -#if QSOUND_DRIVER2 - calcula_mix(ch); -#endif - break; - - case 7: /* unused */ -#ifdef MAME_DEBUG - { - char baf[40]; - sprintf(baf,"UNUSED QSOUND REG 7=%04x",value); - usrintf_showmessage(baf); - } -#endif - - break; - case 8: - { -#if QSOUND_DRIVER1 - int pandata=(value-0x10)&0x3f; - if (pandata > 32) - { - pandata=32; - } - qs->qsound_channel[ch].rvol=qs->qsound_pan_table[pandata]; - qs->qsound_channel[ch].lvol=qs->qsound_pan_table[32-pandata]; -#endif - qs->qsound_channel[ch].pan = value; -#if QSOUND_DRIVER2 - calcula_mix(ch); -#endif - } - break; - case 9: - qs->qsound_channel[ch].reg9=value; -/* -#ifdef MAME_DEBUG - { - char baf[40]; - sprintf(baf,"QSOUND REG 9=%04x",value); - usrintf_showmessage(baf); - } -#endif -*/ - break; - } -#if LOG_QSOUND - logerror("QSOUND WRITE %02x CH%02d-R%02d =%04x\n", data, ch, reg, value); -#endif -} - -#if QSOUND_DRIVER1 - -/* Driver 1 - based on the Amuse source */ - -void qsound_update(qsound_state_t *qs, int num, INT16 **buffer, int length ) -{ - int i,j; - int rvol, lvol, count; - struct QSOUND_CHANNEL *pC=&qs->qsound_channel[0]; - QSOUND_SRC_SAMPLE * pST; - QSOUND_SAMPLE *datap[2]; - - datap[0] = buffer[0]; - datap[1] = buffer[1]; - memset( datap[0], 0x00, length * sizeof(QSOUND_SAMPLE) ); - memset( datap[1], 0x00, length * sizeof(QSOUND_SAMPLE) ); - - - for (i=0; i<QSOUND_CHANNELS; i++) - { - if (pC->key) - { - QSOUND_SAMPLE *pOutL=datap[0]; - QSOUND_SAMPLE *pOutR=datap[1]; - pST=qs->qsound_sample_rom+pC->bank; - - rvol=(pC->rvol*pC->vol)>>(8*LENGTH_DIV); - lvol=(pC->lvol*pC->vol)>>(8*LENGTH_DIV); - - for (j=length-1; j>=0; j--) - { - count=(pC->offset)>>16; - pC->offset &= 0xffff; - if (count) - { - pC->address += count; - if (pC->address >= pC->end) - { - if (!pC->loop) - { - /* Reached the end of a non-looped sample */ - pC->key=0; - break; - } - /* Reached the end, restart the loop */ - pC->address = (pC->end - pC->loop) & 0xffff; - } - pC->lastdt = pST[pC->address]; - } - - (*pOutL) += ((pC->lastdt * lvol) >> 6); - (*pOutR) += ((pC->lastdt * rvol) >> 6); - pOutL++; - pOutR++; - pC->offset += pC->pitch; - } - } - pC++; - } - -#if LOG_WAVE - fwrite(datap[0], length*sizeof(QSOUND_SAMPLE), 1, fpRawDataL); - fwrite(datap[1], length*sizeof(QSOUND_SAMPLE), 1, fpRawDataR); -#endif -} - -#else - -/* ---------------------------------------------------------------- - QSound Sample Mixer (Slow) - Miguel Angel Horna mahorna@teleline.es - - ------------------------------------------------------------------ */ - - -void calcula_mix(int channel) -{ - int factl,factr; - struct qs->qsound_channel *pC=&qs->qsound_channel[channel]; - int vol=pC->vol>>5; - int pan=((pC->pan&0xFF)-0x10)<<3; - pC->mixl=vol; - pC->mixr=vol; - factr=pan; - factl=255-factr; - pC->mixl=(pC->mixl * factl)>>8; - pC->mixr=(pC->mixr * factr)>>8; -#if QSOUND_8BIT_SAMPLES - pC->mixl<<=8; - pC->mixr<<=8; -#endif -} - -void qsound_update(int num,void **buffer,int length) -{ - int i,j; - QSOUND_SAMPLE *bufL,*bufR, sample; - struct qs->qsound_channel *pC=qs->qsound_channel; - - memset( buffer[0], 0x00, length * sizeof(QSOUND_SAMPLE) ); - memset( buffer[1], 0x00, length * sizeof(QSOUND_SAMPLE) ); - - for(j=0;j<qs->qsound_channelS;++j) - { - bufL=(QSOUND_SAMPLE *) buffer[0]; - bufR=(QSOUND_SAMPLE *) buffer[1]; - if(pC->key) - { - for(i=0;i<length;++i) - { - int pos=pC->cursor>>8; - if(pos!=pC->lpos) /*next sample*/ - { - sample=pC->buffer[pos]; - pC->lastsaml=(sample*pC->mixl)>>8; - pC->lastsamr=(sample*pC->mixr)>>8; - pC->lpos=pos; - } - (*bufL++)+=pC->lastsaml; - (*bufR++)+=pC->lastsamr; - pC->cursor+=pC->factor; - if(pC->loop && (pC->cursor>>8) > pC->end) - { - pC->cursor=(pC->end-pC->loop)<<8; - } - else if((pC->cursor>>8) > pC->end) - pC->key=0; - } - } - pC++; - } -} -#endif - - -/**************** end of file ****************/ |