diff -Nur vdr-1.7.16.orig/config.c vdr-1.7.16/config.c --- vdr-1.7.16.orig/config.c 2010-10-20 22:18:55.000000000 +0200 +++ vdr-1.7.16/config.c 2011-01-05 18:16:46.647821525 +0100 @@ -427,6 +427,8 @@ #endif /* JUMPPLAY */ CurrentChannel = -1; CurrentVolume = MAXVOLUME; + VolumeSteps = 51; + VolumeLinearize = 0; CurrentDolby = 0; #ifdef USE_CHANNELPROVIDE LocalChannelProvide = 1; @@ -711,6 +713,8 @@ #endif /* CHANNELPROVIDE */ else if (!strcasecmp(Name, "InitialChannel")) InitialChannel = atoi(Value); else if (!strcasecmp(Name, "InitialVolume")) InitialVolume = atoi(Value); + else if (!strcasecmp(Name, "VolumeSteps")) VolumeSteps = atoi(Value); + else if (!strcasecmp(Name, "VolumeLinearize")) VolumeLinearize = atoi(Value); #ifdef USE_VOLCTRL else if (!strcasecmp(Name, "LRVolumeControl")) LRVolumeControl = atoi(Value); else if (!strcasecmp(Name, "LRChannelGroups")) LRChannelGroups = atoi(Value); @@ -911,6 +915,8 @@ #endif /* HARDLINKCUTTER */ Store("InitialChannel", InitialChannel); Store("InitialVolume", InitialVolume); + Store("VolumeSteps", VolumeSteps); + Store("VolumeLinearize", VolumeLinearize); #ifdef USE_VOLCTRL Store("LRVolumeControl", LRVolumeControl); Store("LRChannelGroups", LRChannelGroups); diff -Nur vdr-1.7.16.orig/config.h vdr-1.7.16/config.h --- vdr-1.7.16.orig/config.h 2010-10-20 22:18:55.000000000 +0200 +++ vdr-1.7.16/config.h 2011-01-05 18:16:46.647821525 +0100 @@ -341,6 +341,8 @@ #endif /* JUMPPLAY */ int CurrentChannel; int CurrentVolume; + int VolumeSteps; + int VolumeLinearize; int CurrentDolby; #ifdef USE_CHANNELPROVIDE int LocalChannelProvide; diff -Nur vdr-1.7.16.orig/device.c vdr-1.7.16/device.c --- vdr-1.7.16.orig/device.c 2010-10-20 22:18:55.000000000 +0200 +++ vdr-1.7.16/device.c 2011-01-05 18:16:46.647821525 +0100 @@ -11,6 +11,7 @@ #include #include #include +#include #include "audio.h" #include "channels.h" #include "i18n.h" @@ -984,8 +985,9 @@ void cDevice::SetVolume(int Volume, bool Absolute) { int OldVolume = volume; - volume = min(max(Absolute ? Volume : volume + Volume, 0), MAXVOLUME); - SetVolumeDevice(volume); + float VolumeDelta = (float)MAXVOLUME/Setup.VolumeSteps; + volume = min(max((int)(floor((Absolute ? Volume : volume + Volume)/VolumeDelta+0.5)*VolumeDelta), 0), MAXVOLUME); + SetVolumeDevice((int)(pow((float)volume/MAXVOLUME, Setup.VolumeLinearize>0 ? ((float)Setup.VolumeLinearize/10+1) : (1/((float)Setup.VolumeLinearize/-10+1)))*MAXVOLUME)); Absolute |= mute; cStatus::MsgSetVolume(Absolute ? volume : volume - OldVolume, Absolute); if (volume > 0) { diff -Nur vdr-1.7.16.orig/device.h vdr-1.7.16/device.h --- vdr-1.7.16.orig/device.h 2010-10-20 22:18:55.000000000 +0200 +++ vdr-1.7.16/device.h 2011-01-05 18:16:46.647821525 +0100 @@ -32,7 +32,7 @@ #define MAXPIDHANDLES 64 // the maximum number of different PIDs per device #define MAXRECEIVERS 16 // the maximum number of receivers per device #define MAXVOLUME 255 -#define VOLUMEDELTA 5 // used to increase/decrease the volume +#define VOLUMEDELTA (MAXVOLUME/Setup.VolumeSteps) // used to increase/decrease the volume enum eSetChannelResult { scrOk, scrNotAvailable, scrNoTransfer, scrFailed }; diff -Nur vdr-1.7.16.orig/menu.c vdr-1.7.16/menu.c --- vdr-1.7.16.orig/menu.c 2010-11-09 17:31:47.000000000 +0100 +++ vdr-1.7.16/menu.c 2011-01-05 18:20:32.480313171 +0100 @@ -3837,6 +3837,8 @@ Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$Channel entry timeout (ms)"), &data.ChannelEntryTimeout, 0)); Add(new cMenuEditChanItem(tr("Setup.Miscellaneous$Initial channel"), &data.InitialChannel, tr("Setup.Miscellaneous$as before"))); Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$Initial volume"), &data.InitialVolume, -1, 255, tr("Setup.Miscellaneous$as before"))); + Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$Volume steps"), &data.VolumeSteps, 5, 255)); + Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$Volume linearize"), &data.VolumeLinearize, -20, 20)); Add(new cMenuEditBoolItem(tr("Setup.Miscellaneous$Channels wrap"), &data.ChannelsWrap)); Add(new cMenuEditBoolItem(tr("Setup.Miscellaneous$Emergency exit"), &data.EmergencyExit)); #ifdef USE_LIRCSETTINGS