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

Symbian

开发平台:

Visual 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 _AUDREND_H_
  36. #define _AUDREND_H_
  37. /****************************************************************************
  38.  *  Includes
  39.  */
  40. #include "audrendf.h"
  41. #include "hxplugn.h"
  42. #include "hxrendr.h"
  43. #include "hxasm.h"
  44. #include "hxmon.h"
  45. #include "hxcore.h"
  46. #include "hxtick.h"
  47. #include "hxerror.h"
  48. #include "audstats.h"
  49. #define AUDREND_INITIAL_NUMSTREAMPTRS  4
  50. /****************************************************************************
  51.  *  CAudioRenderer
  52.  */
  53. class CAudioRenderer : public IHXPlugin,
  54.        public IHXRenderer,
  55.        public IHXStatistics,
  56.        public IHXInterruptSafe,
  57.        public IHXDryNotification
  58. {
  59. protected:
  60.     typedef enum 
  61.     {
  62. stopped, 
  63. buffering, 
  64. playing, 
  65. paused, 
  66. seeking
  67.     } PlayState;
  68.     
  69.     static const char* const zm_pDescription;
  70.     static const char* const zm_pCopyright;
  71.     static const char* const zm_pMoreInfoURL;
  72.     static const char* const zm_pStreamMimeTypes[];
  73.     HX_RESULT InitAudioStream (IHXValues* pHeader,
  74.        IHXAudioStream** ppAudioStream);
  75.     HX_RESULT DoAudio       (UINT32 &ulAudioTime, 
  76.        AUDIO_STATE audioState  = AUDIO_NORMAL);
  77.     HX_RESULT WriteToAudioServices (HXAudioData* pAudioData);
  78.     HX_RESULT AttemptToSatisfyDryRequest (UINT32 ulAudioTimeWanted);
  79.     void CalculateMaxTimeStamp(HXAudioData* pAudioData);
  80.     HX_RESULT CheckForAudioStreamChange(REF(BOOL) rbAudioStreamChanged);
  81.     BOOL      HasAudioFormatChanged();
  82.     HX_RESULT IncrementAudioStream();
  83.     BOOL IsRebuffering() const;
  84.     void StartRebuffer(UINT32 ulAudioWantedTime);
  85.     void EndRebuffer();
  86.     IHXAudioPlayer*     m_pAudioPlayer;
  87.     IHXAudioStream**        m_ppAudioStream;
  88.     UINT32                  m_ulNumAudioStreams;
  89.     UINT32                  m_ulCurAudioStream;
  90.     
  91.     UINT32     m_ulPreroll;
  92.     UINT32     m_ulDelay;
  93.     UINT32     m_ulDuration;
  94.     UINT32     m_ulAudioWantedTime;
  95.     UINT32     m_ulLastWriteTime;
  96.     UINT32     m_ulBaseWriteTime;
  97.     INT32             m_lTimeOffset;
  98.     PlayState     m_PlayState;
  99.   
  100.     HX_BITFIELD     m_bDoneWritingPackets:1;
  101.     HX_BITFIELD     m_bEndOfPackets:1;
  102.     HX_BITFIELD     m_bProcessingPacket:1;
  103.     HX_BITFIELD     m_bInSeekMode:1;
  104.     HX_BITFIELD     m_bFirstPacket:1;
  105.     HX_BITFIELD     m_bDelayOffsetSet:1;
  106.     HX_BITFIELD             m_bCanChangeAudioStream : 1;
  107.     HXMutex*     m_pMutex;
  108.     HX_RESULT CheckStreamVersions (IHXValues* pHeader);
  109.     virtual HX_RESULT CheckAudioServices() {return HXR_OK;}
  110. public:
  111.     /*
  112.      * Costructor
  113.      */
  114.     CAudioRenderer();
  115.     /*
  116.      * IUnknown methods
  117.      */
  118.     STDMETHOD(QueryInterface) (THIS_
  119. REFIID riid,
  120. void** ppvObj);
  121.     STDMETHOD_(UINT32,AddRef) (THIS);
  122.     STDMETHOD_(UINT32,Release) (THIS);
  123.     /*
  124.      * IHXPlugin methods
  125.      */
  126.     /************************************************************************
  127.      * Method:
  128.      *     IHXPlugin::GetPluginInfo
  129.      * Purpose:
  130.      *     Returns the basic information about this plugin. Including:
  131.      *
  132.      *     bLoadMultiple whether or not this plugin DLL can be loaded
  133.      * multiple times. All File Formats must set
  134.      * this value to TRUE.
  135.      *     pDescription which is used in about UIs (can be NULL)
  136.      *     pCopyright which is used in about UIs (can be NULL)
  137.      *     pMoreInfoURL which is used in about UIs (can be NULL)
  138.      */
  139.     STDMETHOD(GetPluginInfo) (THIS_
  140. REF(BOOL)  /*OUT*/ bLoadMultiple,
  141. REF(const char*) /*OUT*/ pDescription,
  142. REF(const char*) /*OUT*/ pCopyright,
  143. REF(const char*) /*OUT*/ pMoreInfoURL,
  144. REF(ULONG32)  /*OUT*/ ulVersionNumber
  145. );
  146.     /************************************************************************
  147.      * Method:
  148.      *     IHXPlugin::InitPlugin
  149.      * Purpose:
  150.      *     Initializes the plugin for use. This interface must always be
  151.      *     called before any other method is called. This is primarily needed 
  152.      *     so that the plugin can have access to the context for creation of
  153.      *     IHXBuffers and IMalloc.
  154.      */
  155.     STDMETHOD(InitPlugin)   (THIS_
  156.     IUnknown*   /*IN*/  pContext);
  157.     
  158.     /*
  159.      * IHXRenderer methods
  160.      */
  161.     /************************************************************************
  162.      * Method:
  163.      *     IHXRenderer::GetRendererInfo
  164.      * Purpose:
  165.      *     Returns information vital to the instantiation of rendering 
  166.      *     plugins.
  167.      */
  168.     STDMETHOD(GetRendererInfo) (THIS_
  169. REF(const char**) /*OUT*/ pStreamMimeTypes,
  170. REF(UINT32)      /*OUT*/ unInitialGranularity
  171. );
  172.     /////////////////////////////////////////////////////////////////////////
  173.     // Method:
  174.     //     IHXRenderer::StartStream
  175.     // Purpose:
  176.     //     Called by client engine to inform the renderer of the stream it
  177.     //     will be rendering. The stream interface can provide access to
  178.     //     its source or player. This method also provides access to the 
  179.     //     primary client controller interface.
  180.     //
  181.     STDMETHOD (StartStream) (THIS_
  182. IHXStream*     pStream,
  183. IHXPlayer*     pPlayer);
  184.     /////////////////////////////////////////////////////////////////////////
  185.     // Method:
  186.     //     IHXRenderer::EndStream
  187.     // Purpose:
  188.     //     Called by client engine to inform the renderer that the stream
  189.     //     is was rendering is closed.
  190.     //
  191.     STDMETHOD (EndStream) (THIS);
  192.     /////////////////////////////////////////////////////////////////////////
  193.     // Method:
  194.     // IHXRenderer::OnHeader
  195.     // Purpose:
  196.     // Called by client engine when a header for this renderer is 
  197.     // available. The header will arrive before any packets.
  198.     //
  199.     STDMETHOD (OnHeader) (THIS_
  200. IHXValues*     pHeader);
  201.     /////////////////////////////////////////////////////////////////////////
  202.     // Method:
  203.     //     IHXRenderer::OnPacket
  204.     // Purpose:
  205.     //     Called by client engine when a packet for this renderer is 
  206.     //     due.
  207.     //
  208.     STDMETHOD (OnPacket) (THIS_
  209. IHXPacket*     pPacket,
  210. LONG32     lTimeOffset);
  211.     /////////////////////////////////////////////////////////////////////////
  212.     // Method:
  213.     //     IHXRenderer::OnTimeSync
  214.     // Purpose:
  215.     //     Called by client engine to inform the renderer of the current
  216.     //     time relative to the streams synchronized time-line. The 
  217.     //     renderer should use this time value to update its display or
  218.     //     render it's stream data accordingly.
  219.     //
  220.     STDMETHOD (OnTimeSync) (THIS_
  221. ULONG32     ulTime);
  222.     /////////////////////////////////////////////////////////////////////////
  223.     //  Method:
  224.     //     IHXRenderer::OnPreSeek
  225.     //  Purpose:
  226.     //     Called by client engine to inform the renderer that a seek is
  227.     //     about to occur. The render is informed the last time for the 
  228.     //     stream's time line before the seek, as well as the first new
  229.     //     time for the stream's time line after the seek will be completed.
  230.     //
  231.     STDMETHOD (OnPreSeek) (THIS_
  232. ULONG32     ulOldTime,
  233. ULONG32     ulNewTime);
  234.     /////////////////////////////////////////////////////////////////////////
  235.     // Method:
  236.     //     IHXRenderer::OnPostSeek
  237.     // Purpose:
  238.     //     Called by client engine to inform the renderer that a seek has
  239.     //     just occured. The render is informed the last time for the 
  240.     //     stream's time line before the seek, as well as the first new
  241.     //     time for the stream's time line after the seek.
  242.     //
  243.     STDMETHOD (OnPostSeek) (THIS_
  244. ULONG32     ulOldTime,
  245. ULONG32     ulNewTime);
  246.     /////////////////////////////////////////////////////////////////////////
  247.     // Method:
  248.     //     IHXRenderer::OnPause
  249.     // Purpose:
  250.     //     Called by client engine to inform the renderer that a pause has
  251.     //     just occured. The render is informed the last time for the 
  252.     //     stream's time line before the pause.
  253.     //
  254.     STDMETHOD (OnPause) (THIS_
  255. ULONG32     ulTime);
  256.     /////////////////////////////////////////////////////////////////////////
  257.     // Method:
  258.     // IHXRenderer::OnBegin
  259.     // Purpose:
  260.     // Called by client engine to inform the renderer that a begin or
  261.     // resume has just occured. The render is informed the first time 
  262.     // for the stream's time line after the resume.
  263.     //
  264.     STDMETHOD (OnBegin) (THIS_
  265. ULONG32     ulTime);
  266.     /////////////////////////////////////////////////////////////////////////
  267.     // Method:
  268.     // IHXRenderer::OnBuffering
  269.     // Purpose:
  270.     // Called by client engine to inform the renderer that buffering
  271.     // of data is occuring. The render is informed of the reason for
  272.     // the buffering (start-up of stream, seek has occured, network
  273.     // congestion, etc.), as well as percentage complete of the 
  274.     // buffering process.
  275.     //
  276.     STDMETHOD (OnBuffering) (THIS_
  277. ULONG32     ulFlags,
  278. UINT16     unPercentComplete);
  279.     /////////////////////////////////////////////////////////////////////////
  280.     // Method:
  281.     // IHXRenderer::GetDisplayType
  282.     // Purpose:
  283.     // Called by client engine to ask the renderer for it's preferred
  284.     // display type. When layout information is not present, the 
  285.     // renderer will be asked for it's prefered display type. Depending
  286.     // on the display type a buffer of additional information may be 
  287.     // needed. This buffer could contain information about preferred
  288.     // window size.
  289.     //
  290.     STDMETHOD (GetDisplayType) (THIS_
  291. REF(HX_DISPLAY_TYPE) ulFlags,
  292. REF(IHXBuffer*) pBuffer);
  293.     /************************************************************************
  294.      * Method:
  295.      *     IHXRenderer::OnEndofPackets
  296.      * Purpose:
  297.      *     Called by client engine to inform the renderer that all the
  298.      *     packets have been delivered. However, if the user seeks before
  299.      *     EndStream() is called, renderer may start getting packets again
  300.      *     and the client engine will eventually call this function again.
  301.      */
  302.     STDMETHOD(OnEndofPackets) (THIS);
  303.     
  304.     /*
  305.      *  IHXDryNotification methods
  306.      */
  307.     /************************************************************************
  308.      *  Method:
  309.      *      IHXDryNotificationOnDryNotification
  310.      *  Purpose:
  311.      *     This function is called when it is time to write to audio device 
  312.      *     and there is not enough data in the audio stream. The renderer can
  313.      *     then decide to add more data to the audio stream. This should be 
  314.      *     done synchronously within the call to this function.
  315.      *     It is OK to not write any data. Silence will be played instead.
  316.      */
  317.     STDMETHOD(OnDryNotification) (THIS_
  318.   UINT32 /*IN*/ ulCurrentStreamTime,
  319.   UINT32 /*IN*/ ulMinimumDurationRequired);
  320.     /*
  321.      * IHXStatistics methods
  322.      */
  323.     STDMETHOD(InitializeStatistics) (THIS_ UINT32 ulRegistryID);
  324.     STDMETHOD(UpdateStatistics)     (THIS);
  325.     /*
  326.      * IHXInterruptSafe methods
  327.      */
  328.     /************************************************************************
  329.      * Method:
  330.      *     IHXInterruptSafe::IsInterruptSafe
  331.      * Purpose:
  332.      *     This is the function that will be called to determine if
  333.      *     interrupt time execution is supported.
  334.      */
  335.     STDMETHOD_(BOOL,IsInterruptSafe) (THIS) 
  336.      { return TRUE; };
  337.     IUnknown* GetContext(void)
  338.     {
  339. return m_pContext;
  340.     }
  341.     static LONG32 CmpTime(ULONG32 ulTime1, ULONG32 ulTime2)
  342.     {
  343. return ((LONG32) (ulTime1 - ulTime2));
  344.     }
  345.     /************************************************************************
  346.      * Public Statistics Methods
  347.      */
  348. #if defined(HELIX_FEATURE_STATS)
  349.     HX_RESULT ReportStat(AudioStatEntryID eEntryID, char* pVal)
  350.     {
  351. return m_pAudioStats->ReportStat(eEntryID, pVal);
  352.     }
  353.     
  354.     HX_RESULT ReportStat(AudioStatEntryID eEntryID, INT32 lVal)
  355.     {
  356. return m_pAudioStats->ReportStat(eEntryID, lVal);
  357.     }
  358. #else // HELIX_FEATURE_STATS
  359.     HX_RESULT ReportStat(AudioStatEntryID eEntryID, char* pVal)
  360.     {
  361. return HXR_OK;
  362.     }
  363.     
  364.     HX_RESULT ReportStat(AudioStatEntryID eEntryID, INT32 lVal)
  365.     {
  366. return HXR_OK;
  367.     }
  368. #endif // HELIX_FEATURE_STATS
  369. protected:
  370.     virtual ~CAudioRenderer();
  371.     /*
  372.      * Renderer's customizable fuctions - can be called any time
  373.      */
  374.     /*
  375.      * Fixed Renderer Configuration - must be callable at any time
  376.      */
  377.     virtual const char* GetUpgradeMimeType(void);
  378.     virtual const char* GetRendererName(void);
  379.     virtual const char* GetCodecName(void);
  380.     virtual const char* GetCodecFourCC(void);
  381.     /*
  382.      * Renderer Configuration - must be callable any time
  383.      *                           after reception of the header
  384.      */
  385.     virtual void GetStreamVersion(ULONG32 &ulThisMajorVersion, 
  386.   ULONG32 &ulThisMinorVersion);
  387.     virtual void GetContentVersion(ULONG32 &ulThisMajorVersion, 
  388.    ULONG32 &ulThisMinorVersion);
  389.     virtual CAudioFormat* CreateFormatObject(IHXValues* pHeader);
  390.     /*
  391.      * Renderer's member variables sharable with the derived renderer
  392.      */
  393.     IUnknown* m_pContext;
  394.     IHXStream* m_pStream;
  395.     IHXBackChannel* m_pBackChannel;
  396.     IHXValues* m_pHeader;
  397.     IHXErrorMessages*                   m_pErrorMessages;
  398.     IHXCommonClassFactory* m_pCommonClassFactory;
  399.     IHXPreferences* m_pPreferences;
  400.     IHXRegistry* m_pRegistry;
  401.     ULONG32 m_ulRegistryID;
  402.     CAudioFormat* m_pAudioFormat;
  403. #if defined(HELIX_FEATURE_STATS)
  404.     CAudioStatistics* m_pAudioStats;
  405. #else
  406.     void*                               m_pAudioStats;
  407. #endif /* HELIX_FEATURE_STATS */
  408.     LONG32 m_lRefCount;
  409. };
  410. #endif // _AUDREND_H_