summaryrefslogtreecommitdiffstats
path: root/libao2
diff options
context:
space:
mode:
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);