mirror of
https://github.com/mpv-player/mpv
synced 2025-02-16 20:27:23 +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.
|
||||
.IPs "9 and 0"
|
||||
Decrease/\:increase volume.
|
||||
.IPs "( and )"
|
||||
Adjust audio balance in favor of left/\:right channel.
|
||||
.IPs "m\ \ \ \ "
|
||||
Mute sound.
|
||||
.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/* string X metadata values
|
||||
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
|
||||
audio_delay float -100 100 X X 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);
|
||||
}
|
||||
|
||||
/// 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)
|
||||
static int mp_property_audio(m_option_t * prop, int action, void *arg,
|
||||
MPContext * mpctx)
|
||||
@ -1589,6 +1640,8 @@ static m_option_t mp_properties[] = {
|
||||
0, 0, 0, NULL },
|
||||
{ "switch_audio", mp_property_audio, CONF_TYPE_INT,
|
||||
CONF_RANGE, -2, MAX_A_STREAMS - 1, NULL },
|
||||
{ "balance", mp_property_balance, CONF_TYPE_FLOAT,
|
||||
M_OPT_RANGE, -1, 1, NULL },
|
||||
|
||||
// Video
|
||||
{ "fullscreen", mp_property_fullscreen, CONF_TYPE_FLAG,
|
||||
@ -1743,6 +1796,7 @@ static struct {
|
||||
{ "mute", MP_CMD_MUTE, 1, 0, -1, MSGTR_MuteStatus },
|
||||
{ "audio_delay", MP_CMD_AUDIO_DELAY, 0, 0, -1, MSGTR_AVDelayStatus },
|
||||
{ "switch_audio", MP_CMD_SWITCH_AUDIO, 1, 0, -1, MSGTR_OSDAudio },
|
||||
{ "balance", MP_CMD_BALANCE, 0, OSD_BALANCE, -1, MSGTR_Balance },
|
||||
// video
|
||||
{ "fullscreen", MP_CMD_VO_FULLSCREEN, 1, 0, -1, NULL },
|
||||
{ "panscan", MP_CMD_PANSCAN, 0, OSD_PANSCAN, -1, MSGTR_Panscan },
|
||||
|
@ -51,6 +51,8 @@ x sub_delay +0.1 # add
|
||||
6 hue 1
|
||||
7 saturation -1
|
||||
8 saturation 1
|
||||
( balance -0.1 # adjust audio balance in favor of left
|
||||
) balance +0.1 # right
|
||||
d frame_drop
|
||||
r sub_pos -1 # move subtitles up
|
||||
t sub_pos +1 # down
|
||||
|
@ -33,6 +33,7 @@
|
||||
|
||||
<pref name="audio_pref" title="Audio">
|
||||
<e property="volume" name="Volume"/>
|
||||
<e property="balance" name="Balance"/>
|
||||
<e property="mute" name="Mute"/>
|
||||
<e property="audio_delay" name="Delay"/>
|
||||
</pref>
|
||||
|
@ -231,6 +231,7 @@ static char help_text[]=
|
||||
#define MSGTR_Contrast "Contrast"
|
||||
#define MSGTR_Saturation "Saturation"
|
||||
#define MSGTR_Hue "Hue"
|
||||
#define MSGTR_Balance "Balance"
|
||||
|
||||
// property state
|
||||
#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_NoVolume "[Mixer] No volume control available.\n"
|
||||
#define MSGTR_NoBalance "[Mixer] No balance control available.\n"
|
||||
|
||||
// ====================== GUI messages/buttons ========================
|
||||
|
||||
@ -1077,6 +1079,7 @@ static char help_text[]=
|
||||
#define MSGTR_VO_SUB_Volume "Volume"
|
||||
#define MSGTR_VO_SUB_Brightness "Brightness"
|
||||
#define MSGTR_VO_SUB_Hue "Hue"
|
||||
#define MSGTR_VO_SUB_Balance "Balance"
|
||||
|
||||
// vo_xv.c
|
||||
#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_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_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_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}} } },
|
||||
@ -363,6 +364,8 @@ static mp_cmd_bind_t def_cmd_binds[] = {
|
||||
{ { '/', 0 }, "volume -1" },
|
||||
{ { '0', 0 }, "volume 1" },
|
||||
{ { '*', 0 }, "volume 1" },
|
||||
{ { '(', 0 }, "balance -0.1" },
|
||||
{ { ')', 0 }, "balance 0.1" },
|
||||
{ { 'm', 0 }, "mute" },
|
||||
{ { '1', 0 }, "contrast -1" },
|
||||
{ { '2', 0 }, "contrast 1" },
|
||||
|
@ -95,6 +95,7 @@
|
||||
#define MP_CMD_TV_STEP_FREQ 93
|
||||
#define MP_CMD_TV_TELETEXT_ADD_DEC 94
|
||||
#define MP_CMD_TV_TELETEXT_GO_LINK 95
|
||||
#define MP_CMD_BALANCE 96
|
||||
|
||||
#define MP_CMD_GUI_EVENTS 5000
|
||||
#define MP_CMD_GUI_LOADFILE 5001
|
||||
|
@ -58,9 +58,10 @@ char * __sub_osd_names[]={
|
||||
MSGTR_VO_SUB_Saturation,
|
||||
MSGTR_VO_SUB_Volume,
|
||||
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;
|
||||
font_desc_t* vo_font=NULL;
|
||||
|
@ -91,6 +91,7 @@ extern void* vo_vobsub;
|
||||
#define OSD_VOLUME 0x09
|
||||
#define OSD_BRIGHTNESS 0x0A
|
||||
#define OSD_HUE 0x0B
|
||||
#define OSD_BALANCE 0x0C
|
||||
#define OSD_PANSCAN 0x50
|
||||
|
||||
#define OSD_PB_START 0x10
|
||||
|
43
mixer.c
43
mixer.c
@ -118,3 +118,46 @@ void mixer_mute(mixer_t *mixer)
|
||||
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_getbothvolume(mixer_t *mixer, float *b);
|
||||
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 );
|
||||
#define mixer_setbothvolume(m, v) mixer_setvolume(m, v, v)
|
||||
|
Loading…
Reference in New Issue
Block a user