[MPlayer-cvslog] r23588 - in trunk: DOCS/man/en/mplayer.1 DOCS/tech/slave.txt command.c etc/input.conf etc/menu.conf help/help_mp-en.h input/input.c input/input.h libvo/sub.c libvo/sub.h mixer.c mixer.h

zuxy subversion at mplayerhq.hu
Wed Jun 20 04:26:20 CEST 2007


Author: zuxy
Date: Wed Jun 20 04:26:20 2007
New Revision: 23588

Log:
The audio balance feature implemented with af_pan.


Modified:
   trunk/DOCS/tech/slave.txt
   trunk/command.c
   trunk/etc/input.conf
   trunk/etc/menu.conf
   trunk/input/input.c
   trunk/input/input.h
   trunk/libvo/sub.c
   trunk/libvo/sub.h
   trunk/mixer.c
   trunk/mixer.h

Changes in other areas also in this revision:
Modified:
   trunk/DOCS/man/en/mplayer.1
   trunk/help/help_mp-en.h

Modified: trunk/DOCS/tech/slave.txt
==============================================================================
--- trunk/DOCS/tech/slave.txt	(original)
+++ trunk/DOCS/tech/slave.txt	Wed Jun 20 04:26:20 2007
@@ -419,6 +419,7 @@ time_pos           time      0          
 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

Modified: trunk/command.c
==============================================================================
--- trunk/command.c	(original)
+++ trunk/command.c	Wed Jun 20 04:26:20 2007
@@ -571,6 +571,57 @@ static int mp_property_channels(m_option
     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 },

Modified: trunk/etc/input.conf
==============================================================================
--- trunk/etc/input.conf	(original)
+++ trunk/etc/input.conf	Wed Jun 20 04:26:20 2007
@@ -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

Modified: trunk/etc/menu.conf
==============================================================================
--- trunk/etc/menu.conf	(original)
+++ trunk/etc/menu.conf	Wed Jun 20 04:26:20 2007
@@ -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>

Modified: trunk/input/input.c
==============================================================================
--- trunk/input/input.c	(original)
+++ trunk/input/input.c	Wed Jun 20 04:26:20 2007
@@ -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" },

Modified: trunk/input/input.h
==============================================================================
--- trunk/input/input.h	(original)
+++ trunk/input/input.h	Wed Jun 20 04:26:20 2007
@@ -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

Modified: trunk/libvo/sub.c
==============================================================================
--- trunk/libvo/sub.c	(original)
+++ trunk/libvo/sub.c	Wed Jun 20 04:26:20 2007
@@ -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;

Modified: trunk/libvo/sub.h
==============================================================================
--- trunk/libvo/sub.h	(original)
+++ trunk/libvo/sub.h	Wed Jun 20 04:26:20 2007
@@ -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

Modified: trunk/mixer.c
==============================================================================
--- trunk/mixer.c	(original)
+++ trunk/mixer.c	Wed Jun 20 04:26:20 2007
@@ -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);
+}
+

Modified: trunk/mixer.h
==============================================================================
--- trunk/mixer.h	(original)
+++ trunk/mixer.h	Wed Jun 20 04:26:20 2007
@@ -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)



More information about the MPlayer-cvslog mailing list