aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video
diff options
context:
space:
mode:
authorMarton Balint <cus@fazekas.hu>2009-03-31 18:01:52 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-06-16 18:14:18 -0400
commit083d6f8c81e9a2bd5f71633fb38acda35fb8240c (patch)
treeb0fcd81a333b89d8a2b30b1cd049a1877fb8807c /drivers/media/video
parente878cf3a47a5d99635edc564423a9a4469c17810 (diff)
V4L/DVB (11395): cx88: audio thread: if stereo detection is hw supported don't do it manually
The sole purpose of the audio thread is to detect if stereo transmission is available, and if it is, then switch to stereo mode (and switch back, if it's no longer available). This manual autodetection is useful for some audio standards (e.g. A2) where cx88_get_stereo CAN detect stereo sound, but the cx2388x chip CANNOT auto-detect stereo sound. However, for other audio standards, the cx2388x chip CAN auto-detect the stereo sound, so the manual autodetection in the audio thread is not needed. In fact, it can cause serious problems because for some of these audio standards, cx88_get_stereo CANNOT detect the presence of stereo sound. Besides that, if the hardware automatically detects stereo/mono sound, you cannot set core->audiomode_current to the real current audio mode on channel change. With this patch, the manual autodetection is only used if audiomode_current is known after a channel change (because of the initial mono mode), and hardware-based stereo autodetecion is not applicable for the current audio standard. Signed-off-by: Marton Balint <cus@fazekas.hu> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video')
-rw-r--r--drivers/media/video/cx88/cx88-tvaudio.c51
1 files changed, 33 insertions, 18 deletions
diff --git a/drivers/media/video/cx88/cx88-tvaudio.c b/drivers/media/video/cx88/cx88-tvaudio.c
index f9501eb8557c..0a8699fa7292 100644
--- a/drivers/media/video/cx88/cx88-tvaudio.c
+++ b/drivers/media/video/cx88/cx88-tvaudio.c
@@ -976,24 +976,39 @@ int cx88_audio_thread(void *data)
976 break; 976 break;
977 try_to_freeze(); 977 try_to_freeze();
978 978
979 /* just monitor the audio status for now ... */ 979 switch (core->tvaudio) {
980 memset(&t, 0, sizeof(t)); 980 case WW_BG:
981 cx88_get_stereo(core, &t); 981 case WW_DK:
982 982 case WW_M:
983 if (UNSET != core->audiomode_manual) 983 case WW_I:
984 /* manually set, don't do anything. */ 984 case WW_L:
985 continue; 985 if (core->use_nicam)
986 986 goto hw_autodetect;
987 /* monitor signal */ 987
988 if (t.rxsubchans & V4L2_TUNER_SUB_STEREO) 988 /* just monitor the audio status for now ... */
989 mode = V4L2_TUNER_MODE_STEREO; 989 memset(&t, 0, sizeof(t));
990 else 990 cx88_get_stereo(core, &t);
991 mode = V4L2_TUNER_MODE_MONO; 991
992 if (mode == core->audiomode_current) 992 if (UNSET != core->audiomode_manual)
993 continue; 993 /* manually set, don't do anything. */
994 994 continue;
995 /* automatically switch to best available mode */ 995
996 cx88_set_stereo(core, mode, 0); 996 /* monitor signal and set stereo if available */
997 if (t.rxsubchans & V4L2_TUNER_SUB_STEREO)
998 mode = V4L2_TUNER_MODE_STEREO;
999 else
1000 mode = V4L2_TUNER_MODE_MONO;
1001 if (mode == core->audiomode_current)
1002 continue;
1003 /* automatically switch to best available mode */
1004 cx88_set_stereo(core, mode, 0);
1005 break;
1006 default:
1007hw_autodetect:
1008 /* stereo autodetection is supported by hardware so
1009 we don't need to do it manually. Do nothing. */
1010 break;
1011 }
997 } 1012 }
998 1013
999 dprintk("cx88: tvaudio thread exiting\n"); 1014 dprintk("cx88: tvaudio thread exiting\n");