summaryrefslogtreecommitdiffstats
path: root/player
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-06-05 22:35:43 +0200
committerwm4 <wm4@nowhere>2015-06-05 22:42:59 +0200
commit57048c7393e94820520a395e569d05cdcc085224 (patch)
tree329ff5bbeb7ca13076dfa653f03cbc4aa5736730 /player
parent14ac4f0bd66d05665f43f3e65138f035be06e29e (diff)
downloadmpv-57048c7393e94820520a395e569d05cdcc085224.tar.bz2
mpv-57048c7393e94820520a395e569d05cdcc085224.tar.xz
audio: add --audio-spdif as new method for enabling passthrough
This provides a new method for enabling spdif passthrough. The old method via --ad (--ad=spdif:ac3 etc.) is deprecated. The deprecated method will probably stop working at some point. This also supports PCM fallback. One caveat is that it will lose at least 1 audio packet in doing so. (I don't care enough to prevent this.) (This is named after the old S/PDIF connector, because it uses the same underlying technology as far as the higher level protoco is concerned. Also, the user should be renamed that passthrough is backwards.)
Diffstat (limited to 'player')
-rw-r--r--player/audio.c15
-rw-r--r--player/main.c4
2 files changed, 18 insertions, 1 deletions
diff --git a/player/audio.c b/player/audio.c
index 559e194218..b354f701ae 100644
--- a/player/audio.c
+++ b/player/audio.c
@@ -190,8 +190,9 @@ void reinit_audio_chain(struct MPContext *mpctx)
mpctx->d_audio->pool = mp_audio_pool_create(mpctx->d_audio);
mpctx->d_audio->afilter = af_new(mpctx->global);
mpctx->d_audio->afilter->replaygain_data = sh->audio->replaygain_data;
+ mpctx->d_audio->spdif_passthrough = true;
mpctx->ao_buffer = mp_audio_buffer_create(NULL);
- if (!audio_init_best_codec(mpctx->d_audio, opts->audio_decoders))
+ if (!audio_init_best_codec(mpctx->d_audio))
goto init_error;
reset_audio_state(mpctx);
@@ -264,6 +265,18 @@ void reinit_audio_chain(struct MPContext *mpctx)
}
if (!mpctx->ao) {
+ // If spdif was used, try to fallback to PCM.
+ if (AF_FORMAT_IS_SPECIAL(afs->output.format) &&
+ mpctx->d_audio->spdif_passthrough)
+ {
+ mpctx->d_audio->spdif_passthrough = false;
+ if (!audio_init_best_codec(mpctx->d_audio))
+ goto init_error;
+ reset_audio_state(mpctx);
+ reinit_audio_chain(mpctx);
+ return;
+ }
+
MP_ERR(mpctx, "Could not open/initialize audio device -> no sound.\n");
mpctx->error_playing = MPV_ERROR_AO_INIT_FAILED;
goto init_error;
diff --git a/player/main.c b/player/main.c
index bb22069bfc..06b1867ebe 100644
--- a/player/main.c
+++ b/player/main.c
@@ -278,6 +278,10 @@ static bool handle_help_options(struct MPContext *mpctx)
talloc_free(list);
opt_exit = 1;
}
+ if (opts->audio_spdif && strcmp(opts->audio_spdif, "help") == 0) {
+ MP_INFO(mpctx, "Choices: ac3,dts-hd,dts (and possibly more)\n");
+ opt_exit = 1;
+ }
if (opts->video_decoders && strcmp(opts->video_decoders, "help") == 0) {
struct mp_decoder_list *list = video_decoder_list();
mp_print_decoders(log, MSGL_INFO, "Video decoders:", list);