@@ -1059,10 +1059,22 @@ RTStreamingThreadProc(
10591059{
10601060 NTSTATUS Status ;
10611061 PVOID WaitObjects [2 ];
1062+ PSOUND_DEVICE SoundDevice ;
1063+ MMDEVICE_TYPE DeviceType ;
1064+ MMRESULT Result ;
1065+
10621066 PSOUND_DEVICE_INSTANCE SoundDeviceInstance ;
10631067
10641068 SoundDeviceInstance = (PSOUND_DEVICE_INSTANCE )Parameter ;
10651069
1070+ Result = GetSoundDeviceFromInstance (SoundDeviceInstance , & SoundDevice );
1071+ if ( ! MMSUCCESS (Result ) )
1072+ {
1073+ return TranslateInternalMmResult (Result );
1074+ }
1075+ Result = GetSoundDeviceType (SoundDevice , & DeviceType );
1076+ SND_ASSERT ( Result == MMSYSERR_NOERROR );
1077+
10661078 WaitObjects [0 ] = (PVOID )SoundDeviceInstance -> hNotifyRTStreamingStopEvent ;
10671079 WaitObjects [1 ] = (PVOID )SoundDeviceInstance -> hNotifyRTStreamingEvent ;
10681080
@@ -1078,40 +1090,57 @@ RTStreamingThreadProc(
10781090
10791091 DWORD Length = SoundDeviceInstance -> RTStreamingBufferLength / 2 ;
10801092 LONG BytesCopied = 0 ;
1081- if (SoundDeviceInstance -> RTStreamingShadowBufferOffset )
1093+ if (DeviceType == WAVE_OUT_DEVICE_TYPE )
10821094 {
1083- SoundDeviceInstance -> RTStreamingStarted = TRUE;
1084- LONG OffsetInBuffer = SoundDeviceInstance -> RTStreamingBufferOffset % Length ;
1085- BytesCopied = min (Length , SoundDeviceInstance -> RTStreamingShadowBufferOffset );
1086- BytesCopied = min (BytesCopied , Length - OffsetInBuffer );
1095+ if (SoundDeviceInstance -> RTStreamingShadowBufferOffset )
1096+ {
1097+ SoundDeviceInstance -> RTStreamingStarted = TRUE;
1098+ LONG OffsetInBuffer = SoundDeviceInstance -> RTStreamingBufferOffset % Length ;
1099+ BytesCopied = min (Length , SoundDeviceInstance -> RTStreamingShadowBufferOffset );
1100+ BytesCopied = min (BytesCopied , Length - OffsetInBuffer );
10871101 //DPRINT1("RTStreamingBufferOffset %u Remaining %u Buffer %p\n",SoundDeviceInstance->RTStreamingBufferOffset, BytesCopied, SoundDeviceInstance->RTStreamingBuffer);
1088- RtlCopyMemory (
1089- & SoundDeviceInstance -> RTStreamingBuffer [SoundDeviceInstance -> RTStreamingBufferOffset ],
1090- SoundDeviceInstance -> RTStreamingShadowBuffer ,
1091- BytesCopied );
1092- RtlMoveMemory (SoundDeviceInstance -> RTStreamingShadowBuffer ,
1102+ RtlCopyMemory (
1103+ & SoundDeviceInstance -> RTStreamingBuffer [SoundDeviceInstance -> RTStreamingBufferOffset ],
1104+ SoundDeviceInstance -> RTStreamingShadowBuffer ,
1105+ BytesCopied );
1106+ RtlMoveMemory (SoundDeviceInstance -> RTStreamingShadowBuffer ,
10931107 & SoundDeviceInstance -> RTStreamingShadowBuffer [BytesCopied ],
10941108 SoundDeviceInstance -> RTStreamingShadowBufferLength - BytesCopied );
1095- InterlockedExchangeAdd (& SoundDeviceInstance -> RTStreamingShadowBufferOffset , - BytesCopied );
1096- InterlockedExchangeAdd (& SoundDeviceInstance -> RTStreamingBufferBytesWritten , BytesCopied );
1097- InterlockedExchangeAdd (& SoundDeviceInstance -> RTStreamingBufferOffset , BytesCopied );
1098- InterlockedCompareExchange (& SoundDeviceInstance -> RTStreamingBufferOffset , 0 , SoundDeviceInstance -> RTStreamingBufferLength );
1109+ InterlockedExchangeAdd (& SoundDeviceInstance -> RTStreamingShadowBufferOffset , - BytesCopied );
1110+ InterlockedExchangeAdd (& SoundDeviceInstance -> RTStreamingBufferBytesWritten , BytesCopied );
1111+ InterlockedExchangeAdd (& SoundDeviceInstance -> RTStreamingBufferOffset , BytesCopied );
1112+ InterlockedCompareExchange (& SoundDeviceInstance -> RTStreamingBufferOffset , 0 , SoundDeviceInstance -> RTStreamingBufferLength );
1113+ }
1114+ if (BytesCopied == 0 )
1115+ {
1116+ // insert silence glitch
1117+ LONG Remaining = Length - BytesCopied ;
1118+ LONG OffsetInBuffer = SoundDeviceInstance -> RTStreamingBufferOffset % Length ;
1119+ Remaining = min (Remaining , SoundDeviceInstance -> RTStreamingBufferLength - SoundDeviceInstance -> RTStreamingBufferOffset );
1120+ Remaining = min (Remaining , Length - OffsetInBuffer );
1121+ DPRINT1 ("Silence glitch: RTStreamingBufferOffset %u Remaining %u Buffer %p\n" ,SoundDeviceInstance -> RTStreamingBufferOffset , Remaining , SoundDeviceInstance -> RTStreamingBuffer );
1122+ ASSERT (SoundDeviceInstance );
1123+ ASSERT (SoundDeviceInstance -> RTStreamingBuffer );
1124+ RtlZeroMemory (
1125+ & SoundDeviceInstance -> RTStreamingBuffer [SoundDeviceInstance -> RTStreamingBufferOffset ],
1126+ Remaining
1127+ );
1128+ InterlockedExchangeAdd (& SoundDeviceInstance -> RTStreamingBufferOffset , Remaining );
1129+ InterlockedCompareExchange (& SoundDeviceInstance -> RTStreamingBufferOffset , 0 , SoundDeviceInstance -> RTStreamingBufferLength );
1130+ }
10991131 }
1100- if (BytesCopied == 0 )
1132+ else if (DeviceType == WAVE_IN_DEVICE_TYPE )
11011133 {
1102- // insert silence glitch
1103- LONG Remaining = Length - BytesCopied ;
1104- LONG OffsetInBuffer = SoundDeviceInstance -> RTStreamingBufferOffset % Length ;
1105- Remaining = min (Remaining , SoundDeviceInstance -> RTStreamingBufferLength - SoundDeviceInstance -> RTStreamingBufferOffset );
1106- Remaining = min (Remaining , Length - OffsetInBuffer );
1107- DPRINT1 ("Silence glitch: RTStreamingBufferOffset %u Remaining %u Buffer %p\n" ,SoundDeviceInstance -> RTStreamingBufferOffset , Remaining , SoundDeviceInstance -> RTStreamingBuffer );
1108- ASSERT (SoundDeviceInstance );
1109- ASSERT (SoundDeviceInstance -> RTStreamingBuffer );
1110- RtlZeroMemory (
1111- & SoundDeviceInstance -> RTStreamingBuffer [SoundDeviceInstance -> RTStreamingBufferOffset ],
1112- Remaining
1113- );
1114- InterlockedExchangeAdd (& SoundDeviceInstance -> RTStreamingBufferOffset , Remaining );
1134+ SoundDeviceInstance -> RTStreamingStarted = TRUE;
1135+ LONG OffsetInStreamingBuffer = SoundDeviceInstance -> RTStreamingBufferOffset % Length ;
1136+ LONG OffsetInStreamingShadowBuffer = SoundDeviceInstance -> RTStreamingShadowBufferOffset ;
1137+ BytesCopied = min (Length - OffsetInStreamingBuffer , SoundDeviceInstance -> RTStreamingShadowBufferLength - OffsetInStreamingShadowBuffer );
1138+ RtlCopyMemory (
1139+ & SoundDeviceInstance -> RTStreamingShadowBuffer [SoundDeviceInstance -> RTStreamingShadowBufferOffset ],
1140+ & SoundDeviceInstance -> RTStreamingBuffer [SoundDeviceInstance -> RTStreamingBufferOffset ],
1141+ BytesCopied );
1142+ InterlockedExchangeAdd (& SoundDeviceInstance -> RTStreamingShadowBufferOffset , BytesCopied );
1143+ InterlockedExchangeAdd (& SoundDeviceInstance -> RTStreamingBufferOffset , BytesCopied );
11151144 InterlockedCompareExchange (& SoundDeviceInstance -> RTStreamingBufferOffset , 0 , SoundDeviceInstance -> RTStreamingBufferLength );
11161145 }
11171146 }
@@ -1205,19 +1234,43 @@ WdmAudCommitWaveBufferByMMixer(
12051234 Status = STATUS_CANCELLED ;
12061235 break ;
12071236 }
1208- DWORD BytesCopied = min (Length - Offset , SoundDeviceInstance -> RTStreamingShadowBufferLength - SoundDeviceInstance -> RTStreamingShadowBufferOffset );
1209- ASSERT (SoundDeviceInstance -> RTStreamingShadowBuffer );
1210- RtlCopyMemory (
1211- & SoundDeviceInstance -> RTStreamingShadowBuffer [SoundDeviceInstance -> RTStreamingShadowBufferOffset ],
1212- & (((PUCHAR )OffsetPtr )[Offset ]),
1213- BytesCopied
1214- );
1215- InterlockedExchangeAdd (& SoundDeviceInstance -> RTStreamingShadowBufferOffset , BytesCopied );
1216- Offset += BytesCopied ;
1217- if (Offset < Length )
1237+ if (DeviceType == WAVE_OUT_DEVICE_TYPE )
12181238 {
1219- //DPRINT1("Waiting...\n");
1220- Sleep (1 );
1239+ DWORD BytesCopied = min (Length - Offset , SoundDeviceInstance -> RTStreamingShadowBufferLength - SoundDeviceInstance -> RTStreamingShadowBufferOffset );
1240+ ASSERT (SoundDeviceInstance -> RTStreamingShadowBuffer );
1241+ RtlCopyMemory (
1242+ & SoundDeviceInstance -> RTStreamingShadowBuffer [SoundDeviceInstance -> RTStreamingShadowBufferOffset ],
1243+ & (((PUCHAR )OffsetPtr )[Offset ]),
1244+ BytesCopied
1245+ );
1246+ InterlockedExchangeAdd (& SoundDeviceInstance -> RTStreamingShadowBufferOffset , BytesCopied );
1247+ Offset += BytesCopied ;
1248+ if (Offset < Length )
1249+ {
1250+ //DPRINT1("Waiting...\n");
1251+ Sleep (1 );
1252+ }
1253+ }
1254+ else if (DeviceType == WAVE_IN_DEVICE_TYPE )
1255+ {
1256+ while (SoundDeviceInstance -> RTStreamingShadowBufferOffset == 0 )
1257+ {
1258+ //DPRINT1("Waiting...\n");
1259+ Sleep (1 );
1260+ }
1261+
1262+ LONG BytesCopied = min (Length - Offset , SoundDeviceInstance -> RTStreamingShadowBufferOffset );
1263+ ASSERT (SoundDeviceInstance -> RTStreamingShadowBuffer );
1264+ RtlCopyMemory (
1265+ & (((PUCHAR )OffsetPtr )[Offset ]),
1266+ SoundDeviceInstance -> RTStreamingShadowBuffer ,
1267+ BytesCopied
1268+ );
1269+ InterlockedExchangeAdd (& SoundDeviceInstance -> RTStreamingShadowBufferOffset , - BytesCopied );
1270+ RtlMoveMemory (SoundDeviceInstance -> RTStreamingShadowBuffer ,
1271+ & SoundDeviceInstance -> RTStreamingShadowBuffer [BytesCopied ],
1272+ SoundDeviceInstance -> RTStreamingShadowBufferLength - BytesCopied );
1273+ Offset += BytesCopied ;
12211274 }
12221275 }
12231276 PCOMPLETION_CONTEXT Context = AllocateMemory (sizeof (COMPLETION_CONTEXT ));
0 commit comments