6 #if defined(USE_TV) && (defined(HAVE_TV_V4L) || defined(HAVE_TV_V4L2)) && defined(USE_OSS_AUDIO)
8 #include <string.h> /* strerror */
11 #include <sys/ioctl.h>
13 #ifdef HAVE_SYS_SOUNDCARD_H
14 #include <sys/soundcard.h>
16 #ifdef HAVE_SOUNDCARD_H
17 #include <soundcard.h>
19 #include <linux/soundcard.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;
34 int ai_oss_set_channels(audio_in_t
*ai
)
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
));
45 mp_msg(MSGT_TV
, MSGL_ERR
, "Unable to set channel count: %d\n",
49 ai
->channels
= ioctl_param
;
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
),
58 mp_msg(MSGT_TV
, MSGL_ERR
, "Unable to set stereo: %d\n",
59 ai
->req_channels
== 2);
62 ai
->channels
= ioctl_param
? 2 : 1;
67 int ai_oss_init(audio_in_t
*ai
)
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
));
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
));
92 mp_msg(MSGT_TV
, MSGL_ERR
, "Unable to set audio format.");
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
));
102 mp_msg(MSGT_TV
, MSGL_ERR
, "Unable to set samplerate: %d\n",
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
));
115 mp_msg(MSGT_TV
, MSGL_ERR
, "Unable to set trigger: %d\n",
120 mp_msg(MSGT_TV
, MSGL_V
, "ioctl dsp getblocksize: %d\n",
121 err
= ioctl(ai
->oss
.audio_fd
, SNDCTL_DSP_GETBLKSIZE
, &ai
->blocksize
));
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
);
137 ai
->bytes_per_sample
= 2;
142 #endif /* USE_OSS_AUDIO */