diff options
author | Bruno Morais <brunosmmm@gmail.com> | 2019-06-06 16:48:23 +0200 |
---|---|---|
committer | Lars-Dominik Braun <lars@6xq.net> | 2019-06-06 16:49:33 +0200 |
commit | 4594810abea6fa50643c0923a9ee9075e59922ce (patch) | |
tree | e9e60bbcd131192dcc3b5f6a0b40aa727c6f1173 /src | |
parent | ef051f835a6393bf3cdfc1ce76943f6db22751c4 (diff) | |
download | pianobar-4594810abea6fa50643c0923a9ee9075e59922ce.tar.gz pianobar-4594810abea6fa50643c0923a9ee9075e59922ce.tar.bz2 pianobar-4594810abea6fa50643c0923a9ee9075e59922ce.zip |
Add audio resampling
Fixes #683
Diffstat (limited to 'src')
-rw-r--r-- | src/player.c | 15 | ||||
-rw-r--r-- | src/settings.c | 3 | ||||
-rw-r--r-- | src/settings.h | 1 |
3 files changed, 16 insertions, 3 deletions
diff --git a/src/player.c b/src/player.c index 17fe7ed..848d58b 100644 --- a/src/player.c +++ b/src/player.c @@ -254,6 +254,15 @@ static bool openStream (player_t * const player) { return true; } +/* Get output sample rate. Default to stream sample rate + */ +static int getSampleRate (const player_t * const player) { + AVCodecParameters const * const cp = player->st->codecpar; + return player->settings->sampleRate == 0 ? + cp->sample_rate : + player->settings->sampleRate; +} + /* setup filter chain */ static bool openFilter (player_t * const player) { @@ -289,8 +298,8 @@ static bool openFilter (player_t * const player) { /* aformat: convert float samples into something more usable */ AVFilterContext *fafmt = NULL; - snprintf (strbuf, sizeof (strbuf), "sample_fmts=%s", - av_get_sample_fmt_name (avformat)); + snprintf (strbuf, sizeof (strbuf), "sample_fmts=%s:sample_rates=%d", + av_get_sample_fmt_name (avformat), getSampleRate (player)); if ((ret = avfilter_graph_create_filter (&fafmt, avfilter_get_by_name ("aformat"), "format", strbuf, NULL, player->fgraph)) < 0) { @@ -328,7 +337,7 @@ static bool openDevice (player_t * const player) { aoFmt.bits = av_get_bytes_per_sample (avformat) * 8; assert (aoFmt.bits > 0); aoFmt.channels = cp->channels; - aoFmt.rate = cp->sample_rate; + aoFmt.rate = getSampleRate (player); aoFmt.byte_format = AO_FMT_NATIVE; int driver = ao_default_driver_id (); diff --git a/src/settings.c b/src/settings.c index 4ee1bd6..bcb5dfc 100644 --- a/src/settings.c +++ b/src/settings.c @@ -183,6 +183,7 @@ void BarSettingsRead (BarSettings_t *settings) { settings->outkey = strdup ("6#26FRL$ZWD"); settings->fifo = BarGetXdgConfigDir (PACKAGE "/ctl"); assert (settings->fifo != NULL); + settings->sampleRate = 0; /* default to stream sample rate */ settings->msgFormat[MSG_NONE].prefix = NULL; settings->msgFormat[MSG_NONE].postfix = NULL; @@ -391,6 +392,8 @@ void BarSettingsRead (BarSettings_t *settings) { settings->fifo = BarSettingsExpandTilde (val, userhome); } else if (streq ("autoselect", key)) { settings->autoselect = atoi (val); + } else if (streq ("sample_rate", key)) { + settings->sampleRate = atoi (val); } else if (strncmp (formatMsgPrefix, key, strlen (formatMsgPrefix)) == 0) { static const char *mapping[] = {"none", "info", "nowplaying", diff --git a/src/settings.h b/src/settings.h index 709a56f..a4264a2 100644 --- a/src/settings.h +++ b/src/settings.h @@ -104,6 +104,7 @@ typedef struct { char *fifo; char *rpcHost, *rpcTlsPort, *partnerUser, *partnerPassword, *device, *inkey, *outkey, *caBundle; char keys[BAR_KS_COUNT]; + int sampleRate; BarMsgFormatStr_t msgFormat[MSG_COUNT]; } BarSettings_t; |