VALUE rb_singleton_class(VALUE obj) { if (FIXNUM_P(obj) || SYMBOL_P(obj) || FIXFLOAT_P(obj)) { rb_raise(rb_eTypeError, "can't define singleton"); } if (rb_special_const_p(obj)) { SPECIAL_SINGLETON(Qnil, rb_cNilClass); SPECIAL_SINGLETON(Qfalse, rb_cFalseClass); SPECIAL_SINGLETON(Qtrue, rb_cTrueClass); rb_bug("unknown immediate %ld", obj); } VALUE klass; switch (TYPE(obj)) { case T_CLASS: case T_MODULE: // FIXME we should really create a new metaclass here. klass = *(VALUE *)obj; break; default: klass = rb_make_metaclass(obj, RBASIC(obj)->klass); break; } return klass; }
/* * Sets the value of system sound volume. * * @param [Float] volume * The value that set volume to system. * range of volume is 0.0 .. 1.0. * @example * System::Sound.set_volume(0.75) */ static VALUE rb_sys_set_volume(VALUE obj, VALUE volume) { AudioDeviceID device; OSStatus err; UInt32 size; Boolean canset = false; UInt32 channels[2]; float involume; if (!FIXFLOAT_P(volume)) { rb_raise(rb_eTypeError, "wrong type of argument"); } involume = NUM2DBL(volume); if (involume < 0.0 || involume > 1.0) { rb_raise(rb_eRangeError, "out of range"); } // get device device = get_audio_device_id(); size = sizeof(canset); err = AudioDeviceGetPropertyInfo(device, 0, false, kAudioDevicePropertyVolumeScalar, &size, &canset); if (err == noErr && canset == true) { size = sizeof involume; err = AudioDeviceSetProperty(device, NULL, 0, false, kAudioDevicePropertyVolumeScalar, size, &involume); return Qnil; } // else, try seperate channes // get channels size = sizeof(channels); err = AudioDeviceGetProperty(device, 0, false, kAudioDevicePropertyPreferredChannelsForStereo, &size, &channels); if (err != noErr) { rb_raise(rb_eRuntimeError, "Failed to get channel numbers"); } // set volume size = sizeof(float); err = AudioDeviceSetProperty(device, 0, channels[0], false, kAudioDevicePropertyVolumeScalar, size, &involume); if (err != noErr) { rb_raise(rb_eRuntimeError, "Failed to set volume of channel"); } err = AudioDeviceSetProperty(device, 0, channels[1], false, kAudioDevicePropertyVolumeScalar, size, &involume); if (err != noErr) { rb_raise(rb_eRuntimeError, "Failed to set volume of channel"); } return Qnil; }