[alsa-devel] [Intel-gfx] [RFC][PATCH] ELD routines and proc interface

Takashi Iwai tiwai at suse.de
Fri Nov 21 08:44:18 CET 2008


At Fri, 21 Nov 2008 11:41:50 +0800,
Wu Fengguang wrote:
> 
> On Thu, Nov 20, 2008 at 05:46:49PM -0800, Shane W wrote:
> > On Fri, Nov 21, 2008 at 09:36:55AM +0800, Wu Fengguang wrote:
> 
> > > Yes it's unexpected. Do you know its real speaker numbers and
> > > allocations? Does it provide some number of line-out ports?
> > 
> > There are six speakers connected, fl, ct, fr, rl, rr and lfe.
> 
> Hi Shane,
> 
> Apply this patch and run "echo speakers f > /proc/asound/card0/eld\#3".
> That will make the ELD "speakers" field right.
> 
> Thanks,
> Fengguang
> ---
> support writing to the ELD proc file
> 
> Allow users to fix quicks of ELD ROMs by writing new values to the ELD proc
> interface. The format is one or more lines of "name hex_value".
> 
> Users can add/remove/modify up to 32 SAD(Short Audio Descriptor) entries.
> 
> Signed-off-by: Wu Fengguang <wfg at linux.intel.com>

This is a nice feature, so I applied now as is.
Please give an incremental patch if you need more fixes.


thanks,

Takashi

> ---
>  sound/pci/hda/hda_eld.c |   56 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 56 insertions(+)
> 
> --- sound-2.6.orig/sound/pci/hda/hda_eld.c
> +++ sound-2.6/sound/pci/hda/hda_eld.c
> @@ -500,6 +500,59 @@ static void hdmi_print_eld_info(struct s
>  		hdmi_print_sad_info(i, e->sad + i, buffer);
>  }
>  
> +static void hdmi_write_eld_item(struct snd_info_entry *entry,
> +				struct snd_info_buffer *buffer)
> +{
> +	struct hdmi_eld *e = entry->private_data;
> +	char line[64];
> +	char name[64];
> +	char *sname;
> +	long long val;
> +	int n;
> +
> +	while (!snd_info_get_line(buffer, line, sizeof(line))) {
> +		if (sscanf(line, "%s %llx", name, &val) != 2)
> +			continue;
> +		if (!strcmp(name, "connection_type"))
> +			e->conn_type = val;
> +		else if (!strcmp(name, "port_id"))
> +			e->port_id = val;
> +		else if (!strcmp(name, "support_hdcp"))
> +			e->support_hdcp = val;
> +		else if (!strcmp(name, "support_ai"))
> +			e->support_ai = val;
> +		else if (!strcmp(name, "audio_sync_delay"))
> +			e->aud_synch_delay = val;
> +		else if (!strcmp(name, "speakers"))
> +			e->spk_alloc = val;
> +		else if (!strcmp(name, "sad_count"))
> +			e->sad_count = val;
> +		else if (!strncmp(name, "sad", 3)) {
> +			sname = name + 4;
> +			n = name[3] - '0';
> +			if (name[4] >= '0' && name[4] <= '9') {
> +				sname++;
> +				n = 10 * n + name[4] - '0';
> +			}
> +			if (n < 0 || n > 31) /* double the CEA limit */
> +				continue;
> +			if (!strcmp(sname, "_coding_type"))
> +				e->sad[n].format = val;
> +			else if (!strcmp(sname, "_channels"))
> +				e->sad[n].channels = val;
> +			else if (!strcmp(sname, "_rates"))
> +				e->sad[n].rates = val;
> +			else if (!strcmp(sname, "_bits"))
> +				e->sad[n].sample_bits = val;
> +			else if (!strcmp(sname, "_max_bitrate"))
> +				e->sad[n].max_bitrate = val;
> +			if (n >= e->sad_count)
> +				e->sad_count = n + 1;
> +		}
> +	}
> +}
> +
> +
>  int snd_hda_eld_proc_new(struct hda_codec *codec, struct hdmi_eld *eld)
>  {
>  	char name[32];
> @@ -512,6 +565,9 @@ int snd_hda_eld_proc_new(struct hda_code
>  		return err;
>  
>  	snd_info_set_text_ops(entry, eld, hdmi_print_eld_info);
> +	entry->c.text.write = hdmi_write_eld_item;
> +	entry->mode |= S_IWUSR;
> +
>  	return 0;
>  }
>  
> 


More information about the Alsa-devel mailing list