diff options
author | Sigrid Solveig Haflínudóttir <sigrid@ftrv.se> | 2022-10-15 19:01:46 +0000 |
---|---|---|
committer | Sigrid Solveig Haflínudóttir <sigrid@ftrv.se> | 2022-10-15 19:01:46 +0000 |
commit | 7e0179bad8fc63294696a465e1583be5c08b9417 (patch) | |
tree | 03eace5780923651ead3f13d55b9f2bc3e5b6953 /sys/src/cmd/audio | |
parent | c7ec663a0bf490169a910a3bba6ff5ba094a4b4e (diff) |
zuke: basic replay gain support
Diffstat (limited to 'sys/src/cmd/audio')
-rw-r--r-- | sys/src/cmd/audio/zuke/mkplist.c | 14 | ||||
-rw-r--r-- | sys/src/cmd/audio/zuke/plist.c | 4 | ||||
-rw-r--r-- | sys/src/cmd/audio/zuke/plist.h | 6 | ||||
-rw-r--r-- | sys/src/cmd/audio/zuke/zuke.c | 50 |
4 files changed, 68 insertions, 6 deletions
diff --git a/sys/src/cmd/audio/zuke/mkplist.c b/sys/src/cmd/audio/zuke/mkplist.c index 7277426fc..9e56c5b68 100644 --- a/sys/src/cmd/audio/zuke/mkplist.c +++ b/sys/src/cmd/audio/zuke/mkplist.c @@ -122,6 +122,16 @@ cb(Tagctx *ctx, int t, const char *k, const char *v, int offset, int size, Tagre aux->imagereader = f != nil; } break; + case Ttrackgain: + aux->rgtrack = atof(v); + if(strncmp(k, "R128_", 5) == 0) + aux->rgtrack /= 256.0; + break; + case Talbumgain: + aux->rgalbum = atof(v); + if(strncmp(k, "R128_", 5) == 0) + aux->rgalbum /= 256.0; + break; } } @@ -393,8 +403,8 @@ threadmain(int argc, char **argv) if(icyfill(m) != 0){ fprint(2, "%s: %r\n", argv[i]); free(m); - } - sendp(cmeta, m); + }else + sendp(cmeta, m); }else{ if(argv[i][0] == '/') dir = strdup(argv[i]); diff --git a/sys/src/cmd/audio/zuke/plist.c b/sys/src/cmd/audio/zuke/plist.c index f9c6ffeec..3e378e9aa 100644 --- a/sys/src/cmd/audio/zuke/plist.c +++ b/sys/src/cmd/audio/zuke/plist.c @@ -21,6 +21,10 @@ printmeta(Biobuf *b, Meta *m) Bprint(b, "%c %s\n", Ptrack, m->track); if(m->duration > 0) Bprint(b, "%c %llud\n", Pduration, m->duration); + if(m->rgtrack != 0.0) + Bprint(b, "%c %g\n", Prgtrack, m->rgtrack); + if(m->rgalbum != 0.0) + Bprint(b, "%c %g\n", Prgalbum, m->rgalbum); if(m->imagesize > 0) Bprint(b, "%c %d %d %d %s\n", Pimage, m->imageoffset, m->imagesize, m->imagereader, m->imagefmt); Bprint(b, "\n"); diff --git a/sys/src/cmd/audio/zuke/plist.h b/sys/src/cmd/audio/zuke/plist.h index 563d5a03f..fee3ee119 100644 --- a/sys/src/cmd/audio/zuke/plist.h +++ b/sys/src/cmd/audio/zuke/plist.h @@ -16,11 +16,13 @@ enum Pbasename= 'b', Pdate= 'd', Pduration= 'D', + Pfilefmt= 'f', Pimage= 'i', Ptitle= 't', Ptrack= 'T', Ppath= 'p', - Pfilefmt= 'f', + Prgtrack= 'r', + Prgalbum= 'R', /* unused */ Pchannels= 'c', @@ -42,6 +44,8 @@ struct Meta char *basename; char *imagefmt; char *filefmt; + double rgtrack; + double rgalbum; uvlong duration; int numartist; int imageoffset; diff --git a/sys/src/cmd/audio/zuke/zuke.c b/sys/src/cmd/audio/zuke/zuke.c index 6cf478aa3..dcc28ece1 100644 --- a/sys/src/cmd/audio/zuke/zuke.c +++ b/sys/src/cmd/audio/zuke/zuke.c @@ -24,6 +24,11 @@ enum Ctoggle, Cseekrel, + Rgdisabled = 0, + Rgtrack, + Rgalbum, + Numrg, + Everror = 1, Evready, @@ -57,6 +62,7 @@ struct Player Channel *ev; Channel *img; double seek; + double gain; int pcur; }; @@ -72,7 +78,7 @@ int mainstacksize = 32768; static int debug; static int audio = -1; -static int volume; +static int volume, rg; static int pnotifies; static Playlist *pl; static Player *playernext; @@ -276,10 +282,11 @@ redraw_(int full) Image *col; /* seekbar playback/duration text */ - i = snprint(tmp, sizeof(tmp), "%s%s%s", + i = snprint(tmp, sizeof(tmp), "%s%s%s%s", + rg ? (rg == Rgalbum ? "ᴬ" : "ᵀ") : "", repeatone ? "¹" : "", shuffle != nil ? "∫" : "", - (repeatone || shuffle != nil) ? " " : "" + (rg || repeatone || shuffle != nil) ? " " : "" ); msec = 0; if(pcurplaying >= 0){ @@ -605,6 +612,20 @@ start(Player *player) static void playerthread(void *player_); +static void +setgain(Player *player) +{ + if(player == nil) + return; + if(rg == Rgdisabled) + player->gain = 0.0; + if(rg == Rgtrack) + player->gain = getmeta(player->pcur)->rgtrack; + else if(rg == Rgalbum) + player->gain = getmeta(player->pcur)->rgalbum; + player->gain = pow(10.0, player->gain/20.0); +} + static Player * newplayer(int pcur, int loadnext) { @@ -624,6 +645,7 @@ newplayer(int pcur, int loadnext) player->ctl = chancreate(sizeof(ulong), 0); player->ev = chancreate(sizeof(ulong), 0); player->pcur = pcur; + setgain(player); threadcreate(playerthread, player, 32768); if(getmeta(pcur)->filefmt[0] && playerret(player) < 0) @@ -637,6 +659,18 @@ done: } static void +gain(double g, char *buf, long n) +{ + s16int *f; + + if(g != 1.0) + for(f = (s16int*)buf; n >= 4; n -= 4){ + *f = g * *f++; + *f = g * *f++; + } +} + +static void playerthread(void *player_) { char *buf, cmd[64], seekpos[12], *fmt; @@ -718,6 +752,7 @@ restart: if(n < 1) goto next; audioon(); + gain(player->gain, buf, n); boffset = iowrite(io, audio, buf, n); noinit = 1; } @@ -767,6 +802,7 @@ restart: boffset += n; byteswritten = boffset; audioon(); + gain(player->gain, buf, n); iowrite(io, audio, buf, n); if(trycoverload){ trycoverload = 0; @@ -930,6 +966,8 @@ addit: case Pdate: m->date = s; break; case Ptitle: m->title = s; break; case Ptrack: m->track = s; break; + case Prgtrack: m->rgtrack = atof(s); break; + case Prgalbum: m->rgalbum = atof(s); break; case Ppath: m->path = s; m->basename = (b = utfrrune(s, '/')) == nil ? s : b+1; @@ -1503,6 +1541,12 @@ playcur: cover = nil; full = 1; break; + case 'g': + rg = (rg+1) % Numrg; + setgain(playercurr); + setgain(playernext); + redraw(0); + break; case 's': toggleshuffle(); recenter(); |