summaryrefslogtreecommitdiffstats
path: root/libao2/ao_nas.c
diff options
context:
space:
mode:
Diffstat (limited to 'libao2/ao_nas.c')
-rw-r--r--libao2/ao_nas.c50
1 files changed, 31 insertions, 19 deletions
diff --git a/libao2/ao_nas.c b/libao2/ao_nas.c
index 4888cfc366..5428c7489f 100644
--- a/libao2/ao_nas.c
+++ b/libao2/ao_nas.c
@@ -41,6 +41,7 @@
#include "audio_out_internal.h"
#include "libaf/af_format.h"
+/* NAS_FRAG_SIZE must be a power-of-two value */
#define NAS_FRAG_SIZE 4096
static char *nas_event_types[] = {
@@ -116,8 +117,8 @@ struct ao_nas_data {
unsigned int state;
int expect_underrun;
- void *client_buffer;
- void *server_buffer;
+ char *client_buffer;
+ char *server_buffer;
unsigned int client_buffer_size;
unsigned int client_buffer_used;
unsigned int server_buffer_size;
@@ -139,7 +140,7 @@ static void nas_print_error(AuServer *aud, const char *prefix, AuStatus as)
mp_msg(MSGT_AO, MSGL_ERR, "ao_nas: %s: returned status %d (%s)\n", prefix, as, s);
}
-static int nas_readBuffer(struct ao_nas_data *nas_data, int num)
+static int nas_readBuffer(struct ao_nas_data *nas_data, unsigned int num)
{
AuStatus as;
@@ -187,7 +188,7 @@ static int nas_readBuffer(struct ao_nas_data *nas_data, int num)
return num;
}
-static int nas_writeBuffer(struct ao_nas_data *nas_data, void *data, int len)
+static int nas_writeBuffer(struct ao_nas_data *nas_data, void *data, unsigned int len)
{
pthread_mutex_lock(&nas_data->buffer_mutex);
mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: nas_writeBuffer(): len=%d client=%d/%d server=%d/%d\n",
@@ -260,7 +261,7 @@ static AuBool nas_event_handler(AuServer *aud, AuEvent *ev, AuEventHandlerRec *h
nas_state(event->prev_state),
nas_state(event->cur_state),
nas_reason(event->reason),
- event->num_bytes,
+ (int)event->num_bytes,
nas_data->expect_underrun);
if (event->num_bytes > INT_MAX) {
@@ -301,7 +302,7 @@ static AuBool nas_event_handler(AuServer *aud, AuEvent *ev, AuEventHandlerRec *h
}
mp_msg(MSGT_AO, MSGL_DBG2,
"ao_nas: Can't refill buffer, stopping flow.\n");
- AuStopFlow(nas_data->aud, nas_data->flow, NULL);
+ AuStopFlow(aud, nas_data->flow, NULL);
break;
default:
break;
@@ -361,7 +362,7 @@ static int control(int cmd, void *arg)
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: %08x\n", nas_data->gain);
+ mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: AOCONTROL_GET_VOLUME: %.2f\n", vol->right);
retval = CONTROL_OK;
break;
@@ -372,7 +373,7 @@ static int control(int cmd, void *arg)
* so i take the mean of both values.
*/
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);
+ mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: AOCONTROL_SET_VOLUME: %.2f\n", (vol->left+vol->right)/2);
aep.parameters[AuParmsMultiplyConstantConstant]=nas_data->gain;
aep.flow = nas_data->flow;
@@ -402,6 +403,8 @@ static int init(int rate,int channels,int format,int flags)
int buffer_size;
char *server;
+ (void)flags; /* shut up 'unused parameter' warning */
+
nas_data=malloc(sizeof(struct ao_nas_data));
memset(nas_data, 0, sizeof(struct ao_nas_data));
@@ -564,7 +567,7 @@ static int get_space(void)
// return: number of bytes played
static int play(void* data,int len,int flags)
{
- int maxbursts, playbursts, writelen;
+ int written, maxbursts = 0, playbursts = 0;
AuStatus as;
mp_msg(MSGT_AO, MSGL_DBG3,
@@ -574,18 +577,27 @@ static int play(void* data,int len,int flags)
if (len == 0)
return 0;
- pthread_mutex_lock(&nas_data->buffer_mutex);
- maxbursts = (nas_data->client_buffer_size -
- nas_data->client_buffer_used) / ao_data.outburst;
- playbursts = len / ao_data.outburst;
- writelen = (playbursts > maxbursts ? maxbursts : playbursts) *
- ao_data.outburst;
- pthread_mutex_unlock(&nas_data->buffer_mutex);
+ if (!(flags & AOPLAY_FINAL_CHUNK)) {
+ pthread_mutex_lock(&nas_data->buffer_mutex);
+ maxbursts = (nas_data->client_buffer_size -
+ nas_data->client_buffer_used) / ao_data.outburst;
+ playbursts = len / ao_data.outburst;
+ len = (playbursts > maxbursts ? maxbursts : playbursts) *
+ ao_data.outburst;
+ pthread_mutex_unlock(&nas_data->buffer_mutex);
+ }
- writelen = nas_writeBuffer(nas_data, data, writelen);
+ /*
+ * If AOPLAY_FINAL_CHUNK is set, we did not actually check len fits
+ * into the available buffer space, but mplayer.c shouldn't give us
+ * more to play than we report to it by get_space(), so this should be
+ * fine.
+ */
+ written = nas_writeBuffer(nas_data, data, len);
if (nas_data->state != AuStateStart &&
- maxbursts == playbursts) {
+ (maxbursts == playbursts ||
+ flags & AOPLAY_FINAL_CHUNK)) {
mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: play(): Starting flow.\n");
nas_data->expect_underrun = 1;
AuStartFlow(nas_data->aud, nas_data->flow, &as);
@@ -593,7 +605,7 @@ static int play(void* data,int len,int flags)
nas_print_error(nas_data->aud, "play(): AuStartFlow", as);
}
- return writelen;
+ return written;
}
// return: delay in seconds between first and last sample in buffer