- Update to r53061
[reactos.git] / lib / drivers / sound / mmebuddy / wave / format.c
1 /*
2 * PROJECT: ReactOS Sound System "MME Buddy" Library
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: lib/drivers/sound/mmebuddy/wave/format.c
5 *
6 * PURPOSE: Queries and sets wave device format (sample rate, etc.)
7 *
8 * PROGRAMMERS: Andrew Greenwood (silverblade@reactos.org)
9 */
10
11 #include "precomp.h"
12
13 MMRESULT
14 QueryWaveDeviceFormatSupport(
15 IN PSOUND_DEVICE SoundDevice,
16 IN LPWAVEFORMATEX Format,
17 IN DWORD FormatSize)
18 {
19 MMRESULT Result;
20 MMDEVICE_TYPE DeviceType;
21 PMMFUNCTION_TABLE FunctionTable;
22
23 SND_TRACE(L"Querying wave format support\n");
24
25 VALIDATE_MMSYS_PARAMETER( IsValidSoundDevice(SoundDevice) );
26 VALIDATE_MMSYS_PARAMETER( Format );
27 VALIDATE_MMSYS_PARAMETER( FormatSize >= sizeof(WAVEFORMATEX) );
28
29 Result = GetSoundDeviceType(SoundDevice, &DeviceType);
30 SND_ASSERT( Result == MMSYSERR_NOERROR );
31
32 /* Ensure we have a wave device (TODO: check if this applies to wavein as well) */
33 VALIDATE_MMSYS_PARAMETER( IS_WAVE_DEVICE_TYPE(DeviceType) );
34
35 /* Obtain the function table */
36 Result = GetSoundDeviceFunctionTable(SoundDevice, &FunctionTable);
37 SND_ASSERT( Result == MMSYSERR_NOERROR );
38
39 if ( ! MMSUCCESS(Result) )
40 return TranslateInternalMmResult(Result);
41
42 if ( ! FunctionTable->QueryWaveFormatSupport )
43 return MMSYSERR_NOTSUPPORTED;
44
45 return FunctionTable->QueryWaveFormatSupport(SoundDevice, Format, FormatSize);
46 }
47
48 MMRESULT
49 SetWaveDeviceFormat(
50 IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
51 IN DWORD DeviceId,
52 IN LPWAVEFORMATEX Format,
53 IN DWORD FormatSize)
54 {
55 MMRESULT Result;
56 MMDEVICE_TYPE DeviceType;
57 PMMFUNCTION_TABLE FunctionTable;
58 PSOUND_DEVICE SoundDevice;
59
60 SND_TRACE(L"Setting wave format\n");
61
62 VALIDATE_MMSYS_PARAMETER( IsValidSoundDeviceInstance(SoundDeviceInstance) );
63
64 Result = GetSoundDeviceFromInstance(SoundDeviceInstance, &SoundDevice);
65 if ( ! MMSUCCESS(Result) )
66 return TranslateInternalMmResult(Result);
67
68 Result = GetSoundDeviceType(SoundDevice, &DeviceType);
69 SND_ASSERT( Result == MMSYSERR_NOERROR );
70 if (DeviceType == WAVE_IN_DEVICE_TYPE || DeviceType == WAVE_OUT_DEVICE_TYPE)
71 {
72 VALIDATE_MMSYS_PARAMETER( Format );
73 VALIDATE_MMSYS_PARAMETER( FormatSize >= sizeof(WAVEFORMATEX) );
74 }
75
76 /* Ensure we have a wave device (TODO: check if this applies to wavein as well) */
77 VALIDATE_MMSYS_PARAMETER( IS_WAVE_DEVICE_TYPE(DeviceType) || IS_MIDI_DEVICE_TYPE(DeviceType) || IS_MIXER_DEVICE_TYPE(DeviceType));
78
79 /* Obtain the function table */
80 Result = GetSoundDeviceFunctionTable(SoundDevice, &FunctionTable);
81 SND_ASSERT( Result == MMSYSERR_NOERROR );
82
83 if ( ! MMSUCCESS(Result) )
84 return TranslateInternalMmResult(Result);
85
86 if ( ! FunctionTable->SetWaveFormat )
87 return MMSYSERR_NOTSUPPORTED;
88
89 return FunctionTable->SetWaveFormat(SoundDeviceInstance, DeviceId, Format, FormatSize);
90 }