Changeset 58954 in vbox for trunk/src/VBox/Devices/Audio
- Timestamp:
- Dec 2, 2015 3:50:55 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 104466
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DevIchHda.cpp
r58931 r58954 831 831 static void hdaStreamDestroy(PHDASTREAM pStrmSt); 832 832 833 static int hdaTransfer(PHDASTATE pThis, ENMSOUNDSOURCE enmSrc, uint32_t *pcbProcessed);833 static int hdaTransfer(PHDASTATE pThis, ENMSOUNDSOURCE enmSrc, uint32_t cbMax, uint32_t *pcbProcessed); 834 834 835 835 #ifdef IN_RING3 … … 1518 1518 AssertPtrReturnVoid(pThis); 1519 1519 AssertPtrReturnVoid(pStrmSt); 1520 AssertReturnVoid(u8Strm <= 7); /** @todo Use a define for MAX_STR AEMS! */1520 AssertReturnVoid(u8Strm <= 7); /** @todo Use a define for MAX_STREAMS! */ 1521 1521 1522 1522 /* … … 2304 2304 return; 2305 2305 2306 for (int i = 0; i < 8; i++) /** @todo Use a define .*/2306 for (int i = 0; i < 8; i++) /** @todo Use a define for MAX_STREAMS! */ 2307 2307 { 2308 2308 uint32_t uDMACnt; … … 2362 2362 * @return Number of bytes for the DMA engine to process. 2363 2363 */ 2364 DECLINLINE(uint32_t) hdaStreamGetTransferSize(PHDASTATE pThis, PHDASTREAM pStrmSt )2364 DECLINLINE(uint32_t) hdaStreamGetTransferSize(PHDASTATE pThis, PHDASTREAM pStrmSt, uint32_t cbMax) 2365 2365 { 2366 2366 AssertPtrReturn(pThis, 0); 2367 2367 AssertPtrReturn(pStrmSt, 0); 2368 2368 2369 if (!cbMax) 2370 return 0; 2371 2369 2372 PHDABDLE pBDLE = hdaStreamGetCurrentBDLE(pThis, pStrmSt); 2370 2373 … … 2377 2380 /* Make sure we only copy as much as the stream's FIFO can hold (SDFIFOS, 18.2.39). */ 2378 2381 cbFree = RT_MIN(cbFree, pStrmSt->u16FIFOS); 2382 2383 /* Make sure we only transfer as many bytes as requested. */ 2384 cbFree = RT_MIN(cbFree, cbMax); 2379 2385 2380 2386 if (pBDLE->State.cbBelowFIFOW) … … 2447 2453 * the CBL limit or our internal DMA buffer is full. */ 2448 2454 bool fNeedsNextBDLE = ( fCBLLimitReached 2449 || pBDLE->State.u32BufOff >= pBDLE->u32BufSize); 2455 || ( pBDLE->State.u32BufOff 2456 && pBDLE->State.u32BufOff >= pBDLE->u32BufSize) 2457 ); 2450 2458 2451 2459 Assert(u32LPIB <= pStrmSt->u32CBL); … … 2557 2565 * but "reports bytes" when all conditions are met (FIFOW). 2558 2566 */ 2559 static int hdaReadAudio(PHDASTATE pThis, PHDASTREAM pStrmSt, PAUDMIXSINK pSink, uint32_t *pcbRead)2567 static int hdaReadAudio(PHDASTATE pThis, PHDASTREAM pStrmSt, PAUDMIXSINK pSink, uint32_t cbMax, uint32_t *pcbRead) 2560 2568 { 2561 2569 AssertPtrReturn(pThis, VERR_INVALID_POINTER); … … 2568 2576 int rc; 2569 2577 uint32_t cbRead = 0; 2570 uint32_t cbBuf = hdaStreamGetTransferSize(pThis, pStrmSt);2578 uint32_t cbBuf = hdaStreamGetTransferSize(pThis, pStrmSt, cbMax); 2571 2579 2572 2580 LogFlowFunc(("cbBuf=%RU32, %R[bdle]\n", cbBuf, pBDLE)); … … 2575 2583 { 2576 2584 /* Nothing to write, bail out. */ 2577 rc = V ERR_NO_DATA;2585 rc = VINF_EOF; 2578 2586 } 2579 2587 else 2580 2588 { 2581 uint32_t cbReadFromSink = 0; 2582 rc = AudioMixerProcessSinkIn(pSink, AUDMIXOP_BLEND, pBDLE->State.au8FIFO, cbBuf, &cbReadFromSink); 2589 rc = AudioMixerProcessSinkIn(pSink, AUDMIXOP_BLEND, pBDLE->State.au8FIFO, cbBuf, &cbRead); 2583 2590 if (RT_SUCCESS(rc)) 2584 2591 { 2585 Assert(cbRead FromSink);2586 Assert(cbRead FromSink== cbBuf);2587 Assert(cbRead FromSink<= pBDLE->u32BufSize - pBDLE->State.u32BufOff);2592 Assert(cbRead); 2593 Assert(cbRead == cbBuf); 2594 Assert(cbRead <= pBDLE->u32BufSize - pBDLE->State.u32BufOff); 2588 2595 2589 2596 /* … … 2592 2599 rc = PDMDevHlpPCIPhysWrite(pThis->CTX_SUFF(pDevIns), 2593 2600 pBDLE->u64BufAdr + pBDLE->State.u32BufOff, 2594 pBDLE->State.au8FIFO, cbRead FromSink);2601 pBDLE->State.au8FIFO, cbRead); 2595 2602 AssertRC(rc); 2596 2603 2597 if (pBDLE->State.cbBelowFIFOW + cbRead FromSink> hdaStreamGetFIFOW(pThis, pStrmSt))2604 if (pBDLE->State.cbBelowFIFOW + cbRead > hdaStreamGetFIFOW(pThis, pStrmSt)) 2598 2605 { 2599 pBDLE->State.u32BufOff += cbRead FromSink;2606 pBDLE->State.u32BufOff += cbRead; 2600 2607 pBDLE->State.cbBelowFIFOW = 0; 2601 2608 //hdaBackendReadTransferReported(pBDLE, cbDMAData, cbRead, &cbRead, pcbAvail); … … 2603 2610 else 2604 2611 { 2605 pBDLE->State.u32BufOff += cbRead FromSink;2606 pBDLE->State.cbBelowFIFOW += cbRead FromSink;2612 pBDLE->State.u32BufOff += cbRead; 2613 pBDLE->State.cbBelowFIFOW += cbRead; 2607 2614 Assert(pBDLE->State.cbBelowFIFOW <= hdaStreamGetFIFOW(pThis, pStrmSt)); 2608 2615 //hdaBackendTransferUnreported(pThis, pBDLE, pStreamDesc, cbRead, pcbAvail); … … 2613 2620 } 2614 2621 2615 //Assert(cbRead <= (SDFIFOS(pThis, pStrmSt->u8Strm) + 1)); 2616 2617 LogFunc(("BDLE(off:%RU32, size:%RU32), cbTransferred=%RU32, rc=%Rrc\n", 2618 pBDLE->State.u32BufOff, pBDLE->u32BufSize, cbRead, rc)); 2622 Assert(cbRead <= pStrmSt->u16FIFOS); 2619 2623 2620 2624 if (RT_SUCCESS(rc)) … … 2624 2628 } 2625 2629 2630 LogFunc(("Returning cbRead=%RU32, rc=%Rrc\n", cbRead, rc)); 2626 2631 return rc; 2627 2632 } 2628 2633 2629 static int hdaWriteAudio(PHDASTATE pThis, PHDASTREAM pStrmSt, uint32_t *pcbWritten)2634 static int hdaWriteAudio(PHDASTATE pThis, PHDASTREAM pStrmSt, uint32_t cbMax, uint32_t *pcbWritten) 2630 2635 { 2631 2636 AssertPtrReturn(pThis, VERR_INVALID_POINTER); … … 2638 2643 2639 2644 uint32_t cbWritten = 0; 2640 uint32_t cbData = hdaStreamGetTransferSize(pThis, pStrmSt );2645 uint32_t cbData = hdaStreamGetTransferSize(pThis, pStrmSt, cbMax); 2641 2646 2642 2647 LogFlowFunc(("cbData=%RU32, %R[bdle]\n", cbData, pBDLE)); … … 2924 2929 { 2925 2930 Assert(cbOutMin != UINT32_MAX); 2926 hdaTransfer(pThis, PO_INDEX, NULL /* pcbProcessed */); /** @todo Add rc! */2931 hdaTransfer(pThis, PO_INDEX, cbOutMin /* cbMax */, NULL /* pcbProcessed */); /** @todo Add rc! */ 2927 2932 } 2928 2933 … … 2931 2936 */ 2932 2937 if (cbInMax) 2933 hdaTransfer(pThis, PI_INDEX, NULL /* pcbProcessed */); /** @todo Add rc! */2938 hdaTransfer(pThis, PI_INDEX, cbInMax /* cbMax */, NULL /* pcbProcessed */); /** @todo Add rc! */ 2934 2939 2935 2940 TMTimerSet(pThis->pTimer, TMTimerGet(pThis->pTimer) + pThis->uTicks); … … 2954 2959 AssertReturn(cbUser == sizeof(PDMAUDIOCALLBACKDATAIN), VERR_INVALID_PARAMETER); 2955 2960 2956 return hdaTransfer(pCtx->pThis, PI_INDEX, &pData->cbOutRead);2961 return hdaTransfer(pCtx->pThis, PI_INDEX, UINT32_MAX, &pData->cbOutRead); 2957 2962 } 2958 2963 … … 2973 2978 PHDASTATE pThis = pCtx->pThis; 2974 2979 2975 int rc = hdaTransfer(pCtx->pThis, PO_INDEX, &pData->cbOutWritten);2980 int rc = hdaTransfer(pCtx->pThis, PO_INDEX, UINT32_MAX, &pData->cbOutWritten); 2976 2981 if ( RT_SUCCESS(rc) 2977 2982 && pData->cbOutWritten) … … 2988 2993 #endif /* VBOX_WITH_AUDIO_CALLBACKS */ 2989 2994 2990 static int hdaTransfer(PHDASTATE pThis, ENMSOUNDSOURCE enmSrc, uint32_t *pcbProcessed)2995 static int hdaTransfer(PHDASTATE pThis, ENMSOUNDSOURCE enmSrc, uint32_t cbMax, uint32_t *pcbProcessed) 2991 2996 { 2992 2997 AssertPtrReturn(pThis, VERR_INVALID_POINTER); 2993 2998 /* pcbProcessed is optional. */ 2994 2999 2995 LogFlowFunc(("enmSrc=%RU32 \n", enmSrc));3000 LogFlowFunc(("enmSrc=%RU32, cbMax=%RU32\n", enmSrc, cbMax)); 2996 3001 2997 3002 PHDASTREAM pStrmSt; … … 3045 3050 } 3046 3051 3047 Assert(pStrmSt->u8Strm <= 7); /** @todo Use a define for MAX_STR AEMS! */3052 Assert(pStrmSt->u8Strm <= 7); /** @todo Use a define for MAX_STREAMS! */ 3048 3053 Assert(pStrmSt->u64BaseDMA); 3049 3054 Assert(pStrmSt->u32CBL); 3050 3055 3051 3056 int rc; 3057 uint32_t cbToProcess = cbMax; 3052 3058 uint32_t cbProcessedTotal = 0; 3053 3059 bool fIsComplete = false; 3054 3060 3055 do3061 while (cbToProcess) 3056 3062 { 3057 3063 /* Do we need to fetch the next Buffer Descriptor Entry (BDLE)? */ … … 3066 3072 { 3067 3073 case PI_INDEX: 3068 rc = hdaReadAudio(pThis, pStrmSt, pThis->pSinkLineIn, &cbProcessed);3074 rc = hdaReadAudio(pThis, pStrmSt, pThis->pSinkLineIn, cbToProcess, &cbProcessed); 3069 3075 break; 3070 3076 case PO_INDEX: 3071 rc = hdaWriteAudio(pThis, pStrmSt, &cbProcessed);3077 rc = hdaWriteAudio(pThis, pStrmSt, cbToProcess, &cbProcessed); 3072 3078 break; 3073 3079 #ifdef VBOX_WITH_HDA_MIC_IN 3074 3080 case MC_INDEX: 3075 rc = hdaReadAudio(pThis, pStrmSt, pThis->pSinkMicIn, &cbProcessed);3081 rc = hdaReadAudio(pThis, pStrmSt, pThis->pSinkMicIn, cbToProcess, &cbProcessed); 3076 3082 break; 3077 3083 #endif … … 3090 3096 hdaStreamTransferUpdate(pThis, pStrmSt, cbProcessed); 3091 3097 3098 cbToProcess -= RT_MIN(cbToProcess, cbProcessed); 3092 3099 cbProcessedTotal += cbProcessed; 3093 3100 3094 LogFlowFunc(("cbProcessed=%RU32, cbProcessedTotal=%RU32, rc=%Rrc\n", cbProcessed, cbProcessedTotal, rc)); 3101 LogFlowFunc(("cbProcessed=%RU32, cbToProcess=%RU32, cbProcessedTotal=%RU32, rc=%Rrc\n", 3102 cbProcessed, cbToProcess, cbProcessedTotal, rc)); 3095 3103 3096 3104 if (rc == VINF_EOF) … … 3100 3108 fIsComplete = hdaStreamTransferIsComplete(pThis, pStrmSt); 3101 3109 3102 } while (!fIsComplete); 3110 if (fIsComplete) 3111 break; 3112 } 3103 3113 3104 3114 if (RT_SUCCESS(rc))
Note:
See TracChangeset
for help on using the changeset viewer.