Re: em28xx: Terratec Grabby no sound

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Em 25-10-2010 20:06, Florian Klink escreveu:
> Hi,
> 
> I'm not very familiar with mailing lists, sorry!
> 
> Patched em28xx-cards.c, but no luck with
> mplayer -v -tv driver=v4l2:input=0:device=/dev/video1:forceaudio tv://
> (/dev/video0 is webcam). I'm able to see the video, but still no sound in mplayer
> 
> playing the sound with arecord works (i think it goes over the snd-usb-audio module,
> but don't know why some "mplayer -v -tv driver=v4l2:input=0:device=/dev/video1:alsa:adevice=hw.2,0:forceaudio tv://" magic won't do the job.
> 
> And shouldn't the sound go over v4l, too?

The sound comes from alsa device. Several em28xx types provide standard USB audio. So,
snd-usb-audio handles it. That's why you need alsa:adevice=hw.2,0:forceaudio at mplayer.

> 
> Florian
> 
> 
> 
> On Mon, 25 Oct 2010 18:51:15 -0200, Mauro Carvalho Chehab <mchehab@xxxxxxxxxx> wrote:
>> Em 25-10-2010 18:24, Florian Klink escreveu:
>>> Hi Mauro,
>>>
>>> thanks for your answer!
>>
>> I'm c/c the mailing list, as this info may be useful for the others.
>> It would be nice to have this added to wiki, but I won't have time for it,
>> unfortunately.
>>>
>>>> Maybe the amux is wrong. The only way to know for sure is to check
>>>> the used GPIO's,
>>>> via a USB snoop dump. Please take a look at linuxtv.org Wiki (search
>>>> for usbsnoop).
>>>> After getting the dump, please parse it and send me.
>>>
>>> I did the usbsnooping and hope I did the parsing right (At least the log
>>> file shrinked from 100MB to some KB, and there are plenty of EM28XX
>>> strings inside ;-))
>>>
>>> You can get it here: http://pastebin.com/SXKfLUny
>>
>> There are a few things that are relevant:
>>
>> First of all, GPIO's. They enable/disable parts of the board:
>>
>> $ grep GPIO /tmp/dump
>> em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
>> em28xx_read_reg(dev, EM28XX_R08_GPIO);        /* read 0xff */
>> em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
>> em28xx_read_reg(dev, EM28XX_R08_GPIO);        /* read 0xfd */
>> em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
>> em28xx_read_reg(dev, EM28XX_R08_GPIO);        /* read 0xfd */
>> em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x7d);
>> em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x2a);
>> em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x2a);
>>
>> Currently, they're not touched for this device. Perhaps, we might
>> need to initialize
>> them to 0xfd for capture mode, and 0x2a for sleep mode.
>>
>> In this specific case, maybe it is just safe to keep it as-is, as I
>> suspect that GPIO's
>> are not used on this device. I may be wrong, though. A simple test will tell.
>>
>> The audio entries are related to the ac97 chip.
>>
>> The driver will basically run this code:
>>
>> amux = EM28XX_AMUX_VIDEO2;     /* from Terratec Grabby entry, at
>> em28xx-cards.c */
>>
>> static struct em28xx_vol_table inputs[] = {
>>     { EM28XX_AMUX_VIDEO,     AC97_VIDEO_VOL   },
>>     { EM28XX_AMUX_LINE_IN,    AC97_LINEIN_VOL  },
>>     { EM28XX_AMUX_PHONE,    AC97_PHONE_VOL   },
>>     { EM28XX_AMUX_MIC,    AC97_MIC_VOL     },
>>     { EM28XX_AMUX_CD,    AC97_CD_VOL      },
>>     { EM28XX_AMUX_AUX,    AC97_AUX_VOL     },
>>     { EM28XX_AMUX_PCM_OUT,    AC97_PCM_OUT_VOL },
>>
>> if (amux == inputs[i].mux)
>>             ret = em28xx_write_ac97(dev, inputs[i].reg, 0x0808);        /* Put the
>> volume in 50% */
>>         else
>>             ret = em28xx_write_ac97(dev, inputs[i].reg, 0x8000);        /* Mute the
>> volume */
>>
>> Any mixer entry equal or bigger than 0x8000 is muted.
>>
>>
>> $ grep 97 dump
>> em28xx_read_ac97(dev, AC97_VENDOR_ID1);    /* read 0x0x8384 */
>> em28xx_read_ac97(dev, AC97_VENDOR_ID2);    /* read 0x0x7652 */
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_AUX_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_POWER_DOWN_CTRL, 0x4200);
>> em28xx_write_ac97(dev, AC97_RECORD_SELECT, 0x0505);
>> em28xx_write_ac97(dev, AC97_EXT_AUD_CTRL, 0x0031);
>> em28xx_write_ac97(dev, AC97_PCM_IN_SRATE, 0xbb80);
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_AUX_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_AUX_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_AUX_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_POWER_DOWN_CTRL, 0x4200);
>> em28xx_write_ac97(dev, AC97_RECORD_SELECT, 0x0505);
>> em28xx_write_ac97(dev, AC97_EXT_AUD_CTRL, 0x0031);
>> em28xx_write_ac97(dev, AC97_PCM_IN_SRATE, 0xbb80);
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_AUX_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_AUX_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_POWER_DOWN_CTRL, 0x4200);
>> em28xx_write_ac97(dev, AC97_RECORD_SELECT, 0x0505);
>> em28xx_write_ac97(dev, AC97_EXT_AUD_CTRL, 0x0031);
>> em28xx_write_ac97(dev, AC97_PCM_IN_SRATE, 0xbb80);
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_reg(dev, EM28XX_R42_AC97ADDR, 0x16);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_AUX_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_AUX_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_AUX_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_POWER_DOWN_CTRL, 0x4200);
>> em28xx_write_ac97(dev, AC97_RECORD_SELECT, 0x0505);
>> em28xx_write_ac97(dev, AC97_EXT_AUD_CTRL, 0x0031);
>> em28xx_write_ac97(dev, AC97_PCM_IN_SRATE, 0xbb80);
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_AUX_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_AUX_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_POWER_DOWN_CTRL, 0x4200);
>> em28xx_write_ac97(dev, AC97_RECORD_SELECT, 0x0505);
>> em28xx_write_ac97(dev, AC97_EXT_AUD_CTRL, 0x0031);
>> em28xx_write_ac97(dev, AC97_PCM_IN_SRATE, 0xbb80);
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_AUX_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x8000);
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_AUX_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_AUX_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_RECORD_GAIN, 0x0000);
>> em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>> em28xx_write_ac97(dev, AC97_VIDEO_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_AUX_VOL, 0x9010);
>> em28xx_write_ac97(dev, AC97_MIC_VOL, 0x9010);
>>
>> From the logs, the only mixer line used on this device is:
>>     em28xx_write_ac97(dev, AC97_LINEIN_VOL, 0x0808);
>>
>> So, I think that the correct value, at em28xx-cards.c is:
>>     amux = EM28XX_AMUX_LINE_IN,
>>
>> Ok, could you please test the enclosed patch? Please test it with both
>> Composite and S-Video entries.
>>
>> Cheers,
>> Mauro
>>
>> ---
>>
>> em28xx: fix Terratec Grabby lack of sound
>>
>> Audio mux were pointing to the wrong line entry.
>>
>> Reported-by: Florian Klink <flokli@xxxxxxxxx>
>>
>> diff --git a/drivers/media/video/em28xx/em28xx-cards.c
>> b/drivers/media/video/em28xx/em28xx-cards.c
>> index 5485923..afb206b 100644
>> --- a/drivers/media/video/em28xx/em28xx-cards.c
>> +++ b/drivers/media/video/em28xx/em28xx-cards.c
>> @@ -1633,11 +1633,11 @@ struct em28xx_board em28xx_boards[] = {
>>          .input           = { {
>>              .type     = EM28XX_VMUX_COMPOSITE1,
>>              .vmux     = SAA7115_COMPOSITE0,
>> -            .amux     = EM28XX_AMUX_VIDEO2,
>> +            .amux     = EM28XX_AMUX_LINE_IN,
>>          }, {
>>              .type     = EM28XX_VMUX_SVIDEO,
>>              .vmux     = SAA7115_SVIDEO3,
>> -            .amux     = EM28XX_AMUX_VIDEO2,
>> +            .amux     = EM28XX_AMUX_LINE_IN,
>>          } },
>>      },
>>      [EM2860_BOARD_TERRATEC_AV350] = {
>> -- 
>> To unsubscribe from this list: send the line "unsubscribe linux-media" in
>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux