📄 sound.c
字号:
sound_frequency); \ \ gs->frequency_step = frequency_step; \ gs->rate = rate; \ \ sweep_ticks = gs->sweep_initial_ticks; \ } \ gs->sweep_ticks = sweep_ticks; \ } \#define update_tone_nosweep() \#define update_tone_envelope() \ if(gs->envelope_status) \ { \ u32 envelope_ticks = gs->envelope_ticks - 1; \ envelope_volume = gs->envelope_volume; \ \ if(envelope_ticks == 0) \ { \ if(gs->envelope_direction) \ { \ if(envelope_volume != 15) \ envelope_volume = gs->envelope_volume + 1; \ } \ else \ { \ if(envelope_volume != 0) \ envelope_volume = gs->envelope_volume - 1; \ } \ \ update_volume(envelope); \ \ gs->envelope_volume = envelope_volume; \ gs->envelope_ticks = gs->envelope_initial_ticks; \ } \ else \ { \ gs->envelope_ticks = envelope_ticks; \ } \ } \#define update_tone_noenvelope() \#define gbc_sound_synchronize() \ while(((gbc_sound_buffer_index - sound_buffer_base) % BUFFER_SIZE) > \ (audio_buffer_size * 2)) \ { \ SDL_CondWait(sound_cv, sound_mutex); \ } \#define update_tone_counters(envelope_op, sweep_op) \ tick_counter += gbc_sound_tick_step; \ if(tick_counter > 0xFFFF) \ { \ if(gs->length_status) \ { \ u32 length_ticks = gs->length_ticks - 1; \ gs->length_ticks = length_ticks; \ \ if(length_ticks == 0) \ { \ gs->active_flag = 0; \ break; \ } \ } \ \ update_tone_##envelope_op(); \ update_tone_##sweep_op(); \ \ tick_counter &= 0xFFFF; \ } \#define gbc_sound_render_sample_right() \ sound_buffer[buffer_index + 1] += (current_sample * volume_right) >> 22 \#define gbc_sound_render_sample_left() \ sound_buffer[buffer_index] += (current_sample * volume_left) >> 22 \#define gbc_sound_render_sample_both() \ gbc_sound_render_sample_right(); \ gbc_sound_render_sample_left() \#define gbc_sound_render_samples(type, sample_length, envelope_op, sweep_op) \ for(i = 0; i < buffer_ticks; i++) \ { \ current_sample = \ sample_data[fp16_16_to_u32(sample_index) % sample_length]; \ gbc_sound_render_sample_##type(); \ \ sample_index += frequency_step; \ buffer_index = (buffer_index + 2) % BUFFER_SIZE; \ \ update_tone_counters(envelope_op, sweep_op); \ } \#define gbc_noise_wrap_full 32767#define gbc_noise_wrap_half 126#define get_noise_sample_full() \ current_sample = \ ((s32)(noise_table15[fp16_16_to_u32(sample_index) >> 5] << \ (fp16_16_to_u32(sample_index) & 0x1F)) >> 31) & 0x0F \#define get_noise_sample_half() \ current_sample = \ ((s32)(noise_table7[fp16_16_to_u32(sample_index) >> 5] << \ (fp16_16_to_u32(sample_index) & 0x1F)) >> 31) & 0x0F \#define gbc_sound_render_noise(type, noise_type, envelope_op, sweep_op) \ for(i = 0; i < buffer_ticks; i++) \ { \ get_noise_sample_##noise_type(); \ gbc_sound_render_sample_##type(); \ \ sample_index += frequency_step; \ \ if(sample_index >= u32_to_fp16_16(gbc_noise_wrap_##noise_type)) \ sample_index -= u32_to_fp16_16(gbc_noise_wrap_##noise_type); \ \ buffer_index = (buffer_index + 2) % BUFFER_SIZE; \ update_tone_counters(envelope_op, sweep_op); \ } \#define gbc_sound_render_channel(type, sample_length, envelope_op, sweep_op) \ buffer_index = gbc_sound_buffer_index; \ sample_index = gs->sample_index; \ frequency_step = gs->frequency_step; \ tick_counter = gs->tick_counter; \ \ update_volume(envelope_op); \ \ switch(gs->status) \ { \ case GBC_SOUND_INACTIVE: \ break; \ \ case GBC_SOUND_LEFT: \ gbc_sound_render_##type(left, sample_length, envelope_op, sweep_op); \ break; \ \ case GBC_SOUND_RIGHT: \ gbc_sound_render_##type(right, sample_length, envelope_op, sweep_op); \ break; \ \ case GBC_SOUND_LEFTRIGHT: \ gbc_sound_render_##type(both, sample_length, envelope_op, sweep_op); \ break; \ } \ \ gs->sample_index = sample_index; \ gs->tick_counter = tick_counter; \#define gbc_sound_load_wave_ram(bank) \ wave_bank = wave_samples + (bank * 32); \ for(i = 0, i2 = 0; i < 16; i++, i2 += 2) \ { \ current_sample = wave_ram[i]; \ wave_bank[i2] = (((current_sample >> 4) & 0x0F) - 8); \ wave_bank[i2 + 1] = ((current_sample & 0x0F) - 8); \ } \void synchronize_sound(){ SDL_LockMutex(sound_mutex); gbc_sound_synchronize(); SDL_UnlockMutex(sound_mutex);}void update_gbc_sound(u32 cpu_ticks){ fixed16_16 buffer_ticks = float_to_fp16_16(((float)(cpu_ticks - gbc_sound_last_cpu_ticks) * sound_frequency) / 16777216.0); u32 i, i2; gbc_sound_struct *gs = gbc_sound_channel; fixed16_16 sample_index, frequency_step; fixed16_16 tick_counter; u32 buffer_index; s32 volume_left, volume_right; u32 envelope_volume; s32 current_sample; u32 sound_status = address16(io_registers, 0x84) & 0xFFF0; s8 *sample_data; s8 *wave_bank; u8 *wave_ram = ((u8 *)io_registers) + 0x90; gbc_sound_partial_ticks += fp16_16_fractional_part(buffer_ticks); buffer_ticks = fp16_16_to_u32(buffer_ticks); if(gbc_sound_partial_ticks > 0xFFFF) { buffer_ticks += 1; gbc_sound_partial_ticks &= 0xFFFF; } SDL_LockMutex(sound_mutex); if(synchronize_flag) { if(((gbc_sound_buffer_index - sound_buffer_base) % BUFFER_SIZE) > (audio_buffer_size * 3 / 2)) { while(((gbc_sound_buffer_index - sound_buffer_base) % BUFFER_SIZE) > (audio_buffer_size * 3 / 2)) { SDL_CondWait(sound_cv, sound_mutex); }#ifdef PSP_BUILD if(current_frameskip_type == auto_frameskip) { sceDisplayWaitVblankStart(); real_frame_count = 0; virtual_frame_count = 0; }#endif } } if(sound_on == 1) { gs = gbc_sound_channel + 0; if(gs->active_flag) { sound_status |= 0x01; sample_data = gs->sample_data; envelope_volume = gs->envelope_volume; gbc_sound_render_channel(samples, 8, envelope, sweep); } gs = gbc_sound_channel + 1; if(gs->active_flag) { sound_status |= 0x02; sample_data = gs->sample_data; envelope_volume = gs->envelope_volume; gbc_sound_render_channel(samples, 8, envelope, nosweep); } gs = gbc_sound_channel + 2; if(gbc_sound_wave_update) { if(gs->wave_bank == 1) { gbc_sound_load_wave_ram(1); } else { gbc_sound_load_wave_ram(0); } gbc_sound_wave_update = 0; } if((gs->active_flag) && (gs->master_enable)) { sound_status |= 0x04; sample_data = wave_samples;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -