Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Feb 2008 00:42:38 +0100
From:      "Danny Pansters" <danny@ricin.com>
To:        Yuri Pankov <yuri.pankov@gmail.com>
Cc:        freebsd-multimedia@freebsd.org
Subject:   Re: kbtv2 sound saa.c
Message-ID:  <200802280042.39186.danny@ricin.com>
In-Reply-To: <20080227175555.GA92245@mail.irbisnet.ru>
References:  <web-15092307@bcgp02.nicmail.ru> <200802270019.40771.danny@ricin.com> <20080227175555.GA92245@mail.irbisnet.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
--Boundary-00=_vVfxHOoKAgM2InL
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

On Wednesday 27 February 2008 18:55:56 you wrote:
<snip>

> thanks for the hints, but I must admit that I'm totally lost here -
> where can I tweak sound carrier frequency?

There doesn't seem to be a canned-in way (only for setting NTSC vs PAL), but 
Sidney's information gave me a second datapoint (for the actual value to be 
set to "audio_options.sao_siffreq1"). It stands to logic that it's not only a 
linear but also a proportional equation to convert the actual freq to the 
required registry value. In terms of numbers I made it work, and there seems 
to be a certain logic in terms of (audio) output frequency.

I think the attached patch will work for you, as well as for PAL I (UK) and 
hopefully also for NTSC. The sif is switched when broadcast standard gets 
changed.

Here (B/G) it used to be that with other PAL variants the sound would remain.
With the current working version of the saa backend it gets noise (most cases 
mixed with the actual original sound) if I switch away from B/G to any other 
PAL type as well as if I switch to NTSC, then it gets a heavy pulse-like 
noise. Once I switch back to B/G sound is ok again.

Please try attached patches (1.93 working version, not beta3 yet) to saa.c and 
saa.h.

If you want/need to experiment in python with the saa module directly (from 
python prompt) please note that you need to "from Kbtv2.drivers.saa import 
saa" and then first init video and turn capture on, and after that init audio 
before tuner (viewer must be after video, may be last, mixer can probably be 
ignored for your purposes). Use dir(saa) to see the available functions.

If you want/need to experiment in python with the AVCtrl (easier), you need to
"from Kbtv2 import avctrl", then e.g. "avc = avctrl.AVCtrl('saa', 0)". 
dir(avc) shows all methods, with help(...) you can access the inline 
documentation (or see the html doc in DOCSDIR).

>
> BTW, I've found my old post -
> http://lists.freebsd.org/pipermail/freebsd-multimedia/2007-January/005711.h
>tml
>
> With those tda9887 settings driver "just worked" with bundled tvv
> application (doesn't work for me anymore - I'm lacking xv extension with
> NVIDIA 8600GT and xf86-video-nv).

It may be that some of the B,C,E data may need to be tweaked here and there, 
but first of all I like to warn you that the mk3 and especially if init need 
to be tested after a *cold* boot. If you have for example used the card under 
windows or linux and then reboot into freebsd the tuner may not be in the 
same (uninitialized) state as after a cold boot. As you may know, saa doesn't 
use firmware or eeprom. On linux/windows they do use that.

>
>
> TIA,
> Yuri

Cheers,

Dan

Because the ML scrubs attachments, the patches (diff -u) are copied-pasted 
below for ML readers. Make sure to re-tab if you copy-paste it.

--- saa.h.orig  2008-02-01 00:14:40.000000000 +0100
+++ saa.h       2008-02-27 23:51:05.000000000 +0100
@@ -72,16 +72,19 @@
 #define CMD_LO_TEMIC          0x02
 #define CMD_MID_TEMIC         0x04
 #define CMD_HI_TEMIC          0x01
+#define CMD_LO_MICROTUNE      CMD_LO_PHILIPS
+#define CMD_MID_MICROTUNE     CMD_MID_PHILIPS
+#define CMD_HI_MICROTUNE      CMD_HI_PHILIPS
 
 #define FREQ_VIF_PAL         38.90 // Video IF (picture carrier) freq, MHz
 #define FREQ_VIF_PAL_LACCENT 33.95
 #define FREQ_VIF_NTSC        45.75
 #define FREQ_VIF_NTSC_JAPAN  58.75
 
-#define FREQ_SND_PAL_B_G       5.5 // Sound carrier frequency, MHz (not used)
-#define FREQ_SND_PAL_I         6.0
-#define FREQ_SND_PAL_D_K_L     6.5
-#define FREQ_SND_NTSC          4.5
+#define FREQ_SND_PAL_B_G        55 // Sound carrier frequency, MHz * 10
+#define FREQ_SND_PAL_I          60
+#define FREQ_SND_PAL_D_K_L      65
+#define FREQ_SND_NTSC           45
 
 #define FREQ_LOBAND_PAL      48.25 // Bands, MK3 spec followed for PAL
 #define FREQ_LOBAND_NTSC     55.25
@@ -112,7 +115,7 @@
 #define TUNER_TEMIC              3
 #define TUNER_ALPS               4
 #define TUNER_LG                 5
-#define TUNER_MICROTUNE          6 // Not supported (same as NONE)
+#define TUNER_MICROTUNE          6 // Experimental
 
 #define TDA988X_ADDRESS       0x86 // IF and tuner address
 #define TUNER_ADDRESS         0xc0
@@ -164,6 +167,7 @@
 int audio_get_source();
 int audio_set_mute(int onoff);
 int audio_get_mute();
+int __set_sif(int freq);
 
 /// TUNER FUNCTIONS //////////////////////////////////////////////////////
 
@@ -181,6 +185,7 @@
 int tuner_get_afc();
 int __init_mk3();
 int __init_if();
+int __init_mt(); // not implemented yet
 
 /// VIDEO FUNCTIONS //////////////////////////////////////////////////////
 



--- saa.c.orig  2008-02-20 02:05:42.000000000 +0100
+++ saa.c       2008-02-27 23:51:02.000000000 +0100
@@ -64,6 +64,7 @@
 struct saa_video_opt vo;      // saa video options structure
 struct saa_video_std std;     // saa video standard structure
 struct saa_video_spec spec;   // saa video specification structure
+struct saa_audio_opt ao;      // saa audio options
 caddr_t framebuffer;          // framebuffer data
 caddr_t framebuffer_copy;     // copy
 int mixer_devmask = 0;        // mixer channel mask
@@ -98,26 +99,33 @@
 int bpp;
 int new_frame = 0;
 
-static struct saa_audio_spec audio_spec = {
+struct saa_audio_spec audio_spec = {
     // saa/tvv/FLTK/audioopt.c
     .sas_audsel = AUDSEL_SIF,
     .sas_sfs = SFS_SIF_32KHZ,
     .sas_icsch = 1,
-    .sas_cap_sampcount = 16384,
+    .sas_cap_sampcount = (SAA_ACAP_FRAME_MAX_SZ >> AUDFMT_AUSEL_SHIFT),
     .sas_audfmt = AUDFMT_16BIT,
     .sas_audsamp = AUDSAMP_STEREO,
     .sas_flag_samp2complement = 1,
     .sas_flags = 0,
 };
 
+// Audio siffreq note:
+// sampcount = SAA_ACAP_FRAME_MAX_SZ >> AUDFMT_AUSEL_SHIFT = 16384
+// postfactor = (sampcount >> AUDFMT_SAMP_SHIFT) * 32 / 48 = sampcount * 25 / 
3
+// siffreq should then be set to FREQ_SND_foo * sampcount * 25 / 3
+// That way only integers are required to get the anticipated register values
+// I don't know if the 32/48 reasoning is correct but the produced numbers 
are
+
 /// AUDIO FUNCTIONS //////////////////////////////////////////////////////
 
 int audio_init(const char* adev) {
     if ((fda = open(adev, O_RDWR, 0)) < 0) return -1;
     // Init the DAC (source 0)
     if (ioctl(fda, ACAPTUREON, &audio_spec) < 0) return -2;
-    usleep(sleeptime);
-    if (ioctl(fda, ACAPTUREOFF, &empty) < 0) return -3;
+    if (ioctl(fda, GETAUDIOOPT, &ao) < 0) return -3;
+    if (ioctl(fda, ACAPTUREOFF, &empty) < 0) return -4;
     audio_set_mute(0);
     return 0;
 }
@@ -162,6 +170,17 @@
     return audio_muted;
 }
 
+int __set_sif(int freq) {
+    if (freq == FREQ_SND_NTSC) audio_spec.sas_flags = ASPEC_FLAG_NTSC;
+    else audio_spec.sas_flags = 0;
+    if (ioctl(fda, ACAPTUREON, &audio_spec) < 0) return -1;
+    if (ioctl(fda, GETAUDIOOPT, &ao) < 0) return -2;
+    ao.sao_siffreq1 = (uint32_t) (freq * audio_spec.sas_cap_sampcount * 25 / 
3);
+    if (ioctl(fda, SETAUDIOOPT, &ao) < 0) return -3;
+    if (ioctl(fda, ACAPTUREOFF, &empty) < 0) return -4;
+    return 0;
+}
+
 /// TUNER FUNCTIONS //////////////////////////////////////////////////////
 
 /* TODO: update iic code to use the newer interface (iic.ko axed in CURRENT) 
*/
@@ -212,12 +231,13 @@
 int tuner_set_type(int ttype) {
     // Tuner types = 0 to 6:
     // TUNER_NONE, TUNER_PHILIPS, TUNER_PHILIPS_MK3, TUNER_TEMIC, TUNER_LG,
-    // TUNER_ALPS, TUNER_MICROTUNE (same as NONE)
-    if (ttype < 0 || ttype > 5) ttype = 0;
+    // TUNER_ALPS, TUNER_MICROTUNE
+    if (ttype < 0 || ttype > 6) ttype = 0;
     if (ttype == 0) {
         tuner_type = ttype;
         return 0;
     }
+    audio_set_mute(1);
     // Bandswitch commands
     if (ttype == TUNER_PHILIPS) {
         bsw_lo = CMD_LO_PHILIPS;
@@ -239,15 +259,26 @@
         bsw_mid = CMD_MID_ALPS;
         bsw_hi = CMD_HI_ALPS;
     }
-    else {
+    else if (ttype == TUNER_TEMIC) {
         bsw_lo = CMD_LO_TEMIC;
         bsw_mid = CMD_MID_TEMIC;
         bsw_hi = CMD_HI_TEMIC;
     }
+    // ChangeLog 20080223: hello microtune
+    else {
+        bsw_lo = CMD_LO_MICROTUNE;
+        bsw_mid = CMD_MID_MICROTUNE;
+        bsw_hi = CMD_HI_MICROTUNE;
+    }
     // Init MK3 if needed
     if (ttype == TUNER_PHILIPS_MK3) {
         val = __init_mk3();
-        if (val < 0) return val - 10; // kludge
+        if (val < 0) return val - 20; // kludge
+    }
+    // Init MT if needed, ChangeLog 20080223
+    if (ttype == TUNER_MICROTUNE) {
+        val = __init_mt();
+        if (val < 0) return val - 60; // kludge
     }
     // IF init if needed
     if (got_tda988x) {
@@ -257,6 +288,7 @@
     // Re-tune!
     tuner_set_frequency(curfreq);
     tuner_type = ttype;
+    audio_set_mute(0);
     return 0;
 }
 
@@ -273,6 +305,7 @@
     // BSTD_PAL_B_G, BSTD_PAL_D_K, BSTD_PAL_I, BSTD_PAL_L, BSTD_PAL_LACCENT
     // BSTD_NTSC, BSTD_NTSC_JAPAN (B/G, D/K, L/L' are same for SECAM)
     if (tuner_type == 0) return 0;
+    audio_set_mute(1);
     if (bstd < 0) bstd = 0;
     else if (bstd > 6) bstd = 6;
     bcast_std = bstd;
@@ -296,7 +329,12 @@
     // MK3 (re-)init -- do this always if MK3 (ChangeLog 20080218)
     if (tuner_type == TUNER_PHILIPS_MK3) {
         val = __init_mk3();
-        if (val < 0) return val - 10; // kludge
+        if (val < 0) return val - 20; // kludge
+    }
+    // Init MT if needed, ChangeLog 20080223
+    else if (tuner_type == TUNER_MICROTUNE) {
+        val = __init_mt();
+        if (val < 0) return val - 60; // kludge
     }
     // IF init if needed
     if (got_tda988x) {
@@ -305,6 +343,14 @@
     }
     // Re-tune!
     tuner_set_frequency(curfreq);
+    // Set audio IF frequency
+    if (bcast_std == BSTD_NTSC || bcast_std == BSTD_NTSC_JAPAN) {
+        __set_sif(FREQ_SND_NTSC);
+    }
+    else if (bcast_std == BSTD_PAL_B_G) __set_sif(FREQ_SND_PAL_B_G);
+    else if (bcast_std == BSTD_PAL_I) __set_sif(FREQ_SND_PAL_I);
+    else  __set_sif(FREQ_SND_PAL_D_K_L);
+    audio_set_mute(0);
     return 0;
 }
 
@@ -426,6 +472,11 @@
     return 0;
 }
 
+int __init_mt() {
+    // TODO
+    return 0;
+}
+
 /// VIDEO FUNCTIONS //////////////////////////////////////////////////////
 
 int video_init(const char* vdev) {

--Boundary-00=_vVfxHOoKAgM2InL
Content-Type: text/x-diff;
  charset="iso-8859-1";
  name="patch-saa.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename="patch-saa.h"

--- saa.h.orig	2008-02-01 00:14:40.000000000 +0100
+++ saa.h	2008-02-27 23:51:05.000000000 +0100
@@ -72,16 +72,19 @@
 #define CMD_LO_TEMIC          0x02
 #define CMD_MID_TEMIC         0x04
 #define CMD_HI_TEMIC          0x01
+#define CMD_LO_MICROTUNE      CMD_LO_PHILIPS
+#define CMD_MID_MICROTUNE     CMD_MID_PHILIPS
+#define CMD_HI_MICROTUNE      CMD_HI_PHILIPS
 
 #define FREQ_VIF_PAL         38.90 // Video IF (picture carrier) freq, MHz
 #define FREQ_VIF_PAL_LACCENT 33.95
 #define FREQ_VIF_NTSC        45.75
 #define FREQ_VIF_NTSC_JAPAN  58.75
 
-#define FREQ_SND_PAL_B_G       5.5 // Sound carrier frequency, MHz (not used)
-#define FREQ_SND_PAL_I         6.0
-#define FREQ_SND_PAL_D_K_L     6.5
-#define FREQ_SND_NTSC          4.5
+#define FREQ_SND_PAL_B_G        55 // Sound carrier frequency, MHz * 10
+#define FREQ_SND_PAL_I          60
+#define FREQ_SND_PAL_D_K_L      65
+#define FREQ_SND_NTSC           45
 
 #define FREQ_LOBAND_PAL      48.25 // Bands, MK3 spec followed for PAL
 #define FREQ_LOBAND_NTSC     55.25
@@ -112,7 +115,7 @@
 #define TUNER_TEMIC              3
 #define TUNER_ALPS               4
 #define TUNER_LG                 5
-#define TUNER_MICROTUNE          6 // Not supported (same as NONE)
+#define TUNER_MICROTUNE          6 // Experimental
 
 #define TDA988X_ADDRESS       0x86 // IF and tuner address
 #define TUNER_ADDRESS         0xc0
@@ -164,6 +167,7 @@
 int audio_get_source();
 int audio_set_mute(int onoff);
 int audio_get_mute();
+int __set_sif(int freq);
 
 /// TUNER FUNCTIONS //////////////////////////////////////////////////////
 
@@ -181,6 +185,7 @@
 int tuner_get_afc();
 int __init_mk3();
 int __init_if();
+int __init_mt(); // not implemented yet
 
 /// VIDEO FUNCTIONS //////////////////////////////////////////////////////
 

--Boundary-00=_vVfxHOoKAgM2InL--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200802280042.39186.danny>