import "unknwn.idl";
import "austream.idl";


interface IWaveInStream;
interface IWaveSampleCallback;
interface IWaveStreamSample;

// just a placeholder so MIDL will generate the interface
// for IWaveSampleCallback
interface WaveSample;
cpp_quote("// This is a hack so MIDL will generate the interface of IWaveSampleCallback!")
cpp_quote("#ifdef __cplusplus")
cpp_quote("class WaveSample;")
cpp_quote("#else")
cpp_quote("typedef void WaveSample;")
cpp_quote("#endif")
cpp_quote("")


cpp_quote("// IWaveStreamSample property flags")
cpp_quote("#define WSS_RECORDING_FLAGS 1")
cpp_quote("#define WSS_SIGNAL_STRENGTH 2")
cpp_quote("")
cpp_quote("// bit properties for WSS_RECORDING_FLAGS")
cpp_quote("#define WSS_SILENT	1")
cpp_quote("#define WSS_ECHOREDUCTION 2")
cpp_quote("")
cpp_quote("// SetDuplexControlObject() can take either a handle to an event or mutex")
cpp_quote("#define WIS_DUPLEX_EVENT	1")
cpp_quote("#define WIS_DUPLEX_MUTEX	2")





[
object,
local,
uuid(17cb3bc0-6fd4-11d1-a95b-00c04fd7ccf1),
pointer_default(unique)
]

interface IWaveInStream : IAudioMediaStream
{
	HRESULT SetDeviceID([in] UINT uWaveDevID);
	HRESULT GetDeviceID([out] UINT *puWaveDevID);
	HRESULT SetDefaultPacketSize([in] int nBytes);

	HRESULT Start();
	HRESULT Stop();

	HRESULT SetSilenceThreshold([in] DWORD dwThresh, BOOL bAutomatic);
	HRESULT SetSilenceTimeout([in] DWORD dwMilliSecs);
	HRESULT SetDuplex(BOOL bFull);
	HRESULT SetDuplexControlObject(HANDLE hand, int nType);


};



[
object,
local,
uuid(72b36900-7640-11d1-a95b-00c04fd7ccf1),
pointer_default(unique)
]

interface IWaveSampleCallback : IUnknown
{
	HRESULT SampleUpdate(WaveSample *pWaveSample, DWORD dwFlags, HANDLE hEvent, PAPCFUNC pfnAPC, DWORD dwAPCData);
	HRESULT GetCurrentStreamTime(STREAM_TIME *pST);
	HRESULT SampleCompletionStatus(WaveSample *pWaveSample, DWORD dwFlags, DWORD dwMilli);
	HRESULT SampleGetMediaStream(IMediaStream **ppMediaStream);
};



[
object,
local,
uuid(8fdc0390-9136-11d1-a95c-00c04fd91a6f),
pointer_default(unique)
]

interface IWaveStreamSample : IAudioStreamSample
{
	HRESULT SetSampleProperty([in] DWORD dwProp, [in] DWORD dwValue);
	HRESULT GetSampleProperty([in] DWORD dwProp, [out] DWORD *pdwValue);
};


