diff --git a/src/state_file.c b/src/state_file.c index 1307faa54..452031ed6 100644 --- a/src/state_file.c +++ b/src/state_file.c @@ -24,6 +24,7 @@ #include "audio.h" #include "playlist.h" #include "utils.h" +#include "volume.h" #include #include @@ -35,6 +36,7 @@ static struct _sf_cb { void (*reader)(FILE *); void (*writer)(FILE *); } sf_callbacks [] = { + { read_sw_volume_state, save_sw_volume_state }, { readAudioDevicesState, saveAudioDevicesState }, { readPlaylistState, savePlaylistState }, }; diff --git a/src/volume.c b/src/volume.c index 7d4fce584..de631ab8c 100644 --- a/src/volume.c +++ b/src/volume.c @@ -21,6 +21,9 @@ #include "conf.h" #include "log.h" #include "player.h" +#include "state_file.h" +#include "gcc.h" +#include "utils.h" #include #include @@ -44,6 +47,7 @@ #define VOLUME_MIXER_OSS_DEFAULT "/dev/mixer" #define VOLUME_MIXER_ALSA_DEFAULT "default" #define VOLUME_MIXER_ALSA_CONTROL_DEFAULT "PCM" +#define SW_VOLUME_STATE "sw_volume: " #ifdef HAVE_OSS #define VOLUME_MIXER_TYPE_DEFAULT VOLUME_MIXER_TYPE_OSS @@ -515,3 +519,34 @@ int changeVolumeLevel(int fd, int change, int rel) break; } } + +void read_sw_volume_state(FILE *fp) +{ + /* strlen(SW_VOLUME_STATE) + strlen('100') + '\0' */ + #define bufsize 16 + char buf[bufsize]; + const size_t len = strlen(SW_VOLUME_STATE); + char *end = NULL; + long int sv; + + if (volume_mixerType != VOLUME_MIXER_TYPE_SOFTWARE) + return; + while (myFgets(buf, bufsize, fp)) { + if (strncmp(buf, SW_VOLUME_STATE, len)) + continue; + sv = strtol(buf + len, &end, 10); + if (mpd_likely(!*end)) + changeSoftwareVolume(STDERR_FILENO, sv, 0); + else + ERROR("Can't parse software volume: %s\n", buf); + return; + } + #undef bufsize +} + +void save_sw_volume_state(FILE *fp) +{ + if (volume_mixerType == VOLUME_MIXER_TYPE_SOFTWARE) + fprintf(fp, SW_VOLUME_STATE "%d\n", volume_softwareSet); +} + diff --git a/src/volume.h b/src/volume.h index 92fd868be..8c4d3803e 100644 --- a/src/volume.h +++ b/src/volume.h @@ -37,4 +37,8 @@ int getVolumeLevel(); int changeVolumeLevel(int fd, int change, int rel); +void read_sw_volume_state(FILE *fp); + +void save_sw_volume_state(FILE *fp); + #endif