Skip to content

Commit 2d77a85

Browse files
committed
[WMDAUD.DRV][MMEBUDDY]
- Support wave in recording in RT streaming
1 parent ce7e55c commit 2d77a85

3 files changed

Lines changed: 131 additions & 48 deletions

File tree

dll/win32/wdmaud.drv/mmixer.c

Lines changed: 93 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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));

sdk/lib/drivers/sound/mmebuddy/mmewrap.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ MmeSetState(
2424
PMMFUNCTION_TABLE FunctionTable;
2525
PSOUND_DEVICE SoundDevice;
2626
PSOUND_DEVICE_INSTANCE SoundDeviceInstance;
27+
MMDEVICE_TYPE DeviceType;
2728
BOOL OldState;
2829

2930
VALIDATE_MMSYS_PARAMETER( PrivateHandle );
@@ -35,6 +36,10 @@ MmeSetState(
3536
if ( ! MMSUCCESS(Result) )
3637
return TranslateInternalMmResult(Result);
3738

39+
Result = GetSoundDeviceType(SoundDevice, &DeviceType);
40+
if ( ! MMSUCCESS(Result) )
41+
return TranslateInternalMmResult(Result);
42+
3843
/* Get the function table, and validate it */
3944
Result = GetSoundDeviceFunctionTable(SoundDevice, &FunctionTable);
4045
if ( ! MMSUCCESS(Result) )
@@ -57,7 +62,7 @@ MmeSetState(
5762
/* Store audio stream pause state */
5863
SoundDeviceInstance->bPaused = !bStart;
5964

60-
if (SoundDeviceInstance->bPaused == FALSE && OldState)
65+
if (SoundDeviceInstance->bPaused == FALSE && (OldState || DeviceType == WAVE_IN_DEVICE_TYPE))
6166
{
6267
InitiateSoundStreaming(SoundDeviceInstance);
6368
}

sdk/lib/drivers/sound/mmebuddy/wave/header.c

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,9 @@ EnqueueWaveHeader(
221221
PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
222222
IN PVOID Parameter)
223223
{
224+
MMDEVICE_TYPE DeviceType;
225+
PSOUND_DEVICE SoundDevice;
226+
MMRESULT Result;
224227
PWAVEHDR WaveHeader = (PWAVEHDR) Parameter;
225228

226229
SND_ASSERT(SoundDeviceInstance);
@@ -235,33 +238,55 @@ EnqueueWaveHeader(
235238
/* Set the "in queue" flag */
236239
WaveHeader->dwFlags |= WHDR_INQUEUE;
237240

241+
Result = GetSoundDeviceFromInstance(SoundDeviceInstance, &SoundDevice);
242+
if ( ! MMSUCCESS(Result) )
243+
{
244+
return TranslateInternalMmResult(Result);
245+
}
246+
247+
Result = GetSoundDeviceType(SoundDevice, &DeviceType);
248+
if ( ! MMSUCCESS(Result) )
249+
{
250+
return TranslateInternalMmResult(Result);
251+
}
252+
238253
if ( ! SoundDeviceInstance->HeadWaveHeader )
239254
{
240255
/* This is the first header in the queue */
241256
SND_TRACE(L"Enqueued first wave header\n");
242257
SoundDeviceInstance->HeadWaveHeader = WaveHeader;
243258
SoundDeviceInstance->TailWaveHeader = WaveHeader;
244259

245-
/* Only do wave streaming when the stream has not been paused */
246-
if (SoundDeviceInstance->bPaused == FALSE && SoundDeviceInstance->bClosed == FALSE)
260+
if (DeviceType == WAVE_OUT_DEVICE_TYPE)
247261
{
248-
if (SoundDeviceInstance->RTStreamingEnabled)
262+
/* Only do wave streaming when the stream has not been paused */
263+
if (SoundDeviceInstance->bPaused == FALSE && SoundDeviceInstance->bClosed == FALSE)
249264
{
250-
/* queue a thread when application does submit multiple buffers */
251-
if (WaveHeader->dwBufferLength < SoundDeviceInstance->RTStreamingShadowBufferLength)
265+
if (SoundDeviceInstance->RTStreamingEnabled)
252266
{
253-
InitiateSoundStreaming(SoundDeviceInstance);
267+
/* queue a thread when application does submit multiple buffers */
268+
if (WaveHeader->dwBufferLength < SoundDeviceInstance->RTStreamingShadowBufferLength)
269+
{
270+
InitiateSoundStreaming(SoundDeviceInstance);
271+
}
272+
else
273+
{
274+
DoWaveStreaming(SoundDeviceInstance);
275+
}
254276
}
255277
else
256278
{
257279
DoWaveStreaming(SoundDeviceInstance);
258280
}
259281
}
260-
else
282+
} else if (DeviceType == WAVE_IN_DEVICE_TYPE)
283+
{
284+
if (SoundDeviceInstance->RTStreamingStarted)
261285
{
262286
DoWaveStreaming(SoundDeviceInstance);
263287
}
264288
}
289+
265290
}
266291
else
267292
{

0 commit comments

Comments
 (0)