From ccc9a58dd0b63c1e5d8489e592585c5ad4955e1b Mon Sep 17 00:00:00 2001 From: Mikel Astiz Date: Thu, 6 Dec 2012 10:35:17 +0100 Subject: [PATCH] bluetooth: Use round() to convert PA<->BT volumes The code can be simplified since it's just trying to round the result of the division. Note that the resulting behavior is slightly different, specially when the volume is 0. In this case, it will remain at 0, instead of being set to 1. --- .../bluetooth/module-bluetooth-device.c | 37 ++++--------------- 1 file changed, 7 insertions(+), 30 deletions(-) diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c index fdc621fe2..29c35e14f 100644 --- a/src/modules/bluetooth/module-bluetooth-device.c +++ b/src/modules/bluetooth/module-bluetooth-device.c @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -1330,21 +1331,13 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us if (u->profile == PROFILE_HSP) { if (u->sink && dbus_message_is_signal(m, "org.bluez.Headset", "SpeakerGainChanged")) { - pa_volume_t volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN); - - /* increment volume by one to correct rounding errors */ - if (volume < PA_VOLUME_NORM) - volume++; + pa_volume_t volume = (pa_volume_t) round((double) gain * PA_VOLUME_NORM / HSP_MAX_GAIN); pa_cvolume_set(&v, u->sample_spec.channels, volume); pa_sink_volume_changed(u->sink, &v); } else if (u->source && dbus_message_is_signal(m, "org.bluez.Headset", "MicrophoneGainChanged")) { - pa_volume_t volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN); - - /* increment volume by one to correct rounding errors */ - if (volume < PA_VOLUME_NORM) - volume++; + pa_volume_t volume = (pa_volume_t) round((double) gain * PA_VOLUME_NORM / HSP_MAX_GAIN); pa_cvolume_set(&v, u->sample_spec.channels, volume); pa_source_volume_changed(u->source, &v); @@ -1476,16 +1469,8 @@ static void sink_set_volume_cb(pa_sink *s) { pa_assert(u->sink == s); pa_assert(u->profile == PROFILE_HSP); - gain = (pa_cvolume_max(&s->real_volume) * HSP_MAX_GAIN) / PA_VOLUME_NORM; - - if (gain > HSP_MAX_GAIN) - gain = HSP_MAX_GAIN; - - volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN); - - /* increment volume by one to correct rounding errors */ - if (volume < PA_VOLUME_NORM) - volume++; + gain = (dbus_uint16_t) round((double) pa_cvolume_max(&s->real_volume) * HSP_MAX_GAIN / PA_VOLUME_NORM); + volume = (pa_volume_t) round((double) gain * PA_VOLUME_NORM / HSP_MAX_GAIN); pa_cvolume_set(&s->real_volume, u->sample_spec.channels, volume); @@ -1514,16 +1499,8 @@ static void source_set_volume_cb(pa_source *s) { pa_assert(u->source == s); pa_assert(u->profile == PROFILE_HSP); - gain = (pa_cvolume_max(&s->real_volume) * HSP_MAX_GAIN) / PA_VOLUME_NORM; - - if (gain > HSP_MAX_GAIN) - gain = HSP_MAX_GAIN; - - volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN); - - /* increment volume by one to correct rounding errors */ - if (volume < PA_VOLUME_NORM) - volume++; + gain = (dbus_uint16_t) round((double) pa_cvolume_max(&s->real_volume) * HSP_MAX_GAIN / PA_VOLUME_NORM); + volume = (pa_volume_t) round((double) gain * PA_VOLUME_NORM / HSP_MAX_GAIN); pa_cvolume_set(&s->real_volume, u->sample_spec.channels, volume);