X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=sound.c;h=01d61e20e9e1fd136b2c3a2070ce8180e20f3526;hb=eb3668fc5dab138073cd4844208ac05b94086a4a;hp=55985fce4fe394af96cb386e365e4f31f4f5c1f0;hpb=2823a4c8196a02da86ee180cf55586d4e8c91a2f;p=gpsp.git diff --git a/sound.c b/sound.c index 55985fc..01d61e2 100644 --- a/sound.c +++ b/sound.c @@ -25,20 +25,16 @@ u32 global_enable_audio = 1; direct_sound_struct direct_sound_channel[2]; gbc_sound_struct gbc_sound_channel[4]; -#if defined(GP2X_BUILD) || defined(TAVI_BUILD) u32 sound_frequency = 44100; -#else -u32 sound_frequency = 44100; -#endif SDL_AudioSpec sound_settings; SDL_mutex *sound_mutex; SDL_cond *sound_cv; -#ifndef PSP_BUILD -u32 audio_buffer_size_number = 7; -#else +#ifdef PSP_BUILD u32 audio_buffer_size_number = 1; +#else +u32 audio_buffer_size_number = 8; #endif u32 audio_buffer_size; @@ -49,6 +45,8 @@ u32 sound_buffer_base = 0; u32 sound_last_cpu_ticks = 0; fixed16_16 gbc_sound_tick_step; +u32 sound_exit_flag; + // Queue 1, 2, or 4 samples to the top of the DS FIFO, wrap around circularly #define sound_timer_queue(size, value) \ @@ -485,13 +483,10 @@ void update_gbc_sound(u32 cpu_ticks) real_frame_count = 0; virtual_frame_count = 0; } -#endif - -/* - -#ifdef GP2X_BUILD +#else if(current_frameskip_type == auto_frameskip) { +/* u64 current_ticks; u64 next_ticks; get_ticks_us(¤t_ticks); @@ -500,12 +495,13 @@ void update_gbc_sound(u32 cpu_ticks) delay_us(next_ticks - current_ticks); get_ticks_us(&frame_count_initial_timestamp); - real_frame_count = 0; - virtual_frame_count = 0; +*/ + /* prevent frameskip, or it will cause more audio, + * then more waiting here, then frame skip again, ... */ + num_skipped_frames = 100; } #endif -*/ } } if(sound_on == 1) @@ -579,13 +575,13 @@ void update_gbc_sound(u32 cpu_ticks) address16(io_registers, 0x84) = sound_status; - SDL_CondSignal(sound_cv); - - SDL_UnlockMutex(sound_mutex); - gbc_sound_last_cpu_ticks = cpu_ticks; gbc_sound_buffer_index = (gbc_sound_buffer_index + (buffer_ticks * 2)) % BUFFER_SIZE; + + SDL_UnlockMutex(sound_mutex); + + SDL_CondSignal(sound_cv); } #define sound_copy_normal() \ @@ -628,7 +624,7 @@ void sound_callback(void *userdata, Uint8 *stream, int length) SDL_LockMutex(sound_mutex); while(((gbc_sound_buffer_index - sound_buffer_base) % BUFFER_SIZE) < - length) + length && !sound_exit_flag) { SDL_CondWait(sound_cv, sound_mutex); } @@ -748,18 +744,18 @@ void sound_exit() gbc_sound_buffer_index = (sound_buffer_base + audio_buffer_size) % BUFFER_SIZE; SDL_PauseAudio(1); + sound_exit_flag = 1; SDL_CondSignal(sound_cv); + SDL_CloseAudio(); } void init_sound() { #ifdef PSP_BUILD audio_buffer_size = (audio_buffer_size_number * 1024) + 3072; -#elif defined(TAVI_BUILD) || defined(ARM_ARCH) +#else audio_buffer_size = 16 << audio_buffer_size_number; // audio_buffer_size = 16384; -#else - audio_buffer_size = 16384; #endif SDL_AudioSpec desired_spec = @@ -783,10 +779,19 @@ void init_sound() reset_sound(); - SDL_OpenAudio(&desired_spec, &sound_settings); - sound_frequency = sound_settings.freq; sound_mutex = SDL_CreateMutex(); sound_cv = SDL_CreateCond(); + + SDL_OpenAudio(&desired_spec, &sound_settings); + sound_frequency = sound_settings.freq; + audio_buffer_size = sound_settings.size; + u32 i = audio_buffer_size / 16; + for (audio_buffer_size_number = 0; i && (i & 1) == 0; i >>= 1) + audio_buffer_size_number++; +#ifndef PSP_BUILD + printf("audio: freq %d, size %d\n", sound_frequency, audio_buffer_size); +#endif + SDL_PauseAudio(0); }