annotate libao2/ao_sun.c @ 4559:5dc383bb1c82

added mga_top_reserved module parameter to skip a configurable amount of space at the top of video memory. this is needed to prevent corruption of the kernel's console font when using the "fastfont" option with matroxfb.
author rfelker
date Thu, 07 Feb 2002 02:07:29 +0000
parents 24b0fad7fccc
children d678ce495a75
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
1 #include <stdio.h>
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
2 #include <stdlib.h>
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
3 #include <string.h>
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
4
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
5 #include <unistd.h>
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
6 #include <fcntl.h>
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
7 #include <errno.h>
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
8 #include <sys/ioctl.h>
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
9 #include <sys/time.h>
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
10 #include <sys/types.h>
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
11 #include <sys/stat.h>
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
12 #include <sys/audioio.h>
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
13 #ifdef __svr4__
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
14 #include <stropts.h>
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
15 #endif
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
16
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
17 #include "../config.h"
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
18
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
19 #include "audio_out.h"
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
20 #include "audio_out_internal.h"
1058
cab5ba9ffc6c fixed AFMT_ stuff (inclue afmt.h)
arpi_esp
parents: 1041
diff changeset
21 #include "afmt.h"
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
22
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
23 static ao_info_t info =
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
24 {
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
25 "Sun audio output",
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
26 "sun",
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
27 "jk@tools.de",
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
28 ""
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
29 };
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
30
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
31 LIBAO_EXTERN(sun)
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
32
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
33
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
34 /* These defines are missing on NetBSD */
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
35 #ifndef AUDIO_PRECISION_8
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
36 #define AUDIO_PRECISION_8 8
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
37 #define AUDIO_PRECISION_16 16
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
38 #endif
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
39 #ifndef AUDIO_CHANNELS_MONO
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
40 #define AUDIO_CHANNELS_MONO 1
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
41 #define AUDIO_CHANNELS_STEREO 2
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
42 #endif
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
43
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
44
3492
24b0fad7fccc Use $AUDIODEV environment variable as the default audio device on solaris, if
jkeil
parents: 3137
diff changeset
45 static char *audio_dev = NULL;
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
46 static int queued_bursts = 0;
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
47 static int queued_samples = 0;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
48 static int bytes_per_sample = 0;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
49 static int byte_per_sec = 0;
1807
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
50 static int convert_u8_s8;
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
51 static int audio_fd = -1;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
52 static enum {
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
53 RTSC_UNKNOWN = 0,
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
54 RTSC_ENABLED,
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
55 RTSC_DISABLED
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
56 } enable_sample_timing;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
57
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
58 extern int verbose;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
59
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
60
1058
cab5ba9ffc6c fixed AFMT_ stuff (inclue afmt.h)
arpi_esp
parents: 1041
diff changeset
61 // convert an OSS audio format specification into a sun audio encoding
cab5ba9ffc6c fixed AFMT_ stuff (inclue afmt.h)
arpi_esp
parents: 1041
diff changeset
62 static int oss2sunfmt(int oss_format)
cab5ba9ffc6c fixed AFMT_ stuff (inclue afmt.h)
arpi_esp
parents: 1041
diff changeset
63 {
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
64 switch (oss_format){
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
65 case AFMT_MU_LAW:
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
66 return AUDIO_ENCODING_ULAW;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
67 case AFMT_A_LAW:
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
68 return AUDIO_ENCODING_ALAW;
1320
18374d49befa On big-endian architectures, all audio decoders default to big-endian 16-bit
jkeil
parents: 1308
diff changeset
69 case AFMT_S16_BE:
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
70 case AFMT_S16_LE:
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
71 return AUDIO_ENCODING_LINEAR;
1346
d6e6132bff35 AUDIO_ENCODING_LINEAR8 format is not available on sunos 5.5. Format is
jkeil
parents: 1320
diff changeset
72 #ifdef AUDIO_ENCODING_LINEAR8 // Missing on SunOS 5.5.1...
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
73 case AFMT_U8:
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
74 return AUDIO_ENCODING_LINEAR8;
1346
d6e6132bff35 AUDIO_ENCODING_LINEAR8 format is not available on sunos 5.5. Format is
jkeil
parents: 1320
diff changeset
75 #endif
1058
cab5ba9ffc6c fixed AFMT_ stuff (inclue afmt.h)
arpi_esp
parents: 1041
diff changeset
76 #ifdef AUDIO_ENCODING_DVI // Missing on NetBSD...
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
77 case AFMT_IMA_ADPCM:
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
78 return AUDIO_ENCODING_DVI;
1058
cab5ba9ffc6c fixed AFMT_ stuff (inclue afmt.h)
arpi_esp
parents: 1041
diff changeset
79 #endif
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
80 default:
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
81 return AUDIO_ENCODING_NONE;
1058
cab5ba9ffc6c fixed AFMT_ stuff (inclue afmt.h)
arpi_esp
parents: 1041
diff changeset
82 }
cab5ba9ffc6c fixed AFMT_ stuff (inclue afmt.h)
arpi_esp
parents: 1041
diff changeset
83 }
cab5ba9ffc6c fixed AFMT_ stuff (inclue afmt.h)
arpi_esp
parents: 1041
diff changeset
84
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
85 // try to figure out, if the soundcard driver provides usable (precise)
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
86 // sample counter information
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
87 static int realtime_samplecounter_available(char *dev)
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
88 {
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
89 int fd = -1;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
90 audio_info_t info;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
91 int rtsc_ok = RTSC_DISABLED;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
92 int len;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
93 void *silence = NULL;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
94 struct timeval start, end;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
95 struct timespec delay;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
96 int usec_delay;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
97 unsigned last_samplecnt;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
98 unsigned increment;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
99 unsigned min_increment;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
100
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
101 len = 44100 * 4 / 4; /* amount of data for 0.25sec of 44.1khz, stereo,
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
102 * 16bit. 44kbyte can be sent to all supported
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
103 * sun audio devices without blocking in the
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
104 * "write" below.
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
105 */
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
106 silence = calloc(1, len);
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
107 if (silence == NULL)
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
108 goto error;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
109
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
110 if ((fd = open(dev, O_WRONLY)) < 0)
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
111 goto error;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
112
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
113 AUDIO_INITINFO(&info);
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
114 info.play.sample_rate = 44100;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
115 info.play.channels = AUDIO_CHANNELS_STEREO;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
116 info.play.precision = AUDIO_PRECISION_16;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
117 info.play.encoding = AUDIO_ENCODING_LINEAR;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
118 info.play.samples = 0;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
119 if (ioctl(fd, AUDIO_SETINFO, &info)) {
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
120 if (verbose)
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
121 printf("rtsc: SETINFO failed\n");
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
122 goto error;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
123 }
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
124
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
125 if (write(fd, silence, len) != len) {
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
126 if (verbose)
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
127 printf("rtsc: write failed");
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
128 goto error;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
129 }
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
130
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
131 if (ioctl(fd, AUDIO_GETINFO, &info)) {
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
132 if (verbose)
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
133 perror("rtsc: GETINFO1");
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
134 goto error;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
135 }
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
136
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
137 last_samplecnt = info.play.samples;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
138 min_increment = ~0;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
139
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
140 gettimeofday(&start, NULL);
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
141 for (;;) {
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
142 delay.tv_sec = 0;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
143 delay.tv_nsec = 10000000;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
144 nanosleep(&delay, NULL);
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
145 gettimeofday(&end, NULL);
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
146 usec_delay = (end.tv_sec - start.tv_sec) * 1000000
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
147 + end.tv_usec - start.tv_usec;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
148
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
149 // stop monitoring sample counter after 0.2 seconds
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
150 if (usec_delay > 200000)
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
151 break;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
152
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
153 if (ioctl(fd, AUDIO_GETINFO, &info)) {
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
154 if (verbose)
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
155 perror("rtsc: GETINFO2 failed");
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
156 goto error;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
157 }
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
158 if (info.play.samples < last_samplecnt) {
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
159 if (verbose)
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
160 printf("rtsc: %d > %d?\n", last_samplecnt, info.play.samples);
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
161 goto error;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
162 }
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
163
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
164 if ((increment = info.play.samples - last_samplecnt) > 0) {
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
165 if (verbose)
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
166 printf("ao_sun: sample counter increment: %d\n", increment);
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
167 if (increment < min_increment) {
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
168 min_increment = increment;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
169 if (min_increment < 2000)
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
170 break; // looks good
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
171 }
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
172 }
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
173 last_samplecnt = info.play.samples;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
174 }
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
175
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
176 /*
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
177 * For 44.1kkz, stereo, 16-bit format we would send sound data in 16kbytes
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
178 * chunks (== 4096 samples) to the audio device. If we see a minimum
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
179 * sample counter increment from the soundcard driver of less than
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
180 * 2000 samples, we assume that the driver provides a useable realtime
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
181 * sample counter in the AUDIO_INFO play.samples field. Timing based
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
182 * on sample counts should be much more accurate than counting whole
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
183 * 16kbyte chunks.
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
184 */
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
185 if (min_increment < 2000)
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
186 rtsc_ok = RTSC_ENABLED;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
187
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
188 if (verbose)
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
189 printf("ao_sun: minimum sample counter increment per 10msec interval: %d\n"
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
190 "\t%susing sample counter based timing code\n",
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
191 min_increment, rtsc_ok == RTSC_ENABLED ? "" : "not ");
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
192
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
193
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
194 error:
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
195 if (silence != NULL) free(silence);
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
196 if (fd >= 0) {
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
197 #ifdef __svr4__
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
198 // remove the 0 bytes from the above measurement from the
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
199 // audio driver's STREAMS queue
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
200 ioctl(fd, I_FLUSH, FLUSHW);
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
201 #endif
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
202 //ioctl(fd, AUDIO_DRAIN, 0);
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
203 close(fd);
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
204 }
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
205
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
206 return rtsc_ok;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
207 }
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
208
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
209 // to set/get/query special features/parameters
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
210 static int control(int cmd,int arg){
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
211 switch(cmd){
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
212 case AOCONTROL_SET_DEVICE:
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
213 audio_dev=(char*)arg;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
214 return CONTROL_OK;
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
215 case AOCONTROL_QUERY_FORMAT:
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
216 return CONTROL_TRUE;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
217 }
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
218 return CONTROL_UNKNOWN;
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
219 }
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
220
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
221 // open & setup audio device
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
222 // return: 1=success 0=fail
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
223 static int init(int rate,int channels,int format,int flags){
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
224
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
225 audio_info_t info;
1807
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
226 int ok;
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
227
3492
24b0fad7fccc Use $AUDIODEV environment variable as the default audio device on solaris, if
jkeil
parents: 3137
diff changeset
228 if (audio_dev == NULL) {
24b0fad7fccc Use $AUDIODEV environment variable as the default audio device on solaris, if
jkeil
parents: 3137
diff changeset
229 if ((audio_dev = getenv("AUDIODEV")) == NULL)
24b0fad7fccc Use $AUDIODEV environment variable as the default audio device on solaris, if
jkeil
parents: 3137
diff changeset
230 audio_dev = "/dev/audio";
24b0fad7fccc Use $AUDIODEV environment variable as the default audio device on solaris, if
jkeil
parents: 3137
diff changeset
231 }
24b0fad7fccc Use $AUDIODEV environment variable as the default audio device on solaris, if
jkeil
parents: 3137
diff changeset
232
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
233 if (ao_subdevice) audio_dev = ao_subdevice;
1209
18539f68dd37 ao_subdevice support
arpi_esp
parents: 1196
diff changeset
234
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
235 if (enable_sample_timing == RTSC_UNKNOWN
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
236 && !getenv("AO_SUN_DISABLE_SAMPLE_TIMING")) {
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
237 enable_sample_timing = realtime_samplecounter_available(audio_dev);
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
238 }
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
239
1456
8c57a5a3c645 printfs cleanup - moved to higher -v level or moved to stderr
arpi
parents: 1346
diff changeset
240 // printf("ao2: %d Hz %d chans %s [0x%X]\n",
8c57a5a3c645 printfs cleanup - moved to higher -v level or moved to stderr
arpi
parents: 1346
diff changeset
241 // rate,channels,audio_out_format_name(format),format);
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
242
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
243 audio_fd=open(audio_dev, O_WRONLY);
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
244 if(audio_fd<0){
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
245 printf("Can't open audio device %s, %s -> nosound\n", audio_dev, strerror(errno));
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
246 return 0;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
247 }
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
248
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
249 ioctl(audio_fd, AUDIO_DRAIN, 0);
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
250
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
251 AUDIO_INITINFO(&info);
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
252 info.play.encoding = oss2sunfmt(ao_data.format = format);
1320
18374d49befa On big-endian architectures, all audio decoders default to big-endian 16-bit
jkeil
parents: 1308
diff changeset
253 info.play.precision =
18374d49befa On big-endian architectures, all audio decoders default to big-endian 16-bit
jkeil
parents: 1308
diff changeset
254 (format==AFMT_S16_LE || format==AFMT_S16_BE
18374d49befa On big-endian architectures, all audio decoders default to big-endian 16-bit
jkeil
parents: 1308
diff changeset
255 ? AUDIO_PRECISION_16
18374d49befa On big-endian architectures, all audio decoders default to big-endian 16-bit
jkeil
parents: 1308
diff changeset
256 : AUDIO_PRECISION_8);
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
257 info.play.channels = ao_data.channels = channels;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
258 info.play.sample_rate = ao_data.samplerate = rate;
1807
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
259 convert_u8_s8 = 0;
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
260 ok = ioctl(audio_fd, AUDIO_SETINFO, &info) >= 0;
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
261 if (!ok && info.play.encoding == AUDIO_ENCODING_LINEAR8) {
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
262 /* sun audiocs hardware does not support U8 format, try S8... */
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
263 info.play.encoding = AUDIO_ENCODING_LINEAR;
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
264 ok = ioctl(audio_fd, AUDIO_SETINFO, &info) >= 0;
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
265 if (ok) {
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
266 /* we must perform software U8 -> S8 conversion */
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
267 convert_u8_s8 = 1;
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
268 }
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
269 }
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
270 if (!ok) {
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
271 printf("audio_setup: your card doesn't support %d channel, %s, %d Hz samplerate\n",
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
272 channels, audio_out_format_name(format), rate);
1807
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
273 return 0;
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
274 }
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
275
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
276 bytes_per_sample = channels * info.play.precision / 8;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
277 byte_per_sec = bytes_per_sample * rate;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
278 ao_data.outburst = byte_per_sec > 100000 ? 16384 : 8192;
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
279
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
280 #ifdef __not_used__
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
281 /*
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
282 * hmm, ao_data.buffersize is currently not used in this driver, do there's
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
283 * no need to measure it
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
284 */
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
285 if(ao_data.buffersize==-1){
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
286 // Measuring buffer size:
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
287 void* data;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
288 ao_data.buffersize=0;
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
289 #ifdef HAVE_AUDIO_SELECT
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
290 data = malloc(ao_data.outburst);
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
291 memset(data, format==AFMT_U8 ? 0x80 : 0, ao_data.outburst);
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
292 while(ao_data.buffersize<0x40000){
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
293 fd_set rfds;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
294 struct timeval tv;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
295 FD_ZERO(&rfds); FD_SET(audio_fd,&rfds);
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
296 tv.tv_sec=0; tv.tv_usec = 0;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
297 if(!select(audio_fd+1, NULL, &rfds, NULL, &tv)) break;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
298 write(audio_fd,data,ao_data.outburst);
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
299 ao_data.buffersize+=ao_data.outburst;
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
300 }
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
301 free(data);
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
302 if(ao_data.buffersize==0){
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
303 printf("\n *** Your audio driver DOES NOT support select() ***\n");
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
304 printf("Recompile mplayer with #undef HAVE_AUDIO_SELECT in config.h !\n\n");
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
305 return 0;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
306 }
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
307 #ifdef __svr4__
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
308 // remove the 0 bytes from the above ao_data.buffersize measurement from the
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
309 // audio driver's STREAMS queue
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
310 ioctl(audio_fd, I_FLUSH, FLUSHW);
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
311 #endif
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
312 ioctl(audio_fd, AUDIO_DRAIN, 0);
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
313 #endif
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
314 }
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
315 #endif /* __not_used__ */
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
316
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
317 AUDIO_INITINFO(&info);
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
318 info.play.samples = 0;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
319 info.play.eof = 0;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
320 info.play.error = 0;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
321 ioctl (audio_fd, AUDIO_SETINFO, &info);
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
322
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
323 queued_bursts = 0;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
324 queued_samples = 0;
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
325
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
326 return 1;
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
327 }
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
328
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
329 // close audio device
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
330 static void uninit(){
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
331 #ifdef __svr4__
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
332 // throw away buffered data in the audio driver's STREAMS queue
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
333 ioctl(audio_fd, I_FLUSH, FLUSHW);
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
334 #endif
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
335 close(audio_fd);
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
336 }
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
337
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
338 // stop playing and empty buffers (for seeking/pause)
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
339 static void reset(){
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
340 audio_info_t info;
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
341
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
342 uninit();
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
343 audio_fd=open(audio_dev, O_WRONLY);
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
344 if(audio_fd<0){
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
345 printf("\nFatal error: *** CANNOT RE-OPEN / RESET AUDIO DEVICE (%s) ***\n", strerror(errno));
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
346 return;
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
347 }
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
348
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
349 ioctl(audio_fd, AUDIO_DRAIN, 0);
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
350
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
351 AUDIO_INITINFO(&info);
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
352 info.play.encoding = oss2sunfmt(ao_data.format);
1320
18374d49befa On big-endian architectures, all audio decoders default to big-endian 16-bit
jkeil
parents: 1308
diff changeset
353 info.play.precision =
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
354 (ao_data.format==AFMT_S16_LE || ao_data.format==AFMT_S16_BE
1320
18374d49befa On big-endian architectures, all audio decoders default to big-endian 16-bit
jkeil
parents: 1308
diff changeset
355 ? AUDIO_PRECISION_16
18374d49befa On big-endian architectures, all audio decoders default to big-endian 16-bit
jkeil
parents: 1308
diff changeset
356 : AUDIO_PRECISION_8);
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
357 info.play.channels = ao_data.channels;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
358 info.play.sample_rate = ao_data.samplerate;
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
359 info.play.samples = 0;
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
360 info.play.eof = 0;
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
361 info.play.error = 0;
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
362 ioctl (audio_fd, AUDIO_SETINFO, &info);
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
363 queued_bursts = 0;
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
364 queued_samples = 0;
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
365 }
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
366
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
367 // stop playing, keep buffers (for pause)
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
368 static void audio_pause()
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
369 {
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
370 struct audio_info info;
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
371 AUDIO_INITINFO(&info);
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
372 info.play.pause = 1;
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
373 ioctl(audio_fd, AUDIO_SETINFO, &info);
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
374 }
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
375
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
376 // resume playing, after audio_pause()
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
377 static void audio_resume()
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
378 {
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
379 struct audio_info info;
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
380 AUDIO_INITINFO(&info);
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
381 info.play.pause = 0;
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
382 ioctl(audio_fd, AUDIO_SETINFO, &info);
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
383 }
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
384
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
385
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
386 // return: how many bytes can be played without blocking
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
387 static int get_space(){
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
388 int playsize = ao_data.outburst;
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
389 audio_info_t info;
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
390
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
391 // check buffer
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
392 #ifdef HAVE_AUDIO_SELECT
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
393 {
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
394 fd_set rfds;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
395 struct timeval tv;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
396 FD_ZERO(&rfds);
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
397 FD_SET(audio_fd, &rfds);
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
398 tv.tv_sec = 0;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
399 tv.tv_usec = 0;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
400 if(!select(audio_fd+1, NULL, &rfds, NULL, &tv)) return 0; // not block!
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
401 }
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
402 #endif
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
403
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
404 ioctl(audio_fd, AUDIO_GETINFO, &info);
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
405 if (queued_bursts - info.play.eof > 2)
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
406 return 0;
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
407
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
408 return ao_data.outburst;
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
409 }
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
410
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
411 // plays 'len' bytes of 'data'
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
412 // it should round it down to outburst*n
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
413 // return: number of bytes played
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
414 static int play(void* data,int len,int flags){
1320
18374d49befa On big-endian architectures, all audio decoders default to big-endian 16-bit
jkeil
parents: 1308
diff changeset
415 #if WORDS_BIGENDIAN
18374d49befa On big-endian architectures, all audio decoders default to big-endian 16-bit
jkeil
parents: 1308
diff changeset
416 int native_endian = AFMT_S16_BE;
18374d49befa On big-endian architectures, all audio decoders default to big-endian 16-bit
jkeil
parents: 1308
diff changeset
417 #else
18374d49befa On big-endian architectures, all audio decoders default to big-endian 16-bit
jkeil
parents: 1308
diff changeset
418 int native_endian = AFMT_S16_LE;
18374d49befa On big-endian architectures, all audio decoders default to big-endian 16-bit
jkeil
parents: 1308
diff changeset
419 #endif
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
420
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
421 if (len < ao_data.outburst) return 0;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
422 len /= ao_data.outburst;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
423 len *= ao_data.outburst;
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
424
1320
18374d49befa On big-endian architectures, all audio decoders default to big-endian 16-bit
jkeil
parents: 1308
diff changeset
425 /* 16-bit format using the 'wrong' byteorder? swap words */
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
426 if ((ao_data.format == AFMT_S16_LE || ao_data.format == AFMT_S16_BE)
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
427 && ao_data.format != native_endian) {
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
428 static void *swab_buf;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
429 static int swab_len;
1320
18374d49befa On big-endian architectures, all audio decoders default to big-endian 16-bit
jkeil
parents: 1308
diff changeset
430 if (len > swab_len) {
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
431 if (swab_buf)
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
432 swab_buf = realloc(swab_buf, len);
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
433 else
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
434 swab_buf = malloc(len);
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
435 swab_len = len;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
436 if (swab_buf == NULL) return 0;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
437 }
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
438 swab(data, swab_buf, len);
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
439 data = swab_buf;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
440 } else if (ao_data.format == AFMT_U8 && convert_u8_s8) {
1807
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
441 int i;
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
442 unsigned char *p = data;
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
443
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
444 for (i = 0, p = data; i < len; i++, p++)
6da3b9428ff0 Sun audiocs HW does not support AFMT_U8, try to use AFMT_S8 instead. If AFMT_S8
jkeil
parents: 1456
diff changeset
445 *p ^= 0x80;
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
446 }
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
447
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
448 len = write(audio_fd, data, len);
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
449 if(len > 0) {
1308
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
450 queued_samples += len / bytes_per_sample;
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
451 if (write(audio_fd,data,0) < 0)
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
452 perror("ao_sun: send EOF audio record");
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
453 else
ffd63a75700c Support playback of AFMT_S16_LE audio data on a big endian machine
jkeil
parents: 1209
diff changeset
454 queued_bursts ++;
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
455 }
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
456 return len;
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
457 }
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
458
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
459
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
460 // return: delay in seconds between first and last sample in buffer
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
461 static float get_delay(){
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
462 audio_info_t info;
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
463 ioctl(audio_fd, AUDIO_GETINFO, &info);
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
464 if (info.play.samples && enable_sample_timing == RTSC_ENABLED)
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1807
diff changeset
465 return (float)(queued_samples - info.play.samples) / (float)byte_per_sec;
1196
fc51929ec8ea Applied patch by J¸«ärgen Keil (jk@tools.de), improves smoothness of video playback.
atmosfear
parents: 1058
diff changeset
466 else
3137
b9ee2d8d7279 Audio delay bugfix
anders
parents: 3095
diff changeset
467 return (float)((queued_bursts - info.play.eof) * ao_data.outburst) / (float)byte_per_sec;
1041
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
468 }
4b3b2bf1c82b SUN-Solaris audio out
arpi_esp
parents:
diff changeset
469