⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sound.c

📁 psp上的GBA模拟器
💻 C
📖 第 1 页 / 共 3 页
字号:
       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 + -