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

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: RCSL 1.0/RPSL 1.0
  3.  *
  4.  * Portions Copyright (c) 1995-2003 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 FBBUFCTL_H
  36. #define FBBUFCTL_H
  37. #include "hxbufctl.h"
  38. #include "hxengin.h"
  39. #include "hxcore.h"
  40. #include "hxsmbw.h"
  41. #include "hxerror.h"
  42. #include "hxprefs.h" // IHXPreferences
  43. #include "hxpends.h" // IHXPendingStatus
  44. class HXFeedbackControl
  45. {
  46. public:
  47.     HXFeedbackControl();
  48.     
  49.     void Init(double c, double wn, double Kv, double delt);
  50.     void Reset(UINT32 ulSetPoint, 
  51.        INT32 e1, INT32 e2,
  52.        UINT32 c1, UINT32 c2);
  53.     void SetLimits(UINT32 ulMin, UINT32 ulMax);
  54.     UINT32 Control(UINT32 ulCurrentBits);
  55.     double SamplePeriod() const { return m_delt;}
  56.     UINT32 SetPoint() const {return m_ulSetPoint;}
  57.     UINT32 Min() const { return m_ulMin;}
  58.     UINT32 Max() const { return m_ulMax;}
  59. private:
  60.     UINT32 RoundAndClip(double value) const;
  61.     void Enqueue(INT32 error, UINT32 ulBandwidth);
  62.     double m_delt; // Sample period sec
  63.     double m_a1; // Weights in bandwith computation
  64.     double m_a2;
  65.     double m_b1;
  66.     double m_b2;
  67.     UINT32 m_ulSetPoint;        // Target value to stablize at
  68.                                 // Output clipping values
  69.     UINT32 m_ulMin;             // Minimum output value
  70.     UINT32 m_ulMax;             // Maximum output value
  71.     INT32 m_e1;                 // Error history
  72.     INT32 m_e2;
  73.     UINT32 m_c1;                // Control history
  74.     UINT32 m_c2;
  75. };
  76. class HXFeedbackBufferControl : public IHXBufferControl,
  77. public IHXCallback
  78. {
  79. public:
  80.     HXFeedbackBufferControl();
  81.     /*
  82.      * IUnknown methods
  83.      */
  84.     STDMETHOD(QueryInterface)   (THIS_
  85.                                 REFIID riid,
  86.                                 void** ppvObj);
  87.     STDMETHOD_(ULONG32,AddRef)  (THIS);
  88.     STDMETHOD_(ULONG32,Release) (THIS);
  89.     /*
  90.      * IHXBufferControl method
  91.      */
  92.     /************************************************************************
  93.      * Method:
  94.      *     IHXBufferControl::Init
  95.      * Purpose:
  96.      *      Initialize the buffer control object with a context
  97.      *      so it can find the interfaces it needs to do buffer
  98.      *      control
  99.      */
  100.     STDMETHOD(Init) (THIS_ IUnknown* pContext);
  101.     /************************************************************************
  102.      * Method:
  103.      *     IHXBufferControl::OnBuffering
  104.      * Purpose:
  105.      *      Called while buffering
  106.      */
  107.     STDMETHOD(OnBuffering) (THIS_ UINT32 ulRemainingInMs,
  108.     UINT32 ulRemainingInBytes);
  109.     /************************************************************************
  110.      * Method:
  111.      *     IHXBufferControl::OnBufferingDone
  112.      * Purpose:
  113.      *      Called when buffering is done
  114.      */
  115.     STDMETHOD(OnBufferingDone)(THIS);
  116.     /************************************************************************
  117.      * Method:
  118.      *     IHXBufferControl::OnResume
  119.      * Purpose:
  120.      *      Called when playback is resumed
  121.      */
  122.     STDMETHOD(OnResume) (THIS);
  123.     
  124.     /************************************************************************
  125.      * Method:
  126.      *     IHXBufferControl::OnPause
  127.      * Purpose:
  128.      *      Called when playback is paused
  129.      */
  130.     STDMETHOD(OnPause) (THIS);
  131.     /************************************************************************
  132.      * Method:
  133.      *     IHXBufferControl::OnSeek
  134.      * Purpose:
  135.      *      Called when a seek occurs
  136.      */
  137.     STDMETHOD(OnSeek) (THIS);
  138.     /************************************************************************
  139.      * Method:
  140.      *     IHXBufferControl::OnClipEnd
  141.      * Purpose:
  142.      *      Called when we get the last packet in the clip
  143.      */
  144.     STDMETHOD(OnClipEnd) (THIS);
  145.     /************************************************************************
  146.      * Method:
  147.      *     IHXBufferControl::Close()
  148.      * Purpose:
  149.      *      Called when the owner of this object wishes to shutdown
  150.      *      and destroy this object. This call causes the buffer control
  151.      *      object to release all it's interfaces references.
  152.      */
  153.     STDMETHOD(Close)(THIS);
  154.     /************************************************************************
  155.      * Method:
  156.      *     IHXCallback::Func
  157.      * Purpose:
  158.      *     This is the function that will be called when a callback is
  159.      *     to be executed.
  160.      */
  161.     STDMETHOD(Func) (THIS);
  162. private:
  163.     typedef enum {csError,
  164.   csNotInitialized,
  165.   csInitialized,
  166.   csBuffering,
  167.   csPlaying,
  168.   csPaused,
  169.   csSeeking,
  170.   csClipEnd} ControlState;
  171.     ~HXFeedbackBufferControl();
  172.     void ChangeState(ControlState newState);
  173.     BOOL Initialized() const { return (csInitialized <= m_state);}
  174.     void ScheduleCallback();
  175.     void StartCallback();
  176.     void StopCallback();
  177.     HX_RESULT GetBwInfo(REF(UINT32) ulClipBw,
  178. REF(UINT16) nControlStream, REF(UINT32) ulControlBw);
  179.     HX_RESULT GetStreamBw(UINT16 uStreamNumber, REF(UINT32) ulBandwidth);
  180.     BOOL IsAudioStream(UINT16 uStreamNumber);
  181.     
  182.     void GetControlData(REF(UINT32) ulTotalBits,
  183. REF(UINT32) ulControlBits);
  184.     HX_RESULT Control(UINT32 ulControlBits, REF(UINT32) ulNewBandwidth);
  185.     void SetBandwidth(UINT32 ulBandwidth);
  186.     HX_RESULT ReadPrefSettings();
  187.     void SetTransportByteLimits(UINT32 ulClipBw);
  188.     BOOL IsBuffering();
  189.     UINT32 ControlToTotal(UINT32 ulValue);
  190.     UINT32 TotalToControl(UINT32 ulValue);
  191.     UINT32 MulDiv(UINT32 ulValue, UINT32 ulMult, UINT32 ulDiv);
  192.     
  193.     UINT32 ClampBandwidth(UINT32 ulBandwidth) const;
  194.     // Used to initialize functionallity related to testing
  195.     HX_RESULT InitTesting(IUnknown* pContext);
  196.     ULONG32 m_lRefCount;
  197.     IHXScheduler* m_pScheduler;
  198.     CallbackHandle m_callbackHandle;
  199.     HXTimeval m_lastTime;
  200.     IHXStreamSource* m_pSource;
  201.     IHXSourceBufferingStats2* m_pBufferStats;
  202.     IHXThinnableSource* m_pThin;
  203.     IHXPreferences* m_pPrefs;
  204.     IHXPendingStatus* m_pStatus;
  205.     IHXErrorMessages* m_pErrMsg;
  206.     
  207.     HXFeedbackControl m_control; // control algorithm
  208.     UINT32 m_ulClipBw;           // Clip bandwidth
  209.     // Control stream values
  210.     UINT16 m_nControlStream;     // Control stream index
  211.     UINT32 m_ulControlBw;        // Control stream bandwidth
  212.     BOOL m_bControlTotal;        // Control total buffer?
  213.     BOOL m_bPaused;
  214.     ControlState m_state;
  215. };
  216. #endif /* FBBUFCTL_H */