10l fix by Jindrich Makovicka
[mplayer/greg.git] / libmpdemux / ai_oss.c
blobad0b61fceeb620361aa8c306d03ed0ea4e69e688
1 #include <stdio.h>
2 #include <stdlib.h>
4 #include "config.h"
6 #if defined(USE_TV) && (defined(HAVE_TV_V4L) || defined(HAVE_TV_V4L2)) && defined(USE_OSS_AUDIO)
8 #include <string.h> /* strerror */
9 #include <fcntl.h>
10 #include <errno.h>
11 #include <sys/ioctl.h>
13 #ifdef HAVE_SYS_SOUNDCARD_H
14 #include <sys/soundcard.h>
15 #else
16 #ifdef HAVE_SOUNDCARD_H
17 #include <soundcard.h>
18 #else
19 #include <linux/soundcard.h>
20 #endif
21 #endif
23 #include "audio_in.h"
24 #include "mp_msg.h"
26 int ai_oss_set_samplerate(audio_in_t *ai)
28 int tmp = ai->req_samplerate;
29 if (ioctl(ai->oss.audio_fd, SNDCTL_DSP_SPEED, &tmp) == -1) return -1;
30 ai->samplerate = tmp;
31 return 0;
34 int ai_oss_set_channels(audio_in_t *ai)
36 int err;
37 int ioctl_param;
39 if (ai->req_channels > 2)
41 ioctl_param = ai->req_channels;
42 mp_msg(MSGT_TV, MSGL_V, "ioctl dsp channels: %d\n",
43 err = ioctl(ai->oss.audio_fd, SNDCTL_DSP_CHANNELS, &ioctl_param));
44 if (err < 0) {
45 mp_msg(MSGT_TV, MSGL_ERR, "Unable to set channel count: %d\n",
46 ai->req_channels);
47 return -1;
49 ai->channels = ioctl_param;
51 else
53 ioctl_param = (ai->req_channels == 2);
54 mp_msg(MSGT_TV, MSGL_V, "ioctl dsp stereo: %d (req: %d)\n",
55 err = ioctl(ai->oss.audio_fd, SNDCTL_DSP_STEREO, &ioctl_param),
56 ioctl_param);
57 if (err < 0) {
58 mp_msg(MSGT_TV, MSGL_ERR, "Unable to set stereo: %d\n",
59 ai->req_channels == 2);
60 return -1;
62 ai->channels = ioctl_param ? 2 : 1;
64 return 0;
67 int ai_oss_init(audio_in_t *ai)
69 int err;
70 int ioctl_param;
72 ai->oss.audio_fd = open(ai->oss.device, O_RDONLY);
73 if (ai->oss.audio_fd < 0)
75 mp_msg(MSGT_TV, MSGL_ERR, "unable to open '%s': %s\n",
76 ai->oss.device, strerror(errno));
77 return -1;
80 ioctl_param = 0 ;
81 mp_msg(MSGT_TV, MSGL_V, "ioctl dsp getfmt: %d\n",
82 ioctl(ai->oss.audio_fd, SNDCTL_DSP_GETFMTS, &ioctl_param));
84 mp_msg(MSGT_TV, MSGL_V, "Supported formats: %x\n", ioctl_param);
85 if (!(ioctl_param & AFMT_S16_LE))
86 mp_msg(MSGT_TV, MSGL_ERR, "notsupported format\n");
88 ioctl_param = AFMT_S16_LE;
89 mp_msg(MSGT_TV, MSGL_V, "ioctl dsp setfmt: %d\n",
90 err = ioctl(ai->oss.audio_fd, SNDCTL_DSP_SETFMT, &ioctl_param));
91 if (err < 0) {
92 mp_msg(MSGT_TV, MSGL_ERR, "Unable to set audio format.");
93 return -1;
96 if (ai_oss_set_channels(ai) < 0) return -1;
98 ioctl_param = ai->req_samplerate;
99 mp_msg(MSGT_TV, MSGL_V, "ioctl dsp speed: %d\n",
100 err = ioctl(ai->oss.audio_fd, SNDCTL_DSP_SPEED, &ioctl_param));
101 if (err < 0) {
102 mp_msg(MSGT_TV, MSGL_ERR, "Unable to set samplerate: %d\n",
103 ai->req_samplerate);
104 return -1;
106 ai->samplerate = ioctl_param;
108 mp_msg(MSGT_TV, MSGL_V, "ioctl dsp trigger: %d\n",
109 ioctl(ai->oss.audio_fd, SNDCTL_DSP_GETTRIGGER, &ioctl_param));
110 mp_msg(MSGT_TV, MSGL_V, "trigger: %x\n", ioctl_param);
111 ioctl_param = PCM_ENABLE_INPUT;
112 mp_msg(MSGT_TV, MSGL_V, "ioctl dsp trigger: %d\n",
113 err = ioctl(ai->oss.audio_fd, SNDCTL_DSP_SETTRIGGER, &ioctl_param));
114 if (err < 0) {
115 mp_msg(MSGT_TV, MSGL_ERR, "Unable to set trigger: %d\n",
116 PCM_ENABLE_INPUT);
119 ai->blocksize = 0;
120 mp_msg(MSGT_TV, MSGL_V, "ioctl dsp getblocksize: %d\n",
121 err = ioctl(ai->oss.audio_fd, SNDCTL_DSP_GETBLKSIZE, &ai->blocksize));
122 if (err < 0) {
123 mp_msg(MSGT_TV, MSGL_ERR, "Unable to get block size!\n");
125 mp_msg(MSGT_TV, MSGL_V, "blocksize: %d\n", ai->blocksize);
127 // correct the blocksize to a reasonable value
128 if (ai->blocksize <= 0) {
129 ai->blocksize = 4096*ai->channels*2;
130 mp_msg(MSGT_TV, MSGL_ERR, "audio block size is zero, setting to %d!\n", ai->blocksize);
131 } else if (ai->blocksize < 4096*ai->channels*2) {
132 ai->blocksize *= 4096*ai->channels*2/ai->blocksize;
133 mp_msg(MSGT_TV, MSGL_ERR, "audio block size too low, setting to %d!\n", ai->blocksize);
136 ai->samplesize = 16;
137 ai->bytes_per_sample = 2;
139 return 0;
142 #endif /* USE_OSS_AUDIO */