/* * call-seq: * play( options={} ) -> self * * Play the Sound, optionally fading in, repeating a certain number of * times (or forever), and/or stopping automatically after a certain time. * * See also #pause and #stop. * * options:: Hash of options, listed below. (Hash, required) * * :fade_in:: Fade in from silence over the given number of seconds. * (Numeric) * :repeats:: Repeat the sound the given number of times, or forever * (or until stopped) if -1. (Integer) * :stop_after:: Automatically stop playing after playing for the given * number of seconds. (Numeric) * * Returns:: The receiver (self). * May raise:: SDLError, if the sound file could not be played. * * **NOTE**: If the sound is already playing (or paused), it will be stopped * and played again from the beginning. * * Example: * # Fade in over 2 seconds, play 4 times (1 + 3 repeats), * # but stop playing after 5 seconds. * sound.play( :fade_in => 2, :repeats => 3, :stop_after => 5 ); * */ static VALUE rg_sound_play( int argc, VALUE *argv, VALUE self ) { RG_Sound *sound; Data_Get_Struct(self, RG_Sound, sound); VALUE options; rb_scan_args(argc, argv, "01", &options); int fade_in = 0; int repeats = 0; int stop_after = -1; /* If we got some options */ if( RTEST(options) ) { /* Make sure options is a Hash table */ if( TYPE(options) != T_HASH ) { rb_raise(rb_eTypeError, "wrong argument type %s (expected Hash)", rb_obj_classname(options)); } VALUE temp; temp = rb_hash_aref(options, make_symbol("fade_in")); if( RTEST(temp) ) { fade_in = (int)(1000 * NUM2DBL( temp )); } temp = rb_hash_aref(options, make_symbol("repeats")); if( RTEST(temp) ) { repeats = NUM2INT(temp); } temp = rb_hash_aref(options, make_symbol("stop_after")); if( RTEST(temp) ) { stop_after = (int)(1000 * NUM2DBL( temp )); } } int result = _rg_sound_play( sound, fade_in, repeats, stop_after ); if( result == -1 ) { rb_raise(eSDLError, "Could not play Sound: %s", Mix_GetError()); } return self; }