📄 hxaudstr.h
字号:
REF(IUnknown*) /*OUT*/ ppUnknown,
IUnknown* /*IN*/ pUnkOuter);
/************************************************************************
* Method:
* IHXUpdateProperties::UpdatePacketTimeOffset
* Purpose:
* Call this method to update the timestamp offset of cached packets
*/
STDMETHOD(UpdatePacketTimeOffset) (THIS_
INT32 lTimeOffset);
/************************************************************************
* Method:
* IHXUpdateProperties::UpdatePlayTimes
* Purpose:
* Call this method to update the playtime attributes
*/
STDMETHOD(UpdatePlayTimes) (THIS_
IHXValues* pProps);
/*
* CHXAudioStream methods
*/
HX_RESULT Setup (
HXAudioFormat* pFormat
, ULONG32 ulGranularity
);
HX_RESULT GetFormat( HXAudioFormat* pAudioFormat );
HX_RESULT MixIntoBuffer(
UCHAR* pBuf,
ULONG32 ulBufSize,
ULONG32& ulBufTime,
BOOL& bIsMixBufferDirty,
BOOL bGetCrossFadeData = FALSE
);
ULONG32 MixData(
UCHAR* pDestBuf
, ULONG32 ulBufLen
, BOOL bMonoToStereoMayBeConverted
, BOOL& bIsMixBufferDirty);
BOOL IsInitialized(void) {return m_bInited;};
BOOL IsAudioFormatKnown(void) {return m_bAudioFormatKnown;};
inline void SetLive(BOOL bIsLive)
{
if (m_bIsFirstPacket)
{
m_bIsLive = bIsLive;
}
}
void SetupToBeDone() {m_bSetupToBeDone = TRUE;};
HX_RESULT StartCrossFade(CHXAudioStream* pFromStream,
UINT32 ulCrossFadeStartTime,
UINT32 ulCrossFadeDuration,
BOOL bToStream);
HX_RESULT ConvertCurrentTime(double dBytesPlayed,
UINT32 ulCurrentTime,
UINT32& ulAdjustedTime);
void SyncStream(INT64 llSyncTime);
void FreeInfo(HXAudioInfo* pInfo, BOOL bInstantaneous = FALSE);
void FreeBuffer(IHXBuffer* pBuffer);
#ifdef _MACINTOSH
INT64 GetLastAudioWriteTime() {return m_llLastWriteTime - (INT64)(UINT64)m_ulBaseTime;};
#else
INT64 GetLastAudioWriteTime() {return m_llLastWriteTime - (INT64)m_ulBaseTime;};
#endif
void UpdateStreamLastWriteTime(BOOL bForceUpdate = FALSE);
void SaveLastNMilliSeconds(BOOL bSave, UINT32 ulNMilliSeconds);
void RewindStream(UINT32 ulTimeToRewind);
void Pause(BOOL bPlayerPause = FALSE);
void Resume(BOOL bPlayerResume = FALSE);
void Stop(void);
void Seek(UINT32 ulSeekTime);
EPlayerState GetState(void) { return m_eState; };
void SetSoundLevel(float fSoundLevel);
void SetAudioDeviceReflushHint(BOOL bSupported);
BOOL IsAudioDeviceReflushHint(void) { return m_bAudioDeviceReflushHint; };
void RollBackTimestamp();
CHXAudioPlayer* m_Owner;
BOOL m_bMayNeedToRollbackTimestamp;
virtual void ResetStream(void);
virtual HX_RESULT ProcessAudioHook(PROCESS_ACTION action,
IHXAudioHook* pAudioHook);
// CAudioSvcSampleConverter method
virtual BOOL ConvertIntoBuffer(tAudioSample* buffer, UINT32 nSamples, INT64 llStartTimeInSamples) ;
protected:
LONG32 m_lRefCount;
HX_RESULT m_wLastError;
BOOL m_bInited; // Set to TRUE after buffer is created.
BOOL m_bSetupDone;
BOOL m_bAudioFormatKnown;
BOOL m_bIsResumed;
BOOL m_bPlayerPause;
HXAudioFormat m_AudioFmt; // This streams format
HXAudioFormat m_DeviceFmt; // The audio device format
IHXAudioResampler* m_pResampler; // Id used by resampling code
void* m_pInterpId; // Id used by linear interpolator code
IHXValues* m_pValues;
BOOL m_bDisableWrite;
#if defined(HELIX_FEATURE_AUDIO_PREMIXHOOK)
CHXMapPtrToPtr m_PreMixHookMap;
#endif
CHXMapPtrToPtr* m_DryNotificationMap;
ULONG32 m_ulGranularity; // Play at least this amt of audio
ULONG32 m_ulInputBytesPerGran; // Number of bytes for this amt of audio
ULONG32 m_ulOutputBytesPerGran; // Number of bytes for this amt of audio
ULONG32 m_ulExcessInterpBufferSize; // Number of bytes for this amt of audio
ULONG32 m_ulPreviousExcessInterpBufferSize;
BOOL m_bFirstWrite;
ULONG32 m_ulMaxBlockSize; // Size of resampled data buffer
UCHAR* m_pResampleBuf; // Resampler output buffer
UCHAR* m_pTmpResBuf; // Tmp resample buffer
UCHAR* m_pCrossFadeBuffer; // Tmp resample buffer
UCHAR* m_pExcessInterpBuffer;
UCHAR* m_pTempInterpBuffer;
UINT32 m_ulCrossFadeBufferSize;
float m_fVolume; // Stream volume level
BOOL m_bChannelConvert; // if TRUE convert mono->stereo
UINT16 m_uVolume; // Stream's current volume.
BOOL m_bMute;
BOOL m_bGotHooks; // if TRUE if this stream has hooks
INT64 m_llLastWriteTime; // Time of last buffer written
ULONG32 m_ulFudge; // The fudge factor for detecting gaps
BOOL m_bHooksInitialized;
HXAudioData* m_pInDataPtr;
HXAudioData* m_pOutDataPtr;
CHXSimpleList* m_pDataList; // Audio data list
CHXSimpleList* m_pInstantaneousList; // Instantaneous data list
CHXSimpleList* m_pRAByToTsInList;
CHXSimpleList* m_pRAByToTsAdjustedList;
#if defined(HELIX_FEATURE_CROSSFADE)
CrossFader* m_pCrossFader;
#else
void* m_pCrossFader;
#endif /* HELIX_FEATURE_CROSSFADE */
IHXCommonClassFactory* m_pCommonClassFactory;
IHXPreferences* m_pPreferences;
#ifdef _MACINTOSH
HXAudioMacQueue* m_pAvailableBuffers;
#else
CHXSimpleList* m_pAvailableBuffers;
#endif
UINT16 m_uCacheSize;
BOOL m_bDeterminedInitialCacheSize;
BOOL m_bCacheMayBeGrown;
BOOL m_bTobeTimed;
BOOL m_bIsFirstPacket;
BOOL m_bIsLive;
BOOL m_bSetupToBeDone;
UINT32 m_ulBaseTime;
BOOL m_bCrossFadingToBeDone;
CHXAudioStream* m_pCrossFadeStream;
INT64 m_llCrossFadeStartTime;
UINT32 m_ulCrossFadeDuration;
BOOL m_bFadeToThisStream;
BOOL m_bFadeAlreadyDone;
BOOL m_bRealAudioStream;
UINT32 m_ulLastInputStartTime;
UINT32 m_ulLastInputEndTime;
INT64 m_llLastStartTimePlayed;
UINT32 m_ulTSRollOver;
UINT32 m_ulLiveDelay;
HX_BITFIELD m_bLastWriteTimeUpdated : 1;
HX_BITFIELD m_bAudioDeviceReflushHint : 1;
HX_BITFIELD m_bLastNMilliSecsToBeSaved : 1;
UINT32 m_ulLastNMilliSeconds;
CHXSimpleList* m_pLastNMilliSecsList;
UINT32 m_ulLastNHeadTime;
UINT32 m_ulLastNTailTime;
EPlayerState m_eState;
HX_BITFIELD m_bCanBeRewound : 1;
/*
* Left around for future debugging
FILE* fdbefore;
FILE* fdbeforetxt;
FILE* fdafter;
FILE* fdaftertxt;
FILE* fdin;
*/
virtual ~CHXAudioStream();
PRIVATE_DESTRUCTORS_ARE_NOT_A_CRIME
void InitHooks();
HX_RESULT ProcessHooks(HXAudioData* pInData
,HXAudioData* pOutData);
HX_RESULT AddData (HXAudioData* pData);
HX_RESULT SetupResampler(void);
ULONG32 CalcMs( ULONG32 ulNumBytes );
ULONG32 CalcDeviceMs( ULONG32 ulNumBytes );
UINT32 CalcOffset(INT64 llStartTime, INT64 llEndTime);
void FlushBuffers(BOOL bInstantaneousAlso = TRUE);
HX_RESULT ProcessInfo(void);
BOOL EnoughDataAvailable(INT64& llStartTimeInSamples, UINT32& nSamplesRequired);
void CleanupRAByToTs(void);
void MapFudgedTimestamps(void);
void InitializeCrossFader(void);
void RemoveExcessCrossFadeData();
private:
HXAudioSvcMixEngine *m_pMixEngine ;
static UINT32 Bytes2Samples(UINT64 ulNumBytes, const HXAudioFormat *fmt) ;
static UINT64 Samples2Ms(INT64 nSamples, const HXAudioFormat *fmt) ;
// variables to estimate the true sample rate
INT64 m_startMeasureTime ;
INT32 m_totSamples ;
// how many samples apart may the mixes lie until we don't recognize them anymore
// as contiguous? Essentially, this should be sample rate * [error in time stamps]
enum { MIXTIMEFUDGEINSAMPLES = 400 } ;
// we need these to correct for incoming data containing incomplete
// sample frames.
IHXBuffer* m_piPendingAudioData ;
UINT32 m_ulPendingAudioBytes ; // size in bytes of the slush buffer content
UINT32 m_ulSampleFrameSize ; // size in bytes of a sample frame, i.e. 2*nChannels
// Write() backend function
HX_RESULT Write2(HXAudioData* pAudioData) ;
#ifdef HELIX_FEATURE_VOLUME
IHXVolume* m_pStreamVolume;
#endif
};
#ifdef _MACINTOSH
struct HXAudioMacQueueElement
{
HXAudioMacQueueElement *mNextElementInQueue; // link must be first member
void *mObject;
};
class HXAudioMacQueue
{
protected:
QHdr mQueueHeader;
Boolean mDestructing;
unsigned long m_nCount;
public:
HXAudioMacQueue(void);
~HXAudioMacQueue(void); // decrements the ref on the irma nodes (via release)
void* RemoveHead(void);
HX_RESULT AddTail(void* pObject); // increments the ref
UINT32 GetCount();
};
#endif // _MACINTOSH
#endif /* HXAUSTR_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -