/*******************************************************************************/ /* */ /* libcoolstream/audio_cs.h */ /* Public header file for audio API */ /* */ /* (C) 2008 CoolStream International */ /* */ /* $Id:: $ */ /*******************************************************************************/ #ifndef __AUDIO_CS_H_ #define __AUDIO_CS_H_ #ifndef CS_AUDIO_PDATA #define CS_AUDIO_PDATA void #endif #include "cs_types.h" typedef enum { AUDIO_SYNC_WITH_PTS, AUDIO_NO_SYNC, AUDIO_SYNC_AUDIO_MASTER } AUDIO_SYNC_MODE; typedef enum { AUDIO_FMT_DOLBY_DIGITAL = 0, AUDIO_FMT_BASIC = AUDIO_FMT_DOLBY_DIGITAL, AUDIO_FMT_MPEG = 1, AUDIO_FMT_DTS = 2, AUDIO_FMT_AAC = 8, AUDIO_FMT_AAC_PLUS = 9, AUDIO_FMT_DD_PLUS = 0x22, //EAC3 AUDIO_FMT_AUTO, AUDIO_FMT_MP3, AUDIO_FMT_AVS, AUDIO_FMT_MLP, AUDIO_FMT_WMA, AUDIO_FMT_ADVANCED = AUDIO_FMT_MLP } AUDIO_FORMAT; typedef enum { HDMI_ENCODED_OFF, HDMI_ENCODED_AUTO, HDMI_ENCODED_FORCED } HDMI_ENCODED_MODE; typedef enum { HDMI_AUDIO_FMT_LPCM = 0x1, HDMI_AUDIO_FMT_AC3, HDMI_AUDIO_FMT_MPEG1, HDMI_AUDIO_FMT_MP3, HDMI_AUDIO_FMT_MPEG2, HDMI_AUDIO_FMT_AAC, HDMI_AUDIO_FMT_DTS, HDMI_AUDIO_FMT_ATRAC, HDMI_AUDIO_FMT_ONE_BIT, HDMI_AUDIO_FMT_DD_PLUS, HDMI_AUDIO_FMT_DTS_HD, HDMI_AUDIO_FMT_MAT, HDMI_AUDIO_FMT_DST, HDMI_AUDIO_FMT_WMA_PRO, HDMI_AUDIO_FMT_LAST = HDMI_AUDIO_FMT_WMA_PRO } HDMI_AUDIO_FORMAT; #define CS_MAX_AUDIO_DECODERS 1 #define CS_MAX_AUDIO_FORMATS HDMI_AUDIO_FMT_LAST typedef struct cs_audio_format { HDMI_AUDIO_FORMAT format; unsigned int max_channels; } cs_audio_format_t; typedef struct cs_audio_caps { unsigned char count; cs_audio_format_t formats[CS_MAX_AUDIO_FORMATS]; } cs_audio_caps_t; class cDemux; class cVideo; class cAudio { friend class cVideo; private: static cAudio *instance[CS_MAX_AUDIO_DECODERS]; unsigned int unit; cDemux *demux; cVideo *video; CS_AUDIO_PDATA *privateData; //unsigned int cEncodedDataOnSPDIF, cEncodedDataOnHDMI; bool muted; AUDIO_FORMAT streamType; AUDIO_SYNC_MODE syncMode; bool started; unsigned int uAudioPTSDelay; unsigned int uAudioDolbyPTSDelay, uAudioMpegPTSDelay; bool receivedDelay; /* internal methods */ int setBypassMode(bool Disable); int LipsyncAdjust(void); int atten; int volume; bool clip_started; HDMI_ENCODED_MODE hdmiDD; bool spdifDD; bool hasMuteScheduled; bool analogOut; // cAudio(unsigned int Unit); public: /* construct & destruct */ cAudio(void *hBuffer, void *encHD, void *encSD); ~cAudio(void); void *GetHandle(void); void *GetDSP(void); void HandleAudioMessage(void *Handle, int Event, void *pData); void HandlePcmMessage(void *Handle, int Event, void *pData); /* shut up */ int mute(void); int unmute(void); int SetMute(bool Enable); /* bypass audio to external decoder */ int enableBypass(void); int disableBypass(void); /* volume, min = 0, max = 255 */ int setVolume(unsigned int Left, unsigned int Right); int getVolume(void) { return volume;} bool getMuteStatus(void) { return muted; } /* start and stop audio */ int Start(void); int Stop(void); bool Pause(bool Pcm = true); bool Resume(bool Pcm = true); void SetStreamType(AUDIO_FORMAT StreamType) { streamType = StreamType; }; AUDIO_FORMAT GetStreamType(void) { return streamType; } bool ReceivedAudioDelay(void) { return receivedDelay; } void SetReceivedAudioDelay(bool Set = false) { receivedDelay = Set; } unsigned int GetAudioDelay(void) { return (streamType == AUDIO_FMT_DOLBY_DIGITAL) ? uAudioDolbyPTSDelay : uAudioMpegPTSDelay; } void SetSyncMode(AVSYNC_TYPE SyncMode); /* stream source */ int getSource(void); int setSource(int Source); int Flush(void); /* select channels */ int setChannel(int Channel); int getChannel(void); int PrepareClipPlay(int uNoOfChannels, int uSampleRate, int uBitsPerSample, int bLittleEndian); int WriteClip(unsigned char *Buffer, int Size); int StopClip(void); void getAudioInfo(int &Type, int &Layer, int &Freq, int &Bitrate, int &Mode); void SetSRS(int iq_enable, int nmgr_enable, int iq_mode, int iq_level); bool IsHdmiDDSupported(void); void SetHdmiDD(bool On); void SetSpdifDD(bool Enable); void ScheduleMute(bool On); void EnableAnalogOut(bool Enable); bool GetHdmiAudioCaps(cs_audio_caps_t &caps); bool IsHdmiAudioFormatSupported(HDMI_AUDIO_FORMAT format); void SetHdmiDD(HDMI_ENCODED_MODE type); bool IsHdmiDTSSupported(void); void SetDemux(cDemux *Demux); void SetVideo(cVideo *Video); static cAudio *GetDecoder(unsigned int Unit); }; #endif //__AUDIO_CS_H_