Mercurial > illumos > illumos-gate
changeset 9947:56695b51ca83
6852427 Record function doesn't work on Dell Precision 390
author | Yang-Rong Jerry Zhou <Yangrong.Zhou@Sun.COM> |
---|---|
date | Tue, 23 Jun 2009 09:19:30 +0800 |
parents | 86a051e72232 |
children | 5ece0f7c6e83 |
files | usr/src/uts/common/io/audio/drv/audiohd/audiohd.c |
diffstat | 1 files changed, 29 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/common/io/audio/drv/audiohd/audiohd.c Mon Jun 22 21:15:44 2009 -0400 +++ b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.c Tue Jun 23 09:19:30 2009 +0800 @@ -1189,11 +1189,12 @@ audiohd_set_input_pin(audiohd_state_t *statep) { uint64_t val; + hda_codec_t *codec; audiohd_pin_t *pin; audiohd_path_t *path; - audiohd_widget_t *widget; + audiohd_widget_t *widget, *w; int i, j; - wid_t wid; + wid_t wid, pin_wid = 0; val = statep->controls[CTL_RECSRC]->val; for (i = 0; i < statep->pathnum; i++) { @@ -1212,6 +1213,8 @@ AUDIOHD_ENABLE_PIN_IN(statep, path->codec->index, pin->wid); + pin_wid = pin->wid; + codec = path->codec; statep->in_port = pin->device; } else if (statep->in_port == pin->device) { AUDIOHD_DISABLE_PIN_IN(statep, @@ -1225,6 +1228,28 @@ } break; } + if (pin_wid == 0) + return (DDI_SUCCESS); + w = codec->widget[pin_wid]; + pin = (audiohd_pin_t *)w->priv; + w = codec->widget[pin->adc_dac_wid]; + path = (audiohd_path_t *)w->priv; + /* + * If there is a real selector in this input path, + * we select the right one input for the selector. + */ + if (path->sum_wid) { + w = codec->widget[path->sum_wid]; + if (w->type == WTYPE_AUDIO_SEL) { + for (i = 0; i < path->pin_nums; i++) + if (path->pin_wid[i] == pin_wid) + break; + (void) audioha_codec_verb_get( + statep, codec->index, path->sum_wid, + AUDIOHDC_VERB_SET_CONN_SEL, + path->sum_selconn[i]); + } + } return (DDI_SUCCESS); } @@ -4002,7 +4027,7 @@ for (i = 0; i < codec->soft_statep->pathnum; i++) { path = codec->soft_statep->path[i]; - if (path == NULL || path->path_type == PLAY || + if (path == NULL || path->path_type != RECORD || path->codec != codec) continue; @@ -4169,7 +4194,7 @@ for (i = 0; i < codec->soft_statep->pathnum; i++) { path = codec->soft_statep->path[i]; - if (path == NULL || path->path_type == PLAY || + if (path == NULL || path->path_type != RECORD || path->codec != codec) continue; wid = path->adda_wid;