mirror of
https://github.com/mpv-player/mpv
synced 2025-04-24 12:24:21 +00:00
The audio balance feature implemented with af_pan.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@23588 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
d5621cf639
commit
be09bd1c04
@ -238,6 +238,8 @@ Adjust audio delay by +/- 0.1 seconds.
|
|||||||
Decrease/\:increase volume.
|
Decrease/\:increase volume.
|
||||||
.IPs "9 and 0"
|
.IPs "9 and 0"
|
||||||
Decrease/\:increase volume.
|
Decrease/\:increase volume.
|
||||||
|
.IPs "( and )"
|
||||||
|
Adjust audio balance in favor of left/\:right channel.
|
||||||
.IPs "m\ \ \ \ "
|
.IPs "m\ \ \ \ "
|
||||||
Mute sound.
|
Mute sound.
|
||||||
.IPs "_ (MPEG-TS and libavformat only)"
|
.IPs "_ (MPEG-TS and libavformat only)"
|
||||||
|
@ -419,6 +419,7 @@ time_pos time 0 X X X position in seconds
|
|||||||
metadata str list X list of metadata key/value
|
metadata str list X list of metadata key/value
|
||||||
metadata/* string X metadata values
|
metadata/* string X metadata values
|
||||||
volume float 0 100 X X X change volume
|
volume float 0 100 X X X change volume
|
||||||
|
balance float -1 1 X X X change audio balance
|
||||||
mute flag 0 1 X X X
|
mute flag 0 1 X X X
|
||||||
audio_delay float -100 100 X X X
|
audio_delay float -100 100 X X X
|
||||||
audio_format int X
|
audio_format int X
|
||||||
|
54
command.c
54
command.c
@ -571,6 +571,57 @@ static int mp_property_channels(m_option_t * prop, int action, void *arg,
|
|||||||
return m_property_int_ro(prop, action, arg, mpctx->sh_audio->channels);
|
return m_property_int_ro(prop, action, arg, mpctx->sh_audio->channels);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Balance (RW)
|
||||||
|
static int mp_property_balance(m_option_t * prop, int action, void *arg,
|
||||||
|
MPContext * mpctx)
|
||||||
|
{
|
||||||
|
float bal;
|
||||||
|
|
||||||
|
if (!mpctx->sh_audio || mpctx->sh_audio->channels < 2)
|
||||||
|
return M_PROPERTY_UNAVAILABLE;
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
case M_PROPERTY_GET:
|
||||||
|
if (!arg)
|
||||||
|
return M_PROPERTY_ERROR;
|
||||||
|
mixer_getbalance(&mpctx->mixer, arg);
|
||||||
|
return M_PROPERTY_OK;
|
||||||
|
case M_PROPERTY_PRINT: {
|
||||||
|
char** str = arg;
|
||||||
|
if (!arg)
|
||||||
|
return M_PROPERTY_ERROR;
|
||||||
|
mixer_getbalance(&mpctx->mixer, &bal);
|
||||||
|
if (bal == 0.f)
|
||||||
|
*str = strdup("center");
|
||||||
|
else if (bal == -1.f)
|
||||||
|
*str = strdup("left only");
|
||||||
|
else if (bal == 1.f)
|
||||||
|
*str = strdup("right only");
|
||||||
|
else {
|
||||||
|
unsigned right = (bal + 1.f) / 2.f * 100.f;
|
||||||
|
*str = malloc(sizeof("left xxx%, right xxx%"));
|
||||||
|
sprintf(*str, "left %d%%, right %d%%", 100 - right, right);
|
||||||
|
}
|
||||||
|
return M_PROPERTY_OK;
|
||||||
|
}
|
||||||
|
case M_PROPERTY_STEP_UP:
|
||||||
|
case M_PROPERTY_STEP_DOWN:
|
||||||
|
mixer_getbalance(&mpctx->mixer, &bal);
|
||||||
|
bal += (arg ? *(float*)arg : .1f) *
|
||||||
|
(action == M_PROPERTY_STEP_UP ? 1.f : -1.f);
|
||||||
|
M_PROPERTY_CLAMP(prop, bal);
|
||||||
|
mixer_setbalance(&mpctx->mixer, bal);
|
||||||
|
return M_PROPERTY_OK;
|
||||||
|
case M_PROPERTY_SET:
|
||||||
|
if (!arg)
|
||||||
|
return M_PROPERTY_ERROR;
|
||||||
|
M_PROPERTY_CLAMP(prop, *(float*)arg);
|
||||||
|
mixer_setbalance(&mpctx->mixer, *(float*)arg);
|
||||||
|
return M_PROPERTY_OK;
|
||||||
|
}
|
||||||
|
return M_PROPERTY_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
/// Selected audio id (RW)
|
/// Selected audio id (RW)
|
||||||
static int mp_property_audio(m_option_t * prop, int action, void *arg,
|
static int mp_property_audio(m_option_t * prop, int action, void *arg,
|
||||||
MPContext * mpctx)
|
MPContext * mpctx)
|
||||||
@ -1589,6 +1640,8 @@ static m_option_t mp_properties[] = {
|
|||||||
0, 0, 0, NULL },
|
0, 0, 0, NULL },
|
||||||
{ "switch_audio", mp_property_audio, CONF_TYPE_INT,
|
{ "switch_audio", mp_property_audio, CONF_TYPE_INT,
|
||||||
CONF_RANGE, -2, MAX_A_STREAMS - 1, NULL },
|
CONF_RANGE, -2, MAX_A_STREAMS - 1, NULL },
|
||||||
|
{ "balance", mp_property_balance, CONF_TYPE_FLOAT,
|
||||||
|
M_OPT_RANGE, -1, 1, NULL },
|
||||||
|
|
||||||
// Video
|
// Video
|
||||||
{ "fullscreen", mp_property_fullscreen, CONF_TYPE_FLAG,
|
{ "fullscreen", mp_property_fullscreen, CONF_TYPE_FLAG,
|
||||||
@ -1743,6 +1796,7 @@ static struct {
|
|||||||
{ "mute", MP_CMD_MUTE, 1, 0, -1, MSGTR_MuteStatus },
|
{ "mute", MP_CMD_MUTE, 1, 0, -1, MSGTR_MuteStatus },
|
||||||
{ "audio_delay", MP_CMD_AUDIO_DELAY, 0, 0, -1, MSGTR_AVDelayStatus },
|
{ "audio_delay", MP_CMD_AUDIO_DELAY, 0, 0, -1, MSGTR_AVDelayStatus },
|
||||||
{ "switch_audio", MP_CMD_SWITCH_AUDIO, 1, 0, -1, MSGTR_OSDAudio },
|
{ "switch_audio", MP_CMD_SWITCH_AUDIO, 1, 0, -1, MSGTR_OSDAudio },
|
||||||
|
{ "balance", MP_CMD_BALANCE, 0, OSD_BALANCE, -1, MSGTR_Balance },
|
||||||
// video
|
// video
|
||||||
{ "fullscreen", MP_CMD_VO_FULLSCREEN, 1, 0, -1, NULL },
|
{ "fullscreen", MP_CMD_VO_FULLSCREEN, 1, 0, -1, NULL },
|
||||||
{ "panscan", MP_CMD_PANSCAN, 0, OSD_PANSCAN, -1, MSGTR_Panscan },
|
{ "panscan", MP_CMD_PANSCAN, 0, OSD_PANSCAN, -1, MSGTR_Panscan },
|
||||||
|
@ -51,6 +51,8 @@ x sub_delay +0.1 # add
|
|||||||
6 hue 1
|
6 hue 1
|
||||||
7 saturation -1
|
7 saturation -1
|
||||||
8 saturation 1
|
8 saturation 1
|
||||||
|
( balance -0.1 # adjust audio balance in favor of left
|
||||||
|
) balance +0.1 # right
|
||||||
d frame_drop
|
d frame_drop
|
||||||
r sub_pos -1 # move subtitles up
|
r sub_pos -1 # move subtitles up
|
||||||
t sub_pos +1 # down
|
t sub_pos +1 # down
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
<pref name="audio_pref" title="Audio">
|
<pref name="audio_pref" title="Audio">
|
||||||
<e property="volume" name="Volume"/>
|
<e property="volume" name="Volume"/>
|
||||||
|
<e property="balance" name="Balance"/>
|
||||||
<e property="mute" name="Mute"/>
|
<e property="mute" name="Mute"/>
|
||||||
<e property="audio_delay" name="Delay"/>
|
<e property="audio_delay" name="Delay"/>
|
||||||
</pref>
|
</pref>
|
||||||
|
@ -231,6 +231,7 @@ static char help_text[]=
|
|||||||
#define MSGTR_Contrast "Contrast"
|
#define MSGTR_Contrast "Contrast"
|
||||||
#define MSGTR_Saturation "Saturation"
|
#define MSGTR_Saturation "Saturation"
|
||||||
#define MSGTR_Hue "Hue"
|
#define MSGTR_Hue "Hue"
|
||||||
|
#define MSGTR_Balance "Balance"
|
||||||
|
|
||||||
// property state
|
// property state
|
||||||
#define MSGTR_MuteStatus "Mute: %s"
|
#define MSGTR_MuteStatus "Mute: %s"
|
||||||
@ -706,6 +707,7 @@ static char help_text[]=
|
|||||||
|
|
||||||
#define MSGTR_InsertingAfVolume "[Mixer] No hardware mixing, inserting volume filter.\n"
|
#define MSGTR_InsertingAfVolume "[Mixer] No hardware mixing, inserting volume filter.\n"
|
||||||
#define MSGTR_NoVolume "[Mixer] No volume control available.\n"
|
#define MSGTR_NoVolume "[Mixer] No volume control available.\n"
|
||||||
|
#define MSGTR_NoBalance "[Mixer] No balance control available.\n"
|
||||||
|
|
||||||
// ====================== GUI messages/buttons ========================
|
// ====================== GUI messages/buttons ========================
|
||||||
|
|
||||||
@ -1077,6 +1079,7 @@ static char help_text[]=
|
|||||||
#define MSGTR_VO_SUB_Volume "Volume"
|
#define MSGTR_VO_SUB_Volume "Volume"
|
||||||
#define MSGTR_VO_SUB_Brightness "Brightness"
|
#define MSGTR_VO_SUB_Brightness "Brightness"
|
||||||
#define MSGTR_VO_SUB_Hue "Hue"
|
#define MSGTR_VO_SUB_Hue "Hue"
|
||||||
|
#define MSGTR_VO_SUB_Balance "Balance"
|
||||||
|
|
||||||
// vo_xv.c
|
// vo_xv.c
|
||||||
#define MSGTR_VO_XV_ImagedimTooHigh "Source image dimensions are too high: %ux%u (maximum is %ux%u)\n"
|
#define MSGTR_VO_XV_ImagedimTooHigh "Source image dimensions are too high: %ux%u (maximum is %ux%u)\n"
|
||||||
|
@ -71,6 +71,7 @@ static mp_cmd_t mp_cmds[] = {
|
|||||||
{ MP_CMD_OSD_SHOW_TEXT, "osd_show_text", 1, { {MP_CMD_ARG_STRING, {0}}, {MP_CMD_ARG_INT,{-1}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
|
{ MP_CMD_OSD_SHOW_TEXT, "osd_show_text", 1, { {MP_CMD_ARG_STRING, {0}}, {MP_CMD_ARG_INT,{-1}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
|
||||||
{ MP_CMD_OSD_SHOW_PROPERTY_TEXT, "osd_show_property_text",1, { {MP_CMD_ARG_STRING, {0}}, {MP_CMD_ARG_INT,{-1}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
|
{ MP_CMD_OSD_SHOW_PROPERTY_TEXT, "osd_show_property_text",1, { {MP_CMD_ARG_STRING, {0}}, {MP_CMD_ARG_INT,{-1}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
|
||||||
{ MP_CMD_VOLUME, "volume", 1, { { MP_CMD_ARG_FLOAT,{0} }, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
|
{ MP_CMD_VOLUME, "volume", 1, { { MP_CMD_ARG_FLOAT,{0} }, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
|
||||||
|
{ MP_CMD_BALANCE, "balance", 1, { { MP_CMD_ARG_FLOAT,{0} }, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
|
||||||
{ MP_CMD_MIXER_USEMASTER, "use_master", 0, { {-1,{0}} } },
|
{ MP_CMD_MIXER_USEMASTER, "use_master", 0, { {-1,{0}} } },
|
||||||
{ MP_CMD_MUTE, "mute", 0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } },
|
{ MP_CMD_MUTE, "mute", 0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } },
|
||||||
{ MP_CMD_CONTRAST, "contrast",1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
|
{ MP_CMD_CONTRAST, "contrast",1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
|
||||||
@ -363,6 +364,8 @@ static mp_cmd_bind_t def_cmd_binds[] = {
|
|||||||
{ { '/', 0 }, "volume -1" },
|
{ { '/', 0 }, "volume -1" },
|
||||||
{ { '0', 0 }, "volume 1" },
|
{ { '0', 0 }, "volume 1" },
|
||||||
{ { '*', 0 }, "volume 1" },
|
{ { '*', 0 }, "volume 1" },
|
||||||
|
{ { '(', 0 }, "balance -0.1" },
|
||||||
|
{ { ')', 0 }, "balance 0.1" },
|
||||||
{ { 'm', 0 }, "mute" },
|
{ { 'm', 0 }, "mute" },
|
||||||
{ { '1', 0 }, "contrast -1" },
|
{ { '1', 0 }, "contrast -1" },
|
||||||
{ { '2', 0 }, "contrast 1" },
|
{ { '2', 0 }, "contrast 1" },
|
||||||
|
@ -95,6 +95,7 @@
|
|||||||
#define MP_CMD_TV_STEP_FREQ 93
|
#define MP_CMD_TV_STEP_FREQ 93
|
||||||
#define MP_CMD_TV_TELETEXT_ADD_DEC 94
|
#define MP_CMD_TV_TELETEXT_ADD_DEC 94
|
||||||
#define MP_CMD_TV_TELETEXT_GO_LINK 95
|
#define MP_CMD_TV_TELETEXT_GO_LINK 95
|
||||||
|
#define MP_CMD_BALANCE 96
|
||||||
|
|
||||||
#define MP_CMD_GUI_EVENTS 5000
|
#define MP_CMD_GUI_EVENTS 5000
|
||||||
#define MP_CMD_GUI_LOADFILE 5001
|
#define MP_CMD_GUI_LOADFILE 5001
|
||||||
|
@ -58,9 +58,10 @@ char * __sub_osd_names[]={
|
|||||||
MSGTR_VO_SUB_Saturation,
|
MSGTR_VO_SUB_Saturation,
|
||||||
MSGTR_VO_SUB_Volume,
|
MSGTR_VO_SUB_Volume,
|
||||||
MSGTR_VO_SUB_Brightness,
|
MSGTR_VO_SUB_Brightness,
|
||||||
MSGTR_VO_SUB_Hue
|
MSGTR_VO_SUB_Hue,
|
||||||
|
MSGTR_VO_SUB_Balance
|
||||||
};
|
};
|
||||||
char * __sub_osd_names_short[] ={ "", "|>", "||", "[]", "<<" , ">>", "", "", "", "", "", ""};
|
char * __sub_osd_names_short[] ={ "", "|>", "||", "[]", "<<" , ">>", "", "", "", "", "", "", "" };
|
||||||
|
|
||||||
//static int vo_font_loaded=-1;
|
//static int vo_font_loaded=-1;
|
||||||
font_desc_t* vo_font=NULL;
|
font_desc_t* vo_font=NULL;
|
||||||
|
@ -91,6 +91,7 @@ extern void* vo_vobsub;
|
|||||||
#define OSD_VOLUME 0x09
|
#define OSD_VOLUME 0x09
|
||||||
#define OSD_BRIGHTNESS 0x0A
|
#define OSD_BRIGHTNESS 0x0A
|
||||||
#define OSD_HUE 0x0B
|
#define OSD_HUE 0x0B
|
||||||
|
#define OSD_BALANCE 0x0C
|
||||||
#define OSD_PANSCAN 0x50
|
#define OSD_PANSCAN 0x50
|
||||||
|
|
||||||
#define OSD_PB_START 0x10
|
#define OSD_PB_START 0x10
|
||||||
|
43
mixer.c
43
mixer.c
@ -118,3 +118,46 @@ void mixer_mute(mixer_t *mixer)
|
|||||||
mixer->muted=1;
|
mixer->muted=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mixer_getbalance(mixer_t *mixer, float *val)
|
||||||
|
{
|
||||||
|
*val = 0.f;
|
||||||
|
if(!mixer->afilter)
|
||||||
|
return;
|
||||||
|
af_control_any_rev(mixer->afilter,
|
||||||
|
AF_CONTROL_PAN_BALANCE | AF_CONTROL_GET, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mixer_setbalance(mixer_t *mixer, float val)
|
||||||
|
{
|
||||||
|
float level[AF_NCH];
|
||||||
|
int i;
|
||||||
|
af_control_ext_t arg_ext = { .arg = level };
|
||||||
|
af_instance_t* af_pan_balance;
|
||||||
|
|
||||||
|
if(!mixer->afilter)
|
||||||
|
return;
|
||||||
|
if (af_control_any_rev(mixer->afilter,
|
||||||
|
AF_CONTROL_PAN_BALANCE | AF_CONTROL_SET, &val))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!(af_pan_balance = af_add(mixer->afilter, "pan"))) {
|
||||||
|
mp_msg(MSGT_GLOBAL, MSGL_ERR, MSGTR_NoBalance);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
af_init(mixer->afilter);
|
||||||
|
/* make all other channels pass thru since by default pan blocks all */
|
||||||
|
memset(level, 0, sizeof(level));
|
||||||
|
for (i = 2; i < AF_NCH; i++) {
|
||||||
|
arg_ext.ch = i;
|
||||||
|
level[i] = 1.f;
|
||||||
|
af_pan_balance->control(af_pan_balance,
|
||||||
|
AF_CONTROL_PAN_LEVEL | AF_CONTROL_SET, &arg_ext);
|
||||||
|
level[i] = 0.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
af_pan_balance->control(af_pan_balance,
|
||||||
|
AF_CONTROL_PAN_BALANCE | AF_CONTROL_SET, &val);
|
||||||
|
}
|
||||||
|
|
||||||
|
2
mixer.h
2
mixer.h
@ -23,6 +23,8 @@ void mixer_incvolume(mixer_t *mixer);
|
|||||||
void mixer_decvolume(mixer_t *mixer);
|
void mixer_decvolume(mixer_t *mixer);
|
||||||
void mixer_getbothvolume(mixer_t *mixer, float *b);
|
void mixer_getbothvolume(mixer_t *mixer, float *b);
|
||||||
void mixer_mute(mixer_t *mixer);
|
void mixer_mute(mixer_t *mixer);
|
||||||
|
void mixer_getbalance(mixer_t *mixer, float *bal);
|
||||||
|
void mixer_setbalance(mixer_t *mixer, float bal);
|
||||||
|
|
||||||
//extern void mixer_setbothvolume( int v );
|
//extern void mixer_setbothvolume( int v );
|
||||||
#define mixer_setbothvolume(m, v) mixer_setvolume(m, v, v)
|
#define mixer_setbothvolume(m, v) mixer_setvolume(m, v, v)
|
||||||
|
Loading…
Reference in New Issue
Block a user