Skip to content

Commit

Permalink
Implement smart ReplayGain setting (cmus#1049)
Browse files Browse the repository at this point in the history
  • Loading branch information
Allavaz authored Mar 1, 2021
1 parent 9f08338 commit a9ac3de
Show file tree
Hide file tree
Showing 6 changed files with 22 additions and 8 deletions.
6 changes: 4 additions & 2 deletions Doc/cmus.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1101,8 +1101,10 @@ repeat (false)
repeat_current (false)
Repeat current track forever.

replaygain (disabled) [track, album, track-preferred, album-preferred]
Enable Replay Gain.
replaygain (disabled) [track, album, track-preferred, album-preferred, smart]
Enable Replay Gain. The smart setting behaves like track-preferred when
shuffle is on, or the queue is active, or when playing from a playlist.
Otherwise, it behaves like album-preferred.

replaygain_limit (true)
Use replay gain limiting when clipping.
Expand Down
4 changes: 4 additions & 0 deletions cmus.c
Original file line number Diff line number Diff line change
Expand Up @@ -509,3 +509,7 @@ void cmus_raise_vte(void)
}
}
}

bool cmus_queue_active(void) {
return play_queue_active;
}
2 changes: 2 additions & 0 deletions cmus.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,4 +93,6 @@ void cmus_track_request_init(void);
int cmus_can_raise_vte(void);
void cmus_raise_vte(void);

bool cmus_queue_active(void);

#endif
8 changes: 5 additions & 3 deletions options.c
Original file line number Diff line number Diff line change
Expand Up @@ -751,9 +751,11 @@ static void toggle_repeat(void *data)
}

static const char * const replaygain_names[] = {
"disabled", "track", "album", "track-preferred", "album-preferred", NULL
"disabled", "track", "album", "track-preferred", "album-preferred", "smart", NULL
};

static const size_t replaygain_names_len = sizeof(replaygain_names) / sizeof(replaygain_names[0]) - 1;

static void get_replaygain(void *data, char *buf, size_t size)
{
strscpy(buf, replaygain_names[replaygain], size);
Expand All @@ -763,14 +765,14 @@ static void set_replaygain(void *data, const char *buf)
{
int tmp;

if (!parse_enum(buf, 0, 4, replaygain_names, &tmp))
if (!parse_enum(buf, 0, replaygain_names_len - 1, replaygain_names, &tmp))
return;
player_set_rg(tmp);
}

static void toggle_replaygain(void *data)
{
player_set_rg((replaygain + 1) % 5);
player_set_rg((replaygain + 1) % replaygain_names_len);
}

static void get_replaygain_limit(void *data, char *buf, size_t size)
Expand Down
7 changes: 5 additions & 2 deletions player.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include "options.h"
#include "mpris.h"
#include "cmus.h"
#include "lib.h"

#include <stdio.h>
#include <stdlib.h>
Expand Down Expand Up @@ -354,7 +355,9 @@ static void update_rg_scale(void)
if (!player_info_priv.ti || !replaygain)
return;

if (replaygain == RG_TRACK || replaygain == RG_TRACK_PREFERRED) {
bool avoid_album_gain = replaygain == RG_SMART && (!play_library || shuffle || cmus_queue_active());

if (replaygain == RG_TRACK || replaygain == RG_TRACK_PREFERRED || avoid_album_gain) {
gain = player_info_priv.ti->rg_track_gain;
peak = player_info_priv.ti->rg_track_peak;
} else {
Expand All @@ -363,7 +366,7 @@ static void update_rg_scale(void)
}

if (isnan(gain)) {
if (replaygain == RG_TRACK_PREFERRED) {
if (replaygain == RG_TRACK_PREFERRED || avoid_album_gain) {
gain = player_info_priv.ti->rg_album_gain;
peak = player_info_priv.ti->rg_album_peak;
} else if (replaygain == RG_ALBUM_PREFERRED) {
Expand Down
3 changes: 2 additions & 1 deletion player.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ enum replaygain {
RG_TRACK,
RG_ALBUM,
RG_TRACK_PREFERRED,
RG_ALBUM_PREFERRED
RG_ALBUM_PREFERRED,
RG_SMART
};

struct player_info {
Expand Down

0 comments on commit a9ac3de

Please sign in to comment.