hxaudstr.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:17k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef _HXAUSTR_H_
  36. #define _HXAUSTR_H_
  37. #include "hxcomm.h"
  38. #include "hxcore.h"
  39. #include "mixengine.h"
  40. // forward decls
  41. class CHXAudioPlayer;
  42. class CHXSimpleList;
  43. class   CHXMapPtrToPtr;
  44. class CHXBuffer;
  45. #if defined(HELIX_FEATURE_CROSSFADE)
  46. class   CrossFader;
  47. #endif /* HELIX_FEATURE_CROSSFADE */
  48. #ifdef _MACINTOSH
  49. class HXAudioMacQueue;
  50. #endif
  51. _INTERFACE IHXAudioStream;
  52. _INTERFACE IHXAudioStream2;
  53. _INTERFACE IHXBuffer;
  54. _INTERFACE IHXValues;
  55. _INTERFACE IHXAudioHook;
  56. _INTERFACE IHXDryNotification;
  57. _INTERFACE IHXRealAudioSync;
  58. _INTERFACE IHXCommonClassFactory;
  59. _INTERFACE IHXUpdateProperties;
  60. struct RealAudioBytesToTimeStamp
  61. {
  62.     RealAudioBytesToTimeStamp()
  63.     {
  64. m_ulOutNumBytes = 0.;
  65. m_ulOrigTimestamp = 0;
  66. m_ulTimestamp = 0;
  67. m_ulInTimestamp = 0;
  68. m_ulInEndTime = 0;
  69. m_ulDuration = 0;
  70.     }
  71.     double  m_ulOutNumBytes;
  72.     UINT32  m_ulOrigTimestamp; // needed for multi-player pause/resume support
  73.     UINT32  m_ulTimestamp;
  74.     UINT32  m_ulInTimestamp;
  75.     UINT32  m_ulInEndTime;
  76.     UINT32  m_ulDuration;
  77. };
  78. struct HXAudioInfo;
  79. /****************************************************************************
  80.  *
  81.  *  Class:
  82.  *
  83.  *      CHXAudioStream
  84.  *
  85.  *  Purpose:
  86.  *
  87.  *      PN implementation of audio stream object.
  88.  *
  89.  */
  90. class CHXAudioStream: public IHXAudioStream, 
  91.       public IHXRealAudioSync,
  92.       public IHXAudioStream2,
  93.       public CAudioSvcSampleConverter,
  94.       public IHXCommonClassFactory,
  95. #ifdef HELIX_FEATURE_VOLUME
  96.       public IHXVolumeAdviseSink,
  97. #endif 
  98.                       public IHXUpdateProperties
  99. {
  100. public:
  101.     CHXAudioStream( CHXAudioPlayer* owner, IUnknown* pContext );
  102.     /*
  103.      * IUnknown methods
  104.      */
  105.     STDMETHOD(QueryInterface)   (THIS_
  106.                             REFIID riid,
  107.                             void** ppvObj);
  108.     STDMETHOD_(ULONG32,AddRef)  (THIS);
  109.     STDMETHOD_(ULONG32,Release) (THIS);
  110.     /*
  111.      *      IHXAudioStream methods
  112.      */
  113.     STDMETHOD(Init) (THIS_
  114. const HXAudioFormat*  pAudioFormat,
  115. IHXValues*      pValues
  116. );
  117.     STDMETHOD(Write) (THIS_
  118. HXAudioData* pAudioData
  119. );
  120.     STDMETHOD(AddPreMixHook) (THIS_
  121. IHXAudioHook* pHook,
  122. const BOOL bDisableWrite
  123. );
  124.     STDMETHOD(RemovePreMixHook) (THIS_
  125. IHXAudioHook* pHook
  126. );
  127. #ifdef HELIX_FEATURE_VOLUME
  128.     // 
  129.     // IHXVolumeAdviseSink methods.
  130.     //
  131.     STDMETHOD(OnVolumeChange)(THIS_ const UINT16 uVolume);
  132.     STDMETHOD(OnMuteChange)(THIS_ const BOOL bMute);
  133. #endif
  134.     /************************************************************************
  135.     *  Method:
  136.     *      IHXAudioStream::AddDryNotification
  137.     *  Purpose:
  138.     *     Use this to add a notification response object to get notifications
  139.     *     when audio stream is running dry.
  140.     */
  141.     STDMETHOD(AddDryNotification)   (THIS_
  142.                                  IHXDryNotification* /*IN*/ pNotification
  143.           );
  144.   
  145.    /************************************************************************
  146.     *  Method:
  147.     *      IHXAudioStream2::RemoveDryNotification
  148.     *  Purpose:
  149.     *     Use this to remove itself from the notification response object
  150.     *     during the stream switching.
  151.     */
  152.     STDMETHOD(RemoveDryNotification) (THIS_
  153. IHXDryNotification* /*IN*/ pNotification
  154.       );
  155.    /************************************************************************
  156.     *  Method:
  157.     *      IHXAudioStream2::GetAudioFormat
  158.     *  Purpose:
  159.     *     Returns the input audio format of the data written by the 
  160.     *     renderer. This function will fill in the pre-allocated 
  161.     *     HXAudioFormat structure passed in.
  162.     */
  163.     STDMETHOD(GetAudioFormat)   (THIS_
  164.         HXAudioFormat* /*IN/OUT*/pAudioFormat);
  165.     STDMETHOD_(IHXValues*,GetStreamInfo) (THIS)
  166.     { 
  167. if (m_pValues)
  168. {
  169.     m_pValues->AddRef();
  170. }
  171. return m_pValues ; 
  172.     };
  173.     /* Return the this stream's volume interface. */
  174.     STDMETHOD_(IHXVolume*, GetAudioVolume)         (THIS);
  175.     /*
  176.      *  IHXRealAudioSync methods
  177.      */
  178.     /************************************************************************
  179.      *  Method:
  180.      *      IHXRealAudioSync::Register
  181.      *  Purpose:
  182.      */
  183.     STDMETHOD(Register) (THIS);
  184.     /************************************************************************
  185.      *  Method:
  186.      *      IHXRealAudioSync::UnRegister
  187.      *  Purpose:
  188.      */
  189.     STDMETHOD(UnRegister) (THIS);
  190.     /************************************************************************
  191.      *  Method:
  192.      *      IHXRealAudioSync::FudgeTimestamp
  193.      *  Purpose:
  194.      *     Tell the audio stream about the relationship between the number 
  195.      *     of bytes written to the actual timestamp.
  196.      *     
  197.      */
  198.     STDMETHOD(FudgeTimestamp) (THIS_
  199. UINT32 /*IN*/ ulNumberofBytes,
  200. UINT32 /*IN*/ ulTimestamp
  201.      );
  202.     /*
  203.      * IHXCommonClassFactory methods
  204.      */
  205.     /************************************************************************
  206.      * Method:
  207.      *     IHXCommonClassFactory::CreateInstance
  208.      * Purpose:
  209.      *     Creates instances of common objects supported by the system,
  210.      *     like IHXBuffer, IHXPacket, IHXValues, etc.
  211.      *
  212.      *     This method is similar to Window's CoCreateInstance() in its 
  213.      *     purpose, except that it only creates objects of a well known
  214.      *     types.
  215.      *
  216.      *     NOTE: Aggregation is never used. Therefore and outer unknown is
  217.      *     not passed to this function, and you do not need to code for this
  218.      *     situation.
  219.      */
  220.     STDMETHOD(CreateInstance) (THIS_
  221. REFCLSID    /*IN*/  rclsid,
  222. void**     /*OUT*/ ppUnkown);
  223.     /************************************************************************
  224.      *  Method:
  225.      *     IHXController::CreateInstanceAggregatable
  226.      *  Purpose:
  227.      *     Creates instances of common objects that can be aggregated
  228.      *     supported by the system, like IHXSiteWindowed
  229.      *
  230.      *     This method is similar to Window's CoCreateInstance() in its 
  231.      *     purpose, except that it only creates objects of a well known
  232.      *     types.
  233.      *
  234.      *     NOTE 1: Unlike CreateInstance, this method will create internal
  235.      *     objects that support Aggregation.
  236.      *
  237.      *     NOTE 2: The output interface is always the non-delegating 
  238.      *     IUnknown.
  239.      */
  240.     STDMETHOD(CreateInstanceAggregatable)
  241.     (THIS_
  242.     REFCLSID     /*IN*/  rclsid,
  243.     REF(IUnknown*)  /*OUT*/ ppUnknown,
  244.     IUnknown*     /*IN*/  pUnkOuter);
  245.     /************************************************************************
  246.      * Method:
  247.      *     IHXUpdateProperties::UpdatePacketTimeOffset
  248.      * Purpose:
  249.      *     Call this method to update the timestamp offset of cached packets
  250.      */
  251.     STDMETHOD(UpdatePacketTimeOffset) (THIS_
  252.        INT32 lTimeOffset);
  253.     /************************************************************************
  254.      * Method:
  255.      *     IHXUpdateProperties::UpdatePlayTimes
  256.      * Purpose:
  257.      *     Call this method to update the playtime attributes
  258.      */
  259.     STDMETHOD(UpdatePlayTimes)       (THIS_
  260.        IHXValues* pProps);
  261.     
  262.     /*
  263.      *      CHXAudioStream methods
  264.      */
  265.     HX_RESULT  Setup   (
  266.     HXAudioFormat*   pFormat
  267.     , ULONG32   ulGranularity
  268.     );
  269.     HX_RESULT GetFormat( HXAudioFormat* pAudioFormat );
  270.     HX_RESULT MixIntoBuffer( 
  271.     UCHAR* pBuf,
  272.     ULONG32 ulBufSize,
  273.     ULONG32&    ulBufTime,
  274.     BOOL& bIsMixBufferDirty,
  275.     BOOL bGetCrossFadeData = FALSE
  276.     );
  277.     ULONG32 MixData(
  278. UCHAR*  pDestBuf
  279.     ,   ULONG32 ulBufLen 
  280.     , BOOL bMonoToStereoMayBeConverted
  281.     , BOOL& bIsMixBufferDirty);
  282. BOOL    IsInitialized(void)      {return m_bInited;};
  283. BOOL    IsAudioFormatKnown(void) {return m_bAudioFormatKnown;};
  284. inline void SetLive(BOOL bIsLive)
  285.         {   
  286.             if (m_bIsFirstPacket)
  287.             {
  288.                 m_bIsLive = bIsLive;
  289.             }
  290.         }
  291. void    SetupToBeDone()      {m_bSetupToBeDone = TRUE;};
  292. HX_RESULT StartCrossFade(CHXAudioStream*    pFromStream, 
  293. UINT32     ulCrossFadeStartTime,
  294. UINT32     ulCrossFadeDuration, 
  295. BOOL     bToStream);
  296. HX_RESULT   ConvertCurrentTime(double dBytesPlayed, 
  297.        UINT32 ulCurrentTime,
  298.        UINT32& ulAdjustedTime);
  299.         
  300. void SyncStream(INT64 llSyncTime);
  301. void FreeInfo(HXAudioInfo* pInfo, BOOL bInstantaneous = FALSE);
  302. void FreeBuffer(IHXBuffer* pBuffer);
  303. #ifdef _MACINTOSH
  304. INT64 GetLastAudioWriteTime() {return m_llLastWriteTime - (INT64)(UINT64)m_ulBaseTime;};
  305. #else
  306. INT64 GetLastAudioWriteTime() {return m_llLastWriteTime - (INT64)m_ulBaseTime;};
  307. #endif
  308. void UpdateStreamLastWriteTime(BOOL bForceUpdate = FALSE);
  309. void SaveLastNMilliSeconds(BOOL bSave, UINT32 ulNMilliSeconds);
  310. void RewindStream(UINT32 ulTimeToRewind);
  311. void Pause(BOOL bPlayerPause = FALSE);
  312. void Resume(BOOL bPlayerResume = FALSE);
  313. void Stop(void);
  314. void Seek(UINT32 ulSeekTime);
  315. EPlayerState GetState(void) { return m_eState; };
  316. void SetSoundLevel(float fSoundLevel);
  317. void SetAudioDeviceReflushHint(BOOL bSupported);
  318. BOOL IsAudioDeviceReflushHint(void) { return m_bAudioDeviceReflushHint; };
  319. void RollBackTimestamp();
  320. CHXAudioPlayer* m_Owner;
  321. BOOL m_bMayNeedToRollbackTimestamp;
  322. virtual void     ResetStream(void);
  323. virtual HX_RESULT   ProcessAudioHook(PROCESS_ACTION action, 
  324.      IHXAudioHook* pAudioHook);
  325. // CAudioSvcSampleConverter method
  326. virtual BOOL ConvertIntoBuffer(tAudioSample* buffer, UINT32 nSamples, INT64 llStartTimeInSamples) ;
  327. protected:
  328.     LONG32 m_lRefCount;
  329.     HX_RESULT m_wLastError;
  330.     BOOL m_bInited; // Set to TRUE after buffer is created. 
  331.     BOOL m_bSetupDone;
  332.     BOOL m_bAudioFormatKnown;
  333.     BOOL m_bIsResumed;
  334.     BOOL m_bPlayerPause;
  335.     HXAudioFormat      m_AudioFmt; // This streams format
  336.     HXAudioFormat      m_DeviceFmt; // The audio device format
  337.     IHXAudioResampler* m_pResampler; // Id used by resampling code
  338.     void* m_pInterpId; // Id used by linear interpolator code
  339.     IHXValues* m_pValues;
  340.     BOOL m_bDisableWrite;
  341. #if defined(HELIX_FEATURE_AUDIO_PREMIXHOOK)
  342.     CHXMapPtrToPtr m_PreMixHookMap;
  343. #endif
  344.     
  345.     CHXMapPtrToPtr* m_DryNotificationMap;
  346.     ULONG32 m_ulGranularity; // Play at least this amt of audio
  347.     ULONG32 m_ulInputBytesPerGran; // Number of bytes for this amt of audio
  348.     ULONG32 m_ulOutputBytesPerGran; // Number of bytes for this amt of audio
  349.     ULONG32 m_ulExcessInterpBufferSize; // Number of bytes for this amt of audio
  350.     ULONG32 m_ulPreviousExcessInterpBufferSize;
  351.     BOOL m_bFirstWrite;
  352.     ULONG32 m_ulMaxBlockSize; // Size of resampled data buffer
  353.     UCHAR* m_pResampleBuf;  // Resampler output buffer
  354.     UCHAR* m_pTmpResBuf;  // Tmp resample  buffer
  355.     UCHAR* m_pCrossFadeBuffer;  // Tmp resample  buffer
  356.     UCHAR* m_pExcessInterpBuffer;
  357.     UCHAR* m_pTempInterpBuffer;
  358.     UINT32 m_ulCrossFadeBufferSize;
  359.     float m_fVolume; // Stream volume level
  360.     BOOL m_bChannelConvert; // if TRUE convert mono->stereo
  361.     UINT16 m_uVolume; // Stream's current volume.
  362.     BOOL m_bMute;
  363.     BOOL m_bGotHooks; // if TRUE if this stream has hooks
  364.     INT64 m_llLastWriteTime; // Time of last buffer written
  365.     ULONG32 m_ulFudge; // The fudge factor for detecting gaps
  366.     BOOL m_bHooksInitialized;
  367.     HXAudioData*   m_pInDataPtr;
  368.     HXAudioData*   m_pOutDataPtr;
  369.     CHXSimpleList*  m_pDataList; // Audio data list
  370.     CHXSimpleList*  m_pInstantaneousList; // Instantaneous data list
  371.     CHXSimpleList*  m_pRAByToTsInList;
  372.     CHXSimpleList*  m_pRAByToTsAdjustedList;
  373. #if defined(HELIX_FEATURE_CROSSFADE)
  374.     CrossFader*     m_pCrossFader;
  375. #else
  376.     void*           m_pCrossFader;
  377. #endif /* HELIX_FEATURE_CROSSFADE */
  378.     IHXCommonClassFactory* m_pCommonClassFactory;
  379.     IHXPreferences* m_pPreferences;
  380.     
  381. #ifdef _MACINTOSH
  382.     HXAudioMacQueue* m_pAvailableBuffers;
  383. #else
  384.     CHXSimpleList*  m_pAvailableBuffers;
  385. #endif
  386.     
  387.     UINT16     m_uCacheSize;
  388.     BOOL     m_bDeterminedInitialCacheSize;
  389.     BOOL     m_bCacheMayBeGrown;
  390.     BOOL m_bTobeTimed;
  391.     BOOL m_bIsFirstPacket;
  392.     BOOL m_bIsLive;
  393.     BOOL m_bSetupToBeDone;
  394.     UINT32 m_ulBaseTime;
  395.     BOOL m_bCrossFadingToBeDone;
  396.     CHXAudioStream* m_pCrossFadeStream;
  397.     INT64 m_llCrossFadeStartTime;
  398.     UINT32 m_ulCrossFadeDuration;
  399.     BOOL m_bFadeToThisStream;
  400.     BOOL m_bFadeAlreadyDone;
  401.     BOOL m_bRealAudioStream;
  402.     UINT32 m_ulLastInputStartTime;
  403.     UINT32 m_ulLastInputEndTime;
  404.     INT64 m_llLastStartTimePlayed;
  405.     UINT32 m_ulTSRollOver;
  406.     UINT32 m_ulLiveDelay;
  407.     HX_BITFIELD m_bLastWriteTimeUpdated  : 1;
  408.     HX_BITFIELD m_bAudioDeviceReflushHint  : 1;
  409.     HX_BITFIELD m_bLastNMilliSecsToBeSaved : 1;
  410.     UINT32 m_ulLastNMilliSeconds;
  411.     CHXSimpleList* m_pLastNMilliSecsList;
  412.     UINT32 m_ulLastNHeadTime;
  413.     UINT32 m_ulLastNTailTime;
  414.     EPlayerState m_eState;
  415.     HX_BITFIELD m_bCanBeRewound : 1;
  416. /*
  417.  *  Left around for future debugging
  418.     FILE* fdbefore;
  419.     FILE* fdbeforetxt;
  420.     FILE* fdafter;
  421.     FILE* fdaftertxt;
  422.     FILE* fdin;
  423. */
  424.     virtual ~CHXAudioStream();
  425.     PRIVATE_DESTRUCTORS_ARE_NOT_A_CRIME
  426.     void InitHooks();
  427.     HX_RESULT  ProcessHooks(HXAudioData*  pInData
  428.      ,HXAudioData* pOutData);
  429.     HX_RESULT AddData (HXAudioData* pData);
  430.     HX_RESULT SetupResampler(void);
  431.     ULONG32 CalcMs( ULONG32 ulNumBytes );
  432.     ULONG32 CalcDeviceMs( ULONG32 ulNumBytes );
  433.     
  434.     UINT32 CalcOffset(INT64 llStartTime, INT64 llEndTime);
  435.     void FlushBuffers(BOOL bInstantaneousAlso = TRUE);
  436.     HX_RESULT ProcessInfo(void);
  437.     BOOL EnoughDataAvailable(INT64& llStartTimeInSamples, UINT32& nSamplesRequired);
  438.     void CleanupRAByToTs(void);
  439.     void MapFudgedTimestamps(void);
  440.     void InitializeCrossFader(void);
  441.     void RemoveExcessCrossFadeData();
  442. private:
  443.     HXAudioSvcMixEngine *m_pMixEngine ;
  444.     static UINT32 Bytes2Samples(UINT64 ulNumBytes, const HXAudioFormat *fmt) ;
  445.     static UINT64 Samples2Ms(INT64 nSamples, const HXAudioFormat *fmt) ;
  446.     // variables to estimate the true sample rate
  447.     INT64 m_startMeasureTime ;
  448.     INT32 m_totSamples ;
  449.     // how many samples apart may the mixes lie until we don't recognize them anymore
  450.     // as contiguous? Essentially, this should be sample rate * [error in time stamps]
  451.     enum { MIXTIMEFUDGEINSAMPLES = 400 } ;
  452.     // we need these to correct for incoming data containing incomplete
  453.     // sample frames.
  454.     IHXBuffer* m_piPendingAudioData ;
  455.     UINT32 m_ulPendingAudioBytes ; // size in bytes of the slush buffer content
  456.     UINT32 m_ulSampleFrameSize ; // size in bytes of a sample frame, i.e. 2*nChannels
  457.     // Write() backend function
  458.     HX_RESULT Write2(HXAudioData* pAudioData) ;
  459. #ifdef HELIX_FEATURE_VOLUME
  460.     IHXVolume* m_pStreamVolume;
  461. #endif
  462. };
  463. #ifdef _MACINTOSH
  464. struct HXAudioMacQueueElement 
  465. {
  466. HXAudioMacQueueElement  *mNextElementInQueue; // link must be first member
  467. void *mObject;
  468. };
  469. class HXAudioMacQueue 
  470. {
  471. protected:
  472. QHdr  mQueueHeader;
  473. Boolean mDestructing;
  474. unsigned long m_nCount;
  475. public:
  476. HXAudioMacQueue(void);
  477. ~HXAudioMacQueue(void); // decrements the ref on the irma nodes (via release)
  478. void*   RemoveHead(void);
  479. HX_RESULT  AddTail(void* pObject); // increments the ref
  480. UINT32 GetCount();
  481. };
  482. #endif // _MACINTOSH
  483. #endif /* HXAUSTR_H_ */