10 #include "libao2/audio_out.h"
16 char * mixer_device
=NULL
;
17 char * mixer_channel
=NULL
;
19 void mixer_getvolume(mixer_t
*mixer
, float *l
, float *r
)
24 if(CONTROL_OK
!= mixer
->audio_out
->control(AOCONTROL_GET_VOLUME
,&vol
)) {
28 float db_vals
[AF_NCH
];
29 if (!af_control_any_rev(mixer
->afilter
,
30 AF_CONTROL_VOLUME_LEVEL
| AF_CONTROL_GET
, db_vals
))
31 db_vals
[0] = db_vals
[1] = 1.0;
33 af_from_dB (2, db_vals
, db_vals
, 20.0, -200.0, 60.0);
34 vol
.left
= db_vals
[0] * 90.0;
35 vol
.right
= db_vals
[1] * 90.0;
43 void mixer_setvolume(mixer_t
*mixer
, float l
, float r
)
46 vol
.right
=r
; vol
.left
=l
;
48 if(CONTROL_OK
!= mixer
->audio_out
->control(AOCONTROL_SET_VOLUME
,&vol
)) {
52 // af_volume uses values in dB
53 float db_vals
[AF_NCH
];
55 // a volume of 90% will give 0 dB (no change)
56 // like this, amplification is possible as well
57 db_vals
[0] = l
/ 90.0;
58 db_vals
[1] = r
/ 90.0;
59 for (i
= 2; i
< AF_NCH
; i
++) {
60 db_vals
[i
] = (l
+ r
) / 180.0;
62 af_to_dB (AF_NCH
, db_vals
, db_vals
, 20.0);
63 if (!af_control_any_rev(mixer
->afilter
,
64 AF_CONTROL_VOLUME_LEVEL
| AF_CONTROL_SET
, db_vals
)) {
65 mp_msg(MSGT_GLOBAL
, MSGL_INFO
, MSGTR_InsertingAfVolume
);
66 if (af_add(mixer
->afilter
, "volume")) {
67 if (!af_control_any_rev(mixer
->afilter
,
68 AF_CONTROL_VOLUME_LEVEL
| AF_CONTROL_SET
, db_vals
)) {
69 mp_msg(MSGT_GLOBAL
, MSGL_ERR
, MSGTR_NoVolume
);
80 void mixer_incvolume(mixer_t
*mixer
)
82 float mixer_l
, mixer_r
;
83 mixer_getvolume(mixer
, &mixer_l
, &mixer_r
);
84 mixer_l
+= mixer
->volstep
;
85 if ( mixer_l
> 100 ) mixer_l
= 100;
86 mixer_r
+= mixer
->volstep
;
87 if ( mixer_r
> 100 ) mixer_r
= 100;
88 mixer_setvolume(mixer
, mixer_l
, mixer_r
);
91 void mixer_decvolume(mixer_t
*mixer
)
93 float mixer_l
, mixer_r
;
94 mixer_getvolume(mixer
, &mixer_l
, &mixer_r
);
95 mixer_l
-= mixer
->volstep
;
96 if ( mixer_l
< 0 ) mixer_l
= 0;
97 mixer_r
-= mixer
->volstep
;
98 if ( mixer_r
< 0 ) mixer_r
= 0;
99 mixer_setvolume(mixer
, mixer_l
, mixer_r
);
102 void mixer_getbothvolume(mixer_t
*mixer
, float *b
)
104 float mixer_l
, mixer_r
;
105 mixer_getvolume(mixer
, &mixer_l
, &mixer_r
);
106 *b
= ( mixer_l
+ mixer_r
) / 2;
109 void mixer_mute(mixer_t
*mixer
)
111 if (mixer
->muted
) mixer_setvolume(mixer
, mixer
->last_l
, mixer
->last_r
);
114 mixer_getvolume(mixer
, &mixer
->last_l
, &mixer
->last_r
);
115 mixer_setvolume(mixer
, 0, 0);