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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: winaudio.h,v 1.3.8.1 2004/07/09 02:02:07 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #ifndef _WINAUDIO_H_
  50. #define _WINAUDIO_H_
  51. struct IHXCallback;
  52. class CHXSimpleList;
  53. class CPtrQueue;
  54. #define WND_CLASS   _T("AudioServicesInternal")
  55. #if defined( _WIN32 )
  56. typedef    LPWAVEFORMATEX WAVEFMTPTR;
  57. #elif defined( _WINDOWS )
  58. typedef    LPWAVEFORMAT WAVEFMTPTR;
  59. #endif
  60. typedef enum 
  61. {
  62.     HXAUDIO_UNKNOWN,
  63.     HXAUDIO_BADDEVICE,
  64.     HXAUDIO_GOODDEVICE
  65. } audioDevice;
  66. /****************************************************************************
  67.  * 
  68.  *  Class: CWindowsWaveFormat
  69.  * 
  70.  *  Purpose: Used to hide 16bit vs. 32bit bullsheet for the windows 
  71.  * wave format structs...
  72.  */
  73. class CWindowsWaveFormat
  74. {
  75. public:
  76.     CWindowsWaveFormat()
  77. {
  78.     mpwf = NULL;
  79.     SetFormatDflt();
  80. }
  81.     ~CWindowsWaveFormat()
  82. {
  83. //         if (mpwf != NULL)
  84. // delete [] mpwf;
  85. }
  86.     void SetFormatDflt()
  87. {
  88. #if defined(_WIN32)
  89.     mwf.wFormatTag = WAVE_FORMAT_PCM;
  90.     mwf.nChannels = 1;
  91.     mwf.nSamplesPerSec = 8000; // 11025;
  92.     mwf.nAvgBytesPerSec = 16000; // 22050;
  93.     mwf.nBlockAlign = 2;
  94.     mwf.wBitsPerSample = 16;
  95.     mwf.cbSize = 0;
  96. #else
  97.     mwf.wf.wFormatTag = WAVE_FORMAT_PCM;
  98.     mwf.wf.nChannels = 1;
  99.     mwf.wf.nSamplesPerSec = 8000; // 11025;
  100.     mwf.wf.nAvgBytesPerSec = 16000; // 22050;
  101.     mwf.wf.nBlockAlign = 2;
  102.     mwf.wBitsPerSample = 16;
  103. #endif
  104. }
  105.     void SetFormat
  106. (
  107.     ULONG32 inSampleRate,
  108.     UINT16  channels,
  109.     UINT16  bitsPerSample
  110. )
  111. {
  112. #if defined(_WIN32)
  113.     mwf.wFormatTag = WAVE_FORMAT_PCM;
  114.     mwf.nChannels = channels;
  115.     mwf.nSamplesPerSec = inSampleRate; //8000; // 11025;
  116.     // note this works for 1 or 2 channels only!!
  117.     mwf.nAvgBytesPerSec = bitsPerSample <= 8 ? inSampleRate * channels
  118.     : inSampleRate * channels * 2;
  119.     mwf.nBlockAlign = bitsPerSample <= 8 ? 1 * channels : channels * 2;
  120.     mwf.wBitsPerSample = bitsPerSample;
  121.     mwf.cbSize = 0;
  122. #else
  123.     mwf.wf.wFormatTag = WAVE_FORMAT_PCM;
  124.     mwf.wf.nChannels = channels;
  125.     mwf.wf.nSamplesPerSec = inSampleRate; //8000; // 11025;
  126.     mwf.wf.nAvgBytesPerSec = bitsPerSample <= 8 ? inSampleRate * channels
  127.     : inSampleRate * channels * 2;
  128.     mwf.wf.nBlockAlign = bitsPerSample <= 8 ? 1 * channels : channels * 2;
  129.     mwf.wBitsPerSample = bitsPerSample;
  130. #endif
  131. }
  132.     WAVEFMTPTR GetWaveFormat()
  133. {
  134. //     if (mpwf != NULL)
  135. // return (mpwf);
  136.     return (WAVEFMTPTR(&mwf));
  137. }
  138.     WORD GetWaveFormatSize ()
  139. {
  140. //     if (mpwf != NULL) return (mcbWaveFmt);
  141.     return (sizeof (mwf));
  142. }
  143. private:
  144. WAVEFMTPTR mpwf; // ptr to wave format header
  145. WORD mcbWaveFmt; // size of wave format header
  146. #if defined(_WIN32)
  147. WAVEFORMATEX mwf; // default PCM wave format header
  148. #else
  149. PCMWAVEFORMAT mwf; // default PCM wave format header
  150. #endif
  151. };
  152. /****************************************************************************
  153.  * 
  154.  *  Class: CWaveHeader
  155.  * 
  156.  *  Purpose: Manages a WAVEHDR struct, includes info about usage, etc.
  157.  * 
  158.  */
  159. class CWaveHeader
  160. {
  161. public:
  162. ULONG32     m_ulTimeEnd;
  163. void*     m_pUser;     // General Purpose user object.
  164. protected:
  165. WAVEHDR     m_WAVEHDR;
  166. BOOL     m_bAvail;
  167. BOOL     m_pPrepared;
  168. CWaveHeader()
  169.     {
  170. memset( &m_WAVEHDR, 0, sizeof(m_WAVEHDR) );
  171. m_bAvail = FALSE;
  172. m_pPrepared = FALSE;
  173.   m_ulTimeEnd = 0;
  174. m_pUser = NULL;
  175.     }
  176. friend class CAudioOutWindows;
  177. };
  178. class CHXAudioDevice;
  179. class HXMutex;
  180. /****************************************************************************
  181.  * 
  182.  *  Class: CAudioOutWindows
  183.  * 
  184.  *  Purpose: Windows implementation of audio out
  185.  * 
  186.  */
  187. class CAudioOutWindows : public CHXAudioDevice
  188. {
  189. public:
  190. CAudioOutWindows();
  191. #if defined(_WIN32)
  192. static LRESULT __declspec(dllexport) CALLBACK 
  193. WaveOutWndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
  194. #else
  195. static LRESULT CALLBACK __export 
  196. WaveOutWndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
  197. #endif
  198. protected:
  199. virtual ~CAudioOutWindows();
  200. HX_RESULT        _Imp_Open( const HXAudioFormat* pFormat );
  201. HX_RESULT        _Imp_Close( void );
  202. HX_RESULT     _Imp_Seek(ULONG32 ulSeekTime);
  203. HX_RESULT        _Imp_Pause( void );
  204. HX_RESULT        _Imp_Resume( void );
  205. HX_RESULT        _Imp_Write( const HXAudioData* pAudioOutData );
  206. HX_RESULT        _Imp_Reset( void );
  207. HX_RESULT       _Imp_Drain( void );
  208. BOOL      _Imp_SupportsVolume( void );
  209. UINT16        _Imp_GetVolume( void );
  210. HX_RESULT        _Imp_SetVolume( const UINT16 uVolume );
  211. HX_RESULT        _Imp_CheckFormat( const HXAudioFormat* pFormat);
  212. HX_RESULT      _Imp_GetCurrentTime( ULONG32& ulCurrentTime);
  213. INT16     _Imp_GetAudioFd(void) {return 0;};
  214. UINT16     _NumberOfBlocksRemainingToPlay(void);
  215. BOOL     _IsWaveOutDevice(void) { return TRUE; };
  216. private:
  217. static BOOL     zm_bVolSupport;
  218. static BOOL     zm_bLRVolSupport;
  219. static WORD     zm_uMaxVolume;
  220. static BOOL     zm_bMixerVolSupport;
  221. static BOOL     zm_bMixerVolSupportChecked;
  222. CWindowsWaveFormat  m_WaveFormat;
  223. HWAVEOUT     m_hWave;
  224. WAVEOUTCAPS     m_waveOutCap;
  225. UINT16     m_unAllocedBufferCnt;
  226. UINT16     m_unAllocedBuffSize;
  227.         UCHAR**     m_ppAllocedBuffers;
  228. CWaveHeader*     m_pWaveHdrs;
  229. CPtrQueue     m_rAvailBuffers;
  230. CHXSimpleList     m_UsedBuffersList;
  231. BOOL     m_bInitialized;
  232. BOOL     m_bResetting;
  233. HXMutex*     m_pMutex;
  234. BOOL     m_bIsFirstPacket;
  235. BOOL     AllocateBuffers(UINT16 unNumBuffers, UINT16 unBufSize);
  236. HINSTANCE     m_hInst;
  237. HWND     m_hWnd;
  238. BOOL     m_bClassRegistered;
  239. #if defined(_WIN32)
  240. UINT32     m_ulOriginalThreadId;
  241. #endif
  242. #if !defined(_WINCE) && ( !defined(_WINDOWS) || defined(_WIN32) ) 
  243. void     CheckForVolumeSupport(void);
  244.         HMIXER               m_hMixer;
  245.         MIXERCONTROLDETAILS  m_VolumeControlDetails;
  246. #endif // !defined(_WINDOWS) || defined(_WIN32) 
  247. HX_RESULT     Register();
  248. void     UnRegister();
  249. INT64     m_llDeviceBytesPlayed;
  250. INT64     m_llDeviceSamplesPlayed;
  251. UINT32     m_ulLastDeviceBytesPlayed;
  252. UINT32     m_ulLastDeviceSamplesPlayed;
  253. UINT32     m_ulDevPosRollOver;
  254. static audioDevice  zm_audioDevice;
  255. static BOOL     zm_bClosed;
  256. static UINT     zm_uDestroyMessage;
  257. };
  258. #endif  // _WINAUDIO_H_