annotate libao2/ao_nas.c @ 35967:76d4f38ffdf9

Fix crash with file selector after pressing OK. The crash would occur with the "dot directory" selected and pressing OK when previously either the "directory up" button or OK (to refresh the file list) has been pressed.
author ib
date Wed, 27 Mar 2013 18:56:13 +0000
parents 0f1b5b68af32
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3336
8818c12743a8 patch by Tobias Diedrich <td@informatik.uni-hannover.de>
pl
parents: 3276
diff changeset
1 /*
28343
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
2 * NAS audio output driver
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
3 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
4 * copyright (c) 2001 Tobias Diedrich <ranma@gmx.at>
3336
8818c12743a8 patch by Tobias Diedrich <td@informatik.uni-hannover.de>
pl
parents: 3276
diff changeset
5 *
28343
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
6 * Based on the libaudiooss parts rewritten by me, which were
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
7 * originally based on the NAS output plugin for XMMS.
3336
8818c12743a8 patch by Tobias Diedrich <td@informatik.uni-hannover.de>
pl
parents: 3276
diff changeset
8 *
28343
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
9 * XMMS plugin by Willem Monsuwe
3336
8818c12743a8 patch by Tobias Diedrich <td@informatik.uni-hannover.de>
pl
parents: 3276
diff changeset
10 * adapted for libaudiooss by Jon Trulson
23734
acfe034e5386 ISO8859-1 --> UTF-8
diego
parents: 23006
diff changeset
11 * further modified by Erik Inge Bolsø
28343
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
12 * largely rewritten and used for this ao driver by Tobias Diedrich
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
13 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
14 * This file is part of MPlayer.
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
15 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
16 * MPlayer is free software; you can redistribute it and/or modify
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
17 * it under the terms of the GNU General Public License as published by
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
18 * the Free Software Foundation; either version 2 of the License, or
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
19 * (at your option) any later version.
3336
8818c12743a8 patch by Tobias Diedrich <td@informatik.uni-hannover.de>
pl
parents: 3276
diff changeset
20 *
28343
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
21 * MPlayer is distributed in the hope that it will be useful,
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
24 * GNU General Public License for more details.
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
25 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
26 * You should have received a copy of the GNU General Public License along
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
27 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
28 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
29 */
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
30
e45b08f2f5d3 Add standard license headers.
diego
parents: 28192
diff changeset
31 /*
7626
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
32 * Theory of operation:
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
33 *
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
34 * The NAS consists of two parts, a server daemon and a client.
7732
arpi
parents: 7646
diff changeset
35 * We setup the server to use a buffer of size bytes_per_second
arpi
parents: 7646
diff changeset
36 * with a low watermark of buffer_size - NAS_FRAG_SIZE.
7626
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
37 * Upon starting the flow the server will generate a buffer underrun
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
38 * event and the event handler will fill the buffer for the first time.
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
39 * Now the server will generate a lowwater event when the server buffer
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
40 * falls below the low watermark value. The event handler gets called
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
41 * again and refills the buffer by the number of bytes requested by the
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
42 * server (usually a multiple of 4096). To prevent stuttering on
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
43 * startup (start of playing, seeks, unpausing) the client buffer should
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
44 * be bigger than the server buffer. (For debugging we also do some
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
45 * accounting of what we think how much of the server buffer is filled)
3336
8818c12743a8 patch by Tobias Diedrich <td@informatik.uni-hannover.de>
pl
parents: 3276
diff changeset
46 */
8818c12743a8 patch by Tobias Diedrich <td@informatik.uni-hannover.de>
pl
parents: 3276
diff changeset
47
7732
arpi
parents: 7646
diff changeset
48 #include <unistd.h>
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
49 #include <stdio.h>
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
50 #include <stdlib.h>
7732
arpi
parents: 7646
diff changeset
51 #include <string.h>
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
52 #include <pthread.h>
15741
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
53 #include <limits.h>
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
54 #include <audio/audiolib.h>
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
55
14480
1d3cc596069d actually mp_msg.h includes config.h, but for consistency better include it
reimar
parents: 14479
diff changeset
56 #include "config.h"
14123
a92101a7eb49 Make include paths consistent.
diego
parents: 12145
diff changeset
57 #include "mp_msg.h"
7627
382b28368402 DPRINTF -> mp_msg()
arpi
parents: 7626
diff changeset
58
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
59 #include "audio_out.h"
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
60 #include "audio_out_internal.h"
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
61 #include "libaf/af_format.h"
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
62
27449
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
63 /* NAS_FRAG_SIZE must be a power-of-two value */
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
64 #define NAS_FRAG_SIZE 4096
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
65
28192
bc49998d5745 Move several of the ao_nas int-to-string maps into .rodata
reimar
parents: 27449
diff changeset
66 static const char * const nas_event_types[] = {
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
67 "Undefined",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
68 "Undefined",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
69 "ElementNotify",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
70 "GrabNotify",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
71 "MonitorNotify",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
72 "BucketNotify",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
73 "DeviceNotify"
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
74 };
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
75
28192
bc49998d5745 Move several of the ao_nas int-to-string maps into .rodata
reimar
parents: 27449
diff changeset
76 static const char * const nas_elementnotify_kinds[] = {
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
77 "LowWater",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
78 "HighWater",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
79 "State",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
80 "Unknown"
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
81 };
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
82
28192
bc49998d5745 Move several of the ao_nas int-to-string maps into .rodata
reimar
parents: 27449
diff changeset
83 static const char * const nas_states[] = {
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
84 "Stop",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
85 "Start",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
86 "Pause",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
87 "Any"
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
88 };
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
89
28192
bc49998d5745 Move several of the ao_nas int-to-string maps into .rodata
reimar
parents: 27449
diff changeset
90 static const char * const nas_reasons[] = {
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
91 "User",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
92 "Underrun",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
93 "Overrun",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
94 "EOF",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
95 "Watermark",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
96 "Hardware",
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
97 "Any"
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
98 };
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
99
28192
bc49998d5745 Move several of the ao_nas int-to-string maps into .rodata
reimar
parents: 27449
diff changeset
100 static const char* nas_reason(unsigned int reason)
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
101 {
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
102 if (reason > 6) reason = 6;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
103 return nas_reasons[reason];
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
104 }
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
105
28192
bc49998d5745 Move several of the ao_nas int-to-string maps into .rodata
reimar
parents: 27449
diff changeset
106 static const char* nas_elementnotify_kind(unsigned int kind)
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
107 {
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
108 if (kind > 2) kind = 3;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
109 return nas_elementnotify_kinds[kind];
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
110 }
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
111
28192
bc49998d5745 Move several of the ao_nas int-to-string maps into .rodata
reimar
parents: 27449
diff changeset
112 static const char* nas_event_type(unsigned int type) {
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
113 if (type > 6) type = 0;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
114 return nas_event_types[type];
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
115 }
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
116
28192
bc49998d5745 Move several of the ao_nas int-to-string maps into .rodata
reimar
parents: 27449
diff changeset
117 static const char* nas_state(unsigned int state) {
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
118 if (state>3) state = 3;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
119 return nas_states[state];
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
120 }
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
121
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
122 static const ao_info_t info =
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
123 {
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
124 "NAS audio output",
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
125 "nas",
15741
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
126 "Tobias Diedrich <ranma+mplayer@tdiedrich.de>",
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
127 ""
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
128 };
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
129
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
130 struct ao_nas_data {
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
131 AuServer *aud;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
132 AuFlowID flow;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
133 AuDeviceID dev;
12022
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
134 AuFixedPoint gain;
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
135
7732
arpi
parents: 7646
diff changeset
136 unsigned int state;
7626
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
137 int expect_underrun;
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
138
27446
9f14e20aaea4 fix compiler warnings
ranma
parents: 27435
diff changeset
139 char *client_buffer;
9f14e20aaea4 fix compiler warnings
ranma
parents: 27435
diff changeset
140 char *server_buffer;
15741
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
141 unsigned int client_buffer_size;
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
142 unsigned int client_buffer_used;
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
143 unsigned int server_buffer_size;
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
144 unsigned int server_buffer_used;
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
145 pthread_mutex_t buffer_mutex;
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
146
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
147 pthread_t event_thread;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
148 int stop_thread;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
149 };
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
150
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
151 static struct ao_nas_data *nas_data;
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
152
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
153 LIBAO_EXTERN(nas)
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
154
18965
24ae1f262dc2 make prefix const. Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents: 17566
diff changeset
155 static void nas_print_error(AuServer *aud, const char *prefix, AuStatus as)
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
156 {
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
157 char s[100];
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
158 AuGetErrorText(aud, as, s, 100);
7627
382b28368402 DPRINTF -> mp_msg()
arpi
parents: 7626
diff changeset
159 mp_msg(MSGT_AO, MSGL_ERR, "ao_nas: %s: returned status %d (%s)\n", prefix, as, s);
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
160 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
161
27446
9f14e20aaea4 fix compiler warnings
ranma
parents: 27435
diff changeset
162 static int nas_readBuffer(struct ao_nas_data *nas_data, unsigned int num)
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
163 {
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
164 AuStatus as;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
165
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
166 pthread_mutex_lock(&nas_data->buffer_mutex);
7627
382b28368402 DPRINTF -> mp_msg()
arpi
parents: 7626
diff changeset
167 mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: nas_readBuffer(): num=%d client=%d/%d server=%d/%d\n",
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
168 num,
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
169 nas_data->client_buffer_used, nas_data->client_buffer_size,
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
170 nas_data->server_buffer_used, nas_data->server_buffer_size);
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
171
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
172 if (nas_data->client_buffer_used == 0) {
7627
382b28368402 DPRINTF -> mp_msg()
arpi
parents: 7626
diff changeset
173 mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: buffer is empty, nothing read.\n");
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
174 pthread_mutex_unlock(&nas_data->buffer_mutex);
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
175 return 0;
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
176 }
15741
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
177 if (num > nas_data->client_buffer_used)
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
178 num = nas_data->client_buffer_used;
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
179
7449
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
180 /*
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
181 * It is not appropriate to call AuWriteElement() here because the
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
182 * buffer is locked and delays writing to the network will cause
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
183 * other threads to block waiting for buffer_mutex. Instead the
15741
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
184 * data is copied to "server_buffer" and written to the network
7449
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
185 * outside of the locked section of code.
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
186 *
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
187 * (Note: Rather than these two buffers, a single circular buffer
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
188 * could eliminate the memcpy/memmove steps.)
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
189 */
15741
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
190 /* make sure we don't overflow the buffer */
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
191 if (num > nas_data->server_buffer_size)
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
192 num = nas_data->server_buffer_size;
7449
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
193 memcpy(nas_data->server_buffer, nas_data->client_buffer, num);
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
194
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
195 nas_data->client_buffer_used -= num;
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
196 nas_data->server_buffer_used += num;
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
197 memmove(nas_data->client_buffer, nas_data->client_buffer + num, nas_data->client_buffer_used);
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
198 pthread_mutex_unlock(&nas_data->buffer_mutex);
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
199
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
200 /*
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
201 * Now write the new buffer to the network.
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
202 */
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
203 AuWriteElement(nas_data->aud, nas_data->flow, 0, num, nas_data->server_buffer, AuFalse, &as);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
204 if (as != AuSuccess)
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
205 nas_print_error(nas_data->aud, "nas_readBuffer(): AuWriteElement", as);
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
206
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
207 return num;
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
208 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
209
27446
9f14e20aaea4 fix compiler warnings
ranma
parents: 27435
diff changeset
210 static int nas_writeBuffer(struct ao_nas_data *nas_data, void *data, unsigned int len)
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
211 {
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
212 pthread_mutex_lock(&nas_data->buffer_mutex);
7627
382b28368402 DPRINTF -> mp_msg()
arpi
parents: 7626
diff changeset
213 mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: nas_writeBuffer(): len=%d client=%d/%d server=%d/%d\n",
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
214 len, nas_data->client_buffer_used, nas_data->client_buffer_size,
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
215 nas_data->server_buffer_used, nas_data->server_buffer_size);
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
216
15741
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
217 /* make sure we don't overflow the buffer */
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
218 if (len > nas_data->client_buffer_size - nas_data->client_buffer_used)
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
219 len = nas_data->client_buffer_size - nas_data->client_buffer_used;
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
220 memcpy(nas_data->client_buffer + nas_data->client_buffer_used, data, len);
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
221 nas_data->client_buffer_used += len;
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
222
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
223 pthread_mutex_unlock(&nas_data->buffer_mutex);
15741
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
224
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
225 return len;
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
226 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
227
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
228 static int nas_empty_event_queue(struct ao_nas_data *nas_data)
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
229 {
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
230 AuEvent ev;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
231 int result = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
232
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
233 while (AuScanForTypedEvent(nas_data->aud, AuEventsQueuedAfterFlush,
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
234 AuTrue, AuEventTypeElementNotify, &ev)) {
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
235 AuDispatchEvent(nas_data->aud, &ev);
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
236 result = 1;
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
237 }
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
238 return result;
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
239 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
240
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
241 static void *nas_event_thread_start(void *data)
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
242 {
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
243 struct ao_nas_data *nas_data = data;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
244
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
245 do {
7732
arpi
parents: 7646
diff changeset
246 mp_msg(MSGT_AO, MSGL_DBG2,
arpi
parents: 7646
diff changeset
247 "ao_nas: event thread heartbeat (state=%s)\n",
arpi
parents: 7646
diff changeset
248 nas_state(nas_data->state));
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
249 nas_empty_event_queue(nas_data);
7732
arpi
parents: 7646
diff changeset
250 usleep(1000);
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
251 } while (!nas_data->stop_thread);
7732
arpi
parents: 7646
diff changeset
252
arpi
parents: 7646
diff changeset
253 return NULL;
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
254 }
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
255
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
256 static AuBool nas_error_handler(AuServer* aud, AuErrorEvent* ev)
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
257 {
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
258 char s[100];
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
259 AuGetErrorText(aud, ev->error_code, s, 100);
7627
382b28368402 DPRINTF -> mp_msg()
arpi
parents: 7626
diff changeset
260 mp_msg(MSGT_AO, MSGL_ERR, "ao_nas: error [%s]\n"
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
261 "error_code: %d\n"
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
262 "request_code: %d\n"
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
263 "minor_code: %d\n",
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
264 s,
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
265 ev->error_code,
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
266 ev->request_code,
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
267 ev->minor_code);
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
268
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
269 return AuTrue;
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
270 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
271
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
272 static AuBool nas_event_handler(AuServer *aud, AuEvent *ev, AuEventHandlerRec *hnd)
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
273 {
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
274 AuElementNotifyEvent *event = (AuElementNotifyEvent *) ev;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
275 struct ao_nas_data *nas_data = hnd->data;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
276
7732
arpi
parents: 7646
diff changeset
277 mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: event_handler(): type %s kind %s state %s->%s reason %s numbytes %d expect_underrun %d\n",
arpi
parents: 7646
diff changeset
278 nas_event_type(event->type),
arpi
parents: 7646
diff changeset
279 nas_elementnotify_kind(event->kind),
arpi
parents: 7646
diff changeset
280 nas_state(event->prev_state),
arpi
parents: 7646
diff changeset
281 nas_state(event->cur_state),
arpi
parents: 7646
diff changeset
282 nas_reason(event->reason),
27446
9f14e20aaea4 fix compiler warnings
ranma
parents: 27435
diff changeset
283 (int)event->num_bytes,
7732
arpi
parents: 7646
diff changeset
284 nas_data->expect_underrun);
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
285
15741
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
286 if (event->num_bytes > INT_MAX) {
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
287 mp_msg(MSGT_AO, MSGL_ERR, "ao_nas: num_bytes > 2GB, server buggy?\n");
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
288 }
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
289
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
290 if (event->num_bytes > nas_data->server_buffer_used)
2beb7a7cdac1 Add missing range checks so we won't overflow the buffers, thanks to Erik Auerswald for noticing this problem
ranma
parents: 14849
diff changeset
291 event->num_bytes = nas_data->server_buffer_used;
7732
arpi
parents: 7646
diff changeset
292 nas_data->server_buffer_used -= event->num_bytes;
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
293
7732
arpi
parents: 7646
diff changeset
294 switch (event->reason) {
arpi
parents: 7646
diff changeset
295 case AuReasonWatermark:
arpi
parents: 7646
diff changeset
296 nas_readBuffer(nas_data, event->num_bytes);
arpi
parents: 7646
diff changeset
297 break;
arpi
parents: 7646
diff changeset
298 case AuReasonUnderrun:
arpi
parents: 7646
diff changeset
299 // buffer underrun -> refill buffer
arpi
parents: 7646
diff changeset
300 nas_data->server_buffer_used = 0;
arpi
parents: 7646
diff changeset
301 if (nas_data->expect_underrun) {
arpi
parents: 7646
diff changeset
302 nas_data->expect_underrun = 0;
arpi
parents: 7646
diff changeset
303 } else {
12022
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
304 static int hint = 1;
7732
arpi
parents: 7646
diff changeset
305 mp_msg(MSGT_AO, MSGL_WARN,
arpi
parents: 7646
diff changeset
306 "ao_nas: Buffer underrun.\n");
12022
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
307 if (hint) {
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
308 hint = 0;
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
309 mp_msg(MSGT_AO, MSGL_HINT,
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
310 "Possible reasons are:\n"
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
311 "1) Network congestion.\n"
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
312 "2) Your NAS server is too slow.\n"
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
313 "Try renicing your nasd to e.g. -15.\n");
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
314 }
7732
arpi
parents: 7646
diff changeset
315 }
arpi
parents: 7646
diff changeset
316 if (nas_readBuffer(nas_data,
arpi
parents: 7646
diff changeset
317 nas_data->server_buffer_size -
arpi
parents: 7646
diff changeset
318 nas_data->server_buffer_used) != 0) {
arpi
parents: 7646
diff changeset
319 event->cur_state = AuStateStart;
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
320 break;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
321 }
7732
arpi
parents: 7646
diff changeset
322 mp_msg(MSGT_AO, MSGL_DBG2,
arpi
parents: 7646
diff changeset
323 "ao_nas: Can't refill buffer, stopping flow.\n");
27446
9f14e20aaea4 fix compiler warnings
ranma
parents: 27435
diff changeset
324 AuStopFlow(aud, nas_data->flow, NULL);
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
325 break;
7732
arpi
parents: 7646
diff changeset
326 default:
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
327 break;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
328 }
7732
arpi
parents: 7646
diff changeset
329 nas_data->state=event->cur_state;
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
330 return AuTrue;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
331 }
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
332
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
333 static AuDeviceID nas_find_device(AuServer *aud, int nch)
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
334 {
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
335 int i;
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
336 for (i = 0; i < AuServerNumDevices(aud); i++) {
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
337 AuDeviceAttributes *dev = AuServerDevice(aud, i);
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
338 if ((AuDeviceKind(dev) == AuComponentKindPhysicalOutput) &&
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
339 AuDeviceNumTracks(dev) == nch) {
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
340 return AuDeviceIdentifier(dev);
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
341 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
342 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
343 return AuNone;
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
344 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
345
7732
arpi
parents: 7646
diff changeset
346 static unsigned int nas_aformat_to_auformat(unsigned int *format)
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
347 {
7732
arpi
parents: 7646
diff changeset
348 switch (*format) {
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
349 case AF_FORMAT_U8:
7732
arpi
parents: 7646
diff changeset
350 return AuFormatLinearUnsigned8;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
351 case AF_FORMAT_S8:
7732
arpi
parents: 7646
diff changeset
352 return AuFormatLinearSigned8;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
353 case AF_FORMAT_U16_LE:
7732
arpi
parents: 7646
diff changeset
354 return AuFormatLinearUnsigned16LSB;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
355 case AF_FORMAT_U16_BE:
7732
arpi
parents: 7646
diff changeset
356 return AuFormatLinearUnsigned16MSB;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
357 case AF_FORMAT_S16_LE:
7732
arpi
parents: 7646
diff changeset
358 return AuFormatLinearSigned16LSB;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
359 case AF_FORMAT_S16_BE:
7732
arpi
parents: 7646
diff changeset
360 return AuFormatLinearSigned16MSB;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
361 case AF_FORMAT_MU_LAW:
7732
arpi
parents: 7646
diff changeset
362 return AuFormatULAW8;
12022
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
363 default:
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
364 *format=AF_FORMAT_S16_NE;
12022
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
365 return nas_aformat_to_auformat(format);
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
366 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
367 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
368
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
369 // to set/get/query special features/parameters
9633
12b1790038b0 64bit libao2 fix by Jens Axboe <mplayer-dev@kernel.dk>
alex
parents: 9583
diff changeset
370 static int control(int cmd, void *arg)
8272
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
371 {
12022
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
372 AuElementParameters aep;
8272
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
373 AuStatus as;
9583
e442209e6241 Fix small memleak in control().
ranma
parents: 8272
diff changeset
374 int retval = CONTROL_UNKNOWN;
e442209e6241 Fix small memleak in control().
ranma
parents: 8272
diff changeset
375
8272
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
376 ao_control_vol_t *vol = (ao_control_vol_t *)arg;
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
377
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
378 switch (cmd) {
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
379 case AOCONTROL_GET_VOLUME:
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
380
12022
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
381 vol->right = (float)nas_data->gain/AU_FIXED_POINT_SCALE*50;
8272
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
382 vol->left = vol->right;
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
383
27446
9f14e20aaea4 fix compiler warnings
ranma
parents: 27435
diff changeset
384 mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: AOCONTROL_GET_VOLUME: %.2f\n", vol->right);
9583
e442209e6241 Fix small memleak in control().
ranma
parents: 8272
diff changeset
385 retval = CONTROL_OK;
e442209e6241 Fix small memleak in control().
ranma
parents: 8272
diff changeset
386 break;
8272
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
387
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
388 case AOCONTROL_SET_VOLUME:
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
389 /*
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
390 * kn: we should have vol->left == vol->right but i don't
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
391 * know if something can change it outside of ao_nas
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
392 * so i take the mean of both values.
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
393 */
12022
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
394 nas_data->gain = AU_FIXED_POINT_SCALE*((vol->left+vol->right)/2)/50;
27446
9f14e20aaea4 fix compiler warnings
ranma
parents: 27435
diff changeset
395 mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: AOCONTROL_SET_VOLUME: %.2f\n", (vol->left+vol->right)/2);
8272
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
396
12022
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
397 aep.parameters[AuParmsMultiplyConstantConstant]=nas_data->gain;
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
398 aep.flow = nas_data->flow;
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
399 aep.element_num = 1;
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
400 aep.num_parameters = AuParmsMultiplyConstant;
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
401
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
402 AuSetElementParameters(nas_data->aud, 1, &aep, &as);
8272
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
403 if (as != AuSuccess) {
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
404 nas_print_error(nas_data->aud,
12022
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
405 "control(): AuSetElementParameters", as);
9583
e442209e6241 Fix small memleak in control().
ranma
parents: 8272
diff changeset
406 retval = CONTROL_ERROR;
e442209e6241 Fix small memleak in control().
ranma
parents: 8272
diff changeset
407 } else retval = CONTROL_OK;
e442209e6241 Fix small memleak in control().
ranma
parents: 8272
diff changeset
408 break;
e442209e6241 Fix small memleak in control().
ranma
parents: 8272
diff changeset
409 };
8272
b1c5460a8105 Implement volume setting functionality,
ranma
parents: 7732
diff changeset
410
9583
e442209e6241 Fix small memleak in control().
ranma
parents: 8272
diff changeset
411 return retval;
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
412 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
413
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
414 // open & setup audio device
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
415 // return: 1=success 0=fail
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
416 static int init(int rate,int channels,int format,int flags)
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
417 {
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
418 AuElement elms[3];
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
419 AuStatus as;
7732
arpi
parents: 7646
diff changeset
420 unsigned char auformat = nas_aformat_to_auformat(&format);
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
421 int bytes_per_sample = channels * AuSizeofFormat(auformat);
7732
arpi
parents: 7646
diff changeset
422 int buffer_size;
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
423 char *server;
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
424
27446
9f14e20aaea4 fix compiler warnings
ranma
parents: 27435
diff changeset
425 (void)flags; /* shut up 'unused parameter' warning */
9f14e20aaea4 fix compiler warnings
ranma
parents: 27435
diff changeset
426
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
427 nas_data=malloc(sizeof(struct ao_nas_data));
6114
34d5c9a67b94 Patch by Tobias Diedrich <td@informatik.uni-hannover.de>:
pl
parents: 5790
diff changeset
428 memset(nas_data, 0, sizeof(struct ao_nas_data));
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
429
7627
382b28368402 DPRINTF -> mp_msg()
arpi
parents: 7626
diff changeset
430 mp_msg(MSGT_AO, MSGL_V, "ao2: %d Hz %d chans %s\n",rate,channels,
14264
cb5fbade8a5c af_fmt2str_short
alex
parents: 14255
diff changeset
431 af_fmt2str_short(format));
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
432
7732
arpi
parents: 7646
diff changeset
433 ao_data.format = format;
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
434 ao_data.samplerate = rate;
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
435 ao_data.channels = channels;
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
436 ao_data.outburst = NAS_FRAG_SIZE;
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
437 ao_data.bps = rate * bytes_per_sample;
7732
arpi
parents: 7646
diff changeset
438 buffer_size = ao_data.bps; /* buffer 1 second */
arpi
parents: 7646
diff changeset
439 /*
arpi
parents: 7646
diff changeset
440 * round up to multiple of NAS_FRAG_SIZE
arpi
parents: 7646
diff changeset
441 * divide by 3 first because of 2:1 split
arpi
parents: 7646
diff changeset
442 */
arpi
parents: 7646
diff changeset
443 buffer_size = (buffer_size/3 + NAS_FRAG_SIZE-1) & ~(NAS_FRAG_SIZE-1);
arpi
parents: 7646
diff changeset
444 ao_data.buffersize = buffer_size*3;
arpi
parents: 7646
diff changeset
445
arpi
parents: 7646
diff changeset
446 nas_data->client_buffer_size = buffer_size*2;
arpi
parents: 7646
diff changeset
447 nas_data->client_buffer = malloc(nas_data->client_buffer_size);
arpi
parents: 7646
diff changeset
448 nas_data->server_buffer_size = buffer_size;
arpi
parents: 7646
diff changeset
449 nas_data->server_buffer = malloc(nas_data->server_buffer_size);
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
450
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
451 if (!bytes_per_sample) {
7627
382b28368402 DPRINTF -> mp_msg()
arpi
parents: 7626
diff changeset
452 mp_msg(MSGT_AO, MSGL_ERR, "ao_nas: init(): Zero bytes per sample -> nosound\n");
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
453 return 0;
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
454 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
455
7646
0761d6ac7ce9 libaf compliance (ao_data) fix by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7627
diff changeset
456 if (!(server = getenv("AUDIOSERVER")) &&
0761d6ac7ce9 libaf compliance (ao_data) fix by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7627
diff changeset
457 !(server = getenv("DISPLAY"))) {
0761d6ac7ce9 libaf compliance (ao_data) fix by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7627
diff changeset
458 mp_msg(MSGT_AO, MSGL_ERR, "ao_nas: init(): AUDIOSERVER environment variable not set -> nosound\n");
0761d6ac7ce9 libaf compliance (ao_data) fix by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7627
diff changeset
459 return 0;
0761d6ac7ce9 libaf compliance (ao_data) fix by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7627
diff changeset
460 }
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
461
7627
382b28368402 DPRINTF -> mp_msg()
arpi
parents: 7626
diff changeset
462 mp_msg(MSGT_AO, MSGL_V, "ao_nas: init(): Using audioserver %s\n", server);
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
463
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
464 nas_data->aud = AuOpenServer(server, 0, NULL, 0, NULL, NULL);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
465 if (!nas_data->aud) {
7627
382b28368402 DPRINTF -> mp_msg()
arpi
parents: 7626
diff changeset
466 mp_msg(MSGT_AO, MSGL_ERR, "ao_nas: init(): Can't open nas audio server -> nosound\n");
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
467 return 0;
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
468 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
469
23006
512a16ec4bcb Mono audio should be supported by NAS, too.
reimar
parents: 18965
diff changeset
470 while (channels>0) {
7646
0761d6ac7ce9 libaf compliance (ao_data) fix by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7627
diff changeset
471 nas_data->dev = nas_find_device(nas_data->aud, channels);
0761d6ac7ce9 libaf compliance (ao_data) fix by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7627
diff changeset
472 if (nas_data->dev != AuNone &&
7732
arpi
parents: 7646
diff changeset
473 ((nas_data->flow = AuCreateFlow(nas_data->aud, NULL)) != 0))
7646
0761d6ac7ce9 libaf compliance (ao_data) fix by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7627
diff changeset
474 break;
0761d6ac7ce9 libaf compliance (ao_data) fix by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7627
diff changeset
475 channels--;
0761d6ac7ce9 libaf compliance (ao_data) fix by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7627
diff changeset
476 }
0761d6ac7ce9 libaf compliance (ao_data) fix by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7627
diff changeset
477
0761d6ac7ce9 libaf compliance (ao_data) fix by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7627
diff changeset
478 if (nas_data->flow == 0) {
0761d6ac7ce9 libaf compliance (ao_data) fix by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7627
diff changeset
479 mp_msg(MSGT_AO, MSGL_ERR, "ao_nas: init(): Can't find a suitable output device -> nosound\n");
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
480 AuCloseServer(nas_data->aud);
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
481 nas_data->aud = 0;
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
482 return 0;
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
483 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
484
7732
arpi
parents: 7646
diff changeset
485 AuMakeElementImportClient(elms, rate, auformat, channels, AuTrue,
arpi
parents: 7646
diff changeset
486 buffer_size / bytes_per_sample,
arpi
parents: 7646
diff changeset
487 (buffer_size - NAS_FRAG_SIZE) /
arpi
parents: 7646
diff changeset
488 bytes_per_sample, 0, NULL);
12022
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
489 nas_data->gain = AuFixedPointFromFraction(1, 1);
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
490 AuMakeElementMultiplyConstant(elms+1, 0, nas_data->gain);
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
491 AuMakeElementExportDevice(elms+2, 1, nas_data->dev, rate,
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
492 AuUnlimitedSamples, 0, NULL);
12022
293141b57c01 Use MultiplyElement to control volume.
ranma
parents: 9633
diff changeset
493 AuSetElements(nas_data->aud, nas_data->flow, AuTrue, sizeof(elms)/sizeof(*elms), elms, &as);
7732
arpi
parents: 7646
diff changeset
494 if (as != AuSuccess) {
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
495 nas_print_error(nas_data->aud, "init(): AuSetElements", as);
7732
arpi
parents: 7646
diff changeset
496 AuCloseServer(nas_data->aud);
arpi
parents: 7646
diff changeset
497 nas_data->aud = 0;
arpi
parents: 7646
diff changeset
498 return 0;
arpi
parents: 7646
diff changeset
499 }
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
500 AuRegisterEventHandler(nas_data->aud, AuEventHandlerIDMask |
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
501 AuEventHandlerTypeMask,
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
502 AuEventTypeElementNotify, nas_data->flow,
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
503 nas_event_handler, (AuPointer) nas_data);
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
504 AuSetErrorHandler(nas_data->aud, nas_error_handler);
7732
arpi
parents: 7646
diff changeset
505 nas_data->state=AuStateStop;
7626
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
506 nas_data->expect_underrun=0;
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
507
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
508 pthread_mutex_init(&nas_data->buffer_mutex, NULL);
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
509 pthread_create(&nas_data->event_thread, NULL, &nas_event_thread_start, nas_data);
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
510
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
511 return 1;
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
512 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
513
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
514 // close audio device
12145
99798c3cdb93 uninit immed flag
alex
parents: 12022
diff changeset
515 static void uninit(int immed){
7732
arpi
parents: 7646
diff changeset
516
arpi
parents: 7646
diff changeset
517 mp_msg(MSGT_AO, MSGL_DBG3, "ao_nas: uninit()\n");
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
518
7732
arpi
parents: 7646
diff changeset
519 nas_data->expect_underrun = 1;
14849
d313f591d1a4 aos should respect the immed uninit flag (quit immediatly vs waiting till file
reimar
parents: 14480
diff changeset
520 if (!immed)
7732
arpi
parents: 7646
diff changeset
521 while (nas_data->state != AuStateStop) usleep(1000);
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
522 nas_data->stop_thread = 1;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
523 pthread_join(nas_data->event_thread, NULL);
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
524 AuCloseServer(nas_data->aud);
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
525 nas_data->aud = 0;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
526 free(nas_data->client_buffer);
7449
28785e6e6900 "One can cause a permanent hang on a seek, and the other just causes
arpi
parents: 6114
diff changeset
527 free(nas_data->server_buffer);
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
528 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
529
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
530 // stop playing and empty buffers (for seeking/pause)
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 15741
diff changeset
531 static void reset(void){
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
532 AuStatus as;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
533
7732
arpi
parents: 7646
diff changeset
534 mp_msg(MSGT_AO, MSGL_DBG3, "ao_nas: reset()\n");
7626
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
535
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
536 pthread_mutex_lock(&nas_data->buffer_mutex);
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
537 nas_data->client_buffer_used = 0;
7732
arpi
parents: 7646
diff changeset
538 pthread_mutex_unlock(&nas_data->buffer_mutex);
arpi
parents: 7646
diff changeset
539 while (nas_data->state != AuStateStop) {
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
540 AuStopFlow(nas_data->aud, nas_data->flow, &as);
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
541 if (as != AuSuccess)
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
542 nas_print_error(nas_data->aud, "reset(): AuStopFlow", as);
7732
arpi
parents: 7646
diff changeset
543 usleep(1000);
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
544 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
545 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
546
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
547 // stop playing, keep buffers (for pause)
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 15741
diff changeset
548 static void audio_pause(void)
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
549 {
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
550 AuStatus as;
7732
arpi
parents: 7646
diff changeset
551 mp_msg(MSGT_AO, MSGL_DBG3, "ao_nas: audio_pause()\n");
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
552
7732
arpi
parents: 7646
diff changeset
553 AuStopFlow(nas_data->aud, nas_data->flow, &as);
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
554 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
555
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
556 // resume playing, after audio_pause()
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 15741
diff changeset
557 static void audio_resume(void)
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
558 {
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
559 AuStatus as;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
560
7732
arpi
parents: 7646
diff changeset
561 mp_msg(MSGT_AO, MSGL_DBG3, "ao_nas: audio_resume()\n");
arpi
parents: 7646
diff changeset
562
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
563 AuStartFlow(nas_data->aud, nas_data->flow, &as);
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
564 if (as != AuSuccess)
7732
arpi
parents: 7646
diff changeset
565 nas_print_error(nas_data->aud,
arpi
parents: 7646
diff changeset
566 "play(): AuStartFlow", as);
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
567 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
568
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
569
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
570 // return: how many bytes can be played without blocking
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 15741
diff changeset
571 static int get_space(void)
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
572 {
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
573 int result;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
574
7732
arpi
parents: 7646
diff changeset
575 mp_msg(MSGT_AO, MSGL_DBG3, "ao_nas: get_space()\n");
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
576
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
577 pthread_mutex_lock(&nas_data->buffer_mutex);
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
578 result = nas_data->client_buffer_size - nas_data->client_buffer_used;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
579 pthread_mutex_unlock(&nas_data->buffer_mutex);
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
580
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
581 return result;
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
582 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
583
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
584 // plays 'len' bytes of 'data'
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
585 // it should round it down to outburst*n
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
586 // return: number of bytes played
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
587 static int play(void* data,int len,int flags)
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
588 {
27449
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
589 int written, maxbursts = 0, playbursts = 0;
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
590 AuStatus as;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
591
7732
arpi
parents: 7646
diff changeset
592 mp_msg(MSGT_AO, MSGL_DBG3,
arpi
parents: 7646
diff changeset
593 "ao_nas: play(%p, %d, %d)\n",
arpi
parents: 7646
diff changeset
594 data, len, flags);
arpi
parents: 7646
diff changeset
595
arpi
parents: 7646
diff changeset
596 if (len == 0)
arpi
parents: 7646
diff changeset
597 return 0;
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
598
27449
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
599 if (!(flags & AOPLAY_FINAL_CHUNK)) {
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
600 pthread_mutex_lock(&nas_data->buffer_mutex);
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
601 maxbursts = (nas_data->client_buffer_size -
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
602 nas_data->client_buffer_used) / ao_data.outburst;
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
603 playbursts = len / ao_data.outburst;
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
604 len = (playbursts > maxbursts ? maxbursts : playbursts) *
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
605 ao_data.outburst;
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
606 pthread_mutex_unlock(&nas_data->buffer_mutex);
27435
f3cd247a4aa3 Work correctly with very small files where less than outburst is to be played.
diego
parents: 23734
diff changeset
607 }
f3cd247a4aa3 Work correctly with very small files where less than outburst is to be played.
diego
parents: 23734
diff changeset
608
27449
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
609 /*
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
610 * If AOPLAY_FINAL_CHUNK is set, we did not actually check len fits
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
611 * into the available buffer space, but mplayer.c shouldn't give us
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
612 * more to play than we report to it by get_space(), so this should be
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
613 * fine.
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
614 */
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
615 written = nas_writeBuffer(nas_data, data, len);
7626
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
616
7732
arpi
parents: 7646
diff changeset
617 if (nas_data->state != AuStateStart &&
27449
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
618 (maxbursts == playbursts ||
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
619 flags & AOPLAY_FINAL_CHUNK)) {
7732
arpi
parents: 7646
diff changeset
620 mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: play(): Starting flow.\n");
7626
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
621 nas_data->expect_underrun = 1;
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
622 AuStartFlow(nas_data->aud, nas_data->flow, &as);
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
623 if (as != AuSuccess)
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
624 nas_print_error(nas_data->aud, "play(): AuStartFlow", as);
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
625 }
09ccf6147d76 Small error, the buffer size got set incorrectly.
arpi
parents: 7449
diff changeset
626
27449
5723b671a0f6 Handle AOPLAY_FINAL_CHUNK
ranma
parents: 27446
diff changeset
627 return written;
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
628 }
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
629
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
630 // return: delay in seconds between first and last sample in buffer
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 15741
diff changeset
631 static float get_delay(void)
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
632 {
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
633 float result;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
634
7732
arpi
parents: 7646
diff changeset
635 mp_msg(MSGT_AO, MSGL_DBG3, "ao_nas: get_delay()\n");
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
636
4775
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
637 pthread_mutex_lock(&nas_data->buffer_mutex);
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
638 result = ((float)(nas_data->client_buffer_used +
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
639 nas_data->server_buffer_used)) /
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
640 (float)ao_data.bps;
080cf3df3e4e improved event handling, implemented working pause that does not flush all buffers, work around a deadlock in the new threadsafe version 1.5 of libaudio by Tobias Diedrich
atmos4
parents: 3336
diff changeset
641 pthread_mutex_unlock(&nas_data->buffer_mutex);
3276
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
642
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
643 return result;
e279cc05f189 -ao NAS support by Tobias Diedrich <ranma@gmx.at>
arpi
parents:
diff changeset
644 }