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

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