use raw volume api if db range is insufficent
Adrian Smith
9 years ago
199 | 199 | snd_mixer_selem_set_playback_switch_all(elem, 1); // unmute |
200 | 200 | } |
201 | 201 | |
202 | if ((err = snd_mixer_selem_get_playback_dB_range(elem, &min, &max)) < 0) { | |
203 | // unable to get db range - set using raw values | |
202 | if ((err = snd_mixer_selem_get_playback_dB_range(elem, &min, &max)) < 0 || max - min < 1000) { | |
203 | // unable to get db range or range is less than 10dB - ignore and set using raw values | |
204 | 204 | if ((err = snd_mixer_selem_get_playback_volume_range(elem, &min, &max)) < 0) { |
205 | LOG_ERROR("unable to get volume raw", min, max); | |
205 | LOG_ERROR("unable to get volume raw"); | |
206 | 206 | } else { |
207 | long lraw = (MINVOL_DB + floor(ldB)) / MINVOL_DB * max; | |
208 | long rraw = (MINVOL_DB + floor(rdB)) / MINVOL_DB * max; | |
209 | LOG_DEBUG("setting vol raw [%ld-%ld]", min, max); | |
207 | long lraw = (ldB > -MINVOL_DB ? MINVOL_DB + floor(ldB) : 0) / MINVOL_DB * max; | |
208 | long rraw = (rdB > -MINVOL_DB ? MINVOL_DB + floor(rdB) : 0) / MINVOL_DB * max; | |
209 | LOG_DEBUG("setting vol raw [%ld..%ld]", min, max); | |
210 | 210 | if ((err = snd_mixer_selem_set_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, lraw)) < 0) { |
211 | 211 | LOG_ERROR("error setting left volume: %s", snd_strerror(err)); |
212 | 212 | } |
216 | 216 | } |
217 | 217 | } else { |
218 | 218 | // set db directly |
219 | LOG_DEBUG("setting vol dB"); | |
219 | LOG_DEBUG("setting vol dB [%ld..%ld]", min, max); | |
220 | 220 | if ((err = snd_mixer_selem_set_playback_dB(elem, SND_MIXER_SCHN_FRONT_LEFT, 100 * ldB, 1)) < 0) { |
221 | 221 | LOG_ERROR("error setting left volume: %s", snd_strerror(err)); |
222 | 222 | } |