There is a bug in the cx88 driver when dealing with blackbird hardware. If you set the "always_analog" cx88xx module option to 1 it will pass the audio from the card input to the internal audio connector for connection to the motherboard, however it will overide the setting of EN_I2SOUT_ENABLE which controls audio output to the mpeg encoder so your mpeg will have no audio in it. However if you do not set "always_analog" then the "ctl" value passed into "set_audio_finish" function doesn't get written to the AUD_CTL register and the external ADC for S-video and composite inputs doesn't get enabled, result again is no audio.
The following patch against a 2.6.28 kernel provides working audio for the PVR2000 and hopefully other blackbird based mpeg encoder cards. The change is simple enough to apply by hand to other kernel versions. If anybody knows how to contact somebody with commit access at linuxtv.org then let me know, they don't appear to have a mechanism to report bugs much less accept patches.
The only remaining problem I have with this card is when switching between inputs. It seems that the mpeg encoder chip mostly "crashes" when you change inputs. If you close the device and reopen after changing inputs everything gets reset and it works, however this pushes responsibility for the driver bug back up to the applications which is not ideal. I am still fidling with the driver to see if I can force an mpeg encoder restart after the input switch. BTW this is all with MythTV, I am keen to try LinuxMCE but haven't had the time just yet. I have been using my PVR2000 to record cable via the compsite input and it has been working fine for a while with this patch.
diff -urN cx88-tvaudio.c cx88-tvaudio.c
--- cx88-tvaudio.c 2009-04-18 15:28:45.000000000 +1000
+++ cx88-tvaudio.c 2009-04-18 23:26:08.000000000 +1000
@@ -147,15 +147,16 @@
cx_write(AUD_I2SINPUTCNTL, 4);
cx_write(AUD_BAUDRATE, 1);
/* 'pass-thru mode': this enables the i2s output to the mpeg enc
oder */
- cx_set(AUD_CTL, EN_I2SOUT_ENABLE);
+ ctl |= EN_I2SOUT_ENABLE;
+ cx_write(AUD_CTL, ctl);
cx_write(AUD_I2SOUTPUTCNTL, 1);
cx_write(AUD_I2SCNTL, 0);
/* cx_write(AUD_APB_IN_RATE_ADJ, 0); */
}
if ((always_analog) || (!(core->board.mpeg & CX88_MPEG_BLACKBIRD))) {
ctl |= EN_DAC_ENABLE;
- cx_write(AUD_CTL, ctl);
}
+ cx_write(AUD_CTL, ctl);
/* finish programming */
cx_write(AUD_SOFT_RESET, 0x0000);