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

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 _RARENDER_H_
  36. #define _RARENDER_H_
  37. /****************************************************************************
  38.  *  Defines
  39.  */
  40. #define STREAM_MAJOR_VERSION  0
  41. #define STREAM_MINOR_VERSION  0
  42. #define CONTENT_MAJOR_VERSION 0
  43. #define CONTENT_MINOR_VERSION 0
  44. /****************************************************************************
  45.  *  Includes
  46.  */
  47. #include "hxcom.h"
  48. #include "baseobj.h"
  49. #include "hxtypes.h"
  50. #include "hxslist.h"
  51. #include "hxresult.h"
  52. #include "hxmarsh.h"
  53. #include "netbyte.h"
  54. #include "hxmime.h"
  55. #include "hxcom.h"
  56. #include "chxpckts.h"
  57. #include "hxheap.h"
  58. #include "hxcomm.h"
  59. #include "ihxpckts.h"
  60. #include "hxfiles.h"
  61. #include "hxcore.h"
  62. #include "hxengin.h"
  63. #include "hxprefs.h"
  64. #include "hxrendr.h"
  65. #include "hxplugn.h"
  66. #include "hxbdwdth.h"
  67. #include "hxausvc.h"
  68. #include "hxslist.h"
  69. #include "hxupgrd.h"
  70. #include "raparser.h"
  71. #include "hxasm.h"
  72. #include "hxrasyn.h"
  73. #include "rmfftype.h"
  74. #include "hxthread.h"
  75. #include "hxerror.h"
  76. #include "pckunpck.h"
  77. #include "adjtime.h"
  78. #include "vbrdepack.h"
  79. #include "dllpath.h"
  80. #include "readpath.h"
  81. #include "hxcodec.h"
  82. #include "codec.h"
  83. #include "errdbg.h"
  84. #include "hxtick.h"
  85. #include "hxstrutl.h"
  86. #include "raformat.h"
  87. /****************************************************************************
  88.  *  Defines
  89.  */
  90. #define NO_STREAM_SET 0xFFFF
  91. class CRealAudioRenderer;
  92. class CDryNotificationCallback;
  93. /////////////////////////////////////////////////////////////////////////////
  94. //
  95. //  Class:
  96. //
  97. // CRealAudioRenderer
  98. //
  99. //  Purpose:
  100. //
  101. // Implementation of a basic RealAudio renderer.
  102. //
  103. class RuleToFlagMap;
  104. class HXMutex;
  105. class CRealAudioRenderer :  public IHXPlugin,
  106.                             public IHXRenderer,
  107.     public IHXInterruptSafe,
  108.     public IHXDryNotification,
  109.     public IHXBandwidthLister,
  110.     public IHXStatistics,
  111.                             public IHXValues, // for HELIX_FEATURE_SETSRCPROPS
  112.     public IHXUpdateProperties,
  113.     public CHXBaseCountingObject
  114. {
  115. protected:
  116.     LONG32     m_lRefCount;
  117.     IUnknown*     m_pContext;
  118.     IHXStream*     m_pStream;
  119.     IHXASMStream2*          m_pASMStream;
  120.     IHXSourceBufferingStats* m_pBufferingStats;
  121.     IHXAudioPlayer*     m_pAudioPlayer;
  122.     IHXErrorMessages*     m_pErrorMessages;
  123.     CRaFormat**     m_pRaFormats;
  124.     IHXAudioStream**     m_pAudioStreams;
  125.     IHXCommonClassFactory* m_pCommonClassFactory;
  126.     UINT32     m_ulPreroll;
  127.     UINT32     m_ulDelay;
  128.     UINT32     m_ulDuration;
  129.     LONG32     m_lTimeLineOffset;
  130.     UINT16     m_usCurrentDryNotificationStream;
  131.     UINT16     m_usPreviousDryNotificationStream;
  132.     UINT16     m_usThisSourceStream;
  133.     UINT32     m_ulCurrentTimelineTime;
  134.     // statistics
  135.     IHXRegistry*     m_pRegistry;
  136.     UINT32     m_ulRegistryID;
  137.     UINT32     m_ulNameRegID;
  138.     UINT32     m_ulSmartStreamRegID;
  139.     UINT32     m_ulCodecRegID;
  140.     UINT32     m_ulCodecTextRegID;
  141.     UINT32     m_ulCodec4CCRegID;
  142.     UINT32     m_ulRateRegID;
  143.     UINT32     m_ulChannelsRegID;
  144.     UINT32     m_ulSurroundRegID;
  145.     HX_BITFIELD     m_bDoneWritingPackets:1;
  146.     HX_BITFIELD     m_bEndOfPackets:1;
  147. #ifdef _MACINTOSH
  148.     HX_BITFIELD     m_bProcessingPacket:1;
  149. #endif // _MACINTOSH
  150.     HX_BITFIELD     m_bAllStreamsToBeUnregistered:1;
  151.     HX_BITFIELD     m_bInSeekMode:1;
  152.     HX_BITFIELD     m_bReportOKStatus:1;
  153.     HX_BITFIELD     m_bStreamSwitchable:1;
  154.     HX_BITFIELD     m_bFirstPacket:1;
  155.     HX_BITFIELD     m_bDelayOffsetSet:1;
  156.     HX_BITFIELD     m_bPreRedstonePlayer:1;
  157.     UINT32     m_ulCurrentGranularity;
  158.     IHXAudioPushdown2*     m_pAudioPushdown2;
  159.     // Stream Switching
  160.     RuleToFlagMap*     m_pRuleToFlagMap;
  161.     UINT16     m_uNumOfSubStreams;
  162.     UINT16     m_uNumOfRules;
  163.     UINT16*     m_pRuleMap;
  164.     BOOL     m_bSecurityBreached;
  165.     typedef enum
  166.     {
  167. stopped, buffering, playing, paused, seeking
  168.     } PlayState;
  169.     PlayState m_PlayState;
  170.     typedef enum
  171.     {
  172. none, unknownRAContentVersion
  173.     } AutoUpgradeRequestExtraInfo;
  174.     class CUnregisterInfo
  175.     {
  176.     public:
  177. CUnregisterInfo(UINT32 ulTime, UINT16 uStream)
  178. {
  179.     m_uStreamToBeUnregistered = uStream;
  180.     m_ulUnregisterTime = ulTime;
  181. }
  182. virtual ~CUnregisterInfo() {};
  183. UINT16     m_uStreamToBeUnregistered;
  184. UINT32     m_ulUnregisterTime;
  185.     };
  186.     UINT16     m_uSyncUnregisterStream;
  187.     UINT32     m_ulSyncUnregisterTime;
  188.     HXMutex*     m_pMutex;
  189.     UINT32     m_ulLatestStreamTime;
  190.     UINT32     m_ulLatestActualTime;
  191.     double     m_fLatestStreamTime;
  192.     UINT32                  m_ulSrcPropertySubStream;
  193.     IHXValues*              m_pValues;
  194.     CVBRSimpleDepacketizer** m_ppVBRDepack;
  195. #ifdef _MACINTOSH
  196.     CDryNotificationCallback* m_pDryCallback;
  197. #endif
  198.     static const char* const     zm_pName;
  199.     static const char* const     zm_pDescription;
  200.     static const char* const     zm_pCopyright;
  201.     static const char* const      zm_pMoreInfoURL;
  202.     static const char* const     zm_pStreamMimeTypes[];
  203.     static const char* const      zm_pAdditionalAutoUpgradeInfo[];
  204.     virtual CRaFormat* CreateRaFormat(UINT16 uStreamNum);
  205.     BOOL HaveDataToWrite();
  206.     virtual HX_RESULT FindLowestStartTime(UINT16 &uLowest,
  207.  UINT32 &ulLowestStartTime,
  208.  UINT32 &ulLowestEndTime,
  209.  UINT16 &nActive);
  210.     virtual HX_RESULT FindLongestOverlap(UINT16 uLowest,
  211.  UINT32 ulLowestEndTime,
  212.  UINT16 nActive,
  213.  UINT16 &uLongestOverlap,
  214.  AUDIO_STATE &audioState);
  215.     virtual void GetLatestTimesForStream(UINT16 uStream,
  216.  UINT32& ulLatestActualTime,
  217.  UINT32& ulLatestStreamTime);
  218.     virtual void OffsetLatestTime(UINT16 uStreamNumber,
  219.   INT32 lTimeOffset);
  220.     virtual BOOL IsCrossfadeInProgress(void);
  221.     virtual HX_RESULT AttemptCrossfade(UINT16 uLowest, // From
  222.        UINT16 uLongetOverlap, // To
  223.        UINT32 ulLatestActualTime,
  224.        UINT32 ulLatestStreamTime,
  225.        UINT32& ulFromStreamTimeStart,
  226.        UINT32& ulFromActualTimeStart,
  227.        AUDIO_STATE audioState);
  228.     virtual HX_RESULT AttemptCrossfadeTermination(UINT16& uStream,
  229.   UINT32 ulActualTimestamp,
  230.   BOOL bStreamDone);
  231.     HX_RESULT AddDryNotification(UINT16 usStreamNumber);
  232.     HX_RESULT CheckStreamVersions(IHXValues* pHeader);
  233.     HX_RESULT InitAudioStream(CRaFormat* pRaFormat,
  234.       IHXValues* pHeader,
  235.       IHXAudioStream** ppAudioStream);
  236.     HX_RESULT DoAudio(UINT32 &ulAudioTime,
  237.       AUDIO_STATE audioState);
  238.     virtual HX_RESULT WriteToAudioServices(UINT16 uStreamNumber,
  239.    HXAudioData* pAuidoData,
  240.    UINT32 ulActualTimestamp);
  241.     HX_RESULT GetQualityPreference(UINT16 &usQuality);
  242.     virtual void CalculateMaxTimeStamp(UINT16 uStreamNumber,
  243.        HXAudioData* pAudioData,
  244.        UINT32 ulActualTimeStamp,
  245.        UINT32* pulDataDuration = NULL,
  246.        double *pfDataDuration = NULL);
  247.     virtual void DoSyncRegister(UINT16 ulStreamNumber);
  248.     virtual void QueueUnregisterSync(UINT16 ulStream, UINT32 ulTime);
  249.     virtual void UnregisterTimeSyncs(UINT32 ulCurrentTime);
  250.     virtual void FlushUnregisterQueue(BOOL bDestroy = FALSE);
  251.     void ScheduleDryCallback(UINT32 ulAudioTimeWanted);
  252.     inline  BOOL IsStreamActive(UINT16 usStreamNumber)
  253. {return m_pRaFormats[usStreamNumber]->IsActive();}
  254.     inline void LogAudioWrite(UINT16 uStreamNumber,
  255.       HXAudioData* pAudioData,
  256.       UINT32 ulActualTimestamp,
  257.       HX_RESULT retVal);
  258.     void      CheckForSetSourceProperties(BOOL bForceRefresh = FALSE);
  259.     HX_RESULT GetSourcePropertyULONG32(const char* pszProp, REF(ULONG32) rulVal);
  260.     HX_RESULT GetSourcePropertyCString(const char* pszProp, REF(IHXBuffer*) rpBuffer);
  261.     void WriteCodecsToRegistry(const char* pAllCodecs);
  262.     void AddCodec(IHXValues*, char*, UINT32, UINT32, int);
  263.     void RemoveCurrentDryNotification();
  264.     HX_RESULT _OnPacket(IHXPacket* pPacket, INT32 lTimeOffset);
  265.     inline ULONG32 _AddRef(void);
  266.     inline ULONG32 _Release(void);
  267. public:
  268.     static void AdvanceLatestTime(UINT32 uBaseStreamTime,
  269.   UINT32 ulBaseActualTime,
  270.   UINT32 ulDurationAdvance,
  271.   double fDurationAdvance,
  272.   UINT32 &ulLatestStreamTime,
  273.   double &fLatestStreamTime,
  274.   UINT32 &ulLatestActualTime);
  275.     STDMETHOD(AttemptToSatisfyDryRequest)(THIS_ UINT32 ulAudioTimeWanted);
  276.     CRealAudioRenderer();
  277.     virtual ~CRealAudioRenderer();
  278.     // *** IHXPlugin methods ***
  279.     /************************************************************************
  280.      * Method:
  281.      *     IHXPlugin::GetPluginInfo
  282.      * Purpose:
  283.      *     Returns the basic information about this plugin. Including:
  284.      *
  285.      *     bLoadMultiple whether or not this plugin DLL can be loaded
  286.      * multiple times. All File Formats must set
  287.      * this value to TRUE.
  288.      *     pDescription which is used in about UIs (can be NULL)
  289.      *     pCopyright which is used in about UIs (can be NULL)
  290.      *     pMoreInfoURL which is used in about UIs (can be NULL)
  291.      */
  292.     STDMETHOD(GetPluginInfo) (THIS_
  293. REF(BOOL)        /*OUT*/ bLoadMultiple,
  294. REF(const char*) /*OUT*/ pDescription,
  295. REF(const char*) /*OUT*/ pCopyright,
  296. REF(const char*) /*OUT*/ pMoreInfoURL,
  297. REF(ULONG32)  /*OUT*/ ulVersionNumber
  298. );
  299.     /************************************************************************
  300.      * Method:
  301.      *     IHXPlugin::InitPlugin
  302.      * Purpose:
  303.      *     Initializes the plugin for use. This interface must always be
  304.      *     called before any other method is called. This is primarily needed
  305.      *     so that the plugin can have access to the context for creation of
  306.      *     IHXBuffers and IMalloc.
  307.      */
  308.     STDMETHOD(InitPlugin)   (THIS_
  309.     IUnknown*   /*IN*/  pContext);
  310.     // *** IUnknown methods ***
  311.     STDMETHOD(QueryInterface) (THIS_
  312. REFIID riid,
  313. void** ppvObj);
  314.     STDMETHOD_(ULONG32,AddRef) (THIS);
  315.     STDMETHOD_(ULONG32,Release) (THIS);
  316.     // *** IHXRenderer methods ***
  317.     /************************************************************************
  318.      * Method:
  319.      *     IHXRenderer::GetRendererInfo
  320.      * Purpose:
  321.      *     Returns information vital to the instantiation of rendering
  322.      *     plugins.
  323.      */
  324.     STDMETHOD(GetRendererInfo)     (THIS_
  325.     REF(const char**) /*OUT*/ pStreamMimeTypes,
  326.     REF(UINT32)      /*OUT*/ unInitialGranularity
  327.     );
  328.     /////////////////////////////////////////////////////////////////////////
  329.     // Method:
  330.     //     IHXRenderer::StartStream
  331.     // Purpose:
  332.     //     Called by client engine to inform the renderer of the stream it
  333.     //     will be rendering. The stream interface can provide access to
  334.     //     its source or player. This method also provides access to the
  335.     //     primary client controller interface.
  336.     //
  337.     STDMETHOD (StartStream) (THIS_
  338. IHXStream*     pStream,
  339. IHXPlayer*     pPlayer);
  340.     /////////////////////////////////////////////////////////////////////////
  341.     // Method:
  342.     //     IHXRenderer::EndStream
  343.     // Purpose:
  344.     //     Called by client engine to inform the renderer that the stream
  345.     //     is was rendering is closed.
  346.     //
  347.     STDMETHOD (EndStream) (THIS);
  348.     /////////////////////////////////////////////////////////////////////////
  349.     // Method:
  350.     // IHXRenderer::OnHeader
  351.     // Purpose:
  352.     // Called by client engine when a header for this renderer is
  353.     // available. The header will arrive before any packets.
  354.     //
  355.     STDMETHOD (OnHeader) (THIS_
  356. IHXValues*     pHeader);
  357.     /////////////////////////////////////////////////////////////////////////
  358.     // Method:
  359.     //     IHXRenderer::OnPacket
  360.     // Purpose:
  361.     //     Called by client engine when a packet for this renderer is
  362.     //     due.
  363.     //
  364.     STDMETHOD (OnPacket) (THIS_
  365. IHXPacket*     pPacket,
  366. LONG32      lTimeOffset);
  367.     /////////////////////////////////////////////////////////////////////////
  368.     // Method:
  369.     //     IHXRenderer::OnTimeSync
  370.     // Purpose:
  371.     //     Called by client engine to inform the renderer of the current
  372.     //     time relative to the streams synchronized time-line. The
  373.     //     renderer should use this time value to update its display or
  374.     //     render it's stream data accordingly.
  375.     //
  376.     STDMETHOD (OnTimeSync) (THIS_
  377. ULONG32     ulTime);
  378.     /////////////////////////////////////////////////////////////////////////
  379.     //  Method:
  380.     //     IHXRenderer::OnPreSeek
  381.     //  Purpose:
  382.     //     Called by client engine to inform the renderer that a seek is
  383.     //     about to occur. The render is informed the last time for the
  384.     //     stream's time line before the seek, as well as the first new
  385.     //     time for the stream's time line after the seek will be completed.
  386.     //
  387.     STDMETHOD (OnPreSeek) (THIS_
  388. ULONG32     ulOldTime,
  389. ULONG32     ulNewTime);
  390.     /////////////////////////////////////////////////////////////////////////
  391.     // Method:
  392.     //     IHXRenderer::OnPostSeek
  393.     // Purpose:
  394.     //     Called by client engine to inform the renderer that a seek has
  395.     //     just occured. The render is informed the last time for the
  396.     //     stream's time line before the seek, as well as the first new
  397.     //     time for the stream's time line after the seek.
  398.     //
  399.     STDMETHOD (OnPostSeek) (THIS_
  400. ULONG32     ulOldTime,
  401. ULONG32     ulNewTime);
  402.     /////////////////////////////////////////////////////////////////////////
  403.     // Method:
  404.     //     IHXRenderer::OnPause
  405.     // Purpose:
  406.     //     Called by client engine to inform the renderer that a pause has
  407.     //     just occured. The render is informed the last time for the
  408.     //     stream's time line before the pause.
  409.     //
  410.     STDMETHOD (OnPause) (THIS_
  411. ULONG32     ulTime);
  412.     /////////////////////////////////////////////////////////////////////////
  413.     // Method:
  414.     // IHXRenderer::OnBegin
  415.     // Purpose:
  416.     // Called by client engine to inform the renderer that a begin or
  417.     // resume has just occured. The render is informed the first time
  418.     // for the stream's time line after the resume.
  419.     //
  420.     STDMETHOD (OnBegin) (THIS_
  421. ULONG32     ulTime);
  422.     /////////////////////////////////////////////////////////////////////////
  423.     // Method:
  424.     // IHXRenderer::OnBuffering
  425.     // Purpose:
  426.     // Called by client engine to inform the renderer that buffering
  427.     // of data is occuring. The render is informed of the reason for
  428.     // the buffering (start-up of stream, seek has occured, network
  429.     // congestion, etc.), as well as percentage complete of the
  430.     // buffering process.
  431.     //
  432.     STDMETHOD (OnBuffering) (THIS_
  433. ULONG32     ulFlags,
  434. UINT16     unPercentComplete);
  435.     /////////////////////////////////////////////////////////////////////////
  436.     // Method:
  437.     // IHXRenderer::GetDisplayType
  438.     // Purpose:
  439.     // Called by client engine to ask the renderer for it's preferred
  440.     // display type. When layout information is not present, the
  441.     // renderer will be asked for it's prefered display type. Depending
  442.     // on the display type a buffer of additional information may be
  443.     // needed. This buffer could contain information about preferred
  444.     // window size.
  445.     //
  446.     STDMETHOD (GetDisplayType) (THIS_
  447. REF(HX_DISPLAY_TYPE) ulFlags,
  448. REF(IHXBuffer*) pBuffer);
  449.     /************************************************************************
  450.      * Method:
  451.      *     IHXRenderer::OnEndofPackets
  452.      * Purpose:
  453.      *     Called by client engine to inform the renderer that all the
  454.      *     packets have been delivered. However, if the user seeks before
  455.      *     EndStream() is called, renderer may start getting packets again
  456.      *     and the client engine will eventually call this function again.
  457.      */
  458.     STDMETHOD(OnEndofPackets) (THIS);
  459.     /*
  460.      *  IHXDryNotification methods
  461.      */
  462.     /************************************************************************
  463.      *  Method:
  464.      *      IHXDryNotificationOnDryNotification
  465.      *  Purpose:
  466.      *     This function is called when it is time to write to audio device
  467.      *     and there is not enough data in the audio stream. The renderer can
  468.      *     then decide to add more data to the audio stream. This should be
  469.      *     done synchronously within the call to this function.
  470.      *     It is OK to not write any data. Silence will be played instead.
  471.      */
  472.     STDMETHOD(OnDryNotification) (THIS_
  473. UINT32 /*IN*/ ulCurrentStreamTime,
  474. UINT32 /*IN*/ ulMinimumDurationRequired);
  475.     /*
  476.      * IHXStatistics methods
  477.      */
  478.     /************************************************************************
  479.      *  Method:
  480.      *      IHXStatistics::InitializeStatistics
  481.      *  Purpose:
  482.      *      Pass registry ID to the caller
  483.      */
  484.     STDMETHOD (InitializeStatistics)
  485. (THIS_
  486. UINT32     /*IN*/ ulRegistryID);
  487.     /************************************************************************
  488.      *  Method:
  489.      *      IHXStatistics::UpdateStatistics
  490.      *  Purpose:
  491.      *      Notify the client to update its statistics stored in the registry
  492.      */
  493.     STDMETHOD (UpdateStatistics)(THIS);
  494.     STDMETHOD (GetBandwidthInfo) (THIS_ IHXValues* pValues);
  495.     /*
  496.      * IHXInterruptSafe methods
  497.      */
  498.     /************************************************************************
  499.      * Method:
  500.      *     IHXInterruptSafe::IsInterruptSafe
  501.      * Purpose:
  502.      *     This is the function that will be called to determine if
  503.      *     interrupt time execution is supported.
  504.      */
  505.     STDMETHOD_(BOOL,IsInterruptSafe) (THIS)
  506.      { return TRUE; };
  507.     /************************************************************************
  508.      * Method:
  509.      *     IHXUpdateProperties::UpdatePacketTimeOffset
  510.      * Purpose:
  511.      *     Call this method to update the timestamp offset of cached packets
  512.      */
  513.     STDMETHOD(UpdatePacketTimeOffset) (THIS_
  514.                                        INT32 lTimeOffset);
  515.     /************************************************************************
  516.      * Method:
  517.      *     IHXUpdateProperties::UpdatePlayTimes
  518.      * Purpose:
  519.      *     Call this method to update the playtime attributes
  520.      */
  521.     STDMETHOD(UpdatePlayTimes)       (THIS_
  522.        IHXValues* pProps);
  523.     // IHXValues methods
  524.     STDMETHOD(SetPropertyULONG32)      (THIS_ const char* pName, ULONG32 ulVal);
  525.     STDMETHOD(GetPropertyULONG32)      (THIS_ const char* pName, REF(ULONG32) rulVal);
  526.     STDMETHOD(GetFirstPropertyULONG32) (THIS_ REF(const char*) rpName, REF(ULONG32) rulVal);
  527.     STDMETHOD(GetNextPropertyULONG32)  (THIS_ REF(const char*) rpName, REF(ULONG32) rulVal);
  528.     STDMETHOD(SetPropertyBuffer)       (THIS_ const char* pName, IHXBuffer* pVal);
  529.     STDMETHOD(GetPropertyBuffer)       (THIS_ const char* pName, REF(IHXBuffer*) rpVal);
  530.     STDMETHOD(GetFirstPropertyBuffer)  (THIS_ REF(const char*) rpName, REF(IHXBuffer*) rpVal);
  531.     STDMETHOD(GetNextPropertyBuffer)   (THIS_ REF(const char*) rpName, REF(IHXBuffer*) rpVal);
  532.     STDMETHOD(SetPropertyCString)      (THIS_ const char* pName, IHXBuffer* pVal);
  533.     STDMETHOD(GetPropertyCString)      (THIS_ const char* pName, REF(IHXBuffer*) rpVal);
  534.     STDMETHOD(GetFirstPropertyCString) (THIS_ REF(const char*) rpName, REF(IHXBuffer*) rpVal);
  535.     STDMETHOD(GetNextPropertyCString)  (THIS_ REF(const char*) rpName, REF(IHXBuffer*) rpVal);
  536.     static HX_RESULT STDAPICALLTYPE HXCreateInstance(IUnknown** ppIUnknown);
  537.     static HX_RESULT STDAPICALLTYPE CanUnload2(void);
  538. };
  539. #ifdef _MACINTOSH
  540. class CDryNotificationCallback : public IHXCallback
  541. {
  542. private:
  543.     LONG32     m_lRefCount;
  544.     CRealAudioRenderer*     m_pOutter;
  545.     UINT32     m_ulAudioTimeWanted;
  546.     IHXScheduler*     m_pScheduler;
  547.     CallbackHandle     m_PendingHandle;
  548.     HX_BITFIELD     m_bPendingCallback:1;
  549.     CDryNotificationCallback(UINT32 ulAudioTimeWanted, CRealAudioRenderer* pOutter, IUnknown* pIUnknown)
  550. : m_lRefCount(0)
  551. , m_ulAudioTimeWanted(ulAudioTimeWanted)
  552. , m_pOutter(pOutter)
  553. , m_pScheduler(NULL)
  554. , m_PendingHandle(NULL)
  555. , m_bPendingCallback(FALSE)
  556.     {
  557. if (m_pOutter != NULL)
  558. {
  559.     m_pOutter->AddRef();
  560. }
  561. if (HXR_OK != pIUnknown->QueryInterface(IID_IHXScheduler,
  562. (void **) &m_pScheduler))
  563. {
  564.     m_pScheduler = NULL;
  565. }
  566.     };
  567.     virtual ~CDryNotificationCallback()
  568.     {
  569. HX_RELEASE(m_pOutter);
  570. HX_RELEASE(m_pScheduler);
  571.     }
  572.     PRIVATE_DESTRUCTORS_ARE_NOT_A_CRIME
  573. public:
  574.     static CDryNotificationCallback*
  575.     CreateInstance(UINT32 ulAudioTimeWanted, CRealAudioRenderer* pOutter, IUnknown* pUnk)
  576.     {
  577. CDryNotificationCallback* pInst = new CDryNotificationCallback(ulAudioTimeWanted, pOutter, pUnk);
  578. if (pInst != NULL)
  579. {
  580.     pInst->AddRef();
  581. }
  582. return pInst;
  583.     }
  584.     /*
  585.      *  IUnknown methods
  586.      */
  587.     STDMETHODIMP QueryInterface(REFIID riid, void** ppvObj)
  588.     {
  589. if (IsEqualIID(riid, IID_IUnknown))
  590. {
  591.     AddRef();
  592.     *ppvObj = (IUnknown*)this;
  593.     return HXR_OK;
  594. }
  595. else if (IsEqualIID(riid, IID_IHXCallback))
  596. {
  597.     AddRef();
  598.     *ppvObj = (IHXCallback*)this;
  599.     return HXR_OK;
  600. }
  601. *ppvObj = NULL;
  602. return HXR_NOINTERFACE;
  603.     }
  604.     STDMETHODIMP_(ULONG32)
  605.     AddRef()
  606.     {
  607. return InterlockedIncrement(&m_lRefCount);
  608.     }
  609.     STDMETHODIMP_(ULONG32)
  610.     Release()
  611.     {
  612. if (InterlockedDecrement(&m_lRefCount) > 0)
  613. {
  614.     return m_lRefCount;
  615. }
  616. delete this;
  617. return 0;
  618.     }
  619.     STDMETHODIMP
  620.     Func()
  621.     {
  622. m_PendingHandle = 0;
  623. m_bPendingCallback = FALSE;
  624. if (m_pOutter != NULL)
  625. {
  626.     return m_pOutter->AttemptToSatisfyDryRequest(m_ulAudioTimeWanted);
  627. }
  628. else
  629. {
  630.     return HXR_UNEXPECTED;
  631. }
  632.     }
  633.     STDMETHODIMP
  634.     ScheduleCallback()
  635.     {
  636. IHXCallback* pCallback = NULL;
  637. if (HXR_OK == QueryInterface(IID_IHXCallback, (void**)&pCallback))
  638. {
  639.     // we want to do the right thing here and remove a callback before we schedule a new one
  640.     // but we should never do that.
  641.     HX_ASSERT(!m_bPendingCallback);
  642.     if (m_bPendingCallback)
  643.     {
  644. if (m_pScheduler)
  645. {
  646.     m_pScheduler->Remove(m_PendingHandle);
  647. }
  648.     }
  649.     m_bPendingCallback = TRUE;
  650.     m_PendingHandle = m_pScheduler->RelativeEnter(pCallback, 0);
  651. }
  652. HX_RELEASE(pCallback);
  653. return HXR_OK;
  654.     }
  655.     STDMETHODIMP
  656.     Cancel()
  657.     {
  658. if (m_bPendingCallback && m_pScheduler)
  659. {
  660.     m_pScheduler->Remove(m_PendingHandle);
  661.     m_bPendingCallback = FALSE;
  662.     m_PendingHandle = 0;
  663. }
  664. return HXR_OK;
  665.     }
  666.     STDMETHODIMP
  667.     UpdateAudioTimeWanted(UINT32 ulAudioTimeWanted)
  668.     {
  669. HX_ASSERT(m_bPendingCallback);
  670. m_ulAudioTimeWanted = ulAudioTimeWanted;
  671. return HXR_OK;
  672.     }
  673. };
  674. #endif /*_MACINTOSH*/
  675. ULONG32 CRealAudioRenderer::_AddRef()
  676. {
  677.     return InterlockedIncrement(&m_lRefCount);
  678. }
  679. ULONG32 CRealAudioRenderer::_Release()
  680. {
  681.     if (InterlockedDecrement(&m_lRefCount) > 0)
  682.     {
  683.         return m_lRefCount;
  684.     }
  685.     delete this;
  686.     return 0;
  687. }
  688. #endif // ndef _RARENDER_H_