/*
 *  call-seq:
 *    jump_to( time )  ->  self
 *
 *  Jump to any time in the Music, in seconds since the beginning.
 *  If the Music was paused, it will still be paused again after the
 *  jump. Does nothing if the Music was stopped.
 *
 *  **NOTE**: Only works for OGG and MP3 formats! Other formats (e.g.
 *  WAV) will usually raise SDLError.
 *
 *  time::   the time to jump to, in seconds since the beginning
 *           of the song. (Numeric, required)
 *
 *  May raise::  SDLError if something goes wrong, or if the music
 *               type does not support jumping.
 *
 *  **CAUTION**: This method may be unreliable (and could even crash!)
 *  if you jump to a time after the end of the song. Unfortunately,
 *  SDL_Mixer does not provide a way to find the song's length, so
 *  Rubygame cannot warn you if you go off the end. Be careful!
 */
static VALUE rg_music_jumpto( VALUE self, VALUE vtime )
{
  RG_Music *music;
  Data_Get_Struct(self, RG_Music, music);

  /* Check that the music is current. */
  if( _rg_music_current_check(self) )
  {
    /* Only do anything if it's not stopped */
    if( !rg_music_stoppedp(self) )
    {
      /* Remember whether it was paused. */
      int was_paused = Mix_PausedMusic();

      double time = NUM2DBL(vtime); /* in seconds */

      if( time < 0 )
      {
        rb_raise(rb_eArgError, "jump_to time cannot be negative (got %d)", time);
      }

      int result = Mix_SetMusicPosition( time );

      if( result == -1 )
      {
        rb_raise(eSDLError, "Could not jump Music: %s", Mix_GetError());
      }

      /* Pause it again if it was paused before. */
      if( was_paused )
      {
        Mix_PauseMusic();
      }
    }
  }

  return self;
}