summaryrefslogtreecommitdiffstats
path: root/libao2
diff options
context:
space:
mode:
authorranma <ranma@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-03-13 21:54:35 +0000
committerranma <ranma@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-03-13 21:54:35 +0000
commit578af24bb4a176062fcbe60fa850098df78bb5b9 (patch)
treed5063af7b9a55f0d7c8edb7c2c5fb46446665efe /libao2
parent2810b67b3523ade20e841066205722a9c9e34963 (diff)
downloadmpv-578af24bb4a176062fcbe60fa850098df78bb5b9.tar.bz2
mpv-578af24bb4a176062fcbe60fa850098df78bb5b9.tar.xz
Use MultiplyElement to control volume.
Works with multiple videos at the same time and even when NAS does not control the mixer or it is unavailable. Show buffer underrun hint only once and add missing linebreaks. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@12023 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libao2')
-rw-r--r--libao2/ao_nas.c66
1 files changed, 29 insertions, 37 deletions
diff --git a/libao2/ao_nas.c b/libao2/ao_nas.c
index 42dacdc748..80617c1f91 100644
--- a/libao2/ao_nas.c
+++ b/libao2/ao_nas.c
@@ -109,6 +109,7 @@ struct ao_nas_data {
AuServer *aud;
AuFlowID flow;
AuDeviceID dev;
+ AuFixedPoint gain;
unsigned int state;
int expect_underrun;
@@ -266,13 +267,17 @@ static AuBool nas_event_handler(AuServer *aud, AuEvent *ev, AuEventHandlerRec *h
if (nas_data->expect_underrun) {
nas_data->expect_underrun = 0;
} else {
+ static int hint = 1;
mp_msg(MSGT_AO, MSGL_WARN,
"ao_nas: Buffer underrun.\n");
- mp_msg(MSGT_AO, MSGL_HINT,
- "Possible reasons are:"
- "1) Network congestion."
- "2) Your NAS server is too slow."
- "Try renicing your nasd to e.g. -15.\n");
+ if (hint) {
+ hint = 0;
+ mp_msg(MSGT_AO, MSGL_HINT,
+ "Possible reasons are:\n"
+ "1) Network congestion.\n"
+ "2) Your NAS server is too slow.\n"
+ "Try renicing your nasd to e.g. -15.\n");
+ }
}
if (nas_readBuffer(nas_data,
nas_data->server_buffer_size -
@@ -315,50 +320,34 @@ static unsigned int nas_aformat_to_auformat(unsigned int *format)
return AuFormatLinearUnsigned16LSB;
case AFMT_U16_BE:
return AuFormatLinearUnsigned16MSB;
-#ifndef WORDS_BIGENDIAN
- default:
- *format=AFMT_S16_LE;
-#endif
case AFMT_S16_LE:
return AuFormatLinearSigned16LSB;
-#ifdef WORDS_BIGENDIAN
- default:
- *format=AFMT_S16_BE;
-#endif
case AFMT_S16_BE:
return AuFormatLinearSigned16MSB;
case AFMT_MU_LAW:
return AuFormatULAW8;
+ default:
+ *format=AFMT_S16_NE;
+ return nas_aformat_to_auformat(format);
}
}
// to set/get/query special features/parameters
static int control(int cmd, void *arg)
{
- AuDeviceAttributes *dattr;
- AuFixedPoint fpgain;
+ AuElementParameters aep;
AuStatus as;
- int gain;
int retval = CONTROL_UNKNOWN;
ao_control_vol_t *vol = (ao_control_vol_t *)arg;
- dattr = AuGetDeviceAttributes(nas_data->aud, nas_data->dev, &as);
- if (as != AuSuccess) {
- nas_print_error(nas_data->aud,
- "control(): AuGetDeviceAttributes", as);
- return CONTROL_ERROR;
- }
- gain = AuFixedPointRoundDown(AuDeviceGain(dattr));
- // kn: 0 <= gain <= 100
-
switch (cmd) {
case AOCONTROL_GET_VOLUME:
- vol->right = (float) gain;
+ vol->right = (float)nas_data->gain/AU_FIXED_POINT_SCALE*50;
vol->left = vol->right;
- mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: AOCONTROL_GET_VOLUME: %d\n", gain);
+ mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: AOCONTROL_GET_VOLUME: %08x\n", nas_data->gain);
retval = CONTROL_OK;
break;
@@ -368,22 +357,23 @@ static int control(int cmd, void *arg)
* know if something can change it outside of ao_nas
* so i take the mean of both values.
*/
- gain = (int) ((vol->left+vol->right)/2);
- mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: AOCONTROL_SET_VOLUME: %d\n", gain);
+ nas_data->gain = AU_FIXED_POINT_SCALE*((vol->left+vol->right)/2)/50;
+ mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: AOCONTROL_SET_VOLUME: %08x\n", nas_data->gain);
+
+ aep.parameters[AuParmsMultiplyConstantConstant]=nas_data->gain;
+ aep.flow = nas_data->flow;
+ aep.element_num = 1;
+ aep.num_parameters = AuParmsMultiplyConstant;
- fpgain = AuFixedPointFromSum(gain, 0);
- AuDeviceGain(dattr) = fpgain;
- AuSetDeviceAttributes(nas_data->aud, nas_data->dev,
- AuCompDeviceGainMask, dattr, &as);
+ AuSetElementParameters(nas_data->aud, 1, &aep, &as);
if (as != AuSuccess) {
nas_print_error(nas_data->aud,
- "control(): AuSetDeviceAttributes", as);
+ "control(): AuSetElementParameters", as);
retval = CONTROL_ERROR;
} else retval = CONTROL_OK;
break;
};
- AuFreeDeviceAttributes(nas_data->aud, 1, dattr);
return retval;
}
@@ -460,9 +450,11 @@ static int init(int rate,int channels,int format,int flags)
buffer_size / bytes_per_sample,
(buffer_size - NAS_FRAG_SIZE) /
bytes_per_sample, 0, NULL);
- AuMakeElementExportDevice(elms+1, 0, nas_data->dev, rate,
+ nas_data->gain = AuFixedPointFromFraction(1, 1);
+ AuMakeElementMultiplyConstant(elms+1, 0, nas_data->gain);
+ AuMakeElementExportDevice(elms+2, 1, nas_data->dev, rate,
AuUnlimitedSamples, 0, NULL);
- AuSetElements(nas_data->aud, nas_data->flow, AuTrue, 2, elms, &as);
+ AuSetElements(nas_data->aud, nas_data->flow, AuTrue, sizeof(elms)/sizeof(*elms), elms, &as);
if (as != AuSuccess) {
nas_print_error(nas_data->aud, "init(): AuSetElements", as);
AuCloseServer(nas_data->aud);