2 * PROJECT: ReactOS Sound System "MME Buddy" Library
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: lib/drivers/sound/mmebuddy/header.c
6 * PURPOSE: Wave header preparation routines
8 * PROGRAMMERS: Andrew Greenwood (silverblade@reactos.org)
19 This structure gets used locally within functions as a way to shuttle data
20 to the sound thread. It's safe to use locally since CallSoundThread will
21 not return until the operation has been carried out.
26 MMWAVEHEADER_FUNC Function
;
28 } THREADED_WAVEHEADER_PARAMETERS
;
32 Helper routines to simplify the call to the sound thread for the header
37 WaveHeaderOperationInSoundThread(
38 PSOUND_DEVICE_INSTANCE SoundDeviceInstance
,
41 THREADED_WAVEHEADER_PARAMETERS
* Parameters
= (THREADED_WAVEHEADER_PARAMETERS
*) Parameter
;
42 return Parameters
->Function(SoundDeviceInstance
, Parameters
->Header
);
47 MMWAVEHEADER_FUNC Function
,
48 PSOUND_DEVICE_INSTANCE SoundDeviceInstance
,
51 THREADED_WAVEHEADER_PARAMETERS Parameters
;
53 Parameters
.Function
= Function
;
54 Parameters
.Header
= Header
;
56 return CallSoundThread(SoundDeviceInstance
,
57 WaveHeaderOperationInSoundThread
,
63 The following routines are basically handlers for:
68 All of these calls are ultimately dealt with in the context of the
69 appropriate sound thread, so the implementation should expect itself to
70 be running in this other thread when any of these operations take place.
75 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance
,
79 PSOUND_DEVICE SoundDevice
;
80 PMMFUNCTION_TABLE FunctionTable
;
82 VALIDATE_MMSYS_PARAMETER( IsValidSoundDeviceInstance(SoundDeviceInstance
) );
83 VALIDATE_MMSYS_PARAMETER( Header
);
85 SND_TRACE(L
"Preparing wave header\n");
87 Result
= GetSoundDeviceFromInstance(SoundDeviceInstance
, &SoundDevice
);
88 if ( ! MMSUCCESS(Result
) )
89 return TranslateInternalMmResult(Result
);
91 Result
= GetSoundDeviceFunctionTable(SoundDevice
, &FunctionTable
);
92 if ( ! MMSUCCESS(Result
) )
93 return TranslateInternalMmResult(Result
);
95 if ( ! FunctionTable
->PrepareWaveHeader
)
96 return MMSYSERR_NOTSUPPORTED
;
98 return WaveHeaderOperation(FunctionTable
->PrepareWaveHeader
,
105 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance
,
109 PSOUND_DEVICE SoundDevice
;
110 PMMFUNCTION_TABLE FunctionTable
;
112 VALIDATE_MMSYS_PARAMETER( IsValidSoundDeviceInstance(SoundDeviceInstance
) );
113 VALIDATE_MMSYS_PARAMETER( Header
);
115 SND_TRACE(L
"Un-preparing wave header\n");
117 Result
= GetSoundDeviceFromInstance(SoundDeviceInstance
, &SoundDevice
);
118 if ( ! MMSUCCESS(Result
) )
119 return TranslateInternalMmResult(Result
);
121 Result
= GetSoundDeviceFunctionTable(SoundDevice
, &FunctionTable
);
122 if ( ! MMSUCCESS(Result
) )
123 return TranslateInternalMmResult(Result
);
125 if ( ! FunctionTable
->UnprepareWaveHeader
)
126 return MMSYSERR_NOTSUPPORTED
;
128 return WaveHeaderOperation(FunctionTable
->UnprepareWaveHeader
,
135 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance
,
139 PSOUND_DEVICE SoundDevice
;
140 PMMFUNCTION_TABLE FunctionTable
;
142 VALIDATE_MMSYS_PARAMETER( IsValidSoundDeviceInstance(SoundDeviceInstance
) );
143 VALIDATE_MMSYS_PARAMETER( Header
);
145 SND_TRACE(L
"Submitting wave header\n");
147 Result
= GetSoundDeviceFromInstance(SoundDeviceInstance
, &SoundDevice
);
148 if ( ! MMSUCCESS(Result
) )
149 return TranslateInternalMmResult(Result
);
151 Result
= GetSoundDeviceFunctionTable(SoundDevice
, &FunctionTable
);
152 if ( ! MMSUCCESS(Result
) )
153 return TranslateInternalMmResult(Result
);
155 if ( ! FunctionTable
->SubmitWaveHeader
)
156 return MMSYSERR_NOTSUPPORTED
;
159 A few minor sanity checks - any custom checks should've been carried
160 out during wave header preparation etc.
162 VALIDATE_MMSYS_PARAMETER( Header
->lpData
!= NULL
);
163 VALIDATE_MMSYS_PARAMETER( Header
->dwBufferLength
> 0 );
164 VALIDATE_MMSYS_PARAMETER( Header
->dwFlags
& WHDR_PREPARED
);
165 VALIDATE_MMSYS_PARAMETER( ! Header
->dwFlags
& WHDR_INQUEUE
);
167 /* Clear the "done" flag for the buffer */
168 Header
->dwFlags
&= ~WHDR_DONE
;
170 Result
= WaveHeaderOperation(FunctionTable
->SubmitWaveHeader
,
174 if ( ! MMSUCCESS(Result
) )
179 /* Set the "in queue" flag if everything was OK */
180 Header
->dwFlags
|= WHDR_INQUEUE
;
182 return MMSYSERR_NOERROR
;