Changeset 31463 in vbox for trunk/src/VBox/Devices/Audio
- Timestamp:
- Aug 9, 2010 8:37:03 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 64544
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DevCodec.cpp
r31459 r31463 125 125 static int codecToAudVolume(struct CODECState *pState); 126 126 127 static inline void codecSetRegister(uint32_t *pu32Reg, uint32_t u32Cmd) 128 { 129 *pu32Reg = (*pu32Reg) & ~CODEC_VERB_8BIT_DATA; 130 *pu32Reg = (*pu32Reg) | (u32Cmd & CODEC_VERB_8BIT_DATA); 127 static inline void codecSetRegister(uint32_t *pu32Reg, uint32_t u32Cmd, uint8_t u8Offset, uint32_t mask) 128 { 129 Assert((pu32Reg && u8Offset < 32)); 130 *pu32Reg &= ~(mask << u8Offset); 131 *pu32Reg |= (u32Cmd & mask) << u8Offset; 132 } 133 static inline void codecSetRegisterU8(uint32_t *pu32Reg, uint32_t u32Cmd, uint8_t u8Offset) 134 { 135 codecSetRegister(pu32Reg, u32Cmd, u8Offset, CODEC_VERB_8BIT_DATA); 136 } 137 138 static inline void codecSetRegisterU16(uint32_t *pu32Reg, uint32_t u32Cmd, uint8_t u8Offset) 139 { 140 codecSetRegister(pu32Reg, u32Cmd, u8Offset, CODEC_VERB_16BIT_DATA); 131 141 } 132 142 … … 204 214 } 205 215 *pResp = 0; 206 fIsOut = CODEC_SET_AMP_IS_OUT_DIRECTION(cmd);207 fIsIn = CODEC_SET_AMP_IS_IN_DIRECTION(cmd);208 fIsRight = CODEC_SET_AMP_IS_RIGHT_SIDE(cmd);209 fIsLeft = CODEC_SET_AMP_IS_LEFT_SIDE(cmd);210 u8Index = CODEC_SET_AMP_INDEX(cmd);211 216 PCODECNODE pNode = &pState->pNodes[CODEC_NID(cmd)]; 212 217 if (STAC9220_IS_DAC_CMD(cmd)) … … 218 223 else if (STAC9220_IS_PCBEEP_CMD(cmd)) 219 224 pAmplifier = &pNode->pcbeep.B_params; 220 if ( (!fIsLeft && !fIsRight)221 || (!fIsOut && !fIsIn))222 return VINF_SUCCESS;223 225 Assert(pAmplifier); 224 226 if (pAmplifier) 225 227 { 228 fIsOut = CODEC_SET_AMP_IS_OUT_DIRECTION(cmd); 229 fIsIn = CODEC_SET_AMP_IS_IN_DIRECTION(cmd); 230 fIsRight = CODEC_SET_AMP_IS_RIGHT_SIDE(cmd); 231 fIsLeft = CODEC_SET_AMP_IS_LEFT_SIDE(cmd); 232 u8Index = CODEC_SET_AMP_INDEX(cmd); 233 if ( (!fIsLeft && !fIsRight) 234 || (!fIsOut && !fIsIn)) 235 return VINF_SUCCESS; 226 236 if (fIsIn) 227 237 { 228 238 if (fIsLeft) 229 codecSetRegister (&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_IN, AMPLIFIER_LEFT, u8Index), cmd);239 codecSetRegisterU8(&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_IN, AMPLIFIER_LEFT, u8Index), cmd, 0); 230 240 if (fIsRight) 231 codecSetRegister (&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_IN, AMPLIFIER_RIGHT, u8Index), cmd);241 codecSetRegisterU8(&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_IN, AMPLIFIER_RIGHT, u8Index), cmd, 0); 232 242 } 233 243 if (fIsOut) 234 244 { 235 245 if (fIsLeft) 236 codecSetRegister (&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_OUT, AMPLIFIER_LEFT, u8Index), cmd);246 codecSetRegisterU8(&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_OUT, AMPLIFIER_LEFT, u8Index), cmd, 0); 237 247 if (fIsRight) 238 codecSetRegister (&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_OUT, AMPLIFIER_RIGHT, u8Index), cmd);248 codecSetRegisterU8(&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_OUT, AMPLIFIER_RIGHT, u8Index), cmd, 0); 239 249 } 240 250 if (CODEC_NID(cmd) == 2) … … 297 307 pu32Reg = &pState->pNodes[CODEC_NID(cmd)].digout.u32F01_param; 298 308 Assert((pu32Reg)); 299 if (!pu32Reg) 300 return VINF_SUCCESS; 301 *pu32Reg = (*pu32Reg) & ~CODEC_VERB_8BIT_DATA; 302 *pu32Reg = (*pu32Reg) | (cmd & CODEC_VERB_8BIT_DATA); 309 if (pu32Reg) 310 codecSetRegisterU8(pu32Reg, cmd, 0); 303 311 return VINF_SUCCESS; 304 312 } … … 349 357 pu32Reg = &pState->pNodes[CODEC_NID(cmd)].cdnode.u32F07_param; 350 358 Assert((pu32Reg)); 351 if (!pu32Reg) 352 return VINF_SUCCESS; 353 *pu32Reg = (*pu32Reg) & ~CODEC_VERB_8BIT_DATA; 354 *pu32Reg = (*pu32Reg) | (cmd & CODEC_VERB_8BIT_DATA); 359 if (pu32Reg) 360 codecSetRegisterU8(pu32Reg, cmd, 0); 355 361 return VINF_SUCCESS; 356 362 } … … 403 409 AssertMsgFailed(("unsupported operation %x on node: %x\n", CODEC_VERB_CMD8(cmd), CODEC_NID(cmd))); 404 410 Assert(pu32Reg); 405 if(!pu32Reg) 406 return VINF_SUCCESS; 407 *pu32Reg &= ~CODEC_VERB_8BIT_DATA; 408 *pu32Reg |= cmd & CODEC_VERB_8BIT_DATA; 411 if(pu32Reg) 412 codecSetRegisterU8(pu32Reg, cmd, 0); 409 413 return VINF_SUCCESS; 410 414 } … … 447 451 pu32Reg = &pState->pNodes[CODEC_NID(cmd)].digin.u32F08_param; 448 452 Assert(pu32Reg); 449 if(!pu32Reg) 450 return VINF_SUCCESS; 451 *pu32Reg &= ~CODEC_VERB_8BIT_DATA; 452 *pu32Reg |= cmd & CODEC_VERB_8BIT_DATA; 453 if(pu32Reg) 454 codecSetRegisterU8(pu32Reg, cmd, 0); 453 455 return VINF_SUCCESS; 454 456 } … … 500 502 if (STAC9220_IS_ADC_CMD(cmd)) 501 503 { 502 pState->pNodes[CODEC_NID(cmd)].adc.u32F03_param &= ~CODEC_VERB_8BIT_DATA; 503 pState->pNodes[CODEC_NID(cmd)].adc.u32F03_param |= cmd & CODEC_VERB_8BIT_DATA; 504 codecSetRegisterU8(&pState->pNodes[CODEC_NID(cmd)].adc.u32F03_param, cmd, 0); 504 505 } 505 506 return VINF_SUCCESS; … … 524 525 } 525 526 527 static int codecSetDigitalConverter(struct CODECState *pState, uint32_t cmd, uint8_t u8Offset, uint64_t *pResp) 528 { 529 Assert((CODEC_CAD(cmd) == pState->id)); 530 Assert((CODEC_NID(cmd) < STAC9220_NODE_COUNT)); 531 if (CODEC_NID(cmd) >= STAC9220_NODE_COUNT) 532 { 533 Log(("HDAcodec: invalid node address %d\n", CODEC_NID(cmd))); 534 return VINF_SUCCESS; 535 } 536 *pResp = 0; 537 if (STAC9220_IS_SPDIFOUT_CMD(cmd)) 538 codecSetRegisterU8(&pState->pNodes[CODEC_NID(cmd)].spdifout.u32F0d_param, cmd, u8Offset); 539 else if (STAC9220_IS_SPDIFIN_CMD(cmd)) 540 codecSetRegisterU8(&pState->pNodes[CODEC_NID(cmd)].spdifin.u32F0d_param, cmd, u8Offset); 541 return VINF_SUCCESS; 542 } 543 526 544 /* 70D */ 527 545 static int codecSetDigitalConverter1(struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 528 546 { 529 Assert((CODEC_CAD(cmd) == pState->id)); 530 Assert((CODEC_NID(cmd) < STAC9220_NODE_COUNT)); 531 if (CODEC_NID(cmd) >= STAC9220_NODE_COUNT) 532 { 533 Log(("HDAcodec: invalid node address %d\n", CODEC_NID(cmd))); 534 return VINF_SUCCESS; 535 } 536 *pResp = 0; 537 if (STAC9220_IS_SPDIFOUT_CMD(cmd)) 538 { 539 pState->pNodes[CODEC_NID(cmd)].spdifout.u32F0d_param &= ~CODEC_VERB_8BIT_DATA; 540 pState->pNodes[CODEC_NID(cmd)].spdifout.u32F0d_param |= cmd & CODEC_VERB_8BIT_DATA; 541 } 542 else if (STAC9220_IS_SPDIFIN_CMD(cmd)) 543 { 544 pState->pNodes[CODEC_NID(cmd)].spdifin.u32F0d_param &= ~CODEC_VERB_8BIT_DATA; 545 pState->pNodes[CODEC_NID(cmd)].spdifin.u32F0d_param |= cmd & CODEC_VERB_8BIT_DATA; 546 } 547 return VINF_SUCCESS; 548 } 547 return codecSetDigitalConverter(pState, cmd, 0, pResp); 548 } 549 549 550 /* 70E */ 550 551 static int codecSetDigitalConverter2(struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 551 552 { 552 Assert((CODEC_CAD(cmd) == pState->id)); 553 Assert((CODEC_NID(cmd) < STAC9220_NODE_COUNT)); 554 if (CODEC_NID(cmd) >= STAC9220_NODE_COUNT) 555 { 556 Log(("HDAcodec: invalid node address %d\n", CODEC_NID(cmd))); 557 return VINF_SUCCESS; 558 } 559 *pResp = 0; 560 if (STAC9220_IS_SPDIFOUT_CMD(cmd)) 561 { 562 pState->pNodes[CODEC_NID(cmd)].spdifout.u32F0d_param &= ~(CODEC_VERB_8BIT_DATA << 8); 563 pState->pNodes[CODEC_NID(cmd)].spdifout.u32F0d_param |= cmd & (CODEC_VERB_8BIT_DATA << 8); 564 } 565 else if (STAC9220_IS_SPDIFIN_CMD(cmd)) 566 { 567 pState->pNodes[CODEC_NID(cmd)].spdifin.u32F0d_param &= ~(CODEC_VERB_8BIT_DATA << 8); 568 pState->pNodes[CODEC_NID(cmd)].spdifin.u32F0d_param |= cmd & (CODEC_VERB_8BIT_DATA << 8); 569 } 570 return VINF_SUCCESS; 553 return codecSetDigitalConverter(pState, cmd, 8, pResp); 571 554 } 572 555 … … 700 683 Assert((pu32addr)); 701 684 if (pu32addr) 702 { 703 *pu32addr &= ~CODEC_VERB_8BIT_DATA; 704 *pu32addr |= cmd & CODEC_VERB_8BIT_DATA; 705 } 685 codecSetRegisterU8(pu32addr, cmd, 0); 706 686 return VINF_SUCCESS; 707 687 } … … 738 718 *pResp = 0; 739 719 if (STAC9220_IS_DAC_CMD(cmd)) 740 { 741 pState->pNodes[CODEC_NID(cmd)].dac.u32A_param &= ~CODEC_VERB_16BIT_DATA; 742 pState->pNodes[CODEC_NID(cmd)].dac.u32A_param |= cmd & CODEC_VERB_16BIT_DATA; 743 } 720 codecSetRegisterU16(&pState->pNodes[CODEC_NID(cmd)].dac.u32A_param, cmd, 0); 744 721 else if (STAC9220_IS_ADC_CMD(cmd)) 745 { 746 pState->pNodes[CODEC_NID(cmd)].adc.u32A_param &= ~CODEC_VERB_16BIT_DATA; 747 pState->pNodes[CODEC_NID(cmd)].adc.u32A_param |= cmd & CODEC_VERB_16BIT_DATA; 748 } 722 codecSetRegisterU16(&pState->pNodes[CODEC_NID(cmd)].adc.u32A_param, cmd, 0); 749 723 else if (STAC9220_IS_SPDIFOUT_CMD(cmd)) 750 { 751 pState->pNodes[CODEC_NID(cmd)].spdifout.u32A_param &= ~CODEC_VERB_16BIT_DATA; 752 pState->pNodes[CODEC_NID(cmd)].spdifout.u32A_param |= cmd & CODEC_VERB_16BIT_DATA; 753 } 724 codecSetRegisterU16(&pState->pNodes[CODEC_NID(cmd)].spdifout.u32A_param, cmd, 0); 754 725 else if (STAC9220_IS_SPDIFIN_CMD(cmd)) 755 { 756 pState->pNodes[CODEC_NID(cmd)].spdifin.u32A_param &= ~CODEC_VERB_16BIT_DATA; 757 pState->pNodes[CODEC_NID(cmd)].spdifin.u32A_param |= cmd & CODEC_VERB_16BIT_DATA; 758 } 726 codecSetRegisterU16(&pState->pNodes[CODEC_NID(cmd)].spdifin.u32A_param, cmd, 0); 759 727 return VINF_SUCCESS; 760 728 } … … 801 769 Assert((pu32Reg)); 802 770 if (pu32Reg) 803 { 804 *pu32Reg &= ~CODEC_VERB_8BIT_DATA; 805 *pu32Reg |= cmd & CODEC_VERB_8BIT_DATA; 806 } 771 codecSetRegisterU8(pu32Reg, cmd, 0); 807 772 return VINF_SUCCESS; 808 773 } … … 840 805 Assert((pu32Reg)); 841 806 if (pu32Reg) 842 { 843 *pu32Reg &= ~CODEC_VERB_8BIT_DATA; 844 *pu32Reg |= cmd & CODEC_VERB_8BIT_DATA; 845 } 807 codecSetRegisterU8(pu32Reg, cmd, 0); 846 808 return VINF_SUCCESS; 847 809 } … … 868 830 return VINF_SUCCESS; 869 831 } 870 static int codecSetConfigX(struct CODECState *pState, uint32_t cmd, uint 32_t mask)832 static int codecSetConfigX(struct CODECState *pState, uint32_t cmd, uint8_t u8Offset) 871 833 { 872 834 Assert((CODEC_CAD(cmd) == pState->id)); … … 888 850 Assert((pu32Reg)); 889 851 if (pu32Reg) 890 { 891 *pu32Reg &= ~mask; 892 *pu32Reg |= cmd & mask; 893 } 852 codecSetRegisterU8(pu32Reg, cmd, u8Offset); 894 853 return VINF_SUCCESS; 895 854 } … … 897 856 static int codecSetConfig0 (struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 898 857 { 899 uint32_t mask = CODEC_VERB_8BIT_DATA; 900 *pResp = 0; 901 return codecSetConfigX(pState, cmd, mask); 858 *pResp = 0; 859 return codecSetConfigX(pState, cmd, 0); 902 860 } 903 861 /* 71D */ 904 862 static int codecSetConfig1 (struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 905 863 { 906 uint32_t mask = CODEC_VERB_8BIT_DATA << 8; 907 *pResp = 0; 908 return codecSetConfigX(pState, cmd, mask); 864 *pResp = 0; 865 return codecSetConfigX(pState, cmd, 8); 909 866 } 910 867 /* 71E */ 911 868 static int codecSetConfig2 (struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 912 869 { 913 uint32_t mask = CODEC_VERB_8BIT_DATA << 16; 914 *pResp = 0; 915 return codecSetConfigX(pState, cmd, mask); 870 *pResp = 0; 871 return codecSetConfigX(pState, cmd, 16); 916 872 } 917 873 /* 71E */ 918 874 static int codecSetConfig3 (struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 919 875 { 920 uint32_t mask = CODEC_VERB_8BIT_DATA << 24; 921 *pResp = 0; 922 return codecSetConfigX(pState, cmd, mask); 876 *pResp = 0; 877 return codecSetConfigX(pState, cmd, 24); 923 878 } 924 879
Note:
See TracChangeset
for help on using the changeset viewer.