Changeset 31076 in vbox
- Timestamp:
- Jul 24, 2010 5:34:36 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 64022
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DevCodec.cpp
r31075 r31076 113 113 Log(("codecUnimplemented: cmd(raw:%x: cad:%x, d:%c, nid:%x, verb:%x)\n", cmd, 114 114 CODEC_CAD(cmd), CODEC_DIRECT(cmd) ? 'N' : 'Y', CODEC_NID(cmd), CODEC_VERBDATA(cmd))); 115 if (CODEC_CAD(cmd) != pState->id) 116 //** @todo r=michaln: Are we really supposed to respond to commands sent to nonexistent codecs?? 117 //** @todo r=michaln: Where in the specs is this response format defined? 118 *pResp = ((uint64_t)CODEC_CAD(cmd) << 4)| 0xFF; 119 else 120 *pResp = 0; 115 *pResp = 0; 121 116 return VINF_SUCCESS; 122 117 } … … 129 124 return rc; 130 125 } 131 126 /* B-- */ 132 127 static int codecGetAmplifier(struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 133 128 { … … 155 150 return VINF_SUCCESS; 156 151 } 152 /* 3-- */ 153 static int codecSetAmplifier(struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 154 { 155 uint32_t *pu32Bparam = NULL; 156 PCODECNODE pNode = &pState->pNodes[CODEC_NID(cmd)]; 157 *pResp = 0; 158 if (STAC9220_IS_DAC_CMD(cmd)) 159 pu32Bparam = &LIFIER_REGISTER(pNode->dac.B_params, 160 CODEC_B_DIRECTION(cmd), 161 CODEC_B_SIDE(cmd), 162 CODEC_B_INDEX(cmd)); 163 else if (STAC9220_IS_ADCVOL_CMD(cmd)) 164 pu32Bparam = &LIFIER_REGISTER(pNode->adcvol.B_params, 165 CODEC_B_DIRECTION(cmd), 166 CODEC_B_SIDE(cmd), 167 CODEC_B_INDEX(cmd)); 168 else if (STAC9220_IS_ADCMUX_CMD(cmd)) 169 pu32Bparam = &LIFIER_REGISTER(pNode->adcmux.B_params, 170 CODEC_B_DIRECTION(cmd), 171 CODEC_B_SIDE(cmd), 172 CODEC_B_INDEX(cmd)); 173 Assert(pu32Bparam); 174 if (pu32Bparam) 175 { 176 *pu32Bparam = (*pu32Bparam) & ~CODEC_VERB_8BIT_DATA; 177 *pu32Bparam = (*pu32Bparam) | (cmd & CODEC_VERB_8BIT_DATA); 178 } 179 return VINF_SUCCESS; 180 } 157 181 158 182 static int codecGetF00(struct CODECState *pState, uint32_t cmd, uint64_t *pResp) … … 189 213 Assert((CODEC_CAD(cmd) == pState->id)); 190 214 *pResp = *(uint32_t *)&pState->pNodes[CODEC_NID(cmd)].node.au8F02_param[cmd & CODEC_VERB_8BIT_DATA]; 215 return VINF_SUCCESS; 216 } 217 /* F03 */ 218 static int codecGetProcessingState(struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 219 { 220 Assert((CODEC_CAD(cmd) == pState->id)); 221 *pResp = 0; 222 if (STAC9220_IS_ADC_CMD(cmd)) 223 *pResp = pState->pNodes[CODEC_NID(cmd)].adc.u32F03_param; 224 return VINF_SUCCESS; 225 } 226 /* 703 */ 227 static int codecSetProcessingState(struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 228 { 229 Assert((CODEC_CAD(cmd) == pState->id)); 230 if (STAC9220_IS_ADC_CMD(cmd)) 231 { 232 pState->pNodes[CODEC_NID(cmd)].adc.u32F03_param &= ~CODEC_VERB_8BIT_DATA; 233 pState->pNodes[CODEC_NID(cmd)].adc.u32F03_param |= cmd & CODEC_VERB_8BIT_DATA; 234 } 235 *pResp = 0; 236 return VINF_SUCCESS; 237 } 238 /* F0D */ 239 static int codecGetDigitalConverter(struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 240 { 241 Assert((CODEC_CAD(cmd) == pState->id)); 242 *pResp = 0; 243 if (STAC9220_IS_SPDIFOUT_CMD(cmd)) 244 *pResp = pState->pNodes[CODEC_NID(cmd)].spdifout.u32F0d_param; 245 return VINF_SUCCESS; 246 } 247 /* 70D */ 248 static int codecSetDigitalConverter1(struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 249 { 250 Assert((CODEC_CAD(cmd) == pState->id)); 251 if (STAC9220_IS_SPDIFOUT_CMD(cmd)) 252 { 253 pState->pNodes[CODEC_NID(cmd)].spdifout.u32F0d_param &= ~CODEC_VERB_8BIT_DATA; 254 pState->pNodes[CODEC_NID(cmd)].spdifout.u32F0d_param |= cmd & CODEC_VERB_8BIT_DATA; 255 } 256 *pResp = 0; 257 return VINF_SUCCESS; 258 } 259 /* 70E */ 260 static int codecSetDigitalConverter2(struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 261 { 262 Assert((CODEC_CAD(cmd) == pState->id)); 263 if (STAC9220_IS_SPDIFOUT_CMD(cmd)) 264 { 265 pState->pNodes[CODEC_NID(cmd)].spdifout.u32F0d_param &= ~(CODEC_VERB_8BIT_DATA << 8); 266 pState->pNodes[CODEC_NID(cmd)].spdifout.u32F0d_param |= cmd & (CODEC_VERB_8BIT_DATA << 8); 267 } 268 *pResp = 0; 191 269 return VINF_SUCCESS; 192 270 } … … 275 353 return VINF_SUCCESS; 276 354 } 355 277 356 static int codecSetConverterFormat(struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 278 357 { … … 513 592 {0x00020000, CODEC_VERB_16BIT_CMD, codecSetConverterFormat}, 514 593 {0x000B0000, CODEC_VERB_16BIT_CMD, codecGetAmplifier }, 594 {0x00030000, CODEC_VERB_16BIT_CMD, codecSetAmplifier }, 515 595 {0x00070600, CODEC_VERB_8BIT_CMD , codecSetStreamId }, 516 596 {0x000F0600, CODEC_VERB_8BIT_CMD , codecGetStreamId }, … … 518 598 {0x00070700, CODEC_VERB_8BIT_CMD , stac9220SetPinCtrl}, 519 599 {0x000F0200, CODEC_VERB_8BIT_CMD , codecGetF02 }, 600 {0x000F0300, CODEC_VERB_8BIT_CMD , codecGetProcessingState }, 601 {0x00070300, CODEC_VERB_8BIT_CMD , codecSetProcessingState }, 602 {0x000F0D00, CODEC_VERB_8BIT_CMD , codecGetDigitalConverter }, 603 {0x00070D00, CODEC_VERB_8BIT_CMD , codecSetDigitalConverter1 }, 604 {0x00070E00, CODEC_VERB_8BIT_CMD , codecSetDigitalConverter2 }, 520 605 {0x000F2000, CODEC_VERB_8BIT_CMD , codecGetSubId }, 521 606 {0x0007FF00, CODEC_VERB_8BIT_CMD , codecReset }, … … 528 613 { 529 614 int rc = VINF_SUCCESS; 530 if ( CODEC_CAD(cmd) != pState->id531 ||CODEC_VERBDATA(cmd) == 0615 Assert(CODEC_CAD(cmd) == pState->id) 616 if ( CODEC_VERBDATA(cmd) == 0 532 617 || CODEC_NID(cmd) >= STAC9220_NODE_COUNT 533 618 || STAC9220_IS_RESERVED_CMD(cmd)) 534 619 { 535 *pfn = CODEC_ CAD(cmd) != pState->id? codecUnimplemented : codecBreak;620 *pfn = CODEC_VERBDATA(cmd) != 0 ? codecUnimplemented : codecBreak; 536 621 //** @todo r=michaln: There needs to be a counter to avoid log flooding (see e.g. DevRTC.cpp) 537 622 LogRel(("HDAcodec: cmd %x was ignored\n", cmd));
Note:
See TracChangeset
for help on using the changeset viewer.