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@xxxxxxxxxxxxxxx> 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; > } > > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel