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;