void sound_frame( void ) { long count; if( !sound_enabled ) return; /* overlay AY sound */ sound_ay_overlay(); blip_buffer_end_frame( left_buf, machine_current->timings.tstates_per_frame ); if( sound_stereo_ay != SOUND_STEREO_AY_NONE ) { blip_buffer_end_frame( right_buf, machine_current->timings.tstates_per_frame ); /* Read left channel into even samples, right channel into odd samples: LRLRLRLRLR... */ count = blip_buffer_read_samples( left_buf, samples, sound_framesiz, 1 ); blip_buffer_read_samples( right_buf, samples + 1, count, 1 ); count <<= 1; } else { count = blip_buffer_read_samples( left_buf, samples, sound_framesiz, BLIP_BUFFER_DEF_STEREO ); } if( settings_current.sound ) sound_lowlevel_frame( samples, count ); if( movie_recording ) movie_add_sound( samples, count ); ay_change_count = 0; }
void sound_frame(void) { unsigned char *ptr; int f; if(!sound_enabled) return; //if(zx81.vsyncsound) { ptr=sound_buf+(sound_stereo?sound_fillpos*2:sound_fillpos); for(f=sound_fillpos;f<sound_framesiz;f++) { BEEPER_OLDVAL_ADJUST; *ptr++=sound_oldval; if(sound_stereo) *ptr++=sound_oldval; } } //else /* must be AY then, so `zero' buffer ready for it */ // memset(sound_buf,128,sound_framesiz*(sound_stereo+1)); if(zx81.aysound ) sound_ay_overlay(); sound_lowlevel_frame(sound_buf,sound_framesiz*(sound_stereo+1)); SoundOP_Update(sound_buf,sound_framesiz*(sound_stereo+1)); sound_oldpos=-1; sound_fillpos=0; sound_ptr=sound_buf; ay_change_count=0; }
void sound_frame( CAY8910 *_this ) { #if 0 libspectrum_signed_word *ptr, *tptr; int f, bchan; int ampl = AMPL_BEEPER; if( !sound_enabled ) return; /* fill in remaining beeper/tape sound */ ptr = sound_buf + ( sound_stereo ? sound_fillpos[0] * 2 : sound_fillpos[0] ); for( bchan = 0; bchan < 2; bchan++ ) { for( f = sound_fillpos[ bchan ]; f < sound_generator_framesiz; f++ ) SOUND_WRITE_BUF( bchan, ptr, sound_oldval[ bchan ] ); ptr = tape_buf + sound_fillpos[1]; ampl = AMPL_TAPE; } /* overlay tape sound */ ptr = sound_buf; tptr = tape_buf; for( f = 0; f < sound_generator_framesiz; f++, tptr++ ) { ( *ptr++ ) += *tptr; if( sound_stereo ) ( *ptr++ ) += *tptr; } #endif /* overlay AY sound */ sound_ay_overlay(_this); #ifdef HAVE_SAMPLERATE /* resample from generated frequency down to output frequency if required */ if( settings_current.sound_hifi ) sound_resample(); else #endif /* #ifdef HAVE_SAMPLERATE */ #if 0 sound_lowlevel_frame( sound_buf, sound_generator_framesiz * sound_channels ); #endif #if 0 sound_oldpos[0] = sound_oldpos[1] = -1; sound_fillpos[0] = sound_fillpos[1] = 0; #endif _this->ay_change_count = 0; }
static void sound_resample( void ) { int error; SRC_DATA data; data.data_in = convert_input_buffer; data.input_frames = sound_generator_framesiz; data.data_out = convert_output_buffer; data.output_frames = sound_framesiz; data.src_ratio = ( double ) settings_current.sound_freq / sound_generator_freq; data.end_of_input = 0; src_short_to_float_array( ( const short * ) sound_buf, convert_input_buffer, sound_generator_framesiz * sound_channels ); while( data.input_frames ) { error = src_process( src_state, &data ); if( error ) { ui_error( UI_ERROR_ERROR, "hifi sound downsample error %s", src_strerror( error ) ); sound_end(_this); return; } src_float_to_short_array( convert_output_buffer, ( short * ) sound_buf, data.output_frames_gen * sound_channels ); sound_lowlevel_frame( sound_buf, data.output_frames_gen * sound_channels ); data.data_in += data.input_frames_used * sound_channels; data.input_frames -= data.input_frames_used; } }