summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authoralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-08-30 11:37:42 +0000
committeralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-08-30 11:37:42 +0000
commitc2b67a610be7e237b6a10cf18c6a9ccb3a990516 (patch)
treedd0e2c54185fa4a86cb861c53e07ab2a08a69913 /libmpdemux
parent76513aa134f1e2660e42ebdefd2ae15d1debb79f (diff)
downloadmpv-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.c7
-rw-r--r--libmpdemux/tv.h7
-rw-r--r--libmpdemux/tvi_v4l.c75
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]);