}
debug(1, "Hardware mixer has dB volume from %f to %f.", (1.0 * alsa_mix_mindb) / 100.0,
(1.0 * alsa_mix_maxdb) / 100.0);
+ if (config.volume_range_db) {
+ long suggested_alsa_min_db = alsa_mix_maxdb - (long)trunc(config.volume_range_db*100);
+ if (suggested_alsa_min_db > alsa_mix_mindb)
+ alsa_mix_mindb = suggested_alsa_min_db;
+ else
+ inform("The volume_range_db setting, %f is greater than the native range of the mixer %f, so it is ignored.",config.volume_range_db,(alsa_mix_maxdb-alsa_mix_mindb)/100.0);
+ }
} else {
// use the linear scale and do the db conversion ourselves
debug(1, "note: the hardware mixer specified -- \"%s\" -- does not have a dB volume scale, so it can't be used.",alsa_mix_ctrl);
// Thus, we ask our vol2attn function for an appropriate dB between -96.3 and 0 dB and translate
// it back to a number.
- double scaled_volume = vol2attn(f, 0, -9630);
- double linear_volume = pow(10, scaled_volume / 2000);
-
- if (f == -144.0)
- linear_volume = 0.0;
+ double linear_volume = 0.0;
if (config.output->volume) {
// debug(1,"Set volume to %f.",f);
if (config.output->parameters)
config.output->parameters(&audio_information);
else {
+ long mindb = -9630;
+ if (config.volume_range_db) {
+ long suggested_alsa_min_db = -(long)trunc(config.volume_range_db*100);
+ if (suggested_alsa_min_db > mindb)
+ mindb = suggested_alsa_min_db;
+ else
+ inform("The volume_range_db setting, %f is greater than the native range of the mixer %f, so it is ignored.",config.volume_range_db,mindb/100.0);
+ }
+ double scaled_volume = vol2attn(f, 0, mindb);
+ linear_volume = pow(10, scaled_volume / 2000);
audio_information.airplay_volume = f;
- audio_information.minimum_volume_dB = -9630;
+ audio_information.minimum_volume_dB = mindb;
audio_information.maximum_volume_dB = 0;
audio_information.current_volume_dB = scaled_volume;
audio_information.has_true_mute = 0;
audio_information.is_muted = 0;
+ // debug(1,"Minimum software volume set to %d centi-dB",f,mindb);
}
audio_information.valid = 1;
// debug(1,"Software volume set to %f on scale with a %f dB",f,linear_volume);
// resync_threshold = 2205; // a synchronisation error greater than this will cause resynchronisation; 0 disables it
// log_verbosity = 0; // "0" means no debug verbosity, "3" is most verbose.
// ignore_volume_control = "no"; // set this to "yes" if you want the volume to be at 100% no matter what the source's volume control is set to.
-// volume_range_db = 0; // set this to the range, in dB, you want between the maximum volume and the minimum volume. Zero means use the mixer's native range. Default is 0.
+// volume_range_db = 60 ; // use this to set the range, in dB, you want between the maximum volume and the minimum volume. Range is 30 to 150 dB. Omit to use mixer's native range.
};
// How to deal with metadata, including artwork
}
/* Get the volume range, in dB, that should be used If not set, it means you just use the range set by the mixer. */
- if (config_lookup_int(config.cfg, "general.volume_range", &value)) {
- if ((value < 0) || (value > 200))
- die("Invalid volume range \"%sd\". It should be between 0 and 200. Zero means use the mixer's native range",
+ if (config_lookup_int(config.cfg, "general.volume_range_db", &value)) {
+ if ((value < 30) || (value > 150))
+ die("Invalid volume range \"%sd\". It should be between 30 and 150 dB. Zero means use the mixer's native range",
value);
else
config.volume_range_db = value;