Author: korli Date: 2009-12-20 23:52:01 +0100 (Sun, 20 Dec 2009) New Revision: 34729 Changeset: http://dev.haiku-os.org/changeset/34729/haiku Modified: haiku/trunk/src/add-ons/kernel/drivers/audio/hda/driver.h haiku/trunk/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp haiku/trunk/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.cpp Log: * style cleanup * added location to pin widget control name Modified: haiku/trunk/src/add-ons/kernel/drivers/audio/hda/driver.h =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/audio/hda/driver.h 2009-12-20 19:48:39 UTC (rev 34728) +++ haiku/trunk/src/add-ons/kernel/drivers/audio/hda/driver.h 2009-12-20 22:52:01 UTC (rev 34729) @@ -336,6 +336,7 @@ extern uint32 gNumCards; /* hda_codec.c */ +const char* get_widget_location(uint32 location); hda_widget* hda_audio_group_get_widget(hda_audio_group* audioGroup, uint32 nodeID); status_t hda_audio_group_get_widgets(hda_audio_group* audioGroup, Modified: haiku/trunk/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp 2009-12-20 19:48:39 UTC (rev 34728) +++ haiku/trunk/src/add-ons/kernel/drivers/audio/hda/hda_codec.cpp 2009-12-20 22:52:01 UTC (rev 34729) @@ -100,6 +100,57 @@ } +const char* +get_widget_location(uint32 location) +{ + switch (location >> 4) { + case 0: + case 2: + switch (location & 0xf) { + case 2: + return "Front"; + case 3: + return "Left"; + case 4: + return "Right"; + case 5: + return "Top"; + case 6: + return "Bottom"; + case 7: + return "Rear panel"; + case 8: + return "Drive bay"; + case 0: + case 1: + default: + return NULL; + } + case 1: + switch (location & 0xf) { + case 7: + return "Riser"; + case 8: + return "HDMI"; + default: + return NULL; + } + case 3: + switch (location & 0xf) { + case 6: + return "Bottom"; + case 7: + return "Inside lid"; + case 8: + return "Outside lid"; + default: + return NULL; + } + } + return NULL; +} + + static void dump_widget_audio_capabilities(uint32 capabilities) { @@ -726,8 +777,12 @@ VID_GET_CONFIGURATION_DEFAULT, 0); if (hda_send_verbs(audioGroup->codec, verbs, resp, 1) == B_OK) { widget.d.pin.config = resp[0]; - TRACE("\t%s, %s, %s, %s, Association:%ld\n", + const char* location = + get_widget_location(CONF_DEFAULT_LOCATION(resp[0])); + TRACE("\t%s, %s%s%s, %s, %s, Association:%ld\n", kPortConnector[CONF_DEFAULT_CONNECTIVITY(resp[0])], + location ? location : "", + location ? " " : "", kDefaultDevice[CONF_DEFAULT_DEVICE(resp[0])], kConnectionType[CONF_DEFAULT_CONNTYPE(resp[0])], kJackColor[CONF_DEFAULT_COLOR(resp[0])], Modified: haiku/trunk/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.cpp 2009-12-20 19:48:39 UTC (rev 34728) +++ haiku/trunk/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.cpp 2009-12-20 22:52:01 UTC (rev 34729) @@ -22,6 +22,7 @@ #else # define TRACE(a...) ; #endif +#define ERROR(a...) dprintf("\33[34mhda:\33[0m " a) typedef enum { B_MIX_GAIN = 1 << 0, @@ -212,57 +213,76 @@ case PIN_DEV_HEAD_PHONE_OUT: return S_HEADPHONE; } - TRACE("couln't find a string for widget %ld in hda_find_multi_string()\n", widget.node_id); + ERROR("couln't find a string for widget %ld in hda_find_multi_string()\n", widget.node_id); return S_null; } -static const char * -hda_find_multi_custom_string(hda_widget& widget) +static void +hda_find_multi_custom_string(hda_widget& widget, char* custom, uint32 size) { + const char* device = NULL; switch (CONF_DEFAULT_DEVICE(widget.d.pin.config)) { case PIN_DEV_LINE_IN: + device = "Line In"; case PIN_DEV_LINE_OUT: + if (device == NULL) + device = "Line Out"; case PIN_DEV_MIC_IN: + if (device == NULL) + device = "Mic In"; switch (CONF_DEFAULT_COLOR(widget.d.pin.config)) { case 1: - return "Rear"; + device = "Rear"; + break; case 2: - return "Side"; + device = "Side"; + break; case 3: - return "Line In"; + device = "Line In"; + break; case 4: - return "Front"; + device = "Front"; + break; case 6: - return "Center/Sub"; + device = "Center/Sub"; + break; case 9: - return "Mic in"; + device = "Mic In"; + break; } - if (CONF_DEFAULT_DEVICE(widget.d.pin.config) == PIN_DEV_LINE_IN) - return "Line In"; - if (CONF_DEFAULT_DEVICE(widget.d.pin.config) == PIN_DEV_MIC_IN) - return "Mic In"; - return "Line Out"; break; case PIN_DEV_SPDIF_IN: - return "SPDIF In"; + device = "SPDIF In"; + break; case PIN_DEV_SPDIF_OUT: - return "SPDIF Out"; + device = "SPDIF Out"; + break; case PIN_DEV_CD: - return "CD"; + device = "CD"; + break; case PIN_DEV_HEAD_PHONE_OUT: - return "Headphones"; + device = "Headphones"; + break; case PIN_DEV_SPEAKER: - return "Speaker"; + device = "Speaker"; + break; } - TRACE("couldn't find a string for widget %ld in hda_find_multi_custom_string()\n", widget.node_id); - return NULL; + if (device == NULL) + ERROR("couldn't find a string for widget %ld in " + "hda_find_multi_custom_string()\n", widget.node_id); + const char* location = + get_widget_location(CONF_DEFAULT_LOCATION(widget.d.pin.config)); + snprintf(custom, size, "%s%s%s", location ? location : "", + location ? " " : "", device); + } static int32 hda_create_group_control(hda_multi *multi, uint32 *index, int32 parent, - enum strind_id string, const char* name) { + enum strind_id string, const char* name) +{ uint32 i = *index; (*index)++; multi->controls[i].mix_control.id = MULTI_CONTROL_FIRSTID + i; @@ -278,8 +298,10 @@ static void -hda_create_channel_control(hda_multi *multi, uint32 *index, int32 parent, int32 string, - hda_widget& widget, bool input, uint32 capabilities, int32 inputIndex, bool &gain, bool& mute) { +hda_create_channel_control(hda_multi *multi, uint32 *index, int32 parent, + int32 string, hda_widget& widget, bool input, uint32 capabilities, + int32 inputIndex, bool &gain, bool& mute) +{ uint32 i = *index, id; hda_multi_mixer_control control; @@ -306,8 +328,8 @@ control.mix_control.gain.granularity = AMP_CAP_STEP_SIZE(capabilities); control.mix_control.gain.min_gain = (0.0 - AMP_CAP_OFFSET(capabilities)) * control.mix_control.gain.granularity; - control.mix_control.gain.max_gain = (AMP_CAP_NUM_STEPS(capabilities) - AMP_CAP_OFFSET(capabilities)) - * control.mix_control.gain.granularity; + control.mix_control.gain.max_gain = (AMP_CAP_NUM_STEPS(capabilities) + - AMP_CAP_OFFSET(capabilities)) * control.mix_control.gain.granularity; control.mix_control.id = MULTI_CONTROL_FIRSTID + i; control.mix_control.flags = B_MULTI_MIX_GAIN; @@ -321,7 +343,8 @@ control.mix_control.id = MULTI_CONTROL_FIRSTID + i; control.mix_control.master = id; multi->controls[i++] = control; - TRACE("control nid %ld %f min %f max %f\n", control.nid, control.mix_control.gain.granularity, + TRACE("control nid %ld %f min %f max %f\n", control.nid, + control.mix_control.gain.granularity, control.mix_control.gain.min_gain, control.mix_control.gain.max_gain); gain = false; } @@ -331,7 +354,9 @@ static void -hda_create_mux_control(hda_multi *multi, uint32 *index, int32 parent, hda_widget& widget) { +hda_create_mux_control(hda_multi *multi, uint32 *index, int32 parent, + hda_widget& widget) +{ uint32 i = *index, parent2; hda_multi_mixer_control control; hda_audio_group *audioGroup = multi->group; @@ -345,14 +370,16 @@ control.mix_control.id = MULTI_CONTROL_FIRSTID + i; control.mix_control.flags = B_MULTI_MIX_MUX; control.mix_control.string = S_null; - control.type = (widget.type == WT_AUDIO_MIXER) ? B_MIX_MUX_MIXER : B_MIX_MUX_SELECTOR; + control.type = + (widget.type == WT_AUDIO_MIXER) ? B_MIX_MUX_MIXER : B_MIX_MUX_SELECTOR; multi->controls[i] = control; strcpy(multi->controls[i].mix_control.name, ""); i++; parent2 = control.mix_control.id; for (uint32 j = 0; j < widget.num_inputs; j++) { - hda_widget *input = hda_audio_group_get_widget(audioGroup, widget.inputs[j]); + hda_widget *input = + hda_audio_group_get_widget(audioGroup, widget.inputs[j]); if (input->type != WT_PIN_COMPLEX) continue; control.nid = widget.node_id; @@ -362,7 +389,8 @@ control.mix_control.parent = parent2; control.mix_control.string = S_null; multi->controls[i] = control; - strcpy(multi->controls[i].mix_control.name, hda_find_multi_custom_string(*input)); + hda_find_multi_custom_string(*input, multi->controls[i].mix_control.name, + sizeof(multi->controls[i].mix_control.name)); i++; } @@ -409,7 +437,8 @@ if ((widget.type & WT_AUDIO_OUTPUT) == 0 && widget.num_inputs > 0) { - hda_widget &child = * hda_audio_group_get_widget(audioGroup, widget.inputs[widget.active_input]); + hda_widget &child = * hda_audio_group_get_widget(audioGroup, + widget.inputs[widget.active_input]); hda_create_control_for_complex(multi, index, parent, child, gain, mute); } @@ -427,6 +456,7 @@ for (uint32 i = 0; i < audioGroup->widget_count; i++) { hda_widget& complex = audioGroup->widgets[i]; + char name[48]; if (complex.type != WT_PIN_COMPLEX) continue; @@ -436,9 +466,9 @@ continue; TRACE("create complex nid %lu\n", complex.node_id); - + hda_find_multi_custom_string(complex, name, sizeof(name)); parent2 = hda_create_group_control(multi, &index, - parent, S_null, hda_find_multi_custom_string(complex)); + parent, S_null, name); bool gain = true, mute = true; hda_create_control_for_complex(multi, &index, parent2, complex, gain, mute); @@ -457,7 +487,9 @@ if (AMP_CAP_NUM_STEPS(widget.capabilities.input_amplifier) >= 1) { for (uint32 j = 0; j < widget.num_inputs; j++) { - hda_widget *complex = hda_audio_group_get_widget(audioGroup, widget.inputs[j]); + hda_widget *complex = hda_audio_group_get_widget(audioGroup, + widget.inputs[j]); + char name[48]; if (complex->type != WT_PIN_COMPLEX) continue; if (!PIN_CAP_IS_INPUT(complex->d.pin.capabilities)) @@ -465,11 +497,12 @@ if (complex->flags & WIDGET_FLAG_OUTPUT_PATH) continue; TRACE(" create widget input nid %lu\n", widget.inputs[j]); + hda_find_multi_custom_string(*complex, name, sizeof(name)); parent2 = hda_create_group_control(multi, &index, - parent, S_null, hda_find_multi_custom_string(*complex)); + parent, S_null, name); bool gain = true, mute = true; - hda_create_channel_control(multi, &index, parent2, 0, - widget, true, widget.capabilities.input_amplifier, j, gain, mute); + hda_create_channel_control(multi, &index, parent2, 0, widget, + true, widget.capabilities.input_amplifier, j, gain, mute); } } @@ -494,7 +527,8 @@ hda_create_channel_control(multi, &index, parent2, 0, widget, true, capabilities, 0, gain, mute); - hda_widget *mixer = hda_audio_group_get_widget(audioGroup, widget.inputs[0]); + hda_widget *mixer = hda_audio_group_get_widget(audioGroup, + widget.inputs[0]); if (mixer->type != WT_AUDIO_MIXER && mixer->type != WT_AUDIO_SELECTOR) continue; TRACE(" create mixer nid %lu\n", mixer->node_id); @@ -542,7 +576,8 @@ static void -get_control_gain_mute(hda_audio_group* audioGroup, hda_multi_mixer_control *control, uint32 *resp) +get_control_gain_mute(hda_audio_group* audioGroup, + hda_multi_mixer_control *control, uint32 *resp) { uint32 verb[2]; verb[0] = MAKE_VERB(audioGroup->codec->addr, @@ -615,7 +650,8 @@ uint32 resp; if (hda_send_verbs(audioGroup->codec, &verb, &resp, 1) == B_OK) mmvi->values[i].mux = resp & 0xff; - TRACE("get_mix: %ld selector: %ld\n", control->nid, mmvi->values[i].mux); + TRACE("get_mix: %ld selector: %ld\n", control->nid, + mmvi->values[i].mux); } } return B_OK; @@ -682,11 +718,13 @@ } if (control->mix_control.master == MULTI_CONTROL_MASTERID) - control->gain = (uint32)(mmvi->values[i].gain / AMP_CAP_STEP_SIZE(control->capabilities) + control->gain = (uint32)(mmvi->values[i].gain + / AMP_CAP_STEP_SIZE(control->capabilities) + AMP_CAP_OFFSET(control->capabilities)); if (control2 && control2->mix_control.master != MULTI_CONTROL_MASTERID) - control2->gain = (uint32)(mmvi->values[i+1].gain / AMP_CAP_STEP_SIZE(control2->capabilities) + control2->gain = (uint32)(mmvi->values[i+1].gain + / AMP_CAP_STEP_SIZE(control2->capabilities) + AMP_CAP_OFFSET(control2->capabilities)); TRACE("set_mix: %ld gain: %lx and %ld gain: %lx\n", control->nid, control->gain, control2->nid, control2->gain); @@ -721,8 +759,9 @@ | AMP_SET_INPUT_INDEX(control->index) | (control2->mute & AMP_MUTE) | (control2->gain & AMP_GAIN_MASK)); - TRACE("set_mix: ctrl2 sending verb to %ld: %lx %lx %x\n", control2->nid, - control2->mute, control2->gain, control2->input); + TRACE("set_mix: ctrl2 sending verb to %ld: %lx %lx %x\n", + control2->nid, control2->mute, control2->gain, + control2->input); } hda_send_verbs(audioGroup->codec, verb, NULL, control2 ? 2 : 1); @@ -730,17 +769,20 @@ i++; } else if (control->mix_control.flags & B_MIX_MUX_MIXER) { TRACE("set_mix: %ld mixer: %ld\n", control->nid, mmvi->values[i].mux); - hda_widget *mixer = hda_audio_group_get_widget(audioGroup, control->nid); + hda_widget *mixer = hda_audio_group_get_widget(audioGroup, + control->nid); uint32 verb[mixer->num_inputs]; for (uint32 j = 0; j < mixer->num_inputs; j++) { verb[j] = MAKE_VERB(audioGroup->codec->addr, control->nid, VID_SET_AMPLIFIER_GAIN_MUTE, AMP_SET_INPUT - | AMP_SET_LEFT_CHANNEL | AMP_SET_RIGHT_CHANNEL | AMP_SET_INPUT_INDEX(j) + | AMP_SET_LEFT_CHANNEL | AMP_SET_RIGHT_CHANNEL + | AMP_SET_INPUT_INDEX(j) | ((mmvi->values[i].mux == j) ? 0 : AMP_MUTE)); TRACE("set_mix: %ld mixer %smuting %ld (%lx)\n", control->nid, (mmvi->values[i].mux == j) ? "un" : "", j, verb[j]); } - if (hda_send_verbs(audioGroup->codec, verb, NULL, mixer->num_inputs) != B_OK) + if (hda_send_verbs(audioGroup->codec, verb, NULL, mixer->num_inputs) + != B_OK) dprintf("hda: Setting mixer %ld failed on widget %ld!\n", mmvi->values[i].mux, control->nid); } else if (control->mix_control.flags & B_MIX_MUX_SELECTOR) { @@ -749,7 +791,8 @@ if (hda_send_verbs(audioGroup->codec, &verb, NULL, 1) != B_OK) dprintf("hda: Setting output selector %ld failed on widget %ld!\n", mmvi->values[i].mux, control->nid); - TRACE("set_mix: %ld selector: %ld\n", control->nid, mmvi->values[i].mux); + TRACE("set_mix: %ld selector: %ld\n", control->nid, + mmvi->values[i].mux); } } return B_OK; @@ -1032,8 +1075,8 @@ if (user_memcpy(arg, &description, sizeof(multi_description)) != B_OK) return B_BAD_ADDRESS; - return user_memcpy(originalChannels, channels, sizeof(multi_channel_info) - * description.request_channel_count); + return user_memcpy(originalChannels, channels, + sizeof(multi_channel_info) * description.request_channel_count); #else return get_description(audioGroup, (multi_description*)arg); #endif