unify non-psp synchronize(), fix a few sound issues
authornotaz <notaz@pixelinis>
Sun, 4 Sep 2011 16:41:51 +0000 (19:41 +0300)
committernotaz <notaz@pixelinis>
Sun, 4 Sep 2011 17:19:07 +0000 (20:19 +0300)
..like ignoring real buffer size and not stopping sound thread on exit

gui.c
main.c
sound.c

diff --git a/gui.c b/gui.c
index 9381d6b..0184a18 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -1756,6 +1756,7 @@ u32 menu(u16 *original_screen)
   set_clock_speed();
 
   SDL_PauseAudio(0);
+  num_skipped_frames = 100;
 
   return return_value;
 }
diff --git a/main.c b/main.c
index bd66c06..b9606db 100644 (file)
--- a/main.c
+++ b/main.c
@@ -758,9 +758,7 @@ void synchronize()
 */
 }
 
-#endif
-
-#ifdef GP2X_BUILD
+#else
 
 u32 real_frame_count = 0;
 u32 virtual_frame_count = 0;
@@ -776,14 +774,11 @@ void synchronize()
   u64 time_delta;
 
   get_ticks_us(&new_ticks);
-  time_delta = new_ticks - last_screen_timestamp;
-  last_screen_timestamp = new_ticks;
 
   skip_next_frame = 0;
   virtual_frame_count++;
 
-  real_frame_count = ((new_ticks -
-    frame_count_initial_timestamp) * 3) / 50000;
+  real_frame_count = (new_ticks * 3) / 50000;
 
   if(real_frame_count >= virtual_frame_count)
   {
@@ -800,6 +795,14 @@ void synchronize()
       num_skipped_frames = 0;
     }
   }
+  else if (synchronize_flag)
+  {
+#if defined(PND_BUILD)
+    fb_wait_vsync();
+#elif !defined(GP2X_BUILD) // sleeping on GP2X is a bad idea
+    delay_us((u64)virtual_frame_count * 50000 / 3 - new_ticks + 2);
+#endif
+  }
 
   frames++;
 
@@ -840,76 +843,11 @@ void synchronize()
 
   interval_skipped_frames += skip_next_frame;
 
-  if(!synchronize_flag)
-    print_string("--FF--", 0xFFFF, 0x000, 0, 0);
-}
-
-#endif
-
-
-#ifdef PC_BUILD
-
-u32 ticks_needed_total = 0;
-float us_needed = 0.0;
-u32 frames = 0;
-const u32 frame_interval = 60;
-
-void synchronize()
-{
-  u64 new_ticks;
-  u64 time_delta;
+#if !defined(GP2X_BUILD) && !defined(PND_BUILD)
   char char_buffer[64];
-
-  get_ticks_us(&new_ticks);
-  time_delta = new_ticks - last_screen_timestamp;
-  last_screen_timestamp = new_ticks;
-  ticks_needed_total += time_delta;
-
-  skip_next_frame = 0;
-
-  if((time_delta < frame_speed) && synchronize_flag)
-  {
-    delay_us(frame_speed - time_delta);
-  }
-
-  frames++;
-
-  if(frames == frame_interval)
-  {
-    us_needed = (float)ticks_needed_total / frame_interval;
-    ticks_needed_total = 0;
-    frames = 0;
-  }
-
-  if(current_frameskip_type == manual_frameskip)
-  {
-    frameskip_counter = (frameskip_counter + 1) %
-     (frameskip_value + 1);
-    if(random_skip)
-    {
-      if(frameskip_counter != (rand() % (frameskip_value + 1)))
-        skip_next_frame = 1;
-    }
-    else
-    {
-      if(frameskip_counter)
-        skip_next_frame = 1;
-    }
-  }
-
-  if(synchronize_flag == 0)
-    print_string("--FF--", 0xFFFF, 0x000, 0, 0);
-
-  sprintf(char_buffer, "gpSP: %.1fms %.1ffps", us_needed / 1000.0,
-   1000000.0 / us_needed);
+  sprintf(char_buffer, "gpSP: %2d (%2d) fps", fps, frames_drawn);
   SDL_WM_SetCaption(char_buffer, "gpSP");
-
-/*
-    sprintf(char_buffer, "%02d %02d %06d %07d", frameskip, (u32)ms_needed,
-     ram_translation_ptr - ram_translation_cache, rom_translation_ptr -
-     rom_translation_cache);
-    print_string(char_buffer, 0xFFFF, 0x0000, 0, 0);
-*/
+#endif
 }
 
 #endif
diff --git a/sound.c b/sound.c
index 81a0a8d..01d61e2 100644 (file)
--- a/sound.c
+++ b/sound.c
@@ -31,10 +31,10 @@ 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;
@@ -45,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)                                        \
@@ -481,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(&current_ticks);
@@ -496,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)
@@ -624,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);
   }
@@ -744,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 =
@@ -779,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);
 }