summaryrefslogtreecommitdiffstats
path: root/mpvcore
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-09-20 13:48:36 +0200
committerwm4 <wm4@nowhere>2013-09-20 13:48:36 +0200
commit3e5b632559a9198c0ede739622529d8df7909ca7 (patch)
tree0b66c871c6b670313da1dcedb9582db2a856cf51 /mpvcore
parented2d67b6d7585a5db5411f230fc8dcd27f9e85fc (diff)
parent542086dd4537b852b61974f9bee4eabebde8505f (diff)
downloadmpv-3e5b632559a9198c0ede739622529d8df7909ca7.tar.bz2
mpv-3e5b632559a9198c0ede739622529d8df7909ca7.tar.xz
Merge branch 'volume_restore'
Diffstat (limited to 'mpvcore')
-rw-r--r--mpvcore/command.c42
-rw-r--r--mpvcore/mp_core.h4
-rw-r--r--mpvcore/mplayer.c50
-rw-r--r--mpvcore/options.c1
-rw-r--r--mpvcore/options.h1
5 files changed, 37 insertions, 61 deletions
diff --git a/mpvcore/command.c b/mpvcore/command.c
index dedac9dc10..a2de363b3d 100644
--- a/mpvcore/command.c
+++ b/mpvcore/command.c
@@ -762,23 +762,19 @@ static int mp_property_clock(m_option_t *prop, int action, void *arg,
static int mp_property_volume(m_option_t *prop, int action, void *arg,
MPContext *mpctx)
{
-
- if (!mpctx->sh_audio)
- return M_PROPERTY_UNAVAILABLE;
-
switch (action) {
case M_PROPERTY_GET:
- mixer_getbothvolume(&mpctx->mixer, arg);
+ mixer_getbothvolume(mpctx->mixer, arg);
return M_PROPERTY_OK;
case M_PROPERTY_SET:
- mixer_setvolume(&mpctx->mixer, *(float *) arg, *(float *) arg);
+ mixer_setvolume(mpctx->mixer, *(float *) arg, *(float *) arg);
return M_PROPERTY_OK;
case M_PROPERTY_SWITCH: {
struct m_property_switch_arg *sarg = arg;
if (sarg->inc <= 0)
- mixer_decvolume(&mpctx->mixer);
+ mixer_decvolume(mpctx->mixer);
else
- mixer_incvolume(&mpctx->mixer);
+ mixer_incvolume(mpctx->mixer);
return M_PROPERTY_OK;
}
}
@@ -789,21 +785,32 @@ static int mp_property_volume(m_option_t *prop, int action, void *arg,
static int mp_property_mute(m_option_t *prop, int action, void *arg,
MPContext *mpctx)
{
-
- if (!mpctx->sh_audio)
- return M_PROPERTY_UNAVAILABLE;
-
switch (action) {
case M_PROPERTY_SET:
- mixer_setmute(&mpctx->mixer, *(int *) arg);
+ mixer_setmute(mpctx->mixer, *(int *) arg);
return M_PROPERTY_OK;
case M_PROPERTY_GET:
- *(int *)arg = mixer_getmute(&mpctx->mixer);
+ *(int *)arg = mixer_getmute(mpctx->mixer);
return M_PROPERTY_OK;
}
return M_PROPERTY_NOT_IMPLEMENTED;
}
+static int mp_property_volrestore(m_option_t *prop, int action,
+ void *arg, MPContext *mpctx)
+{
+ switch (action) {
+ case M_PROPERTY_GET: {
+ char *s = mixer_get_volume_restore_data(mpctx->mixer);
+ *(char **)arg = s;
+ return s ? M_PROPERTY_OK : M_PROPERTY_UNAVAILABLE;
+ }
+ case M_PROPERTY_SET:
+ return M_PROPERTY_NOT_IMPLEMENTED;
+ }
+ return mp_property_generic_option(prop, action, arg, mpctx);
+}
+
/// Audio delay (RW)
static int mp_property_audio_delay(m_option_t *prop, int action,
void *arg, MPContext *mpctx)
@@ -899,11 +906,11 @@ static int mp_property_balance(m_option_t *prop, int action, void *arg,
switch (action) {
case M_PROPERTY_GET:
- mixer_getbalance(&mpctx->mixer, arg);
+ mixer_getbalance(mpctx->mixer, arg);
return M_PROPERTY_OK;
case M_PROPERTY_PRINT: {
char **str = arg;
- mixer_getbalance(&mpctx->mixer, &bal);
+ mixer_getbalance(mpctx->mixer, &bal);
if (bal == 0.f)
*str = talloc_strdup(NULL, "center");
else if (bal == -1.f)
@@ -918,7 +925,7 @@ static int mp_property_balance(m_option_t *prop, int action, void *arg,
return M_PROPERTY_OK;
}
case M_PROPERTY_SET:
- mixer_setbalance(&mpctx->mixer, *(float *)arg);
+ mixer_setbalance(mpctx->mixer, *(float *)arg);
return M_PROPERTY_OK;
}
return M_PROPERTY_NOT_IMPLEMENTED;
@@ -1806,6 +1813,7 @@ static const m_option_t mp_properties[] = {
M_OPTION_PROPERTY_CUSTOM("aid", mp_property_audio),
{ "balance", mp_property_balance, CONF_TYPE_FLOAT,
M_OPT_RANGE, -1, 1, NULL },
+ M_OPTION_PROPERTY_CUSTOM("volume-restore-data", mp_property_volrestore),
// Video
M_OPTION_PROPERTY_CUSTOM("fullscreen", mp_property_fullscreen),
diff --git a/mpvcore/mp_core.h b/mpvcore/mp_core.h
index 9f3e095110..98096aa5fe 100644
--- a/mpvcore/mp_core.h
+++ b/mpvcore/mp_core.h
@@ -22,14 +22,12 @@
#include <stdbool.h>
#include "mpvcore/options.h"
-#include "audio/mixer.h"
#include "demux/demux.h"
// definitions used internally by the core player code
#define INITIALIZED_VO 1
#define INITIALIZED_AO 2
-#define INITIALIZED_VOL 4
#define INITIALIZED_GETCH2 8
#define INITIALIZED_PLAYBACK 16
#define INITIALIZED_STREAM 64
@@ -180,7 +178,7 @@ typedef struct MPContext {
// demuxer defines metadata), or special purpose demuxers like TV.
struct demuxer *master_demuxer;
- mixer_t mixer;
+ struct mixer *mixer;
struct ao *ao;
struct vo *video_out;
diff --git a/mpvcore/mplayer.c b/mpvcore/mplayer.c
index e4566c56ff..f4bf6c9316 100644
--- a/mpvcore/mplayer.c
+++ b/mpvcore/mplayer.c
@@ -443,18 +443,16 @@ static void uninit_subs(struct demuxer *demuxer)
void uninit_player(struct MPContext *mpctx, unsigned int mask)
{
- struct MPOpts *opts = mpctx->opts;
-
mask &= mpctx->initialized_flags;
mp_msg(MSGT_CPLAYER, MSGL_DBG2, "\n*** uninit(0x%X)\n", mask);
if (mask & INITIALIZED_ACODEC) {
mpctx->initialized_flags &= ~INITIALIZED_ACODEC;
+ mixer_uninit_audio(mpctx->mixer);
if (mpctx->sh_audio)
uninit_audio(mpctx->sh_audio);
cleanup_demux_stream(mpctx, STREAM_AUDIO);
- mpctx->mixer.afilter = NULL;
}
if (mask & INITIALIZED_SUB) {
@@ -526,24 +524,8 @@ void uninit_player(struct MPContext *mpctx, unsigned int mask)
getch2_disable();
}
- if (mask & INITIALIZED_VOL) {
- mpctx->initialized_flags &= ~INITIALIZED_VOL;
- if (mpctx->mixer.ao) {
- // Normally the mixer remembers volume, but do it even if the
- // volume is set explicitly with --volume=... (so that the same
- // volume is restored on reinit)
- if (opts->mixer_init_volume >= 0 && mpctx->mixer.user_set_volume)
- mixer_getbothvolume(&mpctx->mixer, &opts->mixer_init_volume);
- if (opts->mixer_init_mute >= 0 && mpctx->mixer.user_set_mute)
- opts->mixer_init_mute = mixer_getmute(&mpctx->mixer);
- }
- }
-
if (mask & INITIALIZED_AO) {
mpctx->initialized_flags &= ~INITIALIZED_AO;
- if (mpctx->mixer.ao)
- mixer_uninit(&mpctx->mixer);
- mpctx->mixer.ao = NULL;
if (mpctx->ao)
ao_uninit(mpctx->ao, mpctx->stop_play != AT_END_OF_FILE);
mpctx->ao = NULL;
@@ -827,8 +809,7 @@ static const char *backup_properties[] = {
"speed",
"edition",
"pause",
- //"volume",
- //"mute",
+ "volume-restore-data",
"audio-delay",
//"balance",
"fullscreen",
@@ -1618,7 +1599,6 @@ static int build_afilter_chain(struct MPContext *mpctx)
static int recreate_audio_filters(struct MPContext *mpctx)
{
- struct MPOpts *opts = mpctx->opts;
assert(mpctx->sh_audio);
// init audio filters:
@@ -1628,20 +1608,7 @@ static int recreate_audio_filters(struct MPContext *mpctx)
return -1;
}
- mpctx->mixer.afilter = mpctx->sh_audio->afilter;
- mpctx->mixer.volstep = opts->volstep;
- mpctx->mixer.softvol = opts->softvol;
- mpctx->mixer.softvol_max = opts->softvol_max;
- mixer_reinit(&mpctx->mixer, mpctx->ao);
- if (!(mpctx->initialized_flags & INITIALIZED_VOL)) {
- if (opts->mixer_init_volume >= 0) {
- mixer_setvolume(&mpctx->mixer, opts->mixer_init_volume,
- opts->mixer_init_volume);
- }
- if (opts->mixer_init_mute >= 0)
- mixer_setmute(&mpctx->mixer, opts->mixer_init_mute);
- mpctx->initialized_flags |= INITIALIZED_VOL;
- }
+ mixer_reinit_audio(mpctx->mixer, mpctx->ao, mpctx->sh_audio->afilter);
return 0;
}
@@ -1666,7 +1633,7 @@ void reinit_audio_chain(struct MPContext *mpctx)
struct MPOpts *opts = mpctx->opts;
init_demux_stream(mpctx, STREAM_AUDIO);
if (!mpctx->sh_audio) {
- uninit_player(mpctx, INITIALIZED_VOL | INITIALIZED_AO);
+ uninit_player(mpctx, INITIALIZED_AO);
goto no_audio;
}
@@ -1737,7 +1704,7 @@ void reinit_audio_chain(struct MPContext *mpctx)
return;
init_error:
- uninit_player(mpctx, INITIALIZED_ACODEC | INITIALIZED_AO | INITIALIZED_VOL);
+ uninit_player(mpctx, INITIALIZED_ACODEC | INITIALIZED_AO);
cleanup_demux_stream(mpctx, STREAM_AUDIO);
no_audio:
mpctx->current_track[STREAM_AUDIO] = NULL;
@@ -2044,7 +2011,7 @@ void mp_switch_track(struct MPContext *mpctx, enum stream_type type,
uninit_player(mpctx, INITIALIZED_VCODEC |
(mpctx->opts->fixed_vo && track ? 0 : INITIALIZED_VO));
} else if (type == STREAM_AUDIO) {
- uninit_player(mpctx, INITIALIZED_AO | INITIALIZED_ACODEC | INITIALIZED_VOL);
+ uninit_player(mpctx, INITIALIZED_AO | INITIALIZED_ACODEC);
} else if (type == STREAM_SUB) {
uninit_player(mpctx, INITIALIZED_SUB);
}
@@ -2284,7 +2251,7 @@ static int fill_audio_out_buffers(struct MPContext *mpctx, double endpts)
* while displaying video, then doing the output format switch.
*/
if (!mpctx->opts->gapless_audio)
- uninit_player(mpctx, INITIALIZED_AO | INITIALIZED_VOL);
+ uninit_player(mpctx, INITIALIZED_AO);
reinit_audio_chain(mpctx);
return -1;
} else if (res == ASYNC_PLAY_DONE)
@@ -2913,7 +2880,7 @@ static bool timeline_set_part(struct MPContext *mpctx, int i, bool force)
enum stop_play_reason orig_stop_play = mpctx->stop_play;
if (!mpctx->sh_video && mpctx->stop_play == KEEP_PLAYING)
mpctx->stop_play = AT_END_OF_FILE; // let audio uninit drain data
- uninit_player(mpctx, INITIALIZED_VCODEC | (mpctx->opts->fixed_vo ? 0 : INITIALIZED_VO) | (mpctx->opts->gapless_audio ? 0 : INITIALIZED_AO) | INITIALIZED_VOL | INITIALIZED_ACODEC | INITIALIZED_SUB);
+ uninit_player(mpctx, INITIALIZED_VCODEC | (mpctx->opts->fixed_vo ? 0 : INITIALIZED_VO) | (mpctx->opts->gapless_audio ? 0 : INITIALIZED_AO) | INITIALIZED_ACODEC | INITIALIZED_SUB);
mpctx->stop_play = orig_stop_play;
mpctx->demuxer = n->source;
@@ -4859,6 +4826,7 @@ static int mpv_main(int argc, char *argv[])
init_libav();
GetCpuCaps(&gCpuCaps);
screenshot_init(mpctx);
+ mpctx->mixer = mixer_init(mpctx, opts);
// Preparse the command line
m_config_preparse_command_line(mpctx->mconfig, argc, argv);
diff --git a/mpvcore/options.c b/mpvcore/options.c
index a09a28856f..e3b3137aed 100644
--- a/mpvcore/options.c
+++ b/mpvcore/options.c
@@ -565,6 +565,7 @@ const m_option_t mp_opts[] = {
({"auto", -1},
{"no", 0},
{"yes", 1}, {"", 1})),
+ OPT_STRING("volume-restore-data", mixer_restore_volume_data, 0),
OPT_FLAG("gapless-audio", gapless_audio, 0),
// set screen dimensions (when not detectable or virtual!=visible)
diff --git a/mpvcore/options.h b/mpvcore/options.h
index 67074de241..d425d0789b 100644
--- a/mpvcore/options.h
+++ b/mpvcore/options.h
@@ -51,6 +51,7 @@ typedef struct MPOpts {
int softvol;
float mixer_init_volume;
int mixer_init_mute;
+ char *mixer_restore_volume_data;
int volstep;
float softvol_max;
int gapless_audio;