/*  call-seq:
 *     fade_in( fade_time, repeats=0, start=0 )  ->  self
 *
 *  Play the music, fading in and repeating a certain number of times.
 *  See also #play.
 *
 *  Raises SDLError if something goes wrong.
 *  
 *  fade_time::  Time in seconds for the fade-in effect to complete.
 *  repeats::    Number of extra times to play through the music.
 *               -1 plays the music forever until it is stopped.
 *               Defaults to 0, play only once (no repeats).
 *  start::      Time to start from, in seconds since the beginning.
 *               Defaults to 0, the beginning of the song.
 *               Non-zero values only work for OGG and MP3; other
 *               music types will raise SDLError.
 */
VALUE rbgm_mixmusic_fadein(int argc, VALUE *argv, VALUE self)
{
  VALUE fadev, repsv, startv;
  rb_scan_args(argc, argv, "12", &fadev, &repsv, &startv);

  Mix_Music* music;
  Data_Get_Struct( self, Mix_Music, music );

  int fade, reps, result;
  fade = (int)(NUM2DBL(fadev) * 1000); /* convert to milliseconds */

  if( RTEST(repsv) )
  {
    reps = NUM2INT(repsv);
  }
  else
  {
    reps = 0;
  }

  if( reps > -1 )
  {
    /* Adjust so repeats means the same as it does for Samples */
    reps += 1;
  }
  
  if( !RTEST(startv) || NUM2DBL(startv) == 0.0 )
  {
                result = Mix_FadeInMusic(music, reps, fade);
  }
  else
        {
    result = Mix_FadeInMusicPos(music, reps, fade, NUM2DBL(startv));
  }

  if( result < 0 )
  {
    rb_raise(eSDLError, "Error fading in music: %s", Mix_GetError());
  }

  return self;
}