Mercurial > mplayer.hg
comparison libmpdemux/tvi_v4l.c @ 7163:a193df8b275b
v4l audio fixes by Jindrich Makovicka <makovick@KMLinux.fjfi.cvut.cz>
author | alex |
---|---|
date | Fri, 30 Aug 2002 11:37:42 +0000 |
parents | aaac9080b8a3 |
children | 64d665ae50f6 |
comparison
equal
deleted
inserted
replaced
7162:c672c79cb396 | 7163:a193df8b275b |
---|---|
142 "yuyv", "uyvy", "yuv420", "yuv411", "raw", "yuv422p", "yuv411p", | 142 "yuyv", "uyvy", "yuv420", "yuv411", "raw", "yuv422p", "yuv411p", |
143 "yuv420p", "yuv410p", NULL | 143 "yuv420p", "yuv410p", NULL |
144 }; | 144 }; |
145 #define PALETTE(x) ((x < sizeof(device_pal)/sizeof(char*)) ? device_pal[x] : "UNKNOWN") | 145 #define PALETTE(x) ((x < sizeof(device_pal)/sizeof(char*)) ? device_pal[x] : "UNKNOWN") |
146 | 146 |
147 static const char *audio_mode2name[] = { | 147 static const char *audio_mode2name(int mode) |
148 "unknown", "mono", "stereo", "language1", "language2", NULL | 148 { |
149 switch (mode) { | |
150 case VIDEO_SOUND_MONO: | |
151 return "mono"; | |
152 case VIDEO_SOUND_STEREO: | |
153 return "stereo"; | |
154 case VIDEO_SOUND_LANG1: | |
155 return "language1"; | |
156 case VIDEO_SOUND_LANG2: | |
157 return "language2"; | |
158 default: | |
159 return "unknown"; | |
160 } | |
149 }; | 161 }; |
150 | 162 |
151 static void *audio_grabber(void *data); | 163 static void *audio_grabber(void *data); |
152 static void *video_grabber(void *data); | 164 static void *video_grabber(void *data); |
153 | 165 |
260 | 272 |
261 /* retrieves info about audio channels from the BTTV */ | 273 /* retrieves info about audio channels from the BTTV */ |
262 static void init_v4l_audio(priv_t *priv) | 274 static void init_v4l_audio(priv_t *priv) |
263 { | 275 { |
264 int i; | 276 int i; |
277 int reqmode; | |
265 | 278 |
266 if (!priv->capability.audios) return; | 279 if (!priv->capability.audios) return; |
267 | 280 |
268 /* audio chanlist */ | 281 /* audio chanlist */ |
269 | 282 |
287 } | 300 } |
288 | 301 |
289 /* mute all channels */ | 302 /* mute all channels */ |
290 priv->audio[i].volume = 0; | 303 priv->audio[i].volume = 0; |
291 priv->audio[i].flags |= VIDEO_AUDIO_MUTE; | 304 priv->audio[i].flags |= VIDEO_AUDIO_MUTE; |
292 if (tv_param_mono) { | 305 if (tv_param_amode >= 0) { |
293 priv->audio[i].mode = VIDEO_SOUND_MONO; | 306 switch (tv_param_amode) { |
294 ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[i]); | 307 case 0: |
295 } else { | 308 reqmode = VIDEO_SOUND_MONO; |
296 /* try to set stereo */ | 309 break; |
297 priv->audio[i].mode = VIDEO_SOUND_STEREO; | 310 case 1: |
298 ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[i]); | 311 reqmode = VIDEO_SOUND_STEREO; |
299 } | 312 break; |
313 case 2: | |
314 reqmode = VIDEO_SOUND_LANG1; | |
315 break; | |
316 case 3: | |
317 reqmode = VIDEO_SOUND_LANG2; | |
318 break; | |
319 } | |
320 } | |
321 priv->audio[i].mode = reqmode; | |
322 ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[i]); | |
300 | 323 |
324 // get the parameters back | |
301 if (ioctl(priv->video_fd, VIDIOCGAUDIO, &priv->audio[i]) == -1) | 325 if (ioctl(priv->video_fd, VIDIOCGAUDIO, &priv->audio[i]) == -1) |
302 { | 326 { |
303 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get audio failed: %s\n", strerror(errno)); | 327 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get audio failed: %s\n", strerror(errno)); |
304 break; | 328 break; |
305 } | 329 } |
314 case VIDEO_SOUND_STEREO: | 338 case VIDEO_SOUND_STEREO: |
315 priv->audio_channels[i] = 2; | 339 priv->audio_channels[i] = 2; |
316 break; | 340 break; |
317 } | 341 } |
318 | 342 |
343 if (tv_param_amode >= 0 && priv->audio[i].mode != reqmode) { | |
344 mp_msg(MSGT_TV, MSGL_ERR, "Audio mode setup warning!\n"); | |
345 mp_msg(MSGT_TV, MSGL_ERR, "Requested mode was %s, but v4l still reports %s.\n", | |
346 audio_mode2name(reqmode), audio_mode2name(priv->audio[i].mode)); | |
347 mp_msg(MSGT_TV, MSGL_ERR, "You may need \"forcechan\" option\nto force stereo/mono audio recording.\n"); | |
348 } | |
349 | |
319 /* display stuff */ | 350 /* display stuff */ |
351 mp_msg(MSGT_TV, MSGL_V, "Video capture card reports the audio setup as follows:\n"); | |
320 mp_msg(MSGT_TV, MSGL_V, " %d: %s: ", priv->audio[i].audio, | 352 mp_msg(MSGT_TV, MSGL_V, " %d: %s: ", priv->audio[i].audio, |
321 priv->audio[i].name); | 353 priv->audio[i].name); |
322 if (priv->audio[i].flags & VIDEO_AUDIO_MUTABLE) { | 354 if (priv->audio[i].flags & VIDEO_AUDIO_MUTABLE) { |
323 mp_msg(MSGT_TV, MSGL_V, "muted=%s ", | 355 mp_msg(MSGT_TV, MSGL_V, "muted=%s ", |
324 (priv->audio[i].flags & VIDEO_AUDIO_MUTE) ? "yes" : "no"); | 356 (priv->audio[i].flags & VIDEO_AUDIO_MUTE) ? "yes" : "no"); |
325 } | 357 } |
326 mp_msg(MSGT_TV, MSGL_V, "volume=%d bass=%d treble=%d balance=%d mode=%s\n", | 358 mp_msg(MSGT_TV, MSGL_V, "volume=%d bass=%d treble=%d balance=%d mode=%s\n", |
327 priv->audio[i].volume, priv->audio[i].bass, priv->audio[i].treble, | 359 priv->audio[i].volume, priv->audio[i].bass, priv->audio[i].treble, |
328 priv->audio[i].balance, audio_mode2name[priv->audio[i].mode]); | 360 priv->audio[i].balance, audio_mode2name(priv->audio[i].mode)); |
329 mp_msg(MSGT_TV, MSGL_V, " channels: %d\n", priv->audio_channels[i]); | 361 mp_msg(MSGT_TV, MSGL_V, " channels: %d\n", priv->audio_channels[i]); |
362 | |
363 if (tv_param_forcechan >= 0) | |
364 priv->audio_channels[i] = tv_param_forcechan; | |
365 | |
366 // we'll call VIDIOCSAUDIO again when starting capture | |
367 // let's set audio mode to requested mode again for the case | |
368 // when VIDIOCGAUDIO just cannot report the mode correctly | |
369 if (tv_param_amode >= 0) | |
370 priv->audio[i].mode = reqmode; | |
330 } | 371 } |
331 } | 372 } |
332 | 373 |
333 static int init(priv_t *priv) | 374 static int init(priv_t *priv) |
334 { | 375 { |
695 priv->video_tail = 0; | 736 priv->video_tail = 0; |
696 priv->video_cnt = 0; | 737 priv->video_cnt = 0; |
697 priv->first = 1; | 738 priv->first = 1; |
698 | 739 |
699 /* enable audio */ | 740 /* enable audio */ |
700 if (priv->audio[priv->audio_id].volume <= 0) | 741 if (tv_param_volume >= 0) |
701 priv->audio[priv->audio_id].volume = 100; | 742 priv->audio[priv->audio_id].volume = tv_param_volume; |
743 if (tv_param_bass >= 0) | |
744 priv->audio[priv->audio_id].bass = tv_param_bass; | |
745 if (tv_param_treble >= 0) | |
746 priv->audio[priv->audio_id].treble = tv_param_treble; | |
747 if (tv_param_balance >= 0) | |
748 priv->audio[priv->audio_id].balance = tv_param_balance; | |
702 priv->audio[priv->audio_id].flags &= ~VIDEO_AUDIO_MUTE; | 749 priv->audio[priv->audio_id].flags &= ~VIDEO_AUDIO_MUTE; |
703 mp_msg(MSGT_TV, MSGL_V, "Starting audio capture\n"); | 750 mp_msg(MSGT_TV, MSGL_V, "Starting audio capture. Requested setup is:\n"); |
704 mp_msg(MSGT_TV, MSGL_V, "id=%d volume=%d bass=%d treble=%d balance=%d mode=%s\n", | 751 mp_msg(MSGT_TV, MSGL_V, "id=%d volume=%d bass=%d treble=%d balance=%d mode=%s\n", |
705 priv->audio_id, | 752 priv->audio_id, |
706 priv->audio[priv->audio_id].volume, priv->audio[priv->audio_id].bass, priv->audio[priv->audio_id].treble, | 753 priv->audio[priv->audio_id].volume, priv->audio[priv->audio_id].bass, priv->audio[priv->audio_id].treble, |
707 priv->audio[priv->audio_id].balance, audio_mode2name[priv->audio[priv->audio_id].mode]); | 754 priv->audio[priv->audio_id].balance, audio_mode2name(priv->audio[priv->audio_id].mode)); |
708 mp_msg(MSGT_TV, MSGL_V, " channels: %d\n", priv->audio_channels[priv->audio_id]); | 755 mp_msg(MSGT_TV, MSGL_V, " channels: %d\n", priv->audio_channels[priv->audio_id]); |
709 ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[priv->audio_id]); | 756 ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[priv->audio_id]); |
710 | 757 |
711 /* launch capture threads */ | 758 /* launch capture threads */ |
712 priv->shutdown = 0; | 759 priv->shutdown = 0; |