int YMF262_sh_start(const struct MachineSound *msound) { int i,chip; int rate = Machine->sample_rate; intf_262 = msound->sound_interface; if( intf_262->num > MAX_262 ) return 1; if (options.use_filter) rate = intf_262->baseclock/288; /* Timer state clear */ memset(Timer_262,0,sizeof(Timer_262)); /* stream system initialize */ if ( YMF262Init(intf_262->num,intf_262->baseclock,rate) != 0) return 1; for (chip = 0;chip < intf_262->num; chip++) { int mixed_vol; int vol[4]; /* four separate outputs */ char buf[4][40]; const char *name[4]; mixed_vol = intf_262->mixing_levelAB[chip]; for (i=0; i<4; i++) { if (i==2) /*channels C ad D use separate field */ mixed_vol = intf_262->mixing_levelCD[chip]; vol[i] = mixed_vol & 0xffff; mixed_vol >>= 16; name[i] = buf[i]; sprintf(buf[i],"%s #%d ch%c",sound_name(msound),chip,'A'+i); logerror("%s #%d ch%c vol %d\n",sound_name(msound),chip,'A'+i,mixed_vol); } stream_262[chip] = stream_init_multi(4,name,vol,rate,chip,YMF262UpdateOne); /* YMF262 setup */ YMF262SetTimerHandler (chip, TimerHandler_262, chip*2); YMF262SetIRQHandler (chip, IRQHandler_262, chip); YMF262SetUpdateHandler(chip, stream_update, stream_262[chip]); Timer_262[chip*2+0] = timer_alloc(timer_callback_262); Timer_262[chip*2+1] = timer_alloc(timer_callback_262); } return 0; }
int YM2203_sh_start(const struct MachineSound *msound) { int i; if (AY8910_sh_start_ym(msound)) return 1; intf = msound->sound_interface; /* Timer Handler set */ FMTimerInit(); /* stream system initialize */ for (i = 0;i < intf->num;i++) { int volume; char name[20]; sprintf(name,"%s #%d FM",sound_name(msound),i); volume = intf->mixing_level[i]>>16; /* high 16 bit */ stream[i] = stream_init(name,volume,Machine->sample_rate,i,YM2203UpdateOne/*YM2203UpdateCallback*/); } /* Initialize FM emurator */ if (YM2203Init(intf->num,intf->baseclock,Machine->sample_rate,TimerHandler,IRQHandler) == 0) { /* Ready */ return 0; } /* error */ /* stream close */ return 1; }
int namco_52xx_sh_start(const struct MachineSound *msound) { int i; unsigned char bits; intf = msound->sound_interface; rom = memory_region(intf->region); rom_len = memory_region_length(intf->region); channel = mixer_allocate_channel(intf->mixing_level); mixer_set_name(channel,sound_name(msound)); samples = auto_malloc(2*rom_len); if (!samples) return 1; /* decode the rom samples */ for (i = 0;i < rom_len;i++) { bits = rom[i] & 0x0f; samples[2*i] = SAMPLE_CONV4(bits); bits = (rom[i] & 0xf0) >> 4; samples[2*i + 1] = SAMPLE_CONV4(bits); } return 0; }
int Y8950_sh_start(const struct MachineSound *msound) { int i; int rate = Machine->sample_rate; intf_8950 = msound->sound_interface; if( intf_8950->num > MAX_8950 ) return 1; if (1) //options.use_filter) // sure, use oversample rate = intf_8950->baseclock/72; /* Timer state clear */ memset(Timer_8950,0,sizeof(Timer_8950)); /* stream system initialize */ if ( Y8950Init(intf_8950->num,intf_8950->baseclock,rate) != 0) return 1; for (i = 0;i < intf_8950->num;i++) { /* stream setup */ char name[40]; int vol = intf_8950->mixing_level[i]; /* stream setup */ sprintf(name,"%s #%d",sound_name(msound),i); /* ADPCM ROM data */ Y8950SetDeltaTMemory(i, (void *)(memory_region(intf_8950->rom_region[i])), memory_region_length(intf_8950->rom_region[i]) ); stream_8950[i] = stream_init(name,vol,rate,i,Y8950UpdateOne); /* port and keyboard handler */ Y8950SetPortHandler(i, Y8950PortHandler_w, Y8950PortHandler_r, i); Y8950SetKeyboardHandler(i, Y8950KeyboardHandler_w, Y8950KeyboardHandler_r, i); /* Y8950 setup */ Y8950SetTimerHandler (i, TimerHandler_8950, i*2); Y8950SetIRQHandler (i, IRQHandler_8950, i); Y8950SetUpdateHandler(i, stream_update, stream_8950[i]); Timer_8950[i*2+0] = timer_alloc(timer_callback_8950); Timer_8950[i*2+1] = timer_alloc(timer_callback_8950); } return 0; }
int YM2610_sh_start(const struct MachineSound *msound) { int i,j; int rate = Machine->sample_rate; char buf[YM2610_NUMBUF][40]; const char *name[YM2610_NUMBUF]; int mixed_vol,vol[YM2610_NUMBUF]; void *pcmbufa[YM2610_NUMBUF],*pcmbufb[YM2610_NUMBUF]; int pcmsizea[YM2610_NUMBUF],pcmsizeb[YM2610_NUMBUF]; intf = msound->sound_interface; if( intf->num > MAX_2610 ) return 1; if (AY8910_sh_start(msound)) return 1; /* Timer Handler set */ FMTimerInit(); /* stream system initialize */ for (i = 0;i < intf->num;i++) { /* stream setup */ mixed_vol = intf->volumeFM[i]; /* stream setup */ for (j = 0 ; j < YM2610_NUMBUF ; j++) { name[j]=buf[j]; vol[j] = mixed_vol & 0xffff; mixed_vol>>=16; sprintf(buf[j],"%s #%d Ch%d",sound_name(msound),i,j+1); } stream[i] = stream_init_multi(YM2610_NUMBUF,name,vol,rate,i,YM2610UpdateOne); /* setup adpcm buffers */ pcmbufa[i] = (void *)(memory_region(intf->pcmroma[i])); pcmsizea[i] = memory_region_length(intf->pcmroma[i]); pcmbufb[i] = (void *)(memory_region(intf->pcmromb[i])); pcmsizeb[i] = memory_region_length(intf->pcmromb[i]); } /**** initialize YM2610 ****/ if (YM2610Init(intf->num,intf->baseclock,rate, pcmbufa,pcmsizea,pcmbufb,pcmsizeb, TimerHandler,IRQHandler) == 0) return 0; /* error */ return 1; }
int AY8910_sh_start(const struct MachineSound *msound) { int chip; const struct AY8910interface *intf = msound->sound_interface; num = intf->num; for (chip = 0;chip < num;chip++) { if (AY8910_init(sound_name(msound),chip+ym_num,intf->baseclock, intf->mixing_level[chip] & 0xffff, Machine->sample_rate, intf->portAread[chip],intf->portBread[chip], intf->portAwrite[chip],intf->portBwrite[chip]) != 0) return 1; build_mixer_table(chip+ym_num); } return 0; }
int YM3812_sh_start(const struct MachineSound *msound) { int i; int rate = Machine->sample_rate; intf_3812 = msound->sound_interface; if( intf_3812->num > MAX_3812 ) return 1; if (options.use_filter) rate = intf_3812->baseclock/72; /* Timer state clear */ memset(Timer_3812,0,sizeof(Timer_3812)); /* stream system initialize */ if ( YM3812Init(intf_3812->num,intf_3812->baseclock,rate) != 0) return 1; for (i = 0;i < intf_3812->num;i++) { /* stream setup */ char name[40]; int vol = intf_3812->mixing_level[i]; /* emulator create */ /* stream setup */ sprintf(name,"%s #%d",sound_name(msound),i); stream_3812[i] = stream_init(name,vol,rate,i,YM3812UpdateOne); /* YM3812 setup */ YM3812SetTimerHandler (i, TimerHandler_3812, i*2); YM3812SetIRQHandler (i, IRQHandler_3812, i); YM3812SetUpdateHandler(i, stream_update, stream_3812[i]); Timer_3812[i*2+0] = timer_alloc(timer_callback_3812); Timer_3812[i*2+1] = timer_alloc(timer_callback_3812); } return 0; }
int YM2612_sh_start(const struct MachineSound *msound) { int i,j; int rate = Machine->sample_rate; char buf[YM2612_NUMBUF][40]; const char *name[YM2612_NUMBUF]; intf = msound->sound_interface; if( intf->num > MAX_2612 ) return 1; /* FM init */ /* Timer Handler set */ FMTimerInit(); /* stream system initialize */ for (i = 0;i < intf->num;i++) { int vol[YM2612_NUMBUF]; /* stream setup */ int mixed_vol = intf->mixing_level[i]; /* stream setup */ for (j = 0 ; j < YM2612_NUMBUF ; j++) { vol[j] = mixed_vol&0xffff; name[j] = buf[j]; mixed_vol >>= 16; sprintf(buf[j],"%s #%d Ch%d",sound_name(msound), i, j+1 ); } stream[i] = stream_init_multi(YM2612_NUMBUF, name,vol,rate, i,YM2612UpdateOne); } /**** initialize YM2612 ****/ if (YM2612Init(intf->num,intf->baseclock,rate,TimerHandler,IRQHandler) == 0) return 0; /* error */ return 1; }
int qsound_sh_start(const struct MachineSound *msound) { int i; if (Machine->sample_rate == 0) return 0; intf = msound->sound_interface; qsound_sample_rom = (QSOUND_SRC_SAMPLE *)memory_region(intf->region); memset(qsound_channel, 0, sizeof(qsound_channel)); #if QSOUND_DRIVER1 qsound_frq_ratio = ((float)intf->clock / (float)QSOUND_CLOCKDIV) / (float) Machine->sample_rate; qsound_frq_ratio *= 16.0; /* Create pan table */ for (i=0; i<33; i++) { 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 ", qsound_pan_table[i]); #endif { /* 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 ); } #if LOG_WAVE fpRawDataR=fopen("qsoundr.raw", "w+b"); fpRawDataL=fopen("qsoundl.raw", "w+b"); if (!fpRawDataR || !fpRawDataL) { return 1; } #endif return 0; }
static int my_YM2151_sh_start(const struct MachineSound *msound,int mode) { int i,j; int rate = Machine->sample_rate; char buf[YM2151_NUMBUF][40]; const char *name[YM2151_NUMBUF]; int mixed_vol,vol[YM2151_NUMBUF]; if( rate == 0 ) rate = 1000; /* kludge to prevent nasty crashes */ intf = msound->sound_interface; if( mode ) FMMode = CHIP_YM2151_ALT; else FMMode = CHIP_YM2151_DAC; switch(FMMode) { #if (HAS_YM2151) case CHIP_YM2151_DAC: /* Tatsuyuki's */ /* stream system initialize */ for (i = 0;i < intf->num;i++) { mixed_vol = intf->volume[i]; /* stream setup */ for (j = 0 ; j < YM2151_NUMBUF ; j++) { name[j]=buf[j]; vol[j] = mixed_vol & 0xffff; mixed_vol>>=16; sprintf(buf[j],"%s #%d Ch%d",sound_name(msound),i,j+1); } stream[i] = stream_init_multi(YM2151_NUMBUF, name,vol,rate,i,OPMUpdateOne); } /* Set Timer handler */ for (i = 0; i < intf->num; i++) { Timer[i][0] = timer_alloc(timer_callback_2151); Timer[i][1] = timer_alloc(timer_callback_2151); } if (OPMInit(intf->num,intf->baseclock,Machine->sample_rate,TimerHandler,IRQHandler) == 0) { /* set port handler */ for (i = 0; i < intf->num; i++) OPMSetPortHander(i,intf->portwritehandler[i]); return 0; } /* error */ return 1; #endif #if (HAS_YM2151_ALT) case CHIP_YM2151_ALT: /* Jarek's */ if (options.use_filter) rate = intf->baseclock/64; /* stream system initialize */ for (i = 0;i < intf->num;i++) { /* stream setup */ mixed_vol = intf->volume[i]; for (j = 0 ; j < YM2151_NUMBUF ; j++) { name[j]=buf[j]; vol[j] = mixed_vol & 0xffff; mixed_vol>>=16; sprintf(buf[j],"%s #%d Ch%d",sound_name(msound),i,j+1); } stream[i] = stream_init_multi(YM2151_NUMBUF, name,vol,rate,i,YM2151UpdateOne); } if (YM2151Init(intf->num,intf->baseclock,rate) == 0) { for (i = 0; i < intf->num; i++) { YM2151SetIrqHandler(i,intf->irqhandler[i]); YM2151SetPortWriteHandler(i,intf->portwritehandler[i]); } return 0; } return 1; #endif } return 1; }
int YM2608_sh_start(const struct MachineSound *msound) { int i,j; int rate = Machine->sample_rate; char buf[YM2608_NUMBUF][40]; const char *name[YM2608_NUMBUF]; int mixed_vol,vol[YM2608_NUMBUF]; void *pcmbufa[YM2608_NUMBUF]; int pcmsizea[YM2608_NUMBUF]; int rhythm_pos[6+1]; struct GameSamples *psSamples; int total_size,r_offset,s_size; intf = (const struct YM2608interface *)msound->sound_interface; if( intf->num > MAX_2608 ) return 1; if (AY8910_sh_start(msound)) return 1; /* Timer Handler set */ FMTimerInit(); /* stream system initialize */ for (i = 0;i < intf->num;i++) { /* stream setup */ mixed_vol = intf->volumeFM[i]; /* stream setup */ for (j = 0 ; j < YM2608_NUMBUF ; j++) { name[j]=buf[j]; vol[j] = mixed_vol & 0xffff; mixed_vol>>=16; sprintf(buf[j],"%s #%d Ch%d",sound_name(msound),i,j+1); } stream[i] = stream_init_multi(YM2608_NUMBUF,name,vol,rate,i,YM2608UpdateOne); /* setup adpcm buffers */ pcmbufa[i] = (void *)(memory_region(intf->pcmrom[i])); pcmsizea[i] = memory_region_length(intf->pcmrom[i]); } /* rythm rom build */ rhythm_buf = 0; #ifdef YM2608_USE_SAMPLES psSamples = readsamples(ym2608_pDrumNames,"ym2608"); #else psSamples = 0; #endif if( psSamples ) { /* calcrate total data size */ total_size = 0; for( i=0;i<6;i++) { s_size = psSamples->sample[i]->length; total_size += s_size ? s_size : 1; } /* aloocate rythm data */ rhythm_buf = (short int*)malloc(total_size * sizeof(signed short)); if( rhythm_buf==0 ) return 0; r_offset = 0; /* merge sampling data */ for(i=0;i<6;i++) { /* set start point */ rhythm_pos[i] = r_offset*2; /* copy sample data */ s_size = psSamples->sample[i]->length; if(s_size && psSamples->sample[i]->data) { if( psSamples->sample[i]->resolution==16 ) { signed short *s_ptr = (signed short *)psSamples->sample[i]->data; for(j=0;j<s_size;j++) rhythm_buf[r_offset++] = *s_ptr++; }else{ signed char *s_ptr = (signed char *)psSamples->sample[i]->data; for(j=0;j<s_size;j++) rhythm_buf[r_offset++] = (*s_ptr++)*0x0101; } }else rhythm_buf[r_offset++] = 0; /* set end point */ rhythm_pos[i+1] = r_offset*2; } freesamples( psSamples ); }else { /* aloocate rythm data */ rhythm_buf = (short int*)malloc(6 * sizeof(signed short)); if( rhythm_buf==0 ) return 0; for(i=0;i<6;i++) { /* set start point */ rhythm_pos[i] = i*2; rhythm_buf[i] = 0; /* set end point */ rhythm_pos[i+1] = (i+1)*2; } } /**** initialize YM2608 ****/ if (YM2608Init(intf->num,intf->baseclock,rate, pcmbufa,pcmsizea,rhythm_buf,rhythm_pos, TimerHandler,IRQHandler) == 0) return 0; /* error */ return 1; }