ShoutcastSource.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:5k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #pragma once
  22. #include <atlbase.h>
  23. #include <afxtempl.h>
  24. #include <afxinet.h>
  25. #include <afxsock.h>
  26. #include <atlutil.h>
  27. #include <qnetwork.h>
  28. [uuid("68F540E9-766F-44d2-AB07-E26CC6D27A79")]
  29. class CShoutcastSource
  30. : public CSource
  31. , public IFileSourceFilter
  32. , public IAMFilterMiscFlags
  33. , public IAMOpenProgress
  34. , public IAMMediaContent
  35. {
  36. CStringW m_fn;
  37. public:
  38. CShoutcastSource(LPUNKNOWN lpunk, HRESULT* phr);
  39. virtual ~CShoutcastSource();
  40. DECLARE_IUNKNOWN;
  41.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  42. // IFileSourceFilter
  43. STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
  44. STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
  45. // IAMFilterMiscFlags
  46. STDMETHODIMP_(ULONG) GetMiscFlags();
  47. // IAMOpenProgress
  48.     STDMETHODIMP QueryProgress(LONGLONG* pllTotal, LONGLONG* pllCurrent);
  49.     STDMETHODIMP AbortOperation();
  50. // IAMMediaContent
  51. STDMETHODIMP GetTypeInfoCount(UINT* pctinfo) {return E_NOTIMPL;}
  52. STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo) {return E_NOTIMPL;}
  53. STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid) {return E_NOTIMPL;}
  54. STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr) {return E_NOTIMPL;}
  55. STDMETHODIMP get_AuthorName(BSTR* pbstrAuthorName) {return E_NOTIMPL;}
  56. STDMETHODIMP get_Title(BSTR* pbstrTitle);
  57. STDMETHODIMP get_Rating(BSTR* pbstrRating) {return E_NOTIMPL;}
  58. STDMETHODIMP get_Description(BSTR* pbstrDescription) {return E_NOTIMPL;}
  59. STDMETHODIMP get_Copyright(BSTR* pbstrCopyright) {return E_NOTIMPL;}
  60. STDMETHODIMP get_BaseURL(BSTR* pbstrBaseURL) {return E_NOTIMPL;}
  61. STDMETHODIMP get_LogoURL(BSTR* pbstrLogoURL) {return E_NOTIMPL;}
  62. STDMETHODIMP get_LogoIconURL(BSTR* pbstrLogoURL) {return E_NOTIMPL;}
  63. STDMETHODIMP get_WatermarkURL(BSTR* pbstrWatermarkURL) {return E_NOTIMPL;}
  64. STDMETHODIMP get_MoreInfoURL(BSTR* pbstrMoreInfoURL) {return E_NOTIMPL;}
  65. STDMETHODIMP get_MoreInfoBannerImage(BSTR* pbstrMoreInfoBannerImage) {return E_NOTIMPL;}
  66. STDMETHODIMP get_MoreInfoBannerURL(BSTR* pbstrMoreInfoBannerURL) {return E_NOTIMPL;}
  67. STDMETHODIMP get_MoreInfoText(BSTR* pbstrMoreInfoText) {return E_NOTIMPL;}
  68. };
  69. class CShoutcastStream : public CSourceStream
  70. {
  71. class mp3frame
  72. {
  73. public:
  74. DWORD len;
  75. BYTE* pData;
  76. REFERENCE_TIME rtStart, rtStop;
  77. CString title;
  78. mp3frame(DWORD len = 0) {pData = (this->len = len) ? new BYTE[len] : NULL; rtStart = rtStop = 0;}
  79. mp3frame(const mp3frame& f) {*this = f;}
  80. ~mp3frame() {delete pData;}
  81. void operator = (const mp3frame& f)
  82. {
  83. len = f.len;
  84. pData = f.pData;
  85. rtStart = f.rtStart;
  86. rtStop = f.rtStop;
  87. title = f.title;
  88. ((mp3frame*)&f)->pData = NULL;
  89. }
  90. };
  91. class mp3queue : public CList<mp3frame>, public CCritSec {} m_queue;
  92. class CShoutcastSocket : public CSocket
  93. {
  94. DWORD m_nBytesRead;
  95. public:
  96. CShoutcastSocket() {m_metaint = m_bitrate = m_freq = m_channels = 0;}
  97. int Receive(void* lpBuf, int nBufLen, int nFlags = 0);
  98. DWORD m_metaint, m_bitrate, m_freq, m_channels;
  99. CString m_title;
  100. bool Connect(CUrl& url);
  101. bool FindSync();
  102. } m_socket;
  103. HANDLE m_hSocketThread;
  104. CUrl m_url;
  105. bool m_fBuffering;
  106. CString m_title;
  107. public:
  108.     CShoutcastStream(const WCHAR* wfn, CShoutcastSource* pParent, HRESULT* phr);
  109. virtual ~CShoutcastStream();
  110. bool fExitThread;
  111. UINT SocketThreadProc();
  112. void EmptyBuffer();
  113. LONGLONG GetBufferFullness();
  114. CString GetTitle();
  115.     HRESULT DecideBufferSize(IMemAllocator* pIMemAlloc, ALLOCATOR_PROPERTIES* pProperties);
  116.     HRESULT FillBuffer(IMediaSample* pSample);
  117.     HRESULT CheckMediaType(const CMediaType* pMediaType);
  118.     HRESULT GetMediaType(int iPosition, CMediaType* pmt);
  119. STDMETHODIMP Notify(IBaseFilter* pSender, Quality q) {return E_NOTIMPL;}
  120.     HRESULT OnThreadCreate();
  121.     HRESULT OnThreadDestroy();
  122. HRESULT Inactive();
  123.     HRESULT Pause();
  124. };