// Set the volume of all channels of this sink to a factor of the maximum // volume (0.0 <= v <= 1.0). Factors greater than 1.0 will be accepted, but // clipping or distortion may occur beyond that value. // func (self *Sink) SetVolume(factor float64) error { if self.Channels > 0 { operation := NewOperation(self.Client) newVolume := &C.pa_cvolume{} // new volume is the (maximum number of normal volume steps * factor) newVolume = C.pa_cvolume_init(newVolume) newVolumeT := C.pa_volume_t(C.uint32_t(uint(float64(self.NumVolumeSteps) * factor))) // prepare newVolume for its journey into PulseAudio C.pa_cvolume_set(newVolume, C.uint(self.Channels), newVolumeT) // make the call operation.paOper = C.pa_context_set_sink_volume_by_index(C.pulse_get_context(), C.uint32_t(self.Index), newVolume, (C.pa_context_success_cb_t)(unsafe.Pointer(C.pulse_generic_success_callback)), unsafe.Pointer(operation)) // wait for the result, refresh, return any errors return operation.WaitSuccess(func(op *Operation) error { return self.Refresh() }) } else { return fmt.Errorf("Cannot set volume on sink %d, no channels defined", self.Index) } return nil }
// Set the volume of all channels of this source to a factor of the maximum // volume (0.0 <= v <= 1.0). Factors greater than 1.0 will be accepted, but // clipping or distortion may occur beyond that value. // func (self *Source) SetVolume(factor float64) error { if self.Channels > 0 { operation := NewOperation(self.Client) defer operation.Destroy() newVolume := &C.pa_cvolume{} // new volume is the (maximum number of normal volume steps * factor) newVolume = C.pa_cvolume_init(newVolume) newVolumeT := C.pa_volume_t(C.uint32_t(uint(float64(self.NumVolumeSteps) * factor))) // prepare newVolume for its journey into PulseAudio C.pa_cvolume_set(newVolume, C.uint(self.Channels), newVolumeT) // make the call operation.paOper = C.pa_context_set_source_volume_by_index(self.Client.context, C.uint32_t(self.Index), newVolume, (C.pa_context_success_cb_t)(C.pulse_generic_success_callback), operation.ToUserdata()) // wait for the result, refresh, return any errors if err := operation.Wait(); err == nil { return self.Refresh() } else { return err } } else { return fmt.Errorf("Cannot set volume on source %d, no channels defined", self.Index) } return nil }