Ich hatte auf mehreren Programmen (Sat, Astra 19.2E) das Problem, daß nach dem Umschalten kurz Ton da war, aber dann verschwand. Betroffen war z.B. "CNN Int.". Da es ja einen Watchdog für den AV Dekoder gibt, wunderte ich mich, warum der das nicht bemerkte. Irgendwie schien es so zu sein, daß da keine interrupts mehr ankamen (oder nur ganz wenige, vom Videodekodieren), was dann nicht reichte, um den Audio-Watchdog zu triggern. Dieser Patch fixt das für mich (die zwei "|" => "||" Änderungen sind nur Correctness-Fixes):
Code: Alles auswählen
Index: driver/dvb/drivers/media/dvb/avia/avia_av_core.c
===================================================================
RCS file: /cvs/tuxbox/driver/dvb/drivers/media/dvb/avia/avia_av_core.c,v
retrieving revision 1.99
diff -u -p -r1.99 avia_av_core.c
--- a/driver/dvb/drivers/media/dvb/avia/avia_av_core.c 8 Jan 2006 21:36:22 -0000 1.99
+++ b/driver/dvb/drivers/media/dvb/avia/avia_av_core.c 19 Sep 2007 16:56:39 -0000
@@ -1478,19 +1478,20 @@ int avia_av_wdt_thread(void)
int SUM_AUD_DECODED = 0;
int LAST_SUM_DECODED = 0;
int LAST_SUM_AUD_DECODED = 0;
- int counter = 0;
+ int counter = 0;
+ int timeout = 0;
dvb_kernel_thread_setup ("avia_av_wdt");
printk ("avia_av_core: Starting avia_av_wdt thread.\n");
for(;;){
- /* sleep till we got a wakeup signal */
- interruptible_sleep_on(&avia_av_wdt_sleep);
+ /* sleep for one second or until we got a wakeup signal */
+ timeout = !interruptible_sleep_on_timeout(&avia_av_wdt_sleep, 100);
- if (counter >= 100) {
+ if (counter >= 100 || timeout) {
if (avia_av_dram_read(PROC_STATE) == 0x04) {
if (play_state_video == AVIA_AV_PLAY_STATE_PLAYING) {
SUM_DECODED = avia_av_dram_read(N_DECODED);
- if ((SUM_DECODED == 0x00) | (SUM_DECODED == LAST_SUM_DECODED)) {
+ if ((SUM_DECODED == 0x00) || (SUM_DECODED == LAST_SUM_DECODED)) {
printk("avia_av_wdt_thread: video decoding stopped ==> restart\n");
avia_av_cmd(SelectStream, 0x00, pid_video);
}
@@ -1498,7 +1499,7 @@ int avia_av_wdt_thread(void)
}
if (play_state_audio == AVIA_AV_PLAY_STATE_PLAYING) {
SUM_AUD_DECODED = avia_av_dram_read(N_AUD_DECODED);
- if ((SUM_AUD_DECODED == 0x00) | (SUM_AUD_DECODED == LAST_SUM_AUD_DECODED)) {
+ if ((SUM_AUD_DECODED == 0x00) || (SUM_AUD_DECODED == LAST_SUM_AUD_DECODED)) {
printk("avia_av_wdt_thread: audio decoding stopped ==> restart\n");
avia_av_cmd(SelectStream, 0x03 - bypass_mode, pid_audio);
}
Aber vielleicht hilft es ja jemand.