annotate libao2/ao_oss.c @ 3639:64ee21b3bd09

Modified the sync code once again, commented out hardware pts sync (I'll likely burn in hell before understanding how to get this bastard to sync well) Added automagic setup of aspect ratio, will remove the "aspect-bug" (I hope). As well as please you rich 16:9 doods ;)
author mswitch
date Thu, 20 Dec 2001 20:50:35 +0000
parents 921a78c7b4aa
children f648f699eda6
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
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
119 ao_data.format=format;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
120 ioctl (audio_fd, SNDCTL_DSP_SETFMT, &ao_data.format);
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
121 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
122 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
123 return 0;
a444bd456fcc ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents: 1456
diff changeset
124 }
1079
1e0da351feaa using audio_out_format_name
al3x
parents: 1058
diff changeset
125 printf("audio_setup: sample format: %s (requested: %s)\n",
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
126 audio_out_format_name(ao_data.format), audio_out_format_name(format));
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
127
1528
a444bd456fcc ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents: 1456
diff changeset
128 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
129 // 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
130 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
131 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
132 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
133 ao_data.channels != channels ) {
66134af21278 fixed to check that SNDCTL_DSP_CHANNELS actually grants the requested number of channels
steve
parents: 3181
diff changeset
134 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
135 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
136 }
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
137 }
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
138 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
139 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
140 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
141 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
142 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
143 }
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 }
3319
66134af21278 fixed to check that SNDCTL_DSP_CHANNELS actually grants the requested number of channels
steve
parents: 3181
diff changeset
145 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
146 // 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
147 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
148 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
149 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
150 }
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
151
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
152 if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)==-1){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
153 int r=0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
154 printf("audio_setup: driver doesn't support SNDCTL_DSP_GETOSPACE :-(\n");
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
155 if(ioctl(audio_fd, SNDCTL_DSP_GETBLKSIZE, &r)==-1){
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
156 printf("audio_setup: %d bytes/frag (config.h)\n",ao_data.outburst);
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
157 } else {
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
158 ao_data.outburst=r;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
159 printf("audio_setup: %d bytes/frag (GETBLKSIZE)\n",ao_data.outburst);
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
160 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
161 } else {
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
162 printf("audio_setup: frags: %3d/%d (%d bytes/frag) free: %6d\n",
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
163 zz.fragments, zz.fragstotal, zz.fragsize, zz.bytes);
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
164 if(ao_data.buffersize==-1) ao_data.buffersize=zz.bytes;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
165 ao_data.outburst=zz.fragsize;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
166 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
167
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
168 if(ao_data.buffersize==-1){
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
169 // Measuring buffer size:
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
170 void* data;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
171 ao_data.buffersize=0;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
172 #ifdef HAVE_AUDIO_SELECT
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
173 data=malloc(ao_data.outburst); memset(data,0,ao_data.outburst);
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
174 while(ao_data.buffersize<0x40000){
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
175 fd_set rfds;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
176 struct timeval tv;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
177 FD_ZERO(&rfds); FD_SET(audio_fd,&rfds);
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
178 tv.tv_sec=0; tv.tv_usec = 0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
179 if(!select(audio_fd+1, NULL, &rfds, NULL, &tv)) break;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
180 write(audio_fd,data,ao_data.outburst);
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
181 ao_data.buffersize+=ao_data.outburst;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
182 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
183 free(data);
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
184 if(ao_data.buffersize==0){
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
185 printf("\n *** Your audio driver DOES NOT support select() ***\n");
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
186 printf("Recompile mplayer with #undef HAVE_AUDIO_SELECT in config.h !\n\n");
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
187 return 0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
188 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
189 #endif
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
190 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
191
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
192 return 1;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
193 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
194
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
195 // close audio device
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
196 static void uninit(){
1020
72cacd3b8f30 Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents: 956
diff changeset
197 #ifdef SNDCTL_DSP_RESET
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
198 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
199 #endif
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
200 close(audio_fd);
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
201 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
202
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
203 // stop playing and empty buffers (for seeking/pause)
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
204 static void reset(){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
205 uninit();
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
206 audio_fd=open(dsp, O_WRONLY);
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
207 if(audio_fd<0){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
208 printf("\nFatal error: *** CANNOT RE-OPEN / RESET AUDIO DEVICE ***\n");
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
209 return;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
210 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
211
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
212 ioctl (audio_fd, SNDCTL_DSP_SETFMT, &ao_data.format);
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
213 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
214 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
215 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
216 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
217 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
218 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
219 }
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_SPEED, &ao_data.samplerate);
1528
a444bd456fcc ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents: 1456
diff changeset
221 }
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
222 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
223
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
224 // 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
225 static void audio_pause()
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
226 {
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
227 // 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
228 reset();
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
229 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
230
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
231 // 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
232 static void audio_resume()
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
233 {
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
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
237 // return: how many bytes can be played without blocking
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
238 static int get_space(){
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
239 int playsize=ao_data.outburst;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
240
1020
72cacd3b8f30 Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents: 956
diff changeset
241 #ifdef SNDCTL_DSP_GETOSPACE
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
242 if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)!=-1){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
243 // calculate exact buffer space:
3455
921a78c7b4aa limit get_space return <= MAX_OUTBURST, whilst always an exact number of fragments
steve
parents: 3319
diff changeset
244 playsize = zz.fragments*zz.fragsize;
921a78c7b4aa limit get_space return <= MAX_OUTBURST, whilst always an exact number of fragments
steve
parents: 3319
diff changeset
245 if (playsize > MAX_OUTBURST)
921a78c7b4aa limit get_space return <= MAX_OUTBURST, whilst always an exact number of fragments
steve
parents: 3319
diff changeset
246 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
247 return playsize;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
248 }
1020
72cacd3b8f30 Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents: 956
diff changeset
249 #endif
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
250
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
251 // check buffer
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
252 #ifdef HAVE_AUDIO_SELECT
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
253 { fd_set rfds;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
254 struct timeval tv;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
255 FD_ZERO(&rfds);
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
256 FD_SET(audio_fd, &rfds);
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
257 tv.tv_sec = 0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
258 tv.tv_usec = 0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
259 if(!select(audio_fd+1, NULL, &rfds, NULL, &tv)) return 0; // not block!
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
260 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
261 #endif
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
262
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
263 return ao_data.outburst;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
264 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
265
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
266 // plays 'len' bytes of 'data'
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
267 // it should round it down to outburst*n
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
268 // return: number of bytes played
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
269 static int play(void* data,int len,int flags){
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
270 len/=ao_data.outburst;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
271 len=write(audio_fd,data,len*ao_data.outburst);
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
272 return len;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
273 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
274
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
275 static int audio_delay_method=2;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
276
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
277 // return: delay in seconds between first and last sample in buffer
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
278 static float get_delay(){
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
279 /* Calculate how many bytes/second is sent out */
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
280 if(audio_delay_method==2){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
281 int r=0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
282 if(ioctl(audio_fd, SNDCTL_DSP_GETODELAY, &r)!=-1)
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
283 return ((float)r)/(float)ao_data.bps;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
284 audio_delay_method=1; // fallback if not supported
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
285 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
286 if(audio_delay_method==1){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
287 // SNDCTL_DSP_GETOSPACE
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
288 if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)!=-1)
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
289 return ((float)(ao_data.buffersize-zz.bytes))/(float)ao_data.bps;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
290 audio_delay_method=0; // fallback if not supported
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
291 }
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
292 return ((float)ao_data.buffersize)/(float)ao_data.bps;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
293 }