annotate libao2/ao_oss.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 f648f699eda6
children d678ce495a75
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
1 #include <stdio.h>
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
2 #include <stdlib.h>
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
3
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
4 #include <sys/ioctl.h>
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
5 #include <unistd.h>
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
6 #include <sys/time.h>
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
7 #include <sys/types.h>
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
8 #include <sys/stat.h>
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
9 #include <fcntl.h>
1532
cb9bc07f3d4c AFMT_AC3 fixed
arpi
parents: 1528
diff changeset
10 //#include <sys/soundcard.h>
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
11
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
12 #include "../config.h"
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
13
1532
cb9bc07f3d4c AFMT_AC3 fixed
arpi
parents: 1528
diff changeset
14 #include "afmt.h"
cb9bc07f3d4c AFMT_AC3 fixed
arpi
parents: 1528
diff changeset
15
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
16 #include "audio_out.h"
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
17 #include "audio_out_internal.h"
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
18
1191
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
19 extern int verbose;
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
20
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
21 static ao_info_t info =
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
22 {
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
23 "OSS/ioctl audio output",
956
a6cecd9a1bad '-ao' switch (including '-ao help'), fixing Arpi's bug (short name 'null' for both of oss and null driver ;)
lgb
parents: 954
diff changeset
24 "oss",
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
25 "A'rpi",
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
26 ""
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
27 };
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
28
3181
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
29 /* Support for >2 output channels added 2001-11-25 - Steve Davies <steve@daviesfam.org> */
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
30
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
31 LIBAO_EXTERN(oss)
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
32
1020
72cacd3b8f30 Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents: 956
diff changeset
33 static char *dsp="/dev/dsp";
72cacd3b8f30 Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents: 956
diff changeset
34 static audio_buf_info zz;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
35 static int audio_fd=-1;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
36
1191
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
37 char *oss_mixer_device = "/dev/mixer";
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
38 int oss_mixer_usemaster = 0;
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
39
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
40 // to set/get/query special features/parameters
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
41 static int control(int cmd,int arg){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
42 switch(cmd){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
43 case AOCONTROL_SET_DEVICE:
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
44 dsp=(char*)arg;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
45 return CONTROL_OK;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
46 case AOCONTROL_QUERY_FORMAT:
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
47 return CONTROL_TRUE;
1191
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
48 case AOCONTROL_GET_VOLUME:
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
49 case AOCONTROL_SET_VOLUME:
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
50 {
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
51 ao_control_vol_t *vol = (ao_control_vol_t *)arg;
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
52 int fd, v, mcmd, devs;
1528
a444bd456fcc ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents: 1456
diff changeset
53
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
54 if(ao_data.format == AFMT_AC3)
1528
a444bd456fcc ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents: 1456
diff changeset
55 return CONTROL_TRUE;
1191
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
56
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
57 if ((fd = open("/dev/mixer", O_RDONLY)) > 0)
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
58 {
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
59 ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devs);
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
60 if ((devs & SOUND_MASK_PCM) && (oss_mixer_usemaster == 0))
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
61 if (cmd == AOCONTROL_GET_VOLUME)
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
62 mcmd = SOUND_MIXER_READ_PCM;
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
63 else
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
64 mcmd = SOUND_MIXER_WRITE_PCM;
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
65 else if ((devs & SOUND_MASK_VOLUME) && (oss_mixer_usemaster == 1))
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
66 if (cmd == AOCONTROL_GET_VOLUME)
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
67 mcmd = SOUND_MIXER_READ_VOLUME;
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
68 else
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
69 mcmd = SOUND_MIXER_WRITE_VOLUME;
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
70 else
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
71 {
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
72 close(fd);
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
73 return CONTROL_ERROR;
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
74 }
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
75
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
76 if (cmd == AOCONTROL_GET_VOLUME)
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
77 {
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
78 ioctl(fd, cmd, &v);
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
79 vol->right = (v & 0xFF00) >> 8;
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
80 vol->left = v & 0x00FF;
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
81 }
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
82 else
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
83 {
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
84 v = ((int)vol->right << 8) | (int)vol->left;
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
85 ioctl(fd, cmd, &v);
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
86 }
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
87 close(fd);
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
88 return CONTROL_OK;
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
89 }
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
90 }
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
91 return CONTROL_ERROR;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
92 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
93 return CONTROL_UNKNOWN;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
94 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
95
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
96 // open & setup audio device
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
97 // return: 1=success 0=fail
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
98 static int init(int rate,int channels,int format,int flags){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
99
3181
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
100 printf("ao2: %d Hz %d chans %s\n",rate,channels,
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
101 audio_out_format_name(format));
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
102
1191
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
103 if (ao_subdevice)
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
104 dsp = ao_subdevice;
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
105
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
106 if (verbose)
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
107 printf("audio_setup: using '%s' dsp device\n", dsp);
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
108
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
109 audio_fd=open(dsp, O_WRONLY);
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
110 if(audio_fd<0){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
111 printf("Can't open audio device %s -> nosound\n",dsp);
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
112 return 0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
113 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
114
3137
b9ee2d8d7279 Audio delay bugfix
anders
parents: 3095
diff changeset
115 ao_data.bps=channels*rate;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
116 if(format != AFMT_U8 && format != AFMT_S8)
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
117 ao_data.bps*=2;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
118
4184
f648f699eda6 hwac3 fix for cmedia 8738 by Hans-Peter Raschke <Hans-Peter.Raschke@wintermann-datenservice.de>
arpi
parents: 3455
diff changeset
119 if(format == AFMT_AC3) {
f648f699eda6 hwac3 fix for cmedia 8738 by Hans-Peter Raschke <Hans-Peter.Raschke@wintermann-datenservice.de>
arpi
parents: 3455
diff changeset
120 ao_data.samplerate=rate;
f648f699eda6 hwac3 fix for cmedia 8738 by Hans-Peter Raschke <Hans-Peter.Raschke@wintermann-datenservice.de>
arpi
parents: 3455
diff changeset
121 ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate);
f648f699eda6 hwac3 fix for cmedia 8738 by Hans-Peter Raschke <Hans-Peter.Raschke@wintermann-datenservice.de>
arpi
parents: 3455
diff changeset
122 }
f648f699eda6 hwac3 fix for cmedia 8738 by Hans-Peter Raschke <Hans-Peter.Raschke@wintermann-datenservice.de>
arpi
parents: 3455
diff changeset
123
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
124 ao_data.format=format;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
125 ioctl (audio_fd, SNDCTL_DSP_SETFMT, &ao_data.format);
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
126 if(format == AFMT_AC3 && ao_data.format != AFMT_AC3) {
1528
a444bd456fcc ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents: 1456
diff changeset
127 printf("Can't set audio device %s to AC3 output\n", dsp);
a444bd456fcc ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents: 1456
diff changeset
128 return 0;
a444bd456fcc ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents: 1456
diff changeset
129 }
1079
1e0da351feaa using audio_out_format_name
al3x
parents: 1058
diff changeset
130 printf("audio_setup: sample format: %s (requested: %s)\n",
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
131 audio_out_format_name(ao_data.format), audio_out_format_name(format));
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
132
1528
a444bd456fcc ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents: 1456
diff changeset
133 if(format != AFMT_AC3) {
3181
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
134 // We only use SNDCTL_DSP_CHANNELS for >2 channels, in case some drivers don't have it
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
135 ao_data.channels = channels;
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
136 if (ao_data.channels > 2) {
3319
66134af21278 fixed to check that SNDCTL_DSP_CHANNELS actually grants the requested number of channels
steve
parents: 3181
diff changeset
137 if ( ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &ao_data.channels) == -1 ||
66134af21278 fixed to check that SNDCTL_DSP_CHANNELS actually grants the requested number of channels
steve
parents: 3181
diff changeset
138 ao_data.channels != channels ) {
66134af21278 fixed to check that SNDCTL_DSP_CHANNELS actually grants the requested number of channels
steve
parents: 3181
diff changeset
139 printf("audio_setup: Failed to set audio device to %d channels\n", channels);
3181
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
140 return 0;
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
141 }
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
142 }
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
143 else {
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
144 int c = ao_data.channels-1;
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
145 if (ioctl (audio_fd, SNDCTL_DSP_STEREO, &c) == -1) {
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
146 printf("audio_setup: Failed to set audio device to %d channels\n", ao_data.channels);
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
147 return 0;
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
148 }
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
149 }
3319
66134af21278 fixed to check that SNDCTL_DSP_CHANNELS actually grants the requested number of channels
steve
parents: 3181
diff changeset
150 printf("audio_setup: using %d channels (requested: %d)\n", ao_data.channels, channels);
3181
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
151 // set rate
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
152 ao_data.samplerate=rate;
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
153 ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate);
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
154 printf("audio_setup: using %d Hz samplerate (requested: %d)\n",ao_data.samplerate,rate);
1528
a444bd456fcc ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents: 1456
diff changeset
155 }
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
156
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
157 if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)==-1){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
158 int r=0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
159 printf("audio_setup: driver doesn't support SNDCTL_DSP_GETOSPACE :-(\n");
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
160 if(ioctl(audio_fd, SNDCTL_DSP_GETBLKSIZE, &r)==-1){
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
161 printf("audio_setup: %d bytes/frag (config.h)\n",ao_data.outburst);
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
162 } else {
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
163 ao_data.outburst=r;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
164 printf("audio_setup: %d bytes/frag (GETBLKSIZE)\n",ao_data.outburst);
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
165 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
166 } else {
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
167 printf("audio_setup: frags: %3d/%d (%d bytes/frag) free: %6d\n",
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
168 zz.fragments, zz.fragstotal, zz.fragsize, zz.bytes);
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
169 if(ao_data.buffersize==-1) ao_data.buffersize=zz.bytes;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
170 ao_data.outburst=zz.fragsize;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
171 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
172
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
173 if(ao_data.buffersize==-1){
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
174 // Measuring buffer size:
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
175 void* data;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
176 ao_data.buffersize=0;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
177 #ifdef HAVE_AUDIO_SELECT
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
178 data=malloc(ao_data.outburst); memset(data,0,ao_data.outburst);
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
179 while(ao_data.buffersize<0x40000){
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
180 fd_set rfds;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
181 struct timeval tv;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
182 FD_ZERO(&rfds); FD_SET(audio_fd,&rfds);
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
183 tv.tv_sec=0; tv.tv_usec = 0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
184 if(!select(audio_fd+1, NULL, &rfds, NULL, &tv)) break;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
185 write(audio_fd,data,ao_data.outburst);
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
186 ao_data.buffersize+=ao_data.outburst;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
187 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
188 free(data);
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
189 if(ao_data.buffersize==0){
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
190 printf("\n *** Your audio driver DOES NOT support select() ***\n");
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
191 printf("Recompile mplayer with #undef HAVE_AUDIO_SELECT in config.h !\n\n");
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
192 return 0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
193 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
194 #endif
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
195 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
196
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
197 return 1;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
198 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
199
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
200 // close audio device
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
201 static void uninit(){
1020
72cacd3b8f30 Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents: 956
diff changeset
202 #ifdef SNDCTL_DSP_RESET
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
203 ioctl(audio_fd, SNDCTL_DSP_RESET, NULL);
1020
72cacd3b8f30 Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents: 956
diff changeset
204 #endif
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
205 close(audio_fd);
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
206 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
207
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
208 // stop playing and empty buffers (for seeking/pause)
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
209 static void reset(){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
210 uninit();
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
211 audio_fd=open(dsp, O_WRONLY);
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
212 if(audio_fd<0){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
213 printf("\nFatal error: *** CANNOT RE-OPEN / RESET AUDIO DEVICE ***\n");
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
214 return;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
215 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
216
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
217 ioctl (audio_fd, SNDCTL_DSP_SETFMT, &ao_data.format);
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
218 if(ao_data.format != AFMT_AC3) {
3181
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
219 if (ao_data.channels > 2)
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
220 ioctl (audio_fd, SNDCTL_DSP_CHANNELS, &ao_data.channels);
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
221 else {
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
222 int c = ao_data.channels-1;
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
223 ioctl (audio_fd, SNDCTL_DSP_STEREO, &c);
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
224 }
c8edb0691f09 Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents: 3137
diff changeset
225 ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate);
1528
a444bd456fcc ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents: 1456
diff changeset
226 }
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
227 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
228
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
229 // stop playing, keep buffers (for pause)
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
230 static void audio_pause()
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
231 {
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
232 // for now, just call reset();
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
233 reset();
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
234 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
235
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
236 // resume playing, after audio_pause()
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
237 static void audio_resume()
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
238 {
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
239 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
240
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
241
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
242 // return: how many bytes can be played without blocking
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
243 static int get_space(){
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
244 int playsize=ao_data.outburst;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
245
1020
72cacd3b8f30 Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents: 956
diff changeset
246 #ifdef SNDCTL_DSP_GETOSPACE
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
247 if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)!=-1){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
248 // calculate exact buffer space:
3455
921a78c7b4aa limit get_space return <= MAX_OUTBURST, whilst always an exact number of fragments
steve
parents: 3319
diff changeset
249 playsize = zz.fragments*zz.fragsize;
921a78c7b4aa limit get_space return <= MAX_OUTBURST, whilst always an exact number of fragments
steve
parents: 3319
diff changeset
250 if (playsize > MAX_OUTBURST)
921a78c7b4aa limit get_space return <= MAX_OUTBURST, whilst always an exact number of fragments
steve
parents: 3319
diff changeset
251 playsize = (MAX_OUTBURST / zz.fragsize) * zz.fragsize;
921a78c7b4aa limit get_space return <= MAX_OUTBURST, whilst always an exact number of fragments
steve
parents: 3319
diff changeset
252 return playsize;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
253 }
1020
72cacd3b8f30 Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents: 956
diff changeset
254 #endif
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
255
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
256 // check buffer
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
257 #ifdef HAVE_AUDIO_SELECT
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
258 { fd_set rfds;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
259 struct timeval tv;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
260 FD_ZERO(&rfds);
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
261 FD_SET(audio_fd, &rfds);
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
262 tv.tv_sec = 0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
263 tv.tv_usec = 0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
264 if(!select(audio_fd+1, NULL, &rfds, NULL, &tv)) return 0; // not block!
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
265 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
266 #endif
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
267
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
268 return ao_data.outburst;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
269 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
270
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
271 // plays 'len' bytes of 'data'
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
272 // it should round it down to outburst*n
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
273 // return: number of bytes played
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
274 static int play(void* data,int len,int flags){
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
275 len/=ao_data.outburst;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
276 len=write(audio_fd,data,len*ao_data.outburst);
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
277 return len;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
278 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
279
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
280 static int audio_delay_method=2;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
281
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
282 // return: delay in seconds between first and last sample in buffer
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
283 static float get_delay(){
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
284 /* Calculate how many bytes/second is sent out */
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
285 if(audio_delay_method==2){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
286 int r=0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
287 if(ioctl(audio_fd, SNDCTL_DSP_GETODELAY, &r)!=-1)
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
288 return ((float)r)/(float)ao_data.bps;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
289 audio_delay_method=1; // fallback if not supported
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
290 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
291 if(audio_delay_method==1){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
292 // SNDCTL_DSP_GETOSPACE
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
293 if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)!=-1)
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
294 return ((float)(ao_data.buffersize-zz.bytes))/(float)ao_data.bps;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
295 audio_delay_method=0; // fallback if not supported
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
296 }
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
297 return ((float)ao_data.buffersize)/(float)ao_data.bps;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
298 }