// File: ichnlaud.h

#ifndef _ICHNLAUD_H_
#define _ICHNLAUD_H_

// we have no notification on the channel "callback" that the state changed
// to determine if a/v is active we need to get both the video and the audio channel

class CNmChannelAudio : public INmChannelAudio,
	public DllRefCount, public CConnectionPointContainer
{
private:
	int				m_cMembers;
	BOOL			m_fIncoming;
	DWORD			m_dwFlags;
	IAudioChannel*	m_pAudioChannel;
	IAudioDevice *	m_pAudioDevice;
	ICommChannel*	m_pCommChannel;
	MEDIA_FORMAT_ID m_MediaFormat;
    CAudioControl   m_AudioControl;

public:
	CNmChannelAudio(BOOL fIncoming);
	~CNmChannelAudio();

	VOID CommChannelOpened(ICommChannel *pCommChannel);
	VOID CommChannelActive(ICommChannel *pCommChannel);
	VOID CommChannelClosed();
	ICommChannel * GetCommChannel() { return m_pCommChannel; }
	VOID SetFormat(MEDIA_FORMAT_ID id) { m_MediaFormat = id;}
	
	VOID OnConnected(IH323Endpoint * pConnection, ICommChannel *pIChannel)
        { m_AudioControl.OnConnected(pConnection, pIChannel); }
	VOID OnDisconnected() {	m_AudioControl.OnDisconnected(); }
	
	VOID OnMemberAdded(CNmMember *pMember);
	VOID OnMemberRemoved(CNmMember *pMember);
	VOID OnMemberUpdated(CNmMember *pMember);

	IMediaChannel *GetMediaChannelInterface(void);


	DWORD GetLevel();
	BOOL IsPaused();
	BOOL IsAutoMixing();

    VOID Open();
    VOID Close();

	// IUnknown
	STDMETHODIMP_(ULONG) AddRef(void);
	STDMETHODIMP_(ULONG) Release(void);
	STDMETHODIMP QueryInterface(REFIID riid, PVOID *ppvObj);

	// INmChannel
    STDMETHODIMP IsSameAs(INmChannel *pChannel);
    STDMETHODIMP IsActive();
    STDMETHODIMP SetActive(BOOL fActive);
    STDMETHODIMP GetConference(INmConference **ppConference);
    STDMETHODIMP GetInterface(IID *piid);
    STDMETHODIMP GetNmch(ULONG *puCh);
    STDMETHODIMP EnumMember(IEnumNmMember **ppEnum);
    STDMETHODIMP GetMemberCount(ULONG * puCount);

	// INmChannelAudio
    STDMETHODIMP IsIncoming(void);
    STDMETHODIMP GetState(NM_AUDIO_STATE *puState);
    STDMETHODIMP GetProperty(NM_AUDPROP uID, ULONG_PTR *puValue);
    STDMETHODIMP SetProperty(NM_AUDPROP uID, ULONG_PTR uValue);
};

HRESULT OnNotifyPropertyChanged(IUnknown *pAudioChannelNotify, PVOID pv, REFIID riid);
HRESULT OnNotifyStateChanged(IUnknown *pAudioChannelNotify, PVOID pv, REFIID riid);

#endif // _ICHNLAUD_H_