/*
 * Copyright 2004 Christian Costa
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "unknwn.idl";
import "mmstream.idl";

cpp_quote("#if 0")
typedef struct tWAVEFORMATEX WAVEFORMATEX;
cpp_quote ("#endif")

interface IAudioMediaStream;
interface IAudioStreamSample;
interface IMemoryData;
interface IAudioData;

[
object,
local,
uuid(f7537560-a3be-11d0-8212-00c04fc32c45),
pointer_default(unique)
]
interface IAudioMediaStream : IMediaStream
{
	HRESULT GetFormat(
		[out] /*[optional]*/ WAVEFORMATEX *pWaveFormatCurrent
	);

	HRESULT SetFormat(
		[in] const WAVEFORMATEX *lpWaveFormat);

	HRESULT CreateSample(
		[in] IAudioData *pAudioData,
		[in] DWORD dwFlags,
		[out] IAudioStreamSample **ppSample
	);
}


[
object,
local,
uuid(345fee00-aba5-11d0-8212-00c04fc32c45),
pointer_default(unique)
]
interface IAudioStreamSample : IStreamSample
{
	HRESULT GetAudioData(
		[out] IAudioData **ppAudio
	);
}


[
object,
local,
uuid(327fc560-af60-11d0-8212-00c04fc32c45),
pointer_default(unique)
]
interface IMemoryData : IUnknown
{
	HRESULT SetBuffer(
		[in] DWORD cbSize,
		[in] BYTE *pbData,
		[in] DWORD dwFlags
	);

	HRESULT GetInfo(
		[out] DWORD *pdwLength,
		[out] BYTE **ppbData,
		[out] DWORD *pcbActualData
	);
	HRESULT SetActual(
		[in] DWORD cbDataValid
	);
}


[
object,
local,
uuid(54c719c0-af60-11d0-8212-00c04fc32c45),
pointer_default(unique)
]
interface IAudioData : IMemoryData
{
	HRESULT GetFormat(
		[out] /*[optional]*/ WAVEFORMATEX *pWaveFormatCurrent
	);

	HRESULT SetFormat(
		[in] const WAVEFORMATEX *lpWaveFormat
	);
}
