Changeset 88160 in vbox
- Timestamp:
- Mar 17, 2021 3:45:09 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/HDAStream.cpp
r88159 r88160 1054 1054 return (uint32_t)RTCircBufFree(pStreamR3->State.pCircBuf); 1055 1055 return 0; 1056 }1057 1058 /**1059 * Reads audio data from an HDA stream's DMA buffer and writes into a specified mixer sink.1060 *1061 * @returns IPRT status code.1062 * @param pStreamR3 HDA stream to read audio data from (ring-3).1063 * @param cbToRead Number of bytes to read.1064 * @param pcbRead Number of bytes read. Optional.1065 */1066 static int hdaR3StreamRead(PHDASTREAMR3 pStreamR3, uint32_t cbToRead, uint32_t *pcbRead)1067 {1068 Assert(cbToRead);1069 1070 PHDAMIXERSINK pSink = pStreamR3->pMixSink;1071 AssertMsgReturnStmt(pSink, ("[SD%RU8] Can't read from a stream with no sink attached\n", pStreamR3->u8SD),1072 if (pcbRead) *pcbRead = 0,1073 VINF_SUCCESS);1074 1075 PRTCIRCBUF pCircBuf = pStreamR3->State.pCircBuf;1076 AssertPtr(pCircBuf);1077 1078 int rc = VINF_SUCCESS;1079 1080 uint32_t cbReadTotal = 0;1081 uint32_t cbLeft = RT_MIN(cbToRead, (uint32_t)RTCircBufUsed(pCircBuf));1082 1083 while (cbLeft)1084 {1085 void *pvSrc;1086 size_t cbSrc;1087 1088 uint32_t cbWritten = 0;1089 1090 RTCircBufAcquireReadBlock(pCircBuf, cbLeft, &pvSrc, &cbSrc);1091 1092 if (cbSrc)1093 {1094 if (pStreamR3->Dbg.Runtime.fEnabled)1095 DrvAudioHlpFileWrite(pStreamR3->Dbg.Runtime.pFileStream, pvSrc, cbSrc, 0 /* fFlags */);1096 1097 rc = AudioMixerSinkWrite(pSink->pMixSink, AUDMIXOP_COPY, pvSrc, (uint32_t)cbSrc, &cbWritten);1098 AssertRC(rc);1099 Assert(cbSrc >= cbWritten);1100 1101 Log2Func(("[SD%RU8] %#RX32/%#zx bytes read @ %#RX64\n", pStreamR3->u8SD, cbWritten, cbSrc, pStreamR3->State.offRead));1102 #ifdef VBOX_WITH_DTRACE1103 VBOXDD_HDA_STREAM_AIO_OUT(pStreamR3->u8SD, (uint32_t)cbSrc, pStreamR3->State.offRead);1104 #endif1105 pStreamR3->State.offRead += cbSrc;1106 }1107 1108 RTCircBufReleaseReadBlock(pCircBuf, cbWritten);1109 1110 if ( !cbWritten /* Nothing written? */1111 || RT_FAILURE(rc))1112 break;1113 1114 Assert(cbLeft >= cbWritten);1115 cbLeft -= cbWritten;1116 1117 cbReadTotal += cbWritten;1118 }1119 1120 if (pcbRead)1121 *pcbRead = cbReadTotal;1122 1123 return rc;1124 1056 } 1125 1057 … … 1990 1922 static void hdaR3StreamPushToMixer(PHDASTREAM pStreamShared, PHDASTREAMR3 pStreamR3, PAUDMIXSINK pSink, uint64_t nsNow) 1991 1923 { 1924 /* 1925 * Figure how much that we can push down. 1926 */ 1992 1927 uint32_t const cbSinkWritable = AudioMixerSinkGetWritable(pSink); 1993 1928 uint32_t const cbStreamReadable = hdaR3StreamGetUsed(pStreamR3); … … 2001 1936 RT_NOREF(pStreamShared, nsNow); 2002 1937 2003 if (cbToReadFromStream) 2004 { 2005 /* Read (guest output) data and write it to the stream's sink. */ 2006 int rc2 = hdaR3StreamRead(pStreamR3, cbToReadFromStream, NULL /* pcbRead */); 2007 AssertRC(rc2); 1938 /* 1939 * Do the pushing. 1940 */ 1941 Assert(pStreamR3->State.pCircBuf); 1942 while (cbToReadFromStream > 0) 1943 { 1944 void /*const*/ *pvSrcBuf; 1945 size_t cbSrcBuf; 1946 RTCircBufAcquireReadBlock(pStreamR3->State.pCircBuf, cbToReadFromStream, &pvSrcBuf, &cbSrcBuf); 1947 1948 if (!pStreamR3->Dbg.Runtime.fEnabled) 1949 { /* likely */ } 1950 else 1951 DrvAudioHlpFileWrite(pStreamR3->Dbg.Runtime.pFileStream, pvSrcBuf, cbSrcBuf, 0 /* fFlags */); 1952 1953 uint32_t cbWritten = 0; 1954 int rc = AudioMixerSinkWrite(pSink, AUDMIXOP_COPY, pvSrcBuf, (uint32_t)cbSrcBuf, &cbWritten); 1955 AssertRC(rc); 1956 Assert(cbWritten <= cbSrcBuf); 1957 1958 Log2Func(("[SD%RU8] %#RX32/%#zx bytes read @ %#RX64\n", pStreamR3->u8SD, cbWritten, cbSrcBuf, pStreamR3->State.offRead)); 1959 #ifdef VBOX_WITH_DTRACE 1960 VBOXDD_HDA_STREAM_AIO_OUT(pStreamR3->u8SD, cbWritten, pStreamR3->State.offRead); 1961 #endif 1962 pStreamR3->State.offRead += cbWritten; 1963 1964 RTCircBufReleaseReadBlock(pStreamR3->State.pCircBuf, cbWritten); 1965 1966 /* advance */ 1967 cbToReadFromStream -= cbWritten; 2008 1968 } 2009 1969
Note:
See TracChangeset
for help on using the changeset viewer.