hxaudstr.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:18k
源码类别:

Symbian

开发平台:

Visual C++

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