Changeset 44667 in vbox
- Timestamp:
- Feb 13, 2013 2:30:33 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 83760
- Location:
- trunk/src/VBox/Devices/Audio
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DevCodec.cpp
r44639 r44667 2 2 /** @file 3 3 * DevCodec - VBox ICH Intel HD Audio Codec. 4 * 5 * Implemented against "Intel I/O Controller Hub 6 (ICH6) High Definition 6 * Audio / AC '97 - Programmer's Reference Manual (PRM)", document number 7 * 302349-003. 4 8 */ 5 9 6 10 /* 7 * Copyright (C) 2006-201 2Oracle Corporation11 * Copyright (C) 2006-2013 Oracle Corporation 8 12 * 9 13 * This file is part of VirtualBox Open Source Edition (OSE), as … … 39 43 * Structures and Typedefs * 40 44 *******************************************************************************/ 41 #define CODECNODE_F0_PARAM_LENGTH 0x14 42 #define CODECNODE_F02_PARAM_LENGTH 16 43 45 /** The F00 parameter length (in dwords). */ 46 #define CODECNODE_F00_PARAM_LENGTH 20 47 /** The F02 parameter length (in dwords). */ 48 #define CODECNODE_F02_PARAM_LENGTH 16 49 50 /** 51 * Common (or core) codec node structure. 52 */ 44 53 typedef struct CODECCOMMONNODE 45 54 { 46 uint8_t id; /* 7 - bit format */ 55 /** Node id - 7 bit format */ 56 uint8_t id; 47 57 /** The node name. */ 48 char const *pszName;49 /* RPM 5.3.6 */50 uint32_t au32F00_param[CODECNODE_F0 _PARAM_LENGTH];58 char const *pszName; 59 /* PRM 5.3.6 */ 60 uint32_t au32F00_param[CODECNODE_F00_PARAM_LENGTH]; 51 61 uint32_t au32F02_param[CODECNODE_F02_PARAM_LENGTH]; 52 } CODECCOMMONNODE, *PCODECCOMMONNODE; 53 AssertCompile(CODECNODE_F0_PARAM_LENGTH == 20); /* saved state */ 62 } CODECCOMMONNODE; 63 typedef CODECCOMMONNODE *PCODECCOMMONNODE; 64 AssertCompile(CODECNODE_F00_PARAM_LENGTH == 20); /* saved state */ 54 65 AssertCompile(CODECNODE_F02_PARAM_LENGTH == 16); /* saved state */ 55 66 67 /** 68 * Compile time assertion on the expected node size. 69 */ 56 70 #define AssertNodeSize(a_Node, a_cParams) \ 57 71 AssertCompile((a_cParams) <= (60 + 6)); /* the max size - saved state */ \ 58 AssertCompile(sizeof(a_Node) - sizeof(CODECCOMMONNODE) == (((a_cParams) * sizeof(uint32_t) + sizeof(void *) - 1) & ~(sizeof(void *) - 1))) 72 AssertCompile( sizeof(a_Node) - sizeof(CODECCOMMONNODE) \ 73 == (((a_cParams) * sizeof(uint32_t) + sizeof(void *) - 1) & ~(sizeof(void *) - 1)) ) 59 74 60 75 typedef struct ROOTCODECNODE … … 267 282 *******************************************************************************/ 268 283 /* STAC9220 - Referenced thru STAC9220WIDGET in the constructor below. */ 269 static uint8_t const g_abStac9220Ports[] = { 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0};270 static uint8_t const g_abStac9220Dacs[] = { 0x2, 0x3, 0x4, 0x5, 0};271 static uint8_t const g_abStac9220Adcs[] = { 0x6, 0x7, 0};272 static uint8_t const g_abStac9220SpdifOuts[] = { 0x8, 0 };273 static uint8_t const g_abStac9220SpdifIns[] = { 0x9, 0 };284 static uint8_t const g_abStac9220Ports[] = { 0x0A, 0xB, 0xC, 0xD, 0xE, 0xF, 0}; 285 static uint8_t const g_abStac9220Dacs[] = { 0x02, 0x3, 0x4, 0x5, 0}; 286 static uint8_t const g_abStac9220Adcs[] = { 0x06, 0x7, 0}; 287 static uint8_t const g_abStac9220SpdifOuts[] = { 0x08, 0 }; 288 static uint8_t const g_abStac9220SpdifIns[] = { 0x09, 0 }; 274 289 static uint8_t const g_abStac9220DigOutPins[] = { 0x10, 0 }; 275 static uint8_t const g_abStac9220DigInPins[] = { 0x11, 0 };276 static uint8_t const g_abStac9220AdcVols[] = { 0x17, 0x18, 0};277 static uint8_t const g_abStac9220AdcMuxs[] = { 0x12, 0x13, 0};278 static uint8_t const g_abStac9220Pcbeeps[] = { 0x14, 0 };279 static uint8_t const g_abStac9220Cds[] = { 0x15, 0 };280 static uint8_t const g_abStac9220VolKnobs[] = { 0x16, 0 };281 static uint8_t const g_abStac9220Reserveds[] = { 0x9, 0x19, 0x1a, 0x1b, 0 };290 static uint8_t const g_abStac9220DigInPins[] = { 0x11, 0 }; 291 static uint8_t const g_abStac9220AdcVols[] = { 0x17, 0x18, 0}; 292 static uint8_t const g_abStac9220AdcMuxs[] = { 0x12, 0x13, 0}; 293 static uint8_t const g_abStac9220Pcbeeps[] = { 0x14, 0 }; 294 static uint8_t const g_abStac9220Cds[] = { 0x15, 0 }; 295 static uint8_t const g_abStac9220VolKnobs[] = { 0x16, 0 }; 296 static uint8_t const g_abStac9220Reserveds[] = { 0x09, 0x19, 0x1a, 0x1b, 0 }; 282 297 283 298 … … 309 324 * Internal Functions * 310 325 *******************************************************************************/ 311 static int stac9220ResetNode( struct CODECState *pState, uint8_t nodenum, PCODECNODE pNode);312 313 314 315 static int stac9220Construct( CODECState *pState)326 static int stac9220ResetNode(PHDACODEC pState, uint8_t nodenum, PCODECNODE pNode); 327 328 329 330 static int stac9220Construct(PHDACODEC pState) 316 331 { 317 332 unconst(pState->cTotalNodes) = 0x1C; … … 344 359 } 345 360 346 static int stac9220ResetNode( struct CODECState *pState, uint8_t nodenum, PCODECNODE pNode)361 static int stac9220ResetNode(PHDACODEC pState, uint8_t nodenum, PCODECNODE pNode) 347 362 { 348 363 pNode->node.id = nodenum; … … 352 367 /* Root Node*/ 353 368 case 0: 354 pNode->node.au32F00_param[ 2] = CODEC_MAKE_F00_02(0x1, 0x0, 0x34, 0x1); /* rev id */369 pNode->node.au32F00_param[0x02] = CODEC_MAKE_F00_02(0x1, 0x0, 0x34, 0x1); /* rev id */ 355 370 break; 356 371 case 1: 357 pNode->node.au32F00_param[ 8] = CODEC_MAKE_F00_08(1, 0xd, 0xd);358 pNode->node.au32F00_param[0x C] =CODEC_MAKE_F00_0C(0x17)359 360 361 362 363 364 pNode->node.au32F00_param[0x B] = CODEC_F00_0B_PCM;365 pNode->node.au32F00_param[0x D] = CODEC_MAKE_F00_0D(1, 0x5, 0xE, 0);//RT_BIT(31)|(0x5 << 16)|(0xE)<<8;372 pNode->node.au32F00_param[0x08] = CODEC_MAKE_F00_08(1, 0xd, 0xd); 373 pNode->node.au32F00_param[0x0C] = CODEC_MAKE_F00_0C(0x17) 374 | CODEC_F00_0C_CAP_BALANCED_IO 375 | CODEC_F00_0C_CAP_INPUT 376 | CODEC_F00_0C_CAP_PRESENSE_DETECT 377 | CODEC_F00_0C_CAP_TRIGGER_REQUIRED 378 | CODEC_F00_0C_CAP_IMPENDANCE_SENSE;//(17 << 8)|RT_BIT(6)|RT_BIT(5)|RT_BIT(2)|RT_BIT(1)|RT_BIT(0); 379 pNode->node.au32F00_param[0x0B] = CODEC_F00_0B_PCM; 380 pNode->node.au32F00_param[0x0D] = CODEC_MAKE_F00_0D(1, 0x5, 0xE, 0);//RT_BIT(31)|(0x5 << 16)|(0xE)<<8; 366 381 pNode->node.au32F00_param[0x12] = RT_BIT(31)|(0x2 << 16)|(0x7f << 8)|0x7f; 367 382 pNode->node.au32F00_param[0x11] = CODEC_MAKE_F00_11(1, 1, 0, 0, 4);//0xc0000004; 368 pNode->node.au32F00_param[0x F] = CODEC_F00_0F_D3|CODEC_F00_0F_D2|CODEC_F00_0F_D1|CODEC_F00_0F_D0;383 pNode->node.au32F00_param[0x0F] = CODEC_F00_0F_D3|CODEC_F00_0F_D2|CODEC_F00_0F_D1|CODEC_F00_0F_D0; 369 384 pNode->afg.u32F05_param = CODEC_MAKE_F05(0, 0, 0, CODEC_F05_D2, CODEC_F05_D2);//0x2 << 4| 0x2; /* PS-Act: D3, PS->Set D3 */ 370 385 pNode->afg.u32F08_param = 0; … … 381 396 AMPLIFIER_REGISTER(pNode->dac.B_params, AMPLIFIER_OUT, AMPLIFIER_RIGHT, 0) = 0x7F | RT_BIT(7); 382 397 383 pNode->dac.node.au32F00_param[9] = 384 385 386 387 398 pNode->dac.node.au32F00_param[9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_AUDIO_OUTPUT, 0xD, 0) 399 | CODEC_F00_09_CAP_L_R_SWAP 400 | CODEC_F00_09_CAP_POWER_CTRL 401 | CODEC_F00_09_CAP_OUT_AMP_PRESENT 402 | CODEC_F00_09_CAP_LSB;//(0xD << 16) | RT_BIT(11) | RT_BIT(10) | RT_BIT(2) | RT_BIT(0); 388 403 pNode->dac.u32F0c_param = 0; 389 404 pNode->dac.u32F05_param = CODEC_MAKE_F05(0, 0, 0, CODEC_F05_D3, CODEC_F05_D3);//0x3 << 4 | 0x3; /* PS-Act: D3, Set: D3 */ 390 break;405 break; 391 406 case 6: 392 407 pNode->node.au32F02_param[0] = 0x17; … … 400 415 pNode->adc.u32F05_param = CODEC_MAKE_F05(0, 0, 0, CODEC_F05_D3, CODEC_F05_D3);//0x3 << 4 | 0x3; /* PS-Act: D3 Set: D3 */ 401 416 pNode->adc.u32F06_param = 0; 402 pNode->adc.node.au32F00_param[9] = 403 404 405 406 417 pNode->adc.node.au32F00_param[9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_AUDIO_INPUT, 0xD, 0) 418 | CODEC_F00_09_CAP_POWER_CTRL 419 | CODEC_F00_09_CAP_CONNECTION_LIST 420 | CODEC_F00_09_CAP_PROC_WIDGET 421 | CODEC_F00_09_CAP_LSB;//RT_BIT(20)| (0xd << 16) | RT_BIT(10) | RT_BIT(8) | RT_BIT(6)| RT_BIT(0); 407 422 break; 408 423 case 8: 409 424 pNode->spdifout.u32A_param = CODEC_MAKE_A(0, 1, CODEC_A_MULT_1X, CODEC_A_DIV_1X, CODEC_A_16_BIT, 1);//(1<<14)|(0x1<<4) | 0x1; 410 pNode->spdifout.node.au32F00_param[9] = 411 412 413 425 pNode->spdifout.node.au32F00_param[9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_AUDIO_OUTPUT, 0x4, 0) 426 | CODEC_F00_09_CAP_DIGITAL 427 | CODEC_F00_09_CAP_FMT_OVERRIDE 428 | CODEC_F00_09_CAP_LSB;//(4 << 16) | RT_BIT(9)|RT_BIT(4)|0x1; 414 429 pNode->node.au32F00_param[0xa] = pState->paNodes[1].node.au32F00_param[0xA]; 415 430 pNode->spdifout.node.au32F00_param[0xB] = CODEC_F00_0B_PCM; 416 431 pNode->spdifout.u32F06_param = 0; 417 432 pNode->spdifout.u32F0d_param = 0; 418 break;433 break; 419 434 case 9: 420 435 pNode->spdifin.u32A_param = CODEC_MAKE_A(0, 1, CODEC_A_MULT_1X, CODEC_A_DIV_1X, CODEC_A_16_BIT, 1);//(0x1<<4) | 0x1; 421 pNode->spdifin.node.au32F00_param[9] = 422 423 424 425 436 pNode->spdifin.node.au32F00_param[9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_AUDIO_INPUT, 0x4, 0) 437 | CODEC_F00_09_CAP_DIGITAL 438 | CODEC_F00_09_CAP_CONNECTION_LIST 439 | CODEC_F00_09_CAP_FMT_OVERRIDE 440 | CODEC_F00_09_CAP_LSB;//(0x1 << 20)|(4 << 16) | RT_BIT(9)| RT_BIT(8)|RT_BIT(4)|0x1; 426 441 pNode->node.au32F00_param[0xA] = pState->paNodes[1].node.au32F00_param[0xA]; 427 442 pNode->node.au32F00_param[0xE] = CODEC_MAKE_F00_0E(0, 1);//RT_BIT(0); … … 430 445 pNode->spdifin.u32F06_param = 0; 431 446 pNode->spdifin.u32F0d_param = 0; 432 break;447 break; 433 448 case 0xA: 434 pNode->node.au32F00_param[0xC] = 435 436 437 438 439 440 449 pNode->node.au32F00_param[0xC] = CODEC_MAKE_F00_0C(0x17) 450 | CODEC_F00_0C_CAP_INPUT 451 | CODEC_F00_0C_CAP_OUTPUT 452 | CODEC_F00_0C_CAP_HP 453 | CODEC_F00_0C_CAP_PRESENSE_DETECT 454 | CODEC_F00_0C_CAP_TRIGGER_REQUIRED 455 | CODEC_F00_0C_CAP_IMPENDANCE_SENSE;//0x173f; 441 456 pNode->node.au32F02_param[0] = 0x2; 442 pNode->port.u32F07_param = 443 457 pNode->port.u32F07_param = CODEC_F07_IN_ENABLE 458 | CODEC_F07_OUT_ENABLE; 444 459 pNode->port.u32F08_param = 0; 445 460 if (!pState->fInReset) … … 453 468 goto port_init; 454 469 case 0xB: 455 pNode->node.au32F00_param[0xC] = 456 457 458 459 460 470 pNode->node.au32F00_param[0xC] = CODEC_MAKE_F00_0C(0x17) 471 | CODEC_F00_0C_CAP_INPUT 472 | CODEC_F00_0C_CAP_OUTPUT 473 | CODEC_F00_0C_CAP_PRESENSE_DETECT 474 | CODEC_F00_0C_CAP_TRIGGER_REQUIRED 475 | CODEC_F00_0C_CAP_IMPENDANCE_SENSE;//0x1737; 461 476 pNode->node.au32F02_param[0] = 0x4; 462 477 pNode->port.u32F07_param = CODEC_F07_IN_ENABLE; … … 472 487 case 0xC: 473 488 pNode->node.au32F02_param[0] = 0x3; 474 pNode->node.au32F00_param[0xC] = 475 476 477 478 479 489 pNode->node.au32F00_param[0xC] = CODEC_MAKE_F00_0C(0x17) 490 | CODEC_F00_0C_CAP_INPUT 491 | CODEC_F00_0C_CAP_OUTPUT 492 | CODEC_F00_0C_CAP_PRESENSE_DETECT 493 | CODEC_F00_0C_CAP_TRIGGER_REQUIRED 494 | CODEC_F00_0C_CAP_IMPENDANCE_SENSE;//0x1737; 480 495 pNode->port.u32F07_param = CODEC_F07_IN_ENABLE; 481 496 if (!pState->fInReset) … … 488 503 goto port_init; 489 504 case 0xD: 490 pNode->node.au32F00_param[0xC] = 491 492 493 494 495 505 pNode->node.au32F00_param[0xC] = CODEC_MAKE_F00_0C(0x17) 506 | CODEC_F00_0C_CAP_INPUT 507 | CODEC_F00_0C_CAP_OUTPUT 508 | CODEC_F00_0C_CAP_PRESENSE_DETECT 509 | CODEC_F00_0C_CAP_TRIGGER_REQUIRED 510 | CODEC_F00_0C_CAP_IMPENDANCE_SENSE;//0x1737; 496 511 pNode->port.u32F07_param = CODEC_F07_IN_ENABLE; 497 512 pNode->node.au32F02_param[0] = 0x2; … … 506 521 pNode->port.u32F09_param = CODEC_MAKE_F09_ANALOG(1, CODEC_F09_ANALOG_NA);//RT_BIT(31)|0x7fffffff; 507 522 pNode->port.u32F08_param = 0; 508 pNode->node.au32F00_param[9] = 509 510 511 523 pNode->node.au32F00_param[9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_PIN_COMPLEX, 0x0, 0) 524 | CODEC_F00_09_CAP_CONNECTION_LIST 525 | CODEC_F00_09_CAP_UNSOL 526 | CODEC_F00_09_CAP_LSB;//(4 << 20)|RT_BIT(8)|RT_BIT(7)|RT_BIT(0); 512 527 pNode->node.au32F00_param[0xE] = CODEC_MAKE_F00_0E(0, 1);//0x1; 513 break;528 break; 514 529 case 0xE: 515 pNode->node.au32F00_param[9] = 516 517 530 pNode->node.au32F00_param[9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_PIN_COMPLEX, 0x0, 0) 531 | CODEC_F00_09_CAP_UNSOL 532 | CODEC_F00_09_CAP_LSB;//(4 << 20)|RT_BIT(7)|RT_BIT(0); 518 533 pNode->port.u32F08_param = 0; 519 pNode->node.au32F00_param[0xC] = 520 521 534 pNode->node.au32F00_param[0xC] = CODEC_F00_0C_CAP_INPUT 535 | CODEC_F00_0C_CAP_OUTPUT 536 | CODEC_F00_0C_CAP_PRESENSE_DETECT;//0x34; 522 537 pNode->port.u32F07_param = CODEC_F07_IN_ENABLE; 523 538 pNode->port.u32F09_param = CODEC_MAKE_F09_ANALOG(0, CODEC_F09_ANALOG_NA);//0x7fffffff; … … 531 546 break; 532 547 case 0xF: 533 pNode->node.au32F00_param[9] = 534 535 536 537 538 pNode->node.au32F00_param[0xC] = 539 540 541 542 548 pNode->node.au32F00_param[9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_PIN_COMPLEX, 0x0, 0x0) 549 | CODEC_F00_09_CAP_CONNECTION_LIST 550 | CODEC_F00_09_CAP_UNSOL 551 | CODEC_F00_09_CAP_OUT_AMP_PRESENT 552 | CODEC_F00_09_CAP_LSB;//(4 << 20)|RT_BIT(8)|RT_BIT(7)|RT_BIT(2)|RT_BIT(0); 553 pNode->node.au32F00_param[0xC] = CODEC_F00_0C_CAP_INPUT 554 | CODEC_F00_0C_CAP_OUTPUT 555 | CODEC_F00_0C_CAP_PRESENSE_DETECT 556 /* | CODEC_F00_0C_CAP_TRIGGER_REQUIRED 557 | CODEC_F00_0C_CAP_IMPENDANCE_SENSE */;//0x37; 543 558 pNode->node.au32F00_param[0xE] = CODEC_MAKE_F00_0E(0, 1);//0x1; 544 559 pNode->port.u32F08_param = 0; 545 pNode->port.u32F07_param = 546 560 pNode->port.u32F07_param = CODEC_F07_OUT_ENABLE 561 | CODEC_F07_IN_ENABLE; 547 562 if (!pState->fInReset) 548 563 pNode->port.u32F1c_param = CODEC_MAKE_F1C(CODEC_F1C_PORT_COMPLEX, … … 554 569 pNode->node.au32F02_param[0] = 0x5; 555 570 pNode->port.u32F09_param = CODEC_MAKE_F09_ANALOG(0, CODEC_F09_ANALOG_NA);//0x7fffffff; 556 break;571 break; 557 572 case 0x10: 558 573 pNode->node.au32F00_param[9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_PIN_COMPLEX, 0x0, 0x0) 559 560 561 574 | CODEC_F00_09_CAP_DIGITAL 575 | CODEC_F00_09_CAP_CONNECTION_LIST 576 | CODEC_F00_09_CAP_LSB;//(4<<20)|RT_BIT(9)|RT_BIT(8)|RT_BIT(0); 562 577 pNode->node.au32F00_param[0xC] = CODEC_F00_0C_CAP_OUTPUT;//RT_BIT(4); 563 578 pNode->node.au32F00_param[0xE] = CODEC_MAKE_F00_0E(0, 0x3); … … 570 585 CODEC_F1C_COLOR_BLACK, 571 586 0x0, 0x3, 0x0);//RT_MAKE_U32_FROM_U8(0x30, 0x10, 0x45, 0x01); 572 break;587 break; 573 588 case 0x11: 574 pNode->node.au32F00_param[9] = (4 << 20) |(3<<16)|RT_BIT(10)|RT_BIT(9)|RT_BIT(7)|RT_BIT(0);575 pNode->node.au32F00_param[0xC] = 576 577 589 pNode->node.au32F00_param[9] = (4 << 20) | (3 << 16) | RT_BIT(10) | RT_BIT(9) | RT_BIT(7) | RT_BIT(0); 590 pNode->node.au32F00_param[0xC] = CODEC_F00_0C_CAP_EAPD 591 | CODEC_F00_0C_CAP_INPUT 592 | CODEC_F00_0C_CAP_PRESENSE_DETECT;//RT_BIT(16)| RT_BIT(5)|RT_BIT(2); 578 593 pNode->digin.u32F05_param = CODEC_MAKE_F05(0, 0, 0, CODEC_F05_D3, CODEC_F05_D3);//0x3 << 4 | 0x3; /* PS-Act: D3 -> D3 */ 579 594 pNode->digin.u32F07_param = 0; … … 588 603 CODEC_F1C_COLOR_BLACK, 589 604 0x0, 0x6, 0x0);//(0x1 << 24) | (0xc5 << 16) | (0x10 << 8) | 0x60; 590 break;605 break; 591 606 case 0x12: 592 607 pNode->adcmux.u32F01_param = 0; … … 595 610 pNode->adcmux.u32F01_param = 1; 596 611 adcmux_init: 597 pNode->node.au32F00_param[9] = 598 599 600 601 612 pNode->node.au32F00_param[9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_AUDIO_SELECTOR, 0x0, 0) 613 | CODEC_F00_09_CAP_CONNECTION_LIST 614 | CODEC_F00_09_CAP_AMP_FMT_OVERRIDE 615 | CODEC_F00_09_CAP_OUT_AMP_PRESENT 616 | CODEC_F00_09_CAP_LSB;//(3<<20)|RT_BIT(8)|RT_BIT(3)|RT_BIT(2)|RT_BIT(0); 602 617 pNode->node.au32F00_param[0xe] = CODEC_MAKE_F00_0E(0, 0x7); 603 618 pNode->node.au32F00_param[0x12] = (0x27 << 16)|(0x4 << 8); … … 606 621 pNode->node.au32F02_param[0] = RT_MAKE_U32_FROM_U8(0xe, 0x15, 0xf, 0xb); 607 622 pNode->node.au32F02_param[4] = RT_MAKE_U32_FROM_U8(0xc, 0xd, 0xa, 0x0); 608 break;623 break; 609 624 case 0x14: 610 pNode->node.au32F00_param[9] = 611 612 625 pNode->node.au32F00_param[9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_BEEP_GEN, 0, 0) 626 | CODEC_F00_09_CAP_AMP_FMT_OVERRIDE 627 | CODEC_F00_09_CAP_OUT_AMP_PRESENT;//(7 << 20) | RT_BIT(3) | RT_BIT(2); 613 628 pNode->node.au32F00_param[0x12] = (0x17 << 16)|(0x3 << 8)| 0x3; 614 629 pNode->pcbeep.u32F0a_param = 0; 615 630 memset(pNode->pcbeep.B_params, 0, AMPLIFIER_SIZE); 616 break;631 break; 617 632 case 0x15: 618 pNode->node.au32F00_param[0x9] = 619 633 pNode->node.au32F00_param[0x9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_PIN_COMPLEX, 0, 0) 634 | CODEC_F00_09_CAP_LSB;//(4 << 20)|RT_BIT(0); 620 635 pNode->node.au32F00_param[0xc] = CODEC_F00_0C_CAP_INPUT;//RT_BIT(5); 621 636 if (!pState->fInReset) … … 626 641 CODEC_F1C_COLOR_UNKNOWN, 627 642 0x0, 0x7, 0x0);//RT_MAKE_U32_FROM_U8(0x70, 0x0, 0x33, 0x90); 628 break;643 break; 629 644 case 0x16: 630 645 pNode->node.au32F00_param[0x9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_VOLUME_KNOB, 0x0, 0x0);//(0x6 << 20); … … 634 649 pNode->volumeKnob.u32F08_param = 0; 635 650 pNode->volumeKnob.u32F0f_param = 0x7f; 636 break;651 break; 637 652 case 0x17: 638 653 pNode->node.au32F02_param[0] = 0x12; … … 643 658 memset(pNode->adcvol.B_params, 0, AMPLIFIER_SIZE); 644 659 645 pNode->node.au32F00_param[0x9] = 646 647 648 649 660 pNode->node.au32F00_param[0x9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_AUDIO_SELECTOR, 0, 0) 661 | CODEC_F00_09_CAP_L_R_SWAP 662 | CODEC_F00_09_CAP_CONNECTION_LIST 663 | CODEC_F00_09_CAP_IN_AMP_PRESENT 664 | CODEC_F00_09_CAP_LSB;//(0x3 << 20)|RT_BIT(11)|RT_BIT(8)|RT_BIT(1)|RT_BIT(0); 650 665 pNode->node.au32F00_param[0xe] = CODEC_MAKE_F00_0E(0, 0x1); 651 666 AMPLIFIER_REGISTER(pNode->adcvol.B_params, AMPLIFIER_IN, AMPLIFIER_LEFT, 0) = RT_BIT(7); … … 654 669 break; 655 670 case 0x19: 656 pNode->node.au32F00_param[0x9] = 657 658 671 pNode->node.au32F00_param[0x9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_VENDOR_DEFINED, 0x3, 0) 672 | CODEC_F00_09_CAP_DIGITAL 673 | CODEC_F00_09_CAP_LSB;//(0xF << 20)|(0x3 << 16)|RT_BIT(9)|RT_BIT(0); 659 674 break; 660 675 case 0x1A: 661 pNode->node.au32F00_param[0x9] = 662 663 676 pNode->node.au32F00_param[0x9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_AUDIO_OUTPUT, 0x3, 0) 677 | CODEC_F00_09_CAP_DIGITAL 678 | CODEC_F00_09_CAP_LSB;//(0x3 << 16)|RT_BIT(9)|RT_BIT(0); 664 679 break; 665 680 case 0x1B: 666 pNode->node.au32F00_param[0x9] = 667 668 669 681 pNode->node.au32F00_param[0x9] = CODEC_MAKE_F00_09(CODEC_F00_09_TYPE_PIN_COMPLEX, 0, 0) 682 | CODEC_F00_09_CAP_DIGITAL 683 | CODEC_F00_09_CAP_CONNECTION_LIST 684 | CODEC_F00_09_CAP_LSB;//(0x4 << 20)|RT_BIT(9)|RT_BIT(8)|RT_BIT(0); 670 685 pNode->node.au32F00_param[0xE] = CODEC_MAKE_F00_0E(0, 0x1); 671 686 pNode->node.au32F00_param[0xC] = CODEC_F00_0C_CAP_OUTPUT;//0x10; … … 687 702 688 703 #define DECLISNODEOFTYPE(type) \ 689 static inline int codecIs##type##Node(struct CODECState *pState, uint8_t cNode)\704 DECLINLINE(int) hdaCodecIs##type##Node(PHDACODEC pState, uint8_t cNode) \ 690 705 { \ 691 706 Assert(pState->au8##type##s); \ 692 for (int i = 0; pState->au8##type##s[i] != 0; ++i)\707 for (int i = 0; pState->au8##type##s[i] != 0; ++i) \ 693 708 if (pState->au8##type##s[i] == cNode) \ 694 709 return 1; \ 695 710 return 0; \ 696 711 } 697 /* codecIsPortNode */712 /* hdaCodecIsPortNode */ 698 713 DECLISNODEOFTYPE(Port) 699 /* codecIsDacNode */714 /* hdaCodecIsDacNode */ 700 715 DECLISNODEOFTYPE(Dac) 701 /* codecIsAdcVolNode */716 /* hdaCodecIsAdcVolNode */ 702 717 DECLISNODEOFTYPE(AdcVol) 703 /* codecIsAdcNode */718 /* hdaCodecIsAdcNode */ 704 719 DECLISNODEOFTYPE(Adc) 705 /* codecIsAdcMuxNode */720 /* hdaCodecIsAdcMuxNode */ 706 721 DECLISNODEOFTYPE(AdcMux) 707 /* codecIsPcbeepNode */722 /* hdaCodecIsPcbeepNode */ 708 723 DECLISNODEOFTYPE(Pcbeep) 709 /* codecIsSpdifOutNode */724 /* hdaCodecIsSpdifOutNode */ 710 725 DECLISNODEOFTYPE(SpdifOut) 711 /* codecIsSpdifInNode */726 /* hdaCodecIsSpdifInNode */ 712 727 DECLISNODEOFTYPE(SpdifIn) 713 /* codecIsDigInPinNode */728 /* hdaCodecIsDigInPinNode */ 714 729 DECLISNODEOFTYPE(DigInPin) 715 /* codecIsDigOutPinNode */730 /* hdaCodecIsDigOutPinNode */ 716 731 DECLISNODEOFTYPE(DigOutPin) 717 /* codecIsCdNode */732 /* hdaCodecIsCdNode */ 718 733 DECLISNODEOFTYPE(Cd) 719 /* codecIsVolKnobNode */734 /* hdaCodecIsVolKnobNode */ 720 735 DECLISNODEOFTYPE(VolKnob) 721 /* codecIsReservedNode */736 /* hdaCodecIsReservedNode */ 722 737 DECLISNODEOFTYPE(Reserved) 723 738 724 static int codecToAudVolume(AMPLIFIER *pAmp, audmixerctl_t mt); 725 726 static inline void codecSetRegister(uint32_t *pu32Reg, uint32_t u32Cmd, uint8_t u8Offset, uint32_t mask) 727 { 728 Assert((pu32Reg && u8Offset < 32)); 729 *pu32Reg &= ~(mask << u8Offset); 730 *pu32Reg |= (u32Cmd & mask) << u8Offset; 731 } 732 static inline void codecSetRegisterU8(uint32_t *pu32Reg, uint32_t u32Cmd, uint8_t u8Offset) 733 { 734 codecSetRegister(pu32Reg, u32Cmd, u8Offset, CODEC_VERB_8BIT_DATA); 735 } 736 737 static inline void codecSetRegisterU16(uint32_t *pu32Reg, uint32_t u32Cmd, uint8_t u8Offset) 738 { 739 codecSetRegister(pu32Reg, u32Cmd, u8Offset, CODEC_VERB_16BIT_DATA); 740 } 741 742 743 static int codecUnimplemented(struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 744 { 745 Log(("codecUnimplemented: cmd(raw:%x: cad:%x, d:%c, nid:%x, verb:%x)\n", cmd, 739 static int hdaCodecToAudVolume(AMPLIFIER *pAmp, audmixerctl_t mt); 740 741 DECLINLINE(void) hdaCodecSetRegister(uint32_t *pu32Reg, uint32_t u32Cmd, uint8_t u8Offset, uint32_t mask) 742 { 743 Assert((pu32Reg && u8Offset < 32)); 744 *pu32Reg &= ~(mask << u8Offset); 745 *pu32Reg |= (u32Cmd & mask) << u8Offset; 746 } 747 DECLINLINE(void) hdaCodecSetRegisterU8(uint32_t *pu32Reg, uint32_t u32Cmd, uint8_t u8Offset) 748 { 749 hdaCodecSetRegister(pu32Reg, u32Cmd, u8Offset, CODEC_VERB_8BIT_DATA); 750 } 751 752 DECLINLINE(void) hdaCodecSetRegisterU16(uint32_t *pu32Reg, uint32_t u32Cmd, uint8_t u8Offset) 753 { 754 hdaCodecSetRegister(pu32Reg, u32Cmd, u8Offset, CODEC_VERB_16BIT_DATA); 755 } 756 757 758 /* 759 * Verb processor functions. 760 */ 761 762 static DECLCALLBACK(int) vrbProcUnimplemented(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 763 { 764 Log(("vrbProcUnimplemented: cmd(raw:%x: cad:%x, d:%c, nid:%x, verb:%x)\n", cmd, 746 765 CODEC_CAD(cmd), CODEC_DIRECT(cmd) ? 'N' : 'Y', CODEC_NID(cmd), CODEC_VERBDATA(cmd))); 747 766 *pResp = 0; … … 749 768 } 750 769 751 static int codecBreak(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)770 static DECLCALLBACK(int) vrbProcBreak(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 752 771 { 753 772 int rc; 754 rc = codecUnimplemented(pState, cmd, pResp);773 rc = vrbProcUnimplemented(pState, cmd, pResp); 755 774 *pResp |= CODEC_RESPONSE_UNSOLICITED; 756 775 return rc; 757 776 } 777 758 778 /* B-- */ 759 static int codecGetAmplifier(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)760 { 761 Assert((CODEC_CAD(cmd) == pState->id)); 762 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 763 if (CODEC_NID(cmd) >= pState->cTotalNodes) 764 { 765 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));779 static DECLCALLBACK(int) vrbProcGetAmplifier(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 780 { 781 Assert((CODEC_CAD(cmd) == pState->id)); 782 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 783 if (CODEC_NID(cmd) >= pState->cTotalNodes) 784 { 785 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 766 786 return VINF_SUCCESS; 767 787 } … … 772 792 773 793 PCODECNODE pNode = &pState->paNodes[CODEC_NID(cmd)]; 774 if ( codecIsDacNode(pState, CODEC_NID(cmd)))794 if (hdaCodecIsDacNode(pState, CODEC_NID(cmd))) 775 795 *pResp = AMPLIFIER_REGISTER(pNode->dac.B_params, 776 796 CODEC_GET_AMP_DIRECTION(cmd), 777 797 CODEC_GET_AMP_SIDE(cmd), 778 798 u8Index); 779 else if ( codecIsAdcVolNode(pState, CODEC_NID(cmd)))799 else if (hdaCodecIsAdcVolNode(pState, CODEC_NID(cmd))) 780 800 *pResp = AMPLIFIER_REGISTER(pNode->adcvol.B_params, 781 801 CODEC_GET_AMP_DIRECTION(cmd), 782 802 CODEC_GET_AMP_SIDE(cmd), 783 803 u8Index); 784 else if ( codecIsAdcMuxNode(pState, CODEC_NID(cmd)))804 else if (hdaCodecIsAdcMuxNode(pState, CODEC_NID(cmd))) 785 805 *pResp = AMPLIFIER_REGISTER(pNode->adcmux.B_params, 786 806 CODEC_GET_AMP_DIRECTION(cmd), 787 807 CODEC_GET_AMP_SIDE(cmd), 788 808 u8Index); 789 else if ( codecIsPcbeepNode(pState, CODEC_NID(cmd)))809 else if (hdaCodecIsPcbeepNode(pState, CODEC_NID(cmd))) 790 810 *pResp = AMPLIFIER_REGISTER(pNode->pcbeep.B_params, 791 811 CODEC_GET_AMP_DIRECTION(cmd), 792 812 CODEC_GET_AMP_SIDE(cmd), 793 813 u8Index); 794 else if ( codecIsPortNode(pState, CODEC_NID(cmd)))814 else if (hdaCodecIsPortNode(pState, CODEC_NID(cmd))) 795 815 *pResp = AMPLIFIER_REGISTER(pNode->port.B_params, 796 816 CODEC_GET_AMP_DIRECTION(cmd), 797 817 CODEC_GET_AMP_SIDE(cmd), 798 818 u8Index); 799 else if ( codecIsAdcNode(pState, CODEC_NID(cmd)))819 else if (hdaCodecIsAdcNode(pState, CODEC_NID(cmd))) 800 820 *pResp = AMPLIFIER_REGISTER(pNode->adc.B_params, 801 821 CODEC_GET_AMP_DIRECTION(cmd), … … 807 827 return VINF_SUCCESS; 808 828 } 829 809 830 /* 3-- */ 810 static int codecSetAmplifier(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)831 static DECLCALLBACK(int) vrbProcSetAmplifier(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 811 832 { 812 833 AMPLIFIER *pAmplifier = NULL; … … 819 840 if (CODEC_NID(cmd) >= pState->cTotalNodes) 820 841 { 821 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));842 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 822 843 return VINF_SUCCESS; 823 844 } 824 845 *pResp = 0; 825 846 PCODECNODE pNode = &pState->paNodes[CODEC_NID(cmd)]; 826 if ( codecIsDacNode(pState, CODEC_NID(cmd)))847 if (hdaCodecIsDacNode(pState, CODEC_NID(cmd))) 827 848 pAmplifier = &pNode->dac.B_params; 828 else if ( codecIsAdcVolNode(pState, CODEC_NID(cmd)))849 else if (hdaCodecIsAdcVolNode(pState, CODEC_NID(cmd))) 829 850 pAmplifier = &pNode->adcvol.B_params; 830 else if ( codecIsAdcMuxNode(pState, CODEC_NID(cmd)))851 else if (hdaCodecIsAdcMuxNode(pState, CODEC_NID(cmd))) 831 852 pAmplifier = &pNode->adcmux.B_params; 832 else if ( codecIsPcbeepNode(pState, CODEC_NID(cmd)))853 else if (hdaCodecIsPcbeepNode(pState, CODEC_NID(cmd))) 833 854 pAmplifier = &pNode->pcbeep.B_params; 834 else if ( codecIsPortNode(pState, CODEC_NID(cmd)))855 else if (hdaCodecIsPortNode(pState, CODEC_NID(cmd))) 835 856 pAmplifier = &pNode->port.B_params; 836 else if ( codecIsAdcNode(pState, CODEC_NID(cmd)))857 else if (hdaCodecIsAdcNode(pState, CODEC_NID(cmd))) 837 858 pAmplifier = &pNode->adc.B_params; 838 859 Assert(pAmplifier); … … 850 871 { 851 872 if (fIsLeft) 852 codecSetRegisterU8(&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_IN, AMPLIFIER_LEFT, u8Index), cmd, 0);873 hdaCodecSetRegisterU8(&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_IN, AMPLIFIER_LEFT, u8Index), cmd, 0); 853 874 if (fIsRight) 854 codecSetRegisterU8(&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_IN, AMPLIFIER_RIGHT, u8Index), cmd, 0);875 hdaCodecSetRegisterU8(&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_IN, AMPLIFIER_RIGHT, u8Index), cmd, 0); 855 876 } 856 877 if (fIsOut) 857 878 { 858 879 if (fIsLeft) 859 codecSetRegisterU8(&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_OUT, AMPLIFIER_LEFT, u8Index), cmd, 0);880 hdaCodecSetRegisterU8(&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_OUT, AMPLIFIER_LEFT, u8Index), cmd, 0); 860 881 if (fIsRight) 861 codecSetRegisterU8(&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_OUT, AMPLIFIER_RIGHT, u8Index), cmd, 0);882 hdaCodecSetRegisterU8(&LIFIER_REGISTER(*pAmplifier, AMPLIFIER_OUT, AMPLIFIER_RIGHT, u8Index), cmd, 0); 862 883 } 863 884 if (CODEC_NID(cmd) == pState->u8DacLineOut) 864 codecToAudVolume(pAmplifier, AUD_MIXER_VOLUME);885 hdaCodecToAudVolume(pAmplifier, AUD_MIXER_VOLUME); 865 886 if (CODEC_NID(cmd) == pState->u8AdcVolsLineIn) /* Microphone */ 866 codecToAudVolume(pAmplifier, AUD_MIXER_LINE_IN);867 } 868 return VINF_SUCCESS; 869 } 870 871 static int codecGetParameter(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)872 { 873 Assert( (CODEC_CAD(cmd) == pState->id));874 if (CODEC_NID(cmd) >= pState->cTotalNodes) 875 { 876 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));877 return VINF_SUCCESS; 878 } 879 Assert(( (cmd & CODEC_VERB_8BIT_DATA) < CODECNODE_F0_PARAM_LENGTH));880 if ((cmd & CODEC_VERB_8BIT_DATA) >= CODECNODE_F0 _PARAM_LENGTH)881 { 882 Log(("H DAcodec: invalid F00 parameter %d\n", (cmd & CODEC_VERB_8BIT_DATA)));887 hdaCodecToAudVolume(pAmplifier, AUD_MIXER_LINE_IN); 888 } 889 return VINF_SUCCESS; 890 } 891 892 static DECLCALLBACK(int) vrbProcGetParameter(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 893 { 894 Assert(CODEC_CAD(cmd) == pState->id); 895 if (CODEC_NID(cmd) >= pState->cTotalNodes) 896 { 897 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 898 return VINF_SUCCESS; 899 } 900 Assert((cmd & CODEC_VERB_8BIT_DATA) < CODECNODE_F00_PARAM_LENGTH); 901 if ((cmd & CODEC_VERB_8BIT_DATA) >= CODECNODE_F00_PARAM_LENGTH) 902 { 903 Log(("HdaCodec: invalid F00 parameter %d\n", (cmd & CODEC_VERB_8BIT_DATA))); 883 904 return VINF_SUCCESS; 884 905 } … … 889 910 890 911 /* F01 */ 891 static int codecGetConSelectCtrl(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)892 { 893 Assert( (CODEC_CAD(cmd) == pState->id));894 Assert( (CODEC_NID(cmd) < pState->cTotalNodes));895 if (CODEC_NID(cmd) >= pState->cTotalNodes) 896 { 897 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));898 return VINF_SUCCESS; 899 } 900 *pResp = 0; 901 if ( codecIsAdcMuxNode(pState, CODEC_NID(cmd)))912 static DECLCALLBACK(int) vrbProcGetConSelectCtrl(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 913 { 914 Assert(CODEC_CAD(cmd) == pState->id); 915 Assert(CODEC_NID(cmd) < pState->cTotalNodes); 916 if (CODEC_NID(cmd) >= pState->cTotalNodes) 917 { 918 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 919 return VINF_SUCCESS; 920 } 921 *pResp = 0; 922 if (hdaCodecIsAdcMuxNode(pState, CODEC_NID(cmd))) 902 923 *pResp = pState->paNodes[CODEC_NID(cmd)].adcmux.u32F01_param; 903 else if ( codecIsDigOutPinNode(pState, CODEC_NID(cmd)))924 else if (hdaCodecIsDigOutPinNode(pState, CODEC_NID(cmd))) 904 925 *pResp = pState->paNodes[CODEC_NID(cmd)].digout.u32F01_param; 905 else if ( codecIsPortNode(pState, CODEC_NID(cmd)))926 else if (hdaCodecIsPortNode(pState, CODEC_NID(cmd))) 906 927 *pResp = pState->paNodes[CODEC_NID(cmd)].port.u32F01_param; 907 else if ( codecIsAdcNode(pState, CODEC_NID(cmd)))928 else if (hdaCodecIsAdcNode(pState, CODEC_NID(cmd))) 908 929 *pResp = pState->paNodes[CODEC_NID(cmd)].adc.u32F01_param; 909 else if ( codecIsAdcVolNode(pState, CODEC_NID(cmd)))930 else if (hdaCodecIsAdcVolNode(pState, CODEC_NID(cmd))) 910 931 *pResp = pState->paNodes[CODEC_NID(cmd)].adcvol.u32F01_param; 911 932 return VINF_SUCCESS; … … 913 934 914 935 /* 701 */ 915 static int codecSetConSelectCtrl(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)936 static DECLCALLBACK(int) vrbProcSetConSelectCtrl(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 916 937 { 917 938 uint32_t *pu32Reg = NULL; … … 919 940 if (CODEC_NID(cmd) >= pState->cTotalNodes) 920 941 { 921 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));922 return VINF_SUCCESS; 923 } 924 *pResp = 0; 925 if ( codecIsAdcMuxNode(pState, CODEC_NID(cmd)))942 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 943 return VINF_SUCCESS; 944 } 945 *pResp = 0; 946 if (hdaCodecIsAdcMuxNode(pState, CODEC_NID(cmd))) 926 947 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].adcmux.u32F01_param; 927 else if ( codecIsDigOutPinNode(pState, CODEC_NID(cmd)))948 else if (hdaCodecIsDigOutPinNode(pState, CODEC_NID(cmd))) 928 949 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].digout.u32F01_param; 929 else if ( codecIsPortNode(pState, CODEC_NID(cmd)))950 else if (hdaCodecIsPortNode(pState, CODEC_NID(cmd))) 930 951 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].port.u32F01_param; 931 else if ( codecIsAdcNode(pState, CODEC_NID(cmd)))952 else if (hdaCodecIsAdcNode(pState, CODEC_NID(cmd))) 932 953 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].adc.u32F01_param; 933 else if ( codecIsAdcVolNode(pState, CODEC_NID(cmd)))954 else if (hdaCodecIsAdcVolNode(pState, CODEC_NID(cmd))) 934 955 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].adcvol.u32F01_param; 935 956 Assert((pu32Reg)); 936 957 if (pu32Reg) 937 codecSetRegisterU8(pu32Reg, cmd, 0);958 hdaCodecSetRegisterU8(pu32Reg, cmd, 0); 938 959 return VINF_SUCCESS; 939 960 } 940 961 941 962 /* F07 */ 942 static int codecGetPinCtrl(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)943 { 944 Assert((CODEC_CAD(cmd) == pState->id)); 945 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 946 if (CODEC_NID(cmd) >= pState->cTotalNodes) 947 { 948 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));949 return VINF_SUCCESS; 950 } 951 *pResp = 0; 952 if ( codecIsPortNode(pState, CODEC_NID(cmd)))963 static DECLCALLBACK(int) vrbProcGetPinCtrl(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 964 { 965 Assert((CODEC_CAD(cmd) == pState->id)); 966 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 967 if (CODEC_NID(cmd) >= pState->cTotalNodes) 968 { 969 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 970 return VINF_SUCCESS; 971 } 972 *pResp = 0; 973 if (hdaCodecIsPortNode(pState, CODEC_NID(cmd))) 953 974 *pResp = pState->paNodes[CODEC_NID(cmd)].port.u32F07_param; 954 else if ( codecIsDigOutPinNode(pState, CODEC_NID(cmd)))975 else if (hdaCodecIsDigOutPinNode(pState, CODEC_NID(cmd))) 955 976 *pResp = pState->paNodes[CODEC_NID(cmd)].digout.u32F07_param; 956 else if ( codecIsDigInPinNode(pState, CODEC_NID(cmd)))977 else if (hdaCodecIsDigInPinNode(pState, CODEC_NID(cmd))) 957 978 *pResp = pState->paNodes[CODEC_NID(cmd)].digin.u32F07_param; 958 else if ( codecIsCdNode(pState, CODEC_NID(cmd)))979 else if (hdaCodecIsCdNode(pState, CODEC_NID(cmd))) 959 980 *pResp = pState->paNodes[CODEC_NID(cmd)].cdnode.u32F07_param; 960 else if ( codecIsPcbeepNode(pState, CODEC_NID(cmd)))981 else if (hdaCodecIsPcbeepNode(pState, CODEC_NID(cmd))) 961 982 *pResp = pState->paNodes[CODEC_NID(cmd)].pcbeep.u32F07_param; 962 else if ( codecIsReservedNode(pState, CODEC_NID(cmd)))983 else if (hdaCodecIsReservedNode(pState, CODEC_NID(cmd))) 963 984 *pResp = pState->paNodes[CODEC_NID(cmd)].reserved.u32F07_param; 964 985 else … … 968 989 969 990 /* 707 */ 970 static int codecSetPinCtrl(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)971 { 972 Assert((CODEC_CAD(cmd) == pState->id)); 973 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 974 if (CODEC_NID(cmd) >= pState->cTotalNodes) 975 { 976 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));991 static DECLCALLBACK(int) vrbProcSetPinCtrl(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 992 { 993 Assert((CODEC_CAD(cmd) == pState->id)); 994 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 995 if (CODEC_NID(cmd) >= pState->cTotalNodes) 996 { 997 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 977 998 return VINF_SUCCESS; 978 999 } 979 1000 *pResp = 0; 980 1001 uint32_t *pu32Reg = NULL; 981 if ( codecIsPortNode(pState, CODEC_NID(cmd)))1002 if (hdaCodecIsPortNode(pState, CODEC_NID(cmd))) 982 1003 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].port.u32F07_param; 983 else if ( codecIsDigInPinNode(pState, CODEC_NID(cmd)))1004 else if (hdaCodecIsDigInPinNode(pState, CODEC_NID(cmd))) 984 1005 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].digin.u32F07_param; 985 else if ( codecIsDigOutPinNode(pState, CODEC_NID(cmd)))1006 else if (hdaCodecIsDigOutPinNode(pState, CODEC_NID(cmd))) 986 1007 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].digout.u32F07_param; 987 else if ( codecIsCdNode(pState, CODEC_NID(cmd)))1008 else if (hdaCodecIsCdNode(pState, CODEC_NID(cmd))) 988 1009 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].cdnode.u32F07_param; 989 else if ( codecIsPcbeepNode(pState, CODEC_NID(cmd)))1010 else if (hdaCodecIsPcbeepNode(pState, CODEC_NID(cmd))) 990 1011 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].pcbeep.u32F07_param; 991 else if ( codecIsReservedNode(pState, CODEC_NID(cmd))1012 else if ( hdaCodecIsReservedNode(pState, CODEC_NID(cmd)) 992 1013 && CODEC_NID(cmd) == 0x1b) 993 1014 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].reserved.u32F07_param; 994 1015 Assert((pu32Reg)); 995 1016 if (pu32Reg) 996 codecSetRegisterU8(pu32Reg, cmd, 0);1017 hdaCodecSetRegisterU8(pu32Reg, cmd, 0); 997 1018 return VINF_SUCCESS; 998 1019 } 999 1020 1000 1021 /* F08 */ 1001 static int codecGetUnsolicitedEnabled(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1002 { 1003 Assert((CODEC_CAD(cmd) == pState->id)); 1004 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1005 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1006 { 1007 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1008 return VINF_SUCCESS; 1009 } 1010 *pResp = 0; 1011 if ( codecIsPortNode(pState, CODEC_NID(cmd)))1022 static DECLCALLBACK(int) vrbProcGetUnsolicitedEnabled(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1023 { 1024 Assert((CODEC_CAD(cmd) == pState->id)); 1025 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1026 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1027 { 1028 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1029 return VINF_SUCCESS; 1030 } 1031 *pResp = 0; 1032 if (hdaCodecIsPortNode(pState, CODEC_NID(cmd))) 1012 1033 *pResp = pState->paNodes[CODEC_NID(cmd)].port.u32F08_param; 1013 else if ( codecIsDigInPinNode(pState, CODEC_NID(cmd)))1034 else if (hdaCodecIsDigInPinNode(pState, CODEC_NID(cmd))) 1014 1035 *pResp = pState->paNodes[CODEC_NID(cmd)].digin.u32F08_param; 1015 1036 else if ((cmd) == 1 /* AFG */) 1016 1037 *pResp = pState->paNodes[CODEC_NID(cmd)].afg.u32F08_param; 1017 else if ( codecIsVolKnobNode(pState, CODEC_NID(cmd)))1038 else if (hdaCodecIsVolKnobNode(pState, CODEC_NID(cmd))) 1018 1039 *pResp = pState->paNodes[CODEC_NID(cmd)].volumeKnob.u32F08_param; 1019 else if ( codecIsDigOutPinNode(pState, CODEC_NID(cmd)))1040 else if (hdaCodecIsDigOutPinNode(pState, CODEC_NID(cmd))) 1020 1041 *pResp = pState->paNodes[CODEC_NID(cmd)].digout.u32F08_param; 1021 else if ( codecIsDigInPinNode(pState, CODEC_NID(cmd)))1042 else if (hdaCodecIsDigInPinNode(pState, CODEC_NID(cmd))) 1022 1043 *pResp = pState->paNodes[CODEC_NID(cmd)].digin.u32F08_param; 1023 1044 else … … 1027 1048 1028 1049 /* 708 */ 1029 static int codecSetUnsolicitedEnabled(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1030 { 1031 Assert((CODEC_CAD(cmd) == pState->id)); 1032 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1033 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1034 { 1035 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1050 static DECLCALLBACK(int) vrbProcSetUnsolicitedEnabled(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1051 { 1052 Assert((CODEC_CAD(cmd) == pState->id)); 1053 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1054 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1055 { 1056 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1036 1057 return VINF_SUCCESS; 1037 1058 } 1038 1059 *pResp = 0; 1039 1060 uint32_t *pu32Reg = NULL; 1040 if ( codecIsPortNode(pState, CODEC_NID(cmd)))1061 if (hdaCodecIsPortNode(pState, CODEC_NID(cmd))) 1041 1062 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].port.u32F08_param; 1042 else if ( codecIsDigInPinNode(pState, CODEC_NID(cmd)))1063 else if (hdaCodecIsDigInPinNode(pState, CODEC_NID(cmd))) 1043 1064 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].digin.u32F08_param; 1044 1065 else if (CODEC_NID(cmd) == 1 /* AFG */) 1045 1066 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].afg.u32F08_param; 1046 else if ( codecIsVolKnobNode(pState, CODEC_NID(cmd)))1067 else if (hdaCodecIsVolKnobNode(pState, CODEC_NID(cmd))) 1047 1068 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].volumeKnob.u32F08_param; 1048 else if ( codecIsDigInPinNode(pState, CODEC_NID(cmd)))1069 else if (hdaCodecIsDigInPinNode(pState, CODEC_NID(cmd))) 1049 1070 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].digin.u32F08_param; 1050 else if ( codecIsDigOutPinNode(pState, CODEC_NID(cmd)))1071 else if (hdaCodecIsDigOutPinNode(pState, CODEC_NID(cmd))) 1051 1072 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].digout.u32F08_param; 1052 1073 else … … 1054 1075 Assert(pu32Reg); 1055 1076 if(pu32Reg) 1056 codecSetRegisterU8(pu32Reg, cmd, 0);1077 hdaCodecSetRegisterU8(pu32Reg, cmd, 0); 1057 1078 return VINF_SUCCESS; 1058 1079 } 1059 1080 1060 1081 /* F09 */ 1061 static int codecGetPinSense(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1062 { 1063 Assert((CODEC_CAD(cmd) == pState->id)); 1064 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1065 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1066 { 1067 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1068 return VINF_SUCCESS; 1069 } 1070 *pResp = 0; 1071 if ( codecIsPortNode(pState, CODEC_NID(cmd)))1082 static DECLCALLBACK(int) vrbProcGetPinSense(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1083 { 1084 Assert((CODEC_CAD(cmd) == pState->id)); 1085 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1086 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1087 { 1088 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1089 return VINF_SUCCESS; 1090 } 1091 *pResp = 0; 1092 if (hdaCodecIsPortNode(pState, CODEC_NID(cmd))) 1072 1093 *pResp = pState->paNodes[CODEC_NID(cmd)].port.u32F09_param; 1073 else if ( codecIsDigInPinNode(pState, CODEC_NID(cmd)))1094 else if (hdaCodecIsDigInPinNode(pState, CODEC_NID(cmd))) 1074 1095 *pResp = pState->paNodes[CODEC_NID(cmd)].digin.u32F09_param; 1075 1096 else … … 1079 1100 1080 1101 /* 709 */ 1081 static int codecSetPinSense(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1082 { 1083 Assert((CODEC_CAD(cmd) == pState->id)); 1084 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1085 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1086 { 1087 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1102 static DECLCALLBACK(int) vrbProcSetPinSense(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1103 { 1104 Assert((CODEC_CAD(cmd) == pState->id)); 1105 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1106 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1107 { 1108 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1088 1109 return VINF_SUCCESS; 1089 1110 } 1090 1111 *pResp = 0; 1091 1112 uint32_t *pu32Reg = NULL; 1092 if ( codecIsPortNode(pState, CODEC_NID(cmd)))1113 if (hdaCodecIsPortNode(pState, CODEC_NID(cmd))) 1093 1114 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].port.u32F09_param; 1094 else if ( codecIsDigInPinNode(pState, CODEC_NID(cmd)))1115 else if (hdaCodecIsDigInPinNode(pState, CODEC_NID(cmd))) 1095 1116 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].digin.u32F09_param; 1096 1117 Assert(pu32Reg); 1097 1118 if(pu32Reg) 1098 codecSetRegisterU8(pu32Reg, cmd, 0);1099 return VINF_SUCCESS; 1100 } 1101 1102 static int codecGetConnectionListEntry(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1103 { 1104 Assert((CODEC_CAD(cmd) == pState->id)); 1105 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1106 *pResp = 0; 1107 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1108 { 1109 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1119 hdaCodecSetRegisterU8(pu32Reg, cmd, 0); 1120 return VINF_SUCCESS; 1121 } 1122 1123 static DECLCALLBACK(int) vrbProcGetConnectionListEntry(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1124 { 1125 Assert((CODEC_CAD(cmd) == pState->id)); 1126 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1127 *pResp = 0; 1128 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1129 { 1130 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1110 1131 return VINF_SUCCESS; 1111 1132 } … … 1113 1134 if ((cmd & CODEC_VERB_8BIT_DATA) >= CODECNODE_F02_PARAM_LENGTH) 1114 1135 { 1115 Log(("H DAcodec: access to invalid F02 index %d\n", (cmd & CODEC_VERB_8BIT_DATA)));1136 Log(("HdaCodec: access to invalid F02 index %d\n", (cmd & CODEC_VERB_8BIT_DATA))); 1116 1137 return VINF_SUCCESS; 1117 1138 } … … 1119 1140 return VINF_SUCCESS; 1120 1141 } 1142 1121 1143 /* F03 */ 1122 static int codecGetProcessingState(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1123 { 1124 Assert((CODEC_CAD(cmd) == pState->id)); 1125 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1126 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1127 { 1128 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1129 return VINF_SUCCESS; 1130 } 1131 *pResp = 0; 1132 if ( codecIsAdcNode(pState, CODEC_NID(cmd)))1144 static DECLCALLBACK(int) vrbProcGetProcessingState(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1145 { 1146 Assert((CODEC_CAD(cmd) == pState->id)); 1147 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1148 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1149 { 1150 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1151 return VINF_SUCCESS; 1152 } 1153 *pResp = 0; 1154 if (hdaCodecIsAdcNode(pState, CODEC_NID(cmd))) 1133 1155 *pResp = pState->paNodes[CODEC_NID(cmd)].adc.u32F03_param; 1134 1156 return VINF_SUCCESS; … … 1136 1158 1137 1159 /* 703 */ 1138 static int codecSetProcessingState(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1139 { 1140 Assert((CODEC_CAD(cmd) == pState->id)); 1141 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1142 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1143 { 1144 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1145 return VINF_SUCCESS; 1146 } 1147 *pResp = 0; 1148 if ( codecIsAdcNode(pState, CODEC_NID(cmd)))1149 { 1150 codecSetRegisterU8(&pState->paNodes[CODEC_NID(cmd)].adc.u32F03_param, cmd, 0);1160 static DECLCALLBACK(int) vrbProcSetProcessingState(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1161 { 1162 Assert((CODEC_CAD(cmd) == pState->id)); 1163 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1164 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1165 { 1166 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1167 return VINF_SUCCESS; 1168 } 1169 *pResp = 0; 1170 if (hdaCodecIsAdcNode(pState, CODEC_NID(cmd))) 1171 { 1172 hdaCodecSetRegisterU8(&pState->paNodes[CODEC_NID(cmd)].adc.u32F03_param, cmd, 0); 1151 1173 } 1152 1174 return VINF_SUCCESS; … … 1154 1176 1155 1177 /* F0D */ 1156 static int codecGetDigitalConverter(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1157 { 1158 Assert((CODEC_CAD(cmd) == pState->id)); 1159 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1160 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1161 { 1162 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1163 return VINF_SUCCESS; 1164 } 1165 *pResp = 0; 1166 if ( codecIsSpdifOutNode(pState, CODEC_NID(cmd)))1178 static DECLCALLBACK(int) vrbProcGetDigitalConverter(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1179 { 1180 Assert((CODEC_CAD(cmd) == pState->id)); 1181 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1182 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1183 { 1184 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1185 return VINF_SUCCESS; 1186 } 1187 *pResp = 0; 1188 if (hdaCodecIsSpdifOutNode(pState, CODEC_NID(cmd))) 1167 1189 *pResp = pState->paNodes[CODEC_NID(cmd)].spdifout.u32F0d_param; 1168 else if ( codecIsSpdifInNode(pState, CODEC_NID(cmd)))1190 else if (hdaCodecIsSpdifInNode(pState, CODEC_NID(cmd))) 1169 1191 *pResp = pState->paNodes[CODEC_NID(cmd)].spdifin.u32F0d_param; 1170 1192 return VINF_SUCCESS; 1171 1193 } 1172 1194 1173 static int codecSetDigitalConverter( struct CODECState *pState, uint32_t cmd, uint8_t u8Offset, uint64_t *pResp)1174 { 1175 Assert((CODEC_CAD(cmd) == pState->id)); 1176 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1177 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1178 { 1179 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1180 return VINF_SUCCESS; 1181 } 1182 *pResp = 0; 1183 if ( codecIsSpdifOutNode(pState, CODEC_NID(cmd)))1184 codecSetRegisterU8(&pState->paNodes[CODEC_NID(cmd)].spdifout.u32F0d_param, cmd, u8Offset);1185 else if ( codecIsSpdifInNode(pState, CODEC_NID(cmd)))1186 codecSetRegisterU8(&pState->paNodes[CODEC_NID(cmd)].spdifin.u32F0d_param, cmd, u8Offset);1195 static int codecSetDigitalConverter(PHDACODEC pState, uint32_t cmd, uint8_t u8Offset, uint64_t *pResp) 1196 { 1197 Assert((CODEC_CAD(cmd) == pState->id)); 1198 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1199 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1200 { 1201 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1202 return VINF_SUCCESS; 1203 } 1204 *pResp = 0; 1205 if (hdaCodecIsSpdifOutNode(pState, CODEC_NID(cmd))) 1206 hdaCodecSetRegisterU8(&pState->paNodes[CODEC_NID(cmd)].spdifout.u32F0d_param, cmd, u8Offset); 1207 else if (hdaCodecIsSpdifInNode(pState, CODEC_NID(cmd))) 1208 hdaCodecSetRegisterU8(&pState->paNodes[CODEC_NID(cmd)].spdifin.u32F0d_param, cmd, u8Offset); 1187 1209 return VINF_SUCCESS; 1188 1210 } 1189 1211 1190 1212 /* 70D */ 1191 static int codecSetDigitalConverter1(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1213 static DECLCALLBACK(int) vrbProcSetDigitalConverter1(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1192 1214 { 1193 1215 return codecSetDigitalConverter(pState, cmd, 0, pResp); … … 1195 1217 1196 1218 /* 70E */ 1197 static int codecSetDigitalConverter2(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1219 static DECLCALLBACK(int) vrbProcSetDigitalConverter2(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1198 1220 { 1199 1221 return codecSetDigitalConverter(pState, cmd, 8, pResp); … … 1201 1223 1202 1224 /* F20 */ 1203 static int codecGetSubId(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1204 { 1205 Assert((CODEC_CAD(cmd) == pState->id)); 1206 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1207 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1208 { 1209 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1225 static DECLCALLBACK(int) vrbProcGetSubId(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1226 { 1227 Assert((CODEC_CAD(cmd) == pState->id)); 1228 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1229 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1230 { 1231 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1210 1232 return VINF_SUCCESS; 1211 1233 } … … 1218 1240 } 1219 1241 1220 static int codecSetSubIdX( struct CODECState *pState, uint32_t cmd, uint8_t u8Offset)1221 { 1222 Assert((CODEC_CAD(cmd) == pState->id)); 1223 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1224 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1225 { 1226 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1242 static int codecSetSubIdX(PHDACODEC pState, uint32_t cmd, uint8_t u8Offset) 1243 { 1244 Assert((CODEC_CAD(cmd) == pState->id)); 1245 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1246 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1247 { 1248 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1227 1249 return VINF_SUCCESS; 1228 1250 } … … 1232 1254 Assert((pu32Reg)); 1233 1255 if (pu32Reg) 1234 codecSetRegisterU8(pu32Reg, cmd, u8Offset); 1235 return VINF_SUCCESS; 1236 } 1256 hdaCodecSetRegisterU8(pu32Reg, cmd, u8Offset); 1257 return VINF_SUCCESS; 1258 } 1259 1237 1260 /* 720 */ 1238 static int codecSetSubId0 (struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1261 static DECLCALLBACK(int) vrbProcSetSubId0(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1239 1262 { 1240 1263 *pResp = 0; … … 1243 1266 1244 1267 /* 721 */ 1245 static int codecSetSubId1 (struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1268 static DECLCALLBACK(int) vrbProcSetSubId1(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1246 1269 { 1247 1270 *pResp = 0; 1248 1271 return codecSetSubIdX(pState, cmd, 8); 1249 1272 } 1273 1250 1274 /* 722 */ 1251 static int codecSetSubId2 (struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1275 static DECLCALLBACK(int) vrbProcSetSubId2(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1252 1276 { 1253 1277 *pResp = 0; 1254 1278 return codecSetSubIdX(pState, cmd, 16); 1255 1279 } 1280 1256 1281 /* 723 */ 1257 static int codecSetSubId3 (struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1282 static DECLCALLBACK(int) vrbProcSetSubId3(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1258 1283 { 1259 1284 *pResp = 0; … … 1261 1286 } 1262 1287 1263 static int codecReset(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1288 static DECLCALLBACK(int) vrbProcReset(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1264 1289 { 1265 1290 Assert((CODEC_CAD(cmd) == pState->id)); … … 1269 1294 { 1270 1295 uint8_t i; 1271 Log(("H DAcodec: enters reset\n"));1296 Log(("HdaCodec: enters reset\n")); 1272 1297 Assert(pState->pfnCodecNodeReset); 1273 1298 for (i = 0; i < pState->cTotalNodes; ++i) … … 1276 1301 } 1277 1302 pState->fInReset = false; 1278 Log(("H DAcodec: exits reset\n"));1303 Log(("HdaCodec: exits reset\n")); 1279 1304 } 1280 1305 *pResp = 0; … … 1283 1308 1284 1309 /* F05 */ 1285 static int codecGetPowerState(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1286 { 1287 Assert((CODEC_CAD(cmd) == pState->id)); 1288 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1289 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1290 { 1291 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1310 static DECLCALLBACK(int) vrbProcGetPowerState(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1311 { 1312 Assert((CODEC_CAD(cmd) == pState->id)); 1313 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1314 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1315 { 1316 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1292 1317 return VINF_SUCCESS; 1293 1318 } … … 1295 1320 if (CODEC_NID(cmd) == 1 /* AFG */) 1296 1321 *pResp = pState->paNodes[CODEC_NID(cmd)].afg.u32F05_param; 1297 else if ( codecIsDacNode(pState, CODEC_NID(cmd)))1322 else if (hdaCodecIsDacNode(pState, CODEC_NID(cmd))) 1298 1323 *pResp = pState->paNodes[CODEC_NID(cmd)].dac.u32F05_param; 1299 else if ( codecIsDigInPinNode(pState, CODEC_NID(cmd)))1324 else if (hdaCodecIsDigInPinNode(pState, CODEC_NID(cmd))) 1300 1325 *pResp = pState->paNodes[CODEC_NID(cmd)].digin.u32F05_param; 1301 else if ( codecIsAdcNode(pState, CODEC_NID(cmd)))1326 else if (hdaCodecIsAdcNode(pState, CODEC_NID(cmd))) 1302 1327 *pResp = pState->paNodes[CODEC_NID(cmd)].adc.u32F05_param; 1303 else if ( codecIsSpdifOutNode(pState, CODEC_NID(cmd)))1328 else if (hdaCodecIsSpdifOutNode(pState, CODEC_NID(cmd))) 1304 1329 *pResp = pState->paNodes[CODEC_NID(cmd)].spdifout.u32F05_param; 1305 else if ( codecIsSpdifInNode(pState, CODEC_NID(cmd)))1330 else if (hdaCodecIsSpdifInNode(pState, CODEC_NID(cmd))) 1306 1331 *pResp = pState->paNodes[CODEC_NID(cmd)].spdifin.u32F05_param; 1307 else if ( codecIsReservedNode(pState, CODEC_NID(cmd)))1332 else if (hdaCodecIsReservedNode(pState, CODEC_NID(cmd))) 1308 1333 *pResp = pState->paNodes[CODEC_NID(cmd)].reserved.u32F05_param; 1309 1334 return VINF_SUCCESS; … … 1312 1337 /* 705 */ 1313 1338 1314 static inline voidcodecPropogatePowerState(uint32_t *pu32F05_param)1339 DECLINLINE(void) codecPropogatePowerState(uint32_t *pu32F05_param) 1315 1340 { 1316 1341 Assert(pu32F05_param); … … 1323 1348 } 1324 1349 1325 static int codecSetPowerState(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1326 { 1327 Assert((CODEC_CAD(cmd) == pState->id)); 1328 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1329 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1330 { 1331 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1350 static DECLCALLBACK(int) vrbProcSetPowerState(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1351 { 1352 Assert((CODEC_CAD(cmd) == pState->id)); 1353 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1354 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1355 { 1356 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1332 1357 return VINF_SUCCESS; 1333 1358 } … … 1336 1361 if (CODEC_NID(cmd) == 1 /* AFG */) 1337 1362 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].afg.u32F05_param; 1338 else if ( codecIsDacNode(pState, CODEC_NID(cmd)))1363 else if (hdaCodecIsDacNode(pState, CODEC_NID(cmd))) 1339 1364 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].dac.u32F05_param; 1340 else if ( codecIsDigInPinNode(pState, CODEC_NID(cmd)))1365 else if (hdaCodecIsDigInPinNode(pState, CODEC_NID(cmd))) 1341 1366 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].digin.u32F05_param; 1342 else if ( codecIsAdcNode(pState, CODEC_NID(cmd)))1367 else if (hdaCodecIsAdcNode(pState, CODEC_NID(cmd))) 1343 1368 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].adc.u32F05_param; 1344 else if ( codecIsSpdifOutNode(pState, CODEC_NID(cmd)))1369 else if (hdaCodecIsSpdifOutNode(pState, CODEC_NID(cmd))) 1345 1370 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].spdifout.u32F05_param; 1346 else if ( codecIsSpdifInNode(pState, CODEC_NID(cmd)))1371 else if (hdaCodecIsSpdifInNode(pState, CODEC_NID(cmd))) 1347 1372 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].spdifin.u32F05_param; 1348 else if ( codecIsReservedNode(pState, CODEC_NID(cmd)))1373 else if (hdaCodecIsReservedNode(pState, CODEC_NID(cmd))) 1349 1374 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].reserved.u32F05_param; 1350 1375 Assert((pu32Reg)); … … 1390 1415 } 1391 1416 1392 static int codecGetStreamId(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1393 { 1394 Assert((CODEC_CAD(cmd) == pState->id)); 1395 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1396 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1397 { 1398 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1399 return VINF_SUCCESS; 1400 } 1401 *pResp = 0; 1402 if ( codecIsDacNode(pState, CODEC_NID(cmd)))1417 static DECLCALLBACK(int) vrbProcGetStreamId(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1418 { 1419 Assert((CODEC_CAD(cmd) == pState->id)); 1420 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1421 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1422 { 1423 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1424 return VINF_SUCCESS; 1425 } 1426 *pResp = 0; 1427 if (hdaCodecIsDacNode(pState, CODEC_NID(cmd))) 1403 1428 *pResp = pState->paNodes[CODEC_NID(cmd)].dac.u32F06_param; 1404 else if ( codecIsAdcNode(pState, CODEC_NID(cmd)))1429 else if (hdaCodecIsAdcNode(pState, CODEC_NID(cmd))) 1405 1430 *pResp = pState->paNodes[CODEC_NID(cmd)].adc.u32F06_param; 1406 else if ( codecIsSpdifInNode(pState, CODEC_NID(cmd)))1431 else if (hdaCodecIsSpdifInNode(pState, CODEC_NID(cmd))) 1407 1432 *pResp = pState->paNodes[CODEC_NID(cmd)].spdifin.u32F06_param; 1408 else if ( codecIsSpdifOutNode(pState, CODEC_NID(cmd)))1433 else if (hdaCodecIsSpdifOutNode(pState, CODEC_NID(cmd))) 1409 1434 *pResp = pState->paNodes[CODEC_NID(cmd)].spdifout.u32F06_param; 1410 1435 else if (CODEC_NID(cmd) == 0x1A) … … 1412 1437 return VINF_SUCCESS; 1413 1438 } 1414 static int codecSetStreamId(struct CODECState *pState, uint32_t cmd, uint64_t *pResp) 1415 { 1416 Assert((CODEC_CAD(cmd) == pState->id)); 1417 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1418 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1419 { 1420 Log(("HDAcodec: invalid node address %d\n", CODEC_NID(cmd))); 1439 1440 static DECLCALLBACK(int) vrbProcSetStreamId(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1441 { 1442 Assert((CODEC_CAD(cmd) == pState->id)); 1443 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1444 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1445 { 1446 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1421 1447 return VINF_SUCCESS; 1422 1448 } … … 1424 1450 uint32_t *pu32addr = NULL; 1425 1451 *pResp = 0; 1426 if ( codecIsDacNode(pState, CODEC_NID(cmd)))1452 if (hdaCodecIsDacNode(pState, CODEC_NID(cmd))) 1427 1453 pu32addr = &pState->paNodes[CODEC_NID(cmd)].dac.u32F06_param; 1428 else if ( codecIsAdcNode(pState, CODEC_NID(cmd)))1454 else if (hdaCodecIsAdcNode(pState, CODEC_NID(cmd))) 1429 1455 pu32addr = &pState->paNodes[CODEC_NID(cmd)].adc.u32F06_param; 1430 else if ( codecIsSpdifOutNode(pState, CODEC_NID(cmd)))1456 else if (hdaCodecIsSpdifOutNode(pState, CODEC_NID(cmd))) 1431 1457 pu32addr = &pState->paNodes[CODEC_NID(cmd)].spdifout.u32F06_param; 1432 else if ( codecIsSpdifInNode(pState, CODEC_NID(cmd)))1458 else if (hdaCodecIsSpdifInNode(pState, CODEC_NID(cmd))) 1433 1459 pu32addr = &pState->paNodes[CODEC_NID(cmd)].spdifin.u32F06_param; 1434 else if ( codecIsReservedNode(pState, CODEC_NID(cmd)))1460 else if (hdaCodecIsReservedNode(pState, CODEC_NID(cmd))) 1435 1461 pu32addr = &pState->paNodes[CODEC_NID(cmd)].reserved.u32F06_param; 1436 1462 Assert((pu32addr)); 1437 1463 if (pu32addr) 1438 codecSetRegisterU8(pu32addr, cmd, 0);1439 return VINF_SUCCESS; 1440 } 1441 1442 static int codecGetConverterFormat(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1443 { 1444 Assert((CODEC_CAD(cmd) == pState->id)); 1445 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1446 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1447 { 1448 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1449 return VINF_SUCCESS; 1450 } 1451 *pResp = 0; 1452 if ( codecIsDacNode(pState, CODEC_NID(cmd)))1464 hdaCodecSetRegisterU8(pu32addr, cmd, 0); 1465 return VINF_SUCCESS; 1466 } 1467 1468 static DECLCALLBACK(int) vrbProcGetConverterFormat(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1469 { 1470 Assert((CODEC_CAD(cmd) == pState->id)); 1471 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1472 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1473 { 1474 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1475 return VINF_SUCCESS; 1476 } 1477 *pResp = 0; 1478 if (hdaCodecIsDacNode(pState, CODEC_NID(cmd))) 1453 1479 *pResp = pState->paNodes[CODEC_NID(cmd)].dac.u32A_param; 1454 else if ( codecIsAdcNode(pState, CODEC_NID(cmd)))1480 else if (hdaCodecIsAdcNode(pState, CODEC_NID(cmd))) 1455 1481 *pResp = pState->paNodes[CODEC_NID(cmd)].adc.u32A_param; 1456 else if ( codecIsSpdifOutNode(pState, CODEC_NID(cmd)))1482 else if (hdaCodecIsSpdifOutNode(pState, CODEC_NID(cmd))) 1457 1483 *pResp = pState->paNodes[CODEC_NID(cmd)].spdifout.u32A_param; 1458 else if ( codecIsSpdifInNode(pState, CODEC_NID(cmd)))1484 else if (hdaCodecIsSpdifInNode(pState, CODEC_NID(cmd))) 1459 1485 *pResp = pState->paNodes[CODEC_NID(cmd)].spdifin.u32A_param; 1460 1486 return VINF_SUCCESS; 1461 1487 } 1462 1488 1463 static int codecSetConverterFormat(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1464 { 1465 Assert((CODEC_CAD(cmd) == pState->id)); 1466 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1467 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1468 { 1469 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1470 return VINF_SUCCESS; 1471 } 1472 *pResp = 0; 1473 if ( codecIsDacNode(pState, CODEC_NID(cmd)))1474 codecSetRegisterU16(&pState->paNodes[CODEC_NID(cmd)].dac.u32A_param, cmd, 0);1475 else if ( codecIsAdcNode(pState, CODEC_NID(cmd)))1476 codecSetRegisterU16(&pState->paNodes[CODEC_NID(cmd)].adc.u32A_param, cmd, 0);1477 else if ( codecIsSpdifOutNode(pState, CODEC_NID(cmd)))1478 codecSetRegisterU16(&pState->paNodes[CODEC_NID(cmd)].spdifout.u32A_param, cmd, 0);1479 else if ( codecIsSpdifInNode(pState, CODEC_NID(cmd)))1480 codecSetRegisterU16(&pState->paNodes[CODEC_NID(cmd)].spdifin.u32A_param, cmd, 0);1489 static DECLCALLBACK(int) vrbProcSetConverterFormat(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1490 { 1491 Assert((CODEC_CAD(cmd) == pState->id)); 1492 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1493 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1494 { 1495 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1496 return VINF_SUCCESS; 1497 } 1498 *pResp = 0; 1499 if (hdaCodecIsDacNode(pState, CODEC_NID(cmd))) 1500 hdaCodecSetRegisterU16(&pState->paNodes[CODEC_NID(cmd)].dac.u32A_param, cmd, 0); 1501 else if (hdaCodecIsAdcNode(pState, CODEC_NID(cmd))) 1502 hdaCodecSetRegisterU16(&pState->paNodes[CODEC_NID(cmd)].adc.u32A_param, cmd, 0); 1503 else if (hdaCodecIsSpdifOutNode(pState, CODEC_NID(cmd))) 1504 hdaCodecSetRegisterU16(&pState->paNodes[CODEC_NID(cmd)].spdifout.u32A_param, cmd, 0); 1505 else if (hdaCodecIsSpdifInNode(pState, CODEC_NID(cmd))) 1506 hdaCodecSetRegisterU16(&pState->paNodes[CODEC_NID(cmd)].spdifin.u32A_param, cmd, 0); 1481 1507 return VINF_SUCCESS; 1482 1508 } 1483 1509 1484 1510 /* F0C */ 1485 static int codecGetEAPD_BTLEnabled(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1486 { 1487 Assert((CODEC_CAD(cmd) == pState->id)); 1488 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1489 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1490 { 1491 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1492 return VINF_SUCCESS; 1493 } 1494 *pResp = 0; 1495 if ( codecIsAdcVolNode(pState, CODEC_NID(cmd)))1511 static DECLCALLBACK(int) vrbProcGetEAPD_BTLEnabled(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1512 { 1513 Assert((CODEC_CAD(cmd) == pState->id)); 1514 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1515 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1516 { 1517 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1518 return VINF_SUCCESS; 1519 } 1520 *pResp = 0; 1521 if (hdaCodecIsAdcVolNode(pState, CODEC_NID(cmd))) 1496 1522 *pResp = pState->paNodes[CODEC_NID(cmd)].adcvol.u32F0c_param; 1497 else if ( codecIsDacNode(pState, CODEC_NID(cmd)))1523 else if (hdaCodecIsDacNode(pState, CODEC_NID(cmd))) 1498 1524 *pResp = pState->paNodes[CODEC_NID(cmd)].dac.u32F0c_param; 1499 else if ( codecIsDigInPinNode(pState, CODEC_NID(cmd)))1525 else if (hdaCodecIsDigInPinNode(pState, CODEC_NID(cmd))) 1500 1526 *pResp = pState->paNodes[CODEC_NID(cmd)].digin.u32F0c_param; 1501 1527 return VINF_SUCCESS; … … 1503 1529 1504 1530 /* 70C */ 1505 static int codecSetEAPD_BTLEnabled(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1506 { 1507 Assert((CODEC_CAD(cmd) == pState->id)); 1508 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1509 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1510 { 1511 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1531 static DECLCALLBACK(int) vrbProcSetEAPD_BTLEnabled(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1532 { 1533 Assert((CODEC_CAD(cmd) == pState->id)); 1534 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1535 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1536 { 1537 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1512 1538 return VINF_SUCCESS; 1513 1539 } 1514 1540 *pResp = 0; 1515 1541 uint32_t *pu32Reg = NULL; 1516 if ( codecIsAdcVolNode(pState, CODEC_NID(cmd)))1542 if (hdaCodecIsAdcVolNode(pState, CODEC_NID(cmd))) 1517 1543 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].adcvol.u32F0c_param; 1518 else if ( codecIsDacNode(pState, CODEC_NID(cmd)))1544 else if (hdaCodecIsDacNode(pState, CODEC_NID(cmd))) 1519 1545 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].dac.u32F0c_param; 1520 else if ( codecIsDigInPinNode(pState, CODEC_NID(cmd)))1546 else if (hdaCodecIsDigInPinNode(pState, CODEC_NID(cmd))) 1521 1547 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].digin.u32F0c_param; 1522 1548 *pResp = 0; 1523 1549 Assert((pu32Reg)); 1524 1550 if (pu32Reg) 1525 codecSetRegisterU8(pu32Reg, cmd, 0);1551 hdaCodecSetRegisterU8(pu32Reg, cmd, 0); 1526 1552 return VINF_SUCCESS; 1527 1553 } 1528 1554 1529 1555 /* F0F */ 1530 static int codecGetVolumeKnobCtrl(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1531 { 1532 Assert((CODEC_CAD(cmd) == pState->id)); 1533 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1534 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1535 { 1536 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1537 return VINF_SUCCESS; 1538 } 1539 *pResp = 0; 1540 if ( codecIsVolKnobNode(pState, CODEC_NID(cmd)))1556 static DECLCALLBACK(int) vrbProcGetVolumeKnobCtrl(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1557 { 1558 Assert((CODEC_CAD(cmd) == pState->id)); 1559 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1560 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1561 { 1562 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1563 return VINF_SUCCESS; 1564 } 1565 *pResp = 0; 1566 if (hdaCodecIsVolKnobNode(pState, CODEC_NID(cmd))) 1541 1567 *pResp = pState->paNodes[CODEC_NID(cmd)].volumeKnob.u32F0f_param; 1542 1568 return VINF_SUCCESS; … … 1544 1570 1545 1571 /* 70F */ 1546 static int codecSetVolumeKnobCtrl(struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1547 { 1548 Assert((CODEC_CAD(cmd) == pState->id)); 1549 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1550 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1551 { 1552 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1572 static DECLCALLBACK(int) vrbProcSetVolumeKnobCtrl(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1573 { 1574 Assert((CODEC_CAD(cmd) == pState->id)); 1575 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1576 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1577 { 1578 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1553 1579 return VINF_SUCCESS; 1554 1580 } 1555 1581 uint32_t *pu32Reg = NULL; 1556 1582 *pResp = 0; 1557 if ( codecIsVolKnobNode(pState, CODEC_NID(cmd)))1583 if (hdaCodecIsVolKnobNode(pState, CODEC_NID(cmd))) 1558 1584 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].volumeKnob.u32F0f_param; 1559 1585 Assert((pu32Reg)); 1560 1586 if (pu32Reg) 1561 codecSetRegisterU8(pu32Reg, cmd, 0);1587 hdaCodecSetRegisterU8(pu32Reg, cmd, 0); 1562 1588 return VINF_SUCCESS; 1563 1589 } 1564 1590 1565 1591 /* F17 */ 1566 static int codecGetGPIOUnsolisted (struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1567 { 1568 Assert((CODEC_CAD(cmd) == pState->id)); 1569 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1570 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1571 { 1572 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1592 static DECLCALLBACK(int) vrbProcGetGPIOUnsolisted(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1593 { 1594 Assert((CODEC_CAD(cmd) == pState->id)); 1595 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1596 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1597 { 1598 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1573 1599 return VINF_SUCCESS; 1574 1600 } … … 1581 1607 1582 1608 /* 717 */ 1583 static int codecSetGPIOUnsolisted (struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1584 { 1585 Assert((CODEC_CAD(cmd) == pState->id)); 1586 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1587 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1588 { 1589 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1609 static DECLCALLBACK(int) vrbProcSetGPIOUnsolisted(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1610 { 1611 Assert((CODEC_CAD(cmd) == pState->id)); 1612 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1613 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1614 { 1615 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1590 1616 return VINF_SUCCESS; 1591 1617 } … … 1596 1622 Assert((pu32Reg)); 1597 1623 if (pu32Reg) 1598 codecSetRegisterU8(pu32Reg, cmd, 0);1624 hdaCodecSetRegisterU8(pu32Reg, cmd, 0); 1599 1625 return VINF_SUCCESS; 1600 1626 } 1601 1627 1602 1628 /* F1C */ 1603 static int codecGetConfig (struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1604 { 1605 Assert((CODEC_CAD(cmd) == pState->id)); 1606 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1607 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1608 { 1609 Log(("H DAcodec: invalid node address %d\n", CODEC_NID(cmd)));1610 return VINF_SUCCESS; 1611 } 1612 *pResp = 0; 1613 if ( codecIsPortNode(pState, CODEC_NID(cmd)))1629 static DECLCALLBACK(int) vrbProcGetConfig(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1630 { 1631 Assert((CODEC_CAD(cmd) == pState->id)); 1632 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1633 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1634 { 1635 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1636 return VINF_SUCCESS; 1637 } 1638 *pResp = 0; 1639 if (hdaCodecIsPortNode(pState, CODEC_NID(cmd))) 1614 1640 *pResp = pState->paNodes[CODEC_NID(cmd)].port.u32F1c_param; 1615 else if ( codecIsDigOutPinNode(pState, CODEC_NID(cmd)))1641 else if (hdaCodecIsDigOutPinNode(pState, CODEC_NID(cmd))) 1616 1642 *pResp = pState->paNodes[CODEC_NID(cmd)].digout.u32F1c_param; 1617 else if ( codecIsDigInPinNode(pState, CODEC_NID(cmd)))1643 else if (hdaCodecIsDigInPinNode(pState, CODEC_NID(cmd))) 1618 1644 *pResp = pState->paNodes[CODEC_NID(cmd)].digin.u32F1c_param; 1619 else if ( codecIsPcbeepNode(pState, CODEC_NID(cmd)))1645 else if (hdaCodecIsPcbeepNode(pState, CODEC_NID(cmd))) 1620 1646 *pResp = pState->paNodes[CODEC_NID(cmd)].pcbeep.u32F1c_param; 1621 else if ( codecIsCdNode(pState, CODEC_NID(cmd)))1647 else if (hdaCodecIsCdNode(pState, CODEC_NID(cmd))) 1622 1648 *pResp = pState->paNodes[CODEC_NID(cmd)].cdnode.u32F1c_param; 1623 else if ( codecIsReservedNode(pState, CODEC_NID(cmd)))1649 else if (hdaCodecIsReservedNode(pState, CODEC_NID(cmd))) 1624 1650 *pResp = pState->paNodes[CODEC_NID(cmd)].reserved.u32F1c_param; 1625 1651 return VINF_SUCCESS; 1626 1652 } 1627 static int codecSetConfigX(struct CODECState *pState, uint32_t cmd, uint8_t u8Offset) 1628 { 1629 Assert((CODEC_CAD(cmd) == pState->id)); 1630 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1631 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1632 { 1633 Log(("HDAcodec: invalid node address %d\n", CODEC_NID(cmd))); 1653 1654 static int codecSetConfigX(PHDACODEC pState, uint32_t cmd, uint8_t u8Offset) 1655 { 1656 Assert((CODEC_CAD(cmd) == pState->id)); 1657 Assert((CODEC_NID(cmd) < pState->cTotalNodes)); 1658 if (CODEC_NID(cmd) >= pState->cTotalNodes) 1659 { 1660 Log(("HdaCodec: invalid node address %d\n", CODEC_NID(cmd))); 1634 1661 return VINF_SUCCESS; 1635 1662 } 1636 1663 uint32_t *pu32Reg = NULL; 1637 if ( codecIsPortNode(pState, CODEC_NID(cmd)))1664 if (hdaCodecIsPortNode(pState, CODEC_NID(cmd))) 1638 1665 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].port.u32F1c_param; 1639 else if ( codecIsDigInPinNode(pState, CODEC_NID(cmd)))1666 else if (hdaCodecIsDigInPinNode(pState, CODEC_NID(cmd))) 1640 1667 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].digin.u32F1c_param; 1641 else if ( codecIsDigOutPinNode(pState, CODEC_NID(cmd)))1668 else if (hdaCodecIsDigOutPinNode(pState, CODEC_NID(cmd))) 1642 1669 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].digout.u32F1c_param; 1643 else if ( codecIsCdNode(pState, CODEC_NID(cmd)))1670 else if (hdaCodecIsCdNode(pState, CODEC_NID(cmd))) 1644 1671 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].cdnode.u32F1c_param; 1645 else if ( codecIsPcbeepNode(pState, CODEC_NID(cmd)))1672 else if (hdaCodecIsPcbeepNode(pState, CODEC_NID(cmd))) 1646 1673 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].pcbeep.u32F1c_param; 1647 else if ( codecIsReservedNode(pState, CODEC_NID(cmd)))1674 else if (hdaCodecIsReservedNode(pState, CODEC_NID(cmd))) 1648 1675 pu32Reg = &pState->paNodes[CODEC_NID(cmd)].reserved.u32F1c_param; 1649 1676 Assert((pu32Reg)); 1650 1677 if (pu32Reg) 1651 codecSetRegisterU8(pu32Reg, cmd, u8Offset); 1652 return VINF_SUCCESS; 1653 } 1678 hdaCodecSetRegisterU8(pu32Reg, cmd, u8Offset); 1679 return VINF_SUCCESS; 1680 } 1681 1654 1682 /* 71C */ 1655 static int codecSetConfig0 (struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1683 static DECLCALLBACK(int) vrbProcSetConfig0(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1656 1684 { 1657 1685 *pResp = 0; 1658 1686 return codecSetConfigX(pState, cmd, 0); 1659 1687 } 1688 1660 1689 /* 71D */ 1661 static int codecSetConfig1 (struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1690 static DECLCALLBACK(int) vrbProcSetConfig1(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1662 1691 { 1663 1692 *pResp = 0; 1664 1693 return codecSetConfigX(pState, cmd, 8); 1665 1694 } 1695 1666 1696 /* 71E */ 1667 static int codecSetConfig2 (struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1697 static DECLCALLBACK(int) vrbProcSetConfig2(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1668 1698 { 1669 1699 *pResp = 0; 1670 1700 return codecSetConfigX(pState, cmd, 16); 1671 1701 } 1702 1672 1703 /* 71E */ 1673 static int codecSetConfig3 (struct CODECState *pState, uint32_t cmd, uint64_t *pResp)1704 static DECLCALLBACK(int) vrbProcSetConfig3(PHDACODEC pState, uint32_t cmd, uint64_t *pResp) 1674 1705 { 1675 1706 *pResp = 0; … … 1678 1709 1679 1710 1680 static int codecToAudVolume(AMPLIFIER *pAmp, audmixerctl_t mt)1711 static int hdaCodecToAudVolume(AMPLIFIER *pAmp, audmixerctl_t mt) 1681 1712 { 1682 1713 uint32_t dir = AMPLIFIER_OUT; … … 1701 1732 } 1702 1733 1703 static CODECVERB CODECVERBS[] = 1704 { 1705 /* verb | verb mask | callback */ 1706 /* ----------- -------------------- ----------------------- */ 1707 {0x000F0000, CODEC_VERB_8BIT_CMD , codecGetParameter }, 1708 {0x000F0100, CODEC_VERB_8BIT_CMD , codecGetConSelectCtrl }, 1709 {0x00070100, CODEC_VERB_8BIT_CMD , codecSetConSelectCtrl }, 1710 {0x000F0600, CODEC_VERB_8BIT_CMD , codecGetStreamId }, 1711 {0x00070600, CODEC_VERB_8BIT_CMD , codecSetStreamId }, 1712 {0x000F0700, CODEC_VERB_8BIT_CMD , codecGetPinCtrl }, 1713 {0x00070700, CODEC_VERB_8BIT_CMD , codecSetPinCtrl }, 1714 {0x000F0800, CODEC_VERB_8BIT_CMD , codecGetUnsolicitedEnabled }, 1715 {0x00070800, CODEC_VERB_8BIT_CMD , codecSetUnsolicitedEnabled }, 1716 {0x000F0900, CODEC_VERB_8BIT_CMD , codecGetPinSense }, 1717 {0x00070900, CODEC_VERB_8BIT_CMD , codecSetPinSense }, 1718 {0x000F0200, CODEC_VERB_8BIT_CMD , codecGetConnectionListEntry }, 1719 {0x000F0300, CODEC_VERB_8BIT_CMD , codecGetProcessingState }, 1720 {0x00070300, CODEC_VERB_8BIT_CMD , codecSetProcessingState }, 1721 {0x000F0D00, CODEC_VERB_8BIT_CMD , codecGetDigitalConverter }, 1722 {0x00070D00, CODEC_VERB_8BIT_CMD , codecSetDigitalConverter1 }, 1723 {0x00070E00, CODEC_VERB_8BIT_CMD , codecSetDigitalConverter2 }, 1724 {0x000F2000, CODEC_VERB_8BIT_CMD , codecGetSubId }, 1725 {0x00072000, CODEC_VERB_8BIT_CMD , codecSetSubId0 }, 1726 {0x00072100, CODEC_VERB_8BIT_CMD , codecSetSubId1 }, 1727 {0x00072200, CODEC_VERB_8BIT_CMD , codecSetSubId2 }, 1728 {0x00072300, CODEC_VERB_8BIT_CMD , codecSetSubId3 }, 1729 {0x0007FF00, CODEC_VERB_8BIT_CMD , codecReset }, 1730 {0x000F0500, CODEC_VERB_8BIT_CMD , codecGetPowerState }, 1731 {0x00070500, CODEC_VERB_8BIT_CMD , codecSetPowerState }, 1732 {0x000F0C00, CODEC_VERB_8BIT_CMD , codecGetEAPD_BTLEnabled }, 1733 {0x00070C00, CODEC_VERB_8BIT_CMD , codecSetEAPD_BTLEnabled }, 1734 {0x000F0F00, CODEC_VERB_8BIT_CMD , codecGetVolumeKnobCtrl }, 1735 {0x00070F00, CODEC_VERB_8BIT_CMD , codecSetVolumeKnobCtrl }, 1736 {0x000F1700, CODEC_VERB_8BIT_CMD , codecGetGPIOUnsolisted }, 1737 {0x00071700, CODEC_VERB_8BIT_CMD , codecSetGPIOUnsolisted }, 1738 {0x000F1C00, CODEC_VERB_8BIT_CMD , codecGetConfig }, 1739 {0x00071C00, CODEC_VERB_8BIT_CMD , codecSetConfig0 }, 1740 {0x00071D00, CODEC_VERB_8BIT_CMD , codecSetConfig1 }, 1741 {0x00071E00, CODEC_VERB_8BIT_CMD , codecSetConfig2 }, 1742 {0x00071F00, CODEC_VERB_8BIT_CMD , codecSetConfig3 }, 1743 {0x000A0000, CODEC_VERB_16BIT_CMD, codecGetConverterFormat }, 1744 {0x00020000, CODEC_VERB_16BIT_CMD, codecSetConverterFormat }, 1745 {0x000B0000, CODEC_VERB_16BIT_CMD, codecGetAmplifier }, 1746 {0x00030000, CODEC_VERB_16BIT_CMD, codecSetAmplifier }, 1734 /** 1735 * HDA codec verb map. 1736 * @todo Any reason not to use binary search here? 1737 */ 1738 static const CODECVERB g_aCodecVerbs[] = 1739 { 1740 /* verb | verb mask | callback */ 1741 /* ----------- -------------------- ----------------------- */ 1742 { 0x000F0000, CODEC_VERB_8BIT_CMD , vrbProcGetParameter }, 1743 { 0x000F0100, CODEC_VERB_8BIT_CMD , vrbProcGetConSelectCtrl }, 1744 { 0x00070100, CODEC_VERB_8BIT_CMD , vrbProcSetConSelectCtrl }, 1745 { 0x000F0600, CODEC_VERB_8BIT_CMD , vrbProcGetStreamId }, 1746 { 0x00070600, CODEC_VERB_8BIT_CMD , vrbProcSetStreamId }, 1747 { 0x000F0700, CODEC_VERB_8BIT_CMD , vrbProcGetPinCtrl }, 1748 { 0x00070700, CODEC_VERB_8BIT_CMD , vrbProcSetPinCtrl }, 1749 { 0x000F0800, CODEC_VERB_8BIT_CMD , vrbProcGetUnsolicitedEnabled }, 1750 { 0x00070800, CODEC_VERB_8BIT_CMD , vrbProcSetUnsolicitedEnabled }, 1751 { 0x000F0900, CODEC_VERB_8BIT_CMD , vrbProcGetPinSense }, 1752 { 0x00070900, CODEC_VERB_8BIT_CMD , vrbProcSetPinSense }, 1753 { 0x000F0200, CODEC_VERB_8BIT_CMD , vrbProcGetConnectionListEntry }, 1754 { 0x000F0300, CODEC_VERB_8BIT_CMD , vrbProcGetProcessingState }, 1755 { 0x00070300, CODEC_VERB_8BIT_CMD , vrbProcSetProcessingState }, 1756 { 0x000F0D00, CODEC_VERB_8BIT_CMD , vrbProcGetDigitalConverter }, 1757 { 0x00070D00, CODEC_VERB_8BIT_CMD , vrbProcSetDigitalConverter1 }, 1758 { 0x00070E00, CODEC_VERB_8BIT_CMD , vrbProcSetDigitalConverter2 }, 1759 { 0x000F2000, CODEC_VERB_8BIT_CMD , vrbProcGetSubId }, 1760 { 0x00072000, CODEC_VERB_8BIT_CMD , vrbProcSetSubId0 }, 1761 { 0x00072100, CODEC_VERB_8BIT_CMD , vrbProcSetSubId1 }, 1762 { 0x00072200, CODEC_VERB_8BIT_CMD , vrbProcSetSubId2 }, 1763 { 0x00072300, CODEC_VERB_8BIT_CMD , vrbProcSetSubId3 }, 1764 { 0x0007FF00, CODEC_VERB_8BIT_CMD , vrbProcReset }, 1765 { 0x000F0500, CODEC_VERB_8BIT_CMD , vrbProcGetPowerState }, 1766 { 0x00070500, CODEC_VERB_8BIT_CMD , vrbProcSetPowerState }, 1767 { 0x000F0C00, CODEC_VERB_8BIT_CMD , vrbProcGetEAPD_BTLEnabled }, 1768 { 0x00070C00, CODEC_VERB_8BIT_CMD , vrbProcSetEAPD_BTLEnabled }, 1769 { 0x000F0F00, CODEC_VERB_8BIT_CMD , vrbProcGetVolumeKnobCtrl }, 1770 { 0x00070F00, CODEC_VERB_8BIT_CMD , vrbProcSetVolumeKnobCtrl }, 1771 { 0x000F1700, CODEC_VERB_8BIT_CMD , vrbProcGetGPIOUnsolisted }, 1772 { 0x00071700, CODEC_VERB_8BIT_CMD , vrbProcSetGPIOUnsolisted }, 1773 { 0x000F1C00, CODEC_VERB_8BIT_CMD , vrbProcGetConfig }, 1774 { 0x00071C00, CODEC_VERB_8BIT_CMD , vrbProcSetConfig0 }, 1775 { 0x00071D00, CODEC_VERB_8BIT_CMD , vrbProcSetConfig1 }, 1776 { 0x00071E00, CODEC_VERB_8BIT_CMD , vrbProcSetConfig2 }, 1777 { 0x00071F00, CODEC_VERB_8BIT_CMD , vrbProcSetConfig3 }, 1778 { 0x000A0000, CODEC_VERB_16BIT_CMD, vrbProcGetConverterFormat }, 1779 { 0x00020000, CODEC_VERB_16BIT_CMD, vrbProcSetConverterFormat }, 1780 { 0x000B0000, CODEC_VERB_16BIT_CMD, vrbProcGetAmplifier }, 1781 { 0x00030000, CODEC_VERB_16BIT_CMD, vrbProcSetAmplifier }, 1747 1782 }; 1748 1783 1749 static int codecLookup( CODECState *pState, uint32_t cmd, PPFNCODECVERBPROCESSOR pfn)1784 static int codecLookup(PHDACODEC pState, uint32_t cmd, PPFNCODECVERBPROCESSOR pfn) 1750 1785 { 1751 1786 int rc = VINF_SUCCESS; 1752 1787 Assert(CODEC_CAD(cmd) == pState->id); 1753 if (codecIsReservedNode(pState, CODEC_NID(cmd))) 1754 { 1755 Log(("HDAcodec: cmd %x was addressed to reserved node\n", cmd)); 1756 } 1788 if (hdaCodecIsReservedNode(pState, CODEC_NID(cmd))) 1789 Log(("HdaCodec: cmd %x was addressed to reserved node\n", cmd)); 1790 1757 1791 if ( CODEC_VERBDATA(cmd) == 0 1758 1792 || CODEC_NID(cmd) >= pState->cTotalNodes) 1759 1793 { 1760 *pfn = codecUnimplemented; 1761 //** @todo r=michaln: There needs to be a counter to avoid log flooding (see e.g. DevRTC.cpp) 1762 Log(("HDAcodec: cmd %x was ignored\n", cmd)); 1763 return VINF_SUCCESS; 1764 } 1794 *pfn = vrbProcUnimplemented; 1795 /// @todo r=michaln: There needs to be a counter to avoid log flooding (see e.g. DevRTC.cpp) 1796 Log(("HdaCodec: cmd %x was ignored\n", cmd)); 1797 return VINF_SUCCESS; 1798 } 1799 1765 1800 for (int i = 0; i < pState->cVerbs; ++i) 1766 1801 { 1767 if ((CODEC_VERBDATA(cmd) & pState->p Verbs[i].mask) == pState->pVerbs[i].verb)1802 if ((CODEC_VERBDATA(cmd) & pState->paVerbs[i].mask) == pState->paVerbs[i].verb) 1768 1803 { 1769 *pfn = pState->p Verbs[i].pfn;1804 *pfn = pState->paVerbs[i].pfn; 1770 1805 return VINF_SUCCESS; 1771 1806 } 1772 1807 } 1773 *pfn = codecUnimplemented; 1774 Log(("HDAcodec: callback for %x wasn't found\n", CODEC_VERBDATA(cmd))); 1808 1809 *pfn = vrbProcUnimplemented; 1810 Log(("HdaCodec: callback for %x wasn't found\n", CODEC_VERBDATA(cmd))); 1775 1811 return rc; 1776 1812 } 1777 1813 1778 static void pi_callback 1779 { 1780 CODECState *pState = (CODECState *)opaque;1814 static void pi_callback(void *opaque, int avail) 1815 { 1816 PHDACODEC pState = (PHDACODEC)opaque; 1781 1817 pState->pfnTransfer(pState, PI_INDEX, avail); 1782 1818 } 1783 1819 1784 static void po_callback 1785 { 1786 CODECState *pState = (CODECState *)opaque;1820 static void po_callback(void *opaque, int avail) 1821 { 1822 PHDACODEC pState = (PHDACODEC)opaque; 1787 1823 pState->pfnTransfer(pState, PO_INDEX, avail); 1788 1824 } 1825 1826 1827 1828 /* 1829 * APIs exposed to DevHDA. 1830 */ 1831 1789 1832 1790 1833 /** … … 1793 1836 * this routine could be called from HDA on setting/resseting sound format. 1794 1837 * 1795 * @todo: probably passed settings should be verified (if AFG's declared proposed format) before enabling. 1838 * @todo Probably passed settings should be verified (if AFG's declared proposed 1839 * format) before enabling. 1796 1840 */ 1797 int codecOpenVoice(CODECState *pState, ENMSOUNDSOURCE enmSoundSource, audsettings_t *pAudioSettings)1841 int hdaCodecOpenVoice(PHDACODEC pState, ENMSOUNDSOURCE enmSoundSource, audsettings_t *pAudioSettings) 1798 1842 { 1799 1843 int rc = 0; … … 1816 1860 } 1817 1861 if (!rc) 1818 LogRel(("HDAcodec: can't open %s fmt(freq: %d)\n", 1819 enmSoundSource == PI_INDEX? "in" : "out", 1820 pAudioSettings->freq)); 1862 LogRel(("HdaCodec: can't open %s fmt(freq: %d)\n", enmSoundSource == PI_INDEX? "in" : "out", pAudioSettings->freq)); 1821 1863 return rc; 1822 1864 } 1823 1865 1824 int codecConstruct(PPDMDEVINS pDevIns, CODECState *pState, PCFGMNODE pCfgHandle) 1825 { 1826 audsettings_t as; 1827 int rc; 1828 pState->pVerbs = (CODECVERB *)&CODECVERBS; 1829 pState->cVerbs = sizeof(CODECVERBS)/sizeof(CODECVERB); 1830 pState->pfnLookup = codecLookup; 1831 rc = stac9220Construct(pState); 1832 AssertRC(rc); 1833 /* common root node initializers */ 1834 pState->paNodes[0].node.au32F00_param[0] = CODEC_MAKE_F00_00(pState->u16VendorId, pState->u16DeviceId); 1835 pState->paNodes[0].node.au32F00_param[4] = CODEC_MAKE_F00_04(0x1, 0x1); 1836 /* common AFG node initializers */ 1837 pState->paNodes[1].node.au32F00_param[4] = CODEC_MAKE_F00_04(0x2, pState->cTotalNodes - 2); 1838 pState->paNodes[1].node.au32F00_param[5] = CODEC_MAKE_F00_05(1, CODEC_F00_05_AFG); 1839 pState->paNodes[1].afg.u32F20_param = CODEC_MAKE_F20(pState->u16VendorId, pState->u8BSKU, pState->u8AssemblyId); 1840 1841 //** @todo r=michaln: Was this meant to be 'HDA' or something like that? (AC'97 was on ICH0) 1842 AUD_register_card ("ICH0", &pState->card); 1843 1844 /* 44.1 kHz */ 1845 as.freq = 44100; 1846 as.nchannels = 2; 1847 as.fmt = AUD_FMT_S16; 1848 as.endianness = 0; 1849 1850 pState->paNodes[1].node.au32F00_param[0xA] = CODEC_F00_0A_16_BIT; 1851 codecOpenVoice(pState, PI_INDEX, &as); 1852 codecOpenVoice(pState, PO_INDEX, &as); 1853 pState->paNodes[1].node.au32F00_param[0xA] |= CODEC_F00_0A_44_1KHZ; 1854 1855 uint8_t i; 1856 Assert(pState->paNodes); 1857 Assert(pState->pfnCodecNodeReset); 1858 for (i = 0; i < pState->cTotalNodes; ++i) 1859 { 1860 pState->pfnCodecNodeReset(pState, i, &pState->paNodes[i]); 1861 } 1862 1863 codecToAudVolume(&pState->paNodes[pState->u8DacLineOut].dac.B_params, AUD_MIXER_VOLUME); 1864 codecToAudVolume(&pState->paNodes[pState->u8AdcVolsLineIn].adcvol.B_params, AUD_MIXER_LINE_IN); 1865 1866 /* If no host voices were created, then fallback to nul audio. */ 1867 if (!AUD_is_host_voice_in_ok(pState->SwVoiceIn)) 1868 LogRel (("HDA: WARNING: Unable to open PCM IN!\n")); 1869 if (!AUD_is_host_voice_out_ok(pState->SwVoiceOut)) 1870 LogRel (("HDA: WARNING: Unable to open PCM OUT!\n")); 1871 1872 if ( !AUD_is_host_voice_in_ok(pState->SwVoiceIn) 1873 && !AUD_is_host_voice_out_ok(pState->SwVoiceOut)) 1874 { 1875 /* Was not able initialize *any* voice. Select the NULL audio driver instead */ 1876 AUD_close_in (&pState->card, pState->SwVoiceIn); 1877 AUD_close_out (&pState->card, pState->SwVoiceOut); 1878 pState->SwVoiceOut = NULL; 1879 pState->SwVoiceIn = NULL; 1880 AUD_init_null (); 1881 1882 PDMDevHlpVMSetRuntimeError (pDevIns, 0 /*fFlags*/, "HostAudioNotResponding", 1883 N_ ("No audio devices could be opened. Selecting the NULL audio backend " 1884 "with the consequence that no sound is audible")); 1885 } 1886 else if ( !AUD_is_host_voice_in_ok(pState->SwVoiceIn) 1887 || !AUD_is_host_voice_out_ok(pState->SwVoiceOut)) 1888 { 1889 char szMissingVoices[128]; 1890 size_t len = 0; 1891 if (!AUD_is_host_voice_in_ok(pState->SwVoiceIn)) 1892 len = RTStrPrintf (szMissingVoices, sizeof(szMissingVoices), "PCM_in"); 1893 if (!AUD_is_host_voice_out_ok(pState->SwVoiceOut)) 1894 len += RTStrPrintf (szMissingVoices + len, sizeof(szMissingVoices) - len, len ? ", PCM_out" : "PCM_out"); 1895 1896 PDMDevHlpVMSetRuntimeError (pDevIns, 0 /*fFlags*/, "HostAudioNotResponding", 1897 N_ ("Some audio devices (%s) could not be opened. Guest applications generating audio " 1898 "output or depending on audio input may hang. Make sure your host audio device " 1899 "is working properly. Check the logfile for error messages of the audio " 1900 "subsystem"), szMissingVoices); 1901 } 1902 1903 return VINF_SUCCESS; 1904 } 1905 1906 int codecDestruct(CODECState *pCodecState) 1907 { 1908 RTMemFree(pCodecState->paNodes); 1909 pCodecState->paNodes = NULL; 1910 return VINF_SUCCESS; 1911 } 1912 1913 int codecSaveState(CODECState *pCodecState, PSSMHANDLE pSSM) 1866 1867 int hdaCodecSaveState(CODECState *pCodecState, PSSMHANDLE pSSM) 1914 1868 { 1915 1869 AssertLogRelMsgReturn(pCodecState->cTotalNodes == 0x1c, ("cTotalNodes=%#x, should be 0x1c", pCodecState->cTotalNodes), … … 1923 1877 1924 1878 1925 int codecLoadState(CODECState *pCodecState, PSSMHANDLE pSSM, uint32_t uVersion)1879 int hdaCodecLoadState(CODECState *pCodecState, PSSMHANDLE pSSM, uint32_t uVersion) 1926 1880 { 1927 1881 PCSSMFIELD pFields; … … 1976 1930 * Update stuff after changing the state. 1977 1931 */ 1978 if (codecIsDacNode(pCodecState, pCodecState->u8DacLineOut)) 1979 codecToAudVolume(&pCodecState->paNodes[pCodecState->u8DacLineOut].dac.B_params, AUD_MIXER_VOLUME); 1980 else if (codecIsSpdifOutNode(pCodecState, pCodecState->u8DacLineOut)) 1981 codecToAudVolume(&pCodecState->paNodes[pCodecState->u8DacLineOut].spdifout.B_params, AUD_MIXER_VOLUME); 1982 codecToAudVolume(&pCodecState->paNodes[pCodecState->u8AdcVolsLineIn].adcvol.B_params, AUD_MIXER_LINE_IN); 1983 1984 return VINF_SUCCESS; 1985 } 1986 1932 if (hdaCodecIsDacNode(pCodecState, pCodecState->u8DacLineOut)) 1933 hdaCodecToAudVolume(&pCodecState->paNodes[pCodecState->u8DacLineOut].dac.B_params, AUD_MIXER_VOLUME); 1934 else if (hdaCodecIsSpdifOutNode(pCodecState, pCodecState->u8DacLineOut)) 1935 hdaCodecToAudVolume(&pCodecState->paNodes[pCodecState->u8DacLineOut].spdifout.B_params, AUD_MIXER_VOLUME); 1936 hdaCodecToAudVolume(&pCodecState->paNodes[pCodecState->u8AdcVolsLineIn].adcvol.B_params, AUD_MIXER_LINE_IN); 1937 1938 return VINF_SUCCESS; 1939 } 1940 1941 1942 int hdaCodecDestruct(CODECState *pCodecState) 1943 { 1944 RTMemFree(pCodecState->paNodes); 1945 pCodecState->paNodes = NULL; 1946 return VINF_SUCCESS; 1947 } 1948 1949 1950 int hdaCodecConstruct(PPDMDEVINS pDevIns, PHDACODEC pState, PCFGMNODE pCfg) 1951 { 1952 pState->paVerbs = &g_aCodecVerbs[0]; 1953 pState->cVerbs = RT_ELEMENTS(g_aCodecVerbs); 1954 pState->pfnLookup = codecLookup; 1955 int rc = stac9220Construct(pState); 1956 AssertRC(rc); 1957 1958 /* common root node initializers */ 1959 pState->paNodes[0].node.au32F00_param[0] = CODEC_MAKE_F00_00(pState->u16VendorId, pState->u16DeviceId); 1960 pState->paNodes[0].node.au32F00_param[4] = CODEC_MAKE_F00_04(0x1, 0x1); 1961 /* common AFG node initializers */ 1962 pState->paNodes[1].node.au32F00_param[4] = CODEC_MAKE_F00_04(0x2, pState->cTotalNodes - 2); 1963 pState->paNodes[1].node.au32F00_param[5] = CODEC_MAKE_F00_05(1, CODEC_F00_05_AFG); 1964 pState->paNodes[1].afg.u32F20_param = CODEC_MAKE_F20(pState->u16VendorId, pState->u8BSKU, pState->u8AssemblyId); 1965 1966 //** @todo r=michaln: Was this meant to be 'HDA' or something like that? (AC'97 was on ICH0) 1967 AUD_register_card ("ICH0", &pState->card); 1968 1969 /* 44.1 kHz */ 1970 audsettings_t as; 1971 as.freq = 44100; 1972 as.nchannels = 2; 1973 as.fmt = AUD_FMT_S16; 1974 as.endianness = 0; 1975 1976 pState->paNodes[1].node.au32F00_param[0xA] = CODEC_F00_0A_16_BIT; 1977 hdaCodecOpenVoice(pState, PI_INDEX, &as); 1978 hdaCodecOpenVoice(pState, PO_INDEX, &as); 1979 pState->paNodes[1].node.au32F00_param[0xA] |= CODEC_F00_0A_44_1KHZ; 1980 1981 uint8_t i; 1982 Assert(pState->paNodes); 1983 Assert(pState->pfnCodecNodeReset); 1984 for (i = 0; i < pState->cTotalNodes; ++i) 1985 { 1986 pState->pfnCodecNodeReset(pState, i, &pState->paNodes[i]); 1987 } 1988 1989 hdaCodecToAudVolume(&pState->paNodes[pState->u8DacLineOut].dac.B_params, AUD_MIXER_VOLUME); 1990 hdaCodecToAudVolume(&pState->paNodes[pState->u8AdcVolsLineIn].adcvol.B_params, AUD_MIXER_LINE_IN); 1991 1992 /* If no host voices were created, then fallback to nul audio. */ 1993 if (!AUD_is_host_voice_in_ok(pState->SwVoiceIn)) 1994 LogRel (("HDA: WARNING: Unable to open PCM IN!\n")); 1995 if (!AUD_is_host_voice_out_ok(pState->SwVoiceOut)) 1996 LogRel (("HDA: WARNING: Unable to open PCM OUT!\n")); 1997 1998 if ( !AUD_is_host_voice_in_ok(pState->SwVoiceIn) 1999 && !AUD_is_host_voice_out_ok(pState->SwVoiceOut)) 2000 { 2001 /* Was not able initialize *any* voice. Select the NULL audio driver instead */ 2002 AUD_close_in (&pState->card, pState->SwVoiceIn); 2003 AUD_close_out (&pState->card, pState->SwVoiceOut); 2004 pState->SwVoiceOut = NULL; 2005 pState->SwVoiceIn = NULL; 2006 AUD_init_null (); 2007 2008 PDMDevHlpVMSetRuntimeError (pDevIns, 0 /*fFlags*/, "HostAudioNotResponding", 2009 N_ ("No audio devices could be opened. Selecting the NULL audio backend " 2010 "with the consequence that no sound is audible")); 2011 } 2012 else if ( !AUD_is_host_voice_in_ok(pState->SwVoiceIn) 2013 || !AUD_is_host_voice_out_ok(pState->SwVoiceOut)) 2014 { 2015 char szMissingVoices[128]; 2016 size_t len = 0; 2017 if (!AUD_is_host_voice_in_ok(pState->SwVoiceIn)) 2018 len = RTStrPrintf (szMissingVoices, sizeof(szMissingVoices), "PCM_in"); 2019 if (!AUD_is_host_voice_out_ok(pState->SwVoiceOut)) 2020 len += RTStrPrintf (szMissingVoices + len, sizeof(szMissingVoices) - len, len ? ", PCM_out" : "PCM_out"); 2021 2022 PDMDevHlpVMSetRuntimeError (pDevIns, 0 /*fFlags*/, "HostAudioNotResponding", 2023 N_ ("Some audio devices (%s) could not be opened. Guest applications generating audio " 2024 "output or depending on audio input may hang. Make sure your host audio device " 2025 "is working properly. Check the logfile for error messages of the audio " 2026 "subsystem"), szMissingVoices); 2027 } 2028 2029 return VINF_SUCCESS; 2030 } 2031 -
trunk/src/VBox/Devices/Audio/DevCodec.h
r44639 r44667 18 18 #ifndef DEV_CODEC_H 19 19 #define DEV_CODEC_H 20 20 21 struct CODECState; 21 struct INTELHDLinkState; 22 23 typedef DECLCALLBACK(int) FNCODECVERBPROCESSOR(struct CODECState *pState, uint32_t cmd, uint64_t *pResp); 22 23 typedef DECLCALLBACK(int) FNCODECVERBPROCESSOR(struct CODECState *pThis, uint32_t cmd, uint64_t *pResp); 24 24 typedef FNCODECVERBPROCESSOR *PFNCODECVERBPROCESSOR; 25 25 typedef FNCODECVERBPROCESSOR **PPFNCODECVERBPROCESSOR; 26 26 27 /* RPM 5.3.1 */27 /* PRM 5.3.1 */ 28 28 #define CODEC_RESPONSE_UNSOLICITED RT_BIT_64(34) 29 29 … … 483 483 uint8_t u8AssemblyId; 484 484 #ifndef VBOX_WITH_HDA_CODEC_EMU 485 CODECVERB *pVerbs;485 CODECVERB const *paVerbs; 486 486 int cVerbs; 487 487 #else … … 521 521 DECLR3CALLBACKMEMBER(int, pfnCodecNodeReset, (struct CODECState *pState, uint8_t, PCODECNODE)); 522 522 /* These callbacks are set by codec implementation to answer debugger requests */ 523 DECLR3CALLBACKMEMBER(void, pfnCodecDbgListNodes, ( CODECState *pState, PCDBGFINFOHLP pHlp, const char *pszArgs));524 DECLR3CALLBACKMEMBER(void, pfnCodecDbgSelector, ( CODECState *pState, PCDBGFINFOHLP pHlp, const char *pszArgs));523 DECLR3CALLBACKMEMBER(void, pfnCodecDbgListNodes, (struct CODECState *pState, PCDBGFINFOHLP pHlp, const char *pszArgs)); 524 DECLR3CALLBACKMEMBER(void, pfnCodecDbgSelector, (struct CODECState *pState, PCDBGFINFOHLP pHlp, const char *pszArgs)); 525 525 } CODECState, *PCODECState; 526 526 /** The ICH HDA (Intel) codec state. */ … … 529 529 typedef HDACODEC *PHDACODEC; 530 530 531 int codecConstruct(PPDMDEVINS pDevIns, CODECState *pCodecState, PCFGMNODE pCfgHandle);532 int codecDestruct(CODECState *pCodecState);533 int codecSaveState(CODECState *pCodecState, PSSMHANDLE pSSMHandle);534 int codecLoadState(CODECState *pCodecState, PSSMHANDLE pSSMHandle, uint32_t uVersion);535 int codecOpenVoice(CODECState *pCodecState, ENMSOUNDSOURCE enmSoundSource, audsettings_t *pAudioSettings);531 int hdaCodecConstruct(PPDMDEVINS pDevIns, PHDACODEC pThis, PCFGMNODE pCfg); 532 int hdaCodecDestruct(PHDACODEC pThis); 533 int hdaCodecSaveState(PHDACODEC pThis, PSSMHANDLE pSSM); 534 int hdaCodecLoadState(PHDACODEC pThis, PSSMHANDLE pSSM, uint32_t uVersion); 535 int hdaCodecOpenVoice(PHDACODEC pThis, ENMSOUNDSOURCE enmSoundSource, audsettings_t *pAudioSettings); 536 536 537 537 #define HDA_SSM_VERSION 4 … … 544 544 struct CODECEMU 545 545 { 546 DECLR3CALLBACKMEMBER(int, pfnCodecEmuConstruct, (PCODECState pState));547 DECLR3CALLBACKMEMBER(int, pfnCodecEmuDestruct, (PCODECState pState));548 DECLR3CALLBACKMEMBER(int, pfnCodecEmuReset, (PCODECState pState, bool fInit));546 DECLR3CALLBACKMEMBER(int, pfnCodecEmuConstruct,(PHDACODEC pThis)); 547 DECLR3CALLBACKMEMBER(int, pfnCodecEmuDestruct,(PHDACODEC pThis)); 548 DECLR3CALLBACKMEMBER(int, pfnCodecEmuReset,(PHDACODEC pThis, bool fInit)); 549 549 }; 550 550 # endif -
trunk/src/VBox/Devices/Audio/DevIchIntelHDA.cpp
r44666 r44667 1479 1479 { 1480 1480 case ICH6_HDA_REG_SD0FMT: 1481 rc = codecOpenVoice(&pThis->Codec, PI_INDEX, &as);1481 rc = hdaCodecOpenVoice(&pThis->Codec, PI_INDEX, &as); 1482 1482 break; 1483 1483 case ICH6_HDA_REG_SD4FMT: 1484 rc = codecOpenVoice(&pThis->Codec, PO_INDEX, &as);1484 rc = hdaCodecOpenVoice(&pThis->Codec, PO_INDEX, &as); 1485 1485 break; 1486 1486 default: … … 2396 2396 PHDASTATE pThis = PDMINS_2_DATA(pDevIns, PHDASTATE); 2397 2397 /* Save Codec nodes states */ 2398 codecSaveState(&pThis->Codec, pSSM);2398 hdaCodecSaveState(&pThis->Codec, pSSM); 2399 2399 2400 2400 /* Save MMIO registers */ … … 2423 2423 * Load Codec nodes states. 2424 2424 */ 2425 int rc = codecLoadState(&pThis->Codec, pSSM, uVersion);2425 int rc = hdaCodecLoadState(&pThis->Codec, pSSM, uVersion); 2426 2426 if (RT_FAILURE(rc)) 2427 2427 return rc; … … 2775 2775 PHDASTATE pThis = PDMINS_2_DATA(pDevIns, PHDASTATE); 2776 2776 2777 int rc = codecDestruct(&pThis->Codec);2777 int rc = hdaCodecDestruct(&pThis->Codec); 2778 2778 AssertRC(rc); 2779 2779 … … 2934 2934 2935 2935 pThis->Codec.pvHDAState = pThis; 2936 rc = codecConstruct(pDevIns, &pThis->Codec, pCfgHandle);2936 rc = hdaCodecConstruct(pDevIns, &pThis->Codec, pCfgHandle); 2937 2937 if (RT_FAILURE(rc)) 2938 2938 AssertRCReturn(rc, rc);
Note:
See TracChangeset
for help on using the changeset viewer.