diff options
author | alex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-08-30 11:37:42 +0000 |
---|---|---|
committer | alex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-08-30 11:37:42 +0000 |
commit | c2b67a610be7e237b6a10cf18c6a9ccb3a990516 (patch) | |
tree | dd0e2c54185fa4a86cb861c53e07ab2a08a69913 /libmpdemux | |
parent | 76513aa134f1e2660e42ebdefd2ae15d1debb79f (diff) | |
download | mpv-c2b67a610be7e237b6a10cf18c6a9ccb3a990516.tar.bz2 mpv-c2b67a610be7e237b6a10cf18c6a9ccb3a990516.tar.xz |
v4l audio fixes by Jindrich Makovicka <makovick@KMLinux.fjfi.cvut.cz>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7164 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/tv.c | 7 | ||||
-rw-r--r-- | libmpdemux/tv.h | 7 | ||||
-rw-r--r-- | libmpdemux/tvi_v4l.c | 75 |
3 files changed, 73 insertions, 16 deletions
diff --git a/libmpdemux/tv.c b/libmpdemux/tv.c index 88c8fd2ccd..73d94abae6 100644 --- a/libmpdemux/tv.c +++ b/libmpdemux/tv.c @@ -52,8 +52,13 @@ int tv_param_input = 0; /* used in v4l and bttv */ char *tv_param_outfmt = "yv12"; float tv_param_fps = -1.0; #ifdef HAVE_TV_V4L -int tv_param_mono = 0; +int tv_param_amode = -1; int tv_param_audio_id = 0; +int tv_param_volume = 60000; +int tv_param_bass = -1; +int tv_param_treble = -1; +int tv_param_balance = -1; +int tv_param_forcechan = -1; #ifdef HAVE_ALSA9 int tv_param_alsa = 0; #endif diff --git a/libmpdemux/tv.h b/libmpdemux/tv.h index 255ab4c064..ce622ea8f9 100644 --- a/libmpdemux/tv.h +++ b/libmpdemux/tv.h @@ -24,8 +24,13 @@ extern int tv_param_noaudio; extern int tv_param_immediate; extern int tv_param_audiorate; #ifdef HAVE_TV_V4L -extern int tv_param_mono; +extern int tv_param_amode; extern int tv_param_audio_id; +extern int tv_param_volume; +extern int tv_param_bass; +extern int tv_param_treble; +extern int tv_param_balance; +extern int tv_param_forcechan; #ifdef HAVE_ALSA9 extern int tv_param_alsa; #endif diff --git a/libmpdemux/tvi_v4l.c b/libmpdemux/tvi_v4l.c index 8075f516b0..8fb4cc5bdc 100644 --- a/libmpdemux/tvi_v4l.c +++ b/libmpdemux/tvi_v4l.c @@ -144,8 +144,20 @@ static const char *device_palette2name[] = { }; #define PALETTE(x) ((x < sizeof(device_pal)/sizeof(char*)) ? device_pal[x] : "UNKNOWN") -static const char *audio_mode2name[] = { - "unknown", "mono", "stereo", "language1", "language2", NULL +static const char *audio_mode2name(int mode) +{ + switch (mode) { + case VIDEO_SOUND_MONO: + return "mono"; + case VIDEO_SOUND_STEREO: + return "stereo"; + case VIDEO_SOUND_LANG1: + return "language1"; + case VIDEO_SOUND_LANG2: + return "language2"; + default: + return "unknown"; + } }; static void *audio_grabber(void *data); @@ -262,6 +274,7 @@ tvi_handle_t *tvi_init_v4l(char *device, char *adevice) static void init_v4l_audio(priv_t *priv) { int i; + int reqmode; if (!priv->capability.audios) return; @@ -289,15 +302,26 @@ static void init_v4l_audio(priv_t *priv) /* mute all channels */ priv->audio[i].volume = 0; priv->audio[i].flags |= VIDEO_AUDIO_MUTE; - if (tv_param_mono) { - priv->audio[i].mode = VIDEO_SOUND_MONO; - ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[i]); - } else { - /* try to set stereo */ - priv->audio[i].mode = VIDEO_SOUND_STEREO; - ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[i]); + if (tv_param_amode >= 0) { + switch (tv_param_amode) { + case 0: + reqmode = VIDEO_SOUND_MONO; + break; + case 1: + reqmode = VIDEO_SOUND_STEREO; + break; + case 2: + reqmode = VIDEO_SOUND_LANG1; + break; + case 3: + reqmode = VIDEO_SOUND_LANG2; + break; + } } + priv->audio[i].mode = reqmode; + ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[i]); + // get the parameters back if (ioctl(priv->video_fd, VIDIOCGAUDIO, &priv->audio[i]) == -1) { mp_msg(MSGT_TV, MSGL_ERR, "ioctl get audio failed: %s\n", strerror(errno)); @@ -316,7 +340,15 @@ static void init_v4l_audio(priv_t *priv) break; } + if (tv_param_amode >= 0 && priv->audio[i].mode != reqmode) { + mp_msg(MSGT_TV, MSGL_ERR, "Audio mode setup warning!\n"); + mp_msg(MSGT_TV, MSGL_ERR, "Requested mode was %s, but v4l still reports %s.\n", + audio_mode2name(reqmode), audio_mode2name(priv->audio[i].mode)); + mp_msg(MSGT_TV, MSGL_ERR, "You may need \"forcechan\" option\nto force stereo/mono audio recording.\n"); + } + /* display stuff */ + mp_msg(MSGT_TV, MSGL_V, "Video capture card reports the audio setup as follows:\n"); mp_msg(MSGT_TV, MSGL_V, " %d: %s: ", priv->audio[i].audio, priv->audio[i].name); if (priv->audio[i].flags & VIDEO_AUDIO_MUTABLE) { @@ -325,8 +357,17 @@ static void init_v4l_audio(priv_t *priv) } mp_msg(MSGT_TV, MSGL_V, "volume=%d bass=%d treble=%d balance=%d mode=%s\n", priv->audio[i].volume, priv->audio[i].bass, priv->audio[i].treble, - priv->audio[i].balance, audio_mode2name[priv->audio[i].mode]); + priv->audio[i].balance, audio_mode2name(priv->audio[i].mode)); mp_msg(MSGT_TV, MSGL_V, " channels: %d\n", priv->audio_channels[i]); + + if (tv_param_forcechan >= 0) + priv->audio_channels[i] = tv_param_forcechan; + + // we'll call VIDIOCSAUDIO again when starting capture + // let's set audio mode to requested mode again for the case + // when VIDIOCGAUDIO just cannot report the mode correctly + if (tv_param_amode >= 0) + priv->audio[i].mode = reqmode; } } @@ -697,14 +738,20 @@ static int start(priv_t *priv) priv->first = 1; /* enable audio */ - if (priv->audio[priv->audio_id].volume <= 0) - priv->audio[priv->audio_id].volume = 100; + if (tv_param_volume >= 0) + priv->audio[priv->audio_id].volume = tv_param_volume; + if (tv_param_bass >= 0) + priv->audio[priv->audio_id].bass = tv_param_bass; + if (tv_param_treble >= 0) + priv->audio[priv->audio_id].treble = tv_param_treble; + if (tv_param_balance >= 0) + priv->audio[priv->audio_id].balance = tv_param_balance; priv->audio[priv->audio_id].flags &= ~VIDEO_AUDIO_MUTE; - mp_msg(MSGT_TV, MSGL_V, "Starting audio capture\n"); + mp_msg(MSGT_TV, MSGL_V, "Starting audio capture. Requested setup is:\n"); mp_msg(MSGT_TV, MSGL_V, "id=%d volume=%d bass=%d treble=%d balance=%d mode=%s\n", priv->audio_id, priv->audio[priv->audio_id].volume, priv->audio[priv->audio_id].bass, priv->audio[priv->audio_id].treble, - priv->audio[priv->audio_id].balance, audio_mode2name[priv->audio[priv->audio_id].mode]); + priv->audio[priv->audio_id].balance, audio_mode2name(priv->audio[priv->audio_id].mode)); mp_msg(MSGT_TV, MSGL_V, " channels: %d\n", priv->audio_channels[priv->audio_id]); ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[priv->audio_id]); |