winaudio.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-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 _WINAUDIO_H_
  36. #define _WINAUDIO_H_
  37. struct IHXCallback;
  38. class CHXSimpleList;
  39. class CPtrQueue;
  40. #define WND_CLASS   _T("AudioServicesInternal")
  41. #if defined( _WIN32 )
  42. typedef    LPWAVEFORMATEX WAVEFMTPTR;
  43. #elif defined( _WINDOWS )
  44. typedef    LPWAVEFORMAT WAVEFMTPTR;
  45. #endif
  46. typedef enum 
  47. {
  48.     HXAUDIO_UNKNOWN,
  49.     HXAUDIO_BADDEVICE,
  50.     HXAUDIO_GOODDEVICE
  51. } audioDevice;
  52. /****************************************************************************
  53.  * 
  54.  *  Class: CWindowsWaveFormat
  55.  * 
  56.  *  Purpose: Used to hide 16bit vs. 32bit bullsheet for the windows 
  57.  * wave format structs...
  58.  */
  59. class CWindowsWaveFormat
  60. {
  61. public:
  62.     CWindowsWaveFormat()
  63. {
  64.     mpwf = NULL;
  65.     SetFormatDflt();
  66. }
  67.     ~CWindowsWaveFormat()
  68. {
  69. //         if (mpwf != NULL)
  70. // delete [] mpwf;
  71. }
  72.     void SetFormatDflt()
  73. {
  74. #if defined(_WIN32)
  75.     mwf.wFormatTag = WAVE_FORMAT_PCM;
  76.     mwf.nChannels = 1;
  77.     mwf.nSamplesPerSec = 8000; // 11025;
  78.     mwf.nAvgBytesPerSec = 16000; // 22050;
  79.     mwf.nBlockAlign = 2;
  80.     mwf.wBitsPerSample = 16;
  81.     mwf.cbSize = 0;
  82. #else
  83.     mwf.wf.wFormatTag = WAVE_FORMAT_PCM;
  84.     mwf.wf.nChannels = 1;
  85.     mwf.wf.nSamplesPerSec = 8000; // 11025;
  86.     mwf.wf.nAvgBytesPerSec = 16000; // 22050;
  87.     mwf.wf.nBlockAlign = 2;
  88.     mwf.wBitsPerSample = 16;
  89. #endif
  90. }
  91.     void SetFormat
  92. (
  93.     ULONG32 inSampleRate,
  94.     UINT16  channels,
  95.     UINT16  bitsPerSample
  96. )
  97. {
  98. #if defined(_WIN32)
  99.     mwf.wFormatTag = WAVE_FORMAT_PCM;
  100.     mwf.nChannels = channels;
  101.     mwf.nSamplesPerSec = inSampleRate; //8000; // 11025;
  102.     // note this works for 1 or 2 channels only!!
  103.     mwf.nAvgBytesPerSec = bitsPerSample <= 8 ? inSampleRate * channels
  104.     : inSampleRate * channels * 2;
  105.     mwf.nBlockAlign = bitsPerSample <= 8 ? 1 * channels : channels * 2;
  106.     mwf.wBitsPerSample = bitsPerSample;
  107.     mwf.cbSize = 0;
  108. #else
  109.     mwf.wf.wFormatTag = WAVE_FORMAT_PCM;
  110.     mwf.wf.nChannels = channels;
  111.     mwf.wf.nSamplesPerSec = inSampleRate; //8000; // 11025;
  112.     mwf.wf.nAvgBytesPerSec = bitsPerSample <= 8 ? inSampleRate * channels
  113.     : inSampleRate * channels * 2;
  114.     mwf.wf.nBlockAlign = bitsPerSample <= 8 ? 1 * channels : channels * 2;
  115.     mwf.wBitsPerSample = bitsPerSample;
  116. #endif
  117. }
  118.     WAVEFMTPTR GetWaveFormat()
  119. {
  120. //     if (mpwf != NULL)
  121. // return (mpwf);
  122.     return (WAVEFMTPTR(&mwf));
  123. }
  124.     WORD GetWaveFormatSize ()
  125. {
  126. //     if (mpwf != NULL) return (mcbWaveFmt);
  127.     return (sizeof (mwf));
  128. }
  129. private:
  130. WAVEFMTPTR mpwf; // ptr to wave format header
  131. WORD mcbWaveFmt; // size of wave format header
  132. #if defined(_WIN32)
  133. WAVEFORMATEX mwf; // default PCM wave format header
  134. #else
  135. PCMWAVEFORMAT mwf; // default PCM wave format header
  136. #endif
  137. };
  138. /****************************************************************************
  139.  * 
  140.  *  Class: CWaveHeader
  141.  * 
  142.  *  Purpose: Manages a WAVEHDR struct, includes info about usage, etc.
  143.  * 
  144.  */
  145. class CWaveHeader
  146. {
  147. public:
  148. ULONG32     m_ulTimeEnd;
  149. void*     m_pUser;     // General Purpose user object.
  150. protected:
  151. WAVEHDR     m_WAVEHDR;
  152. BOOL     m_bAvail;
  153. BOOL     m_pPrepared;
  154. CWaveHeader()
  155.     {
  156. memset( &m_WAVEHDR, 0, sizeof(m_WAVEHDR) );
  157. m_bAvail = FALSE;
  158. m_pPrepared = FALSE;
  159.   m_ulTimeEnd = 0;
  160. m_pUser = NULL;
  161.     }
  162. friend class CAudioOutWindows;
  163. };
  164. class CHXAudioDevice;
  165. class HXMutex;
  166. /****************************************************************************
  167.  * 
  168.  *  Class: CAudioOutWindows
  169.  * 
  170.  *  Purpose: Windows implementation of audio out
  171.  * 
  172.  */
  173. class CAudioOutWindows : public CHXAudioDevice
  174. {
  175. public:
  176. CAudioOutWindows();
  177. #if defined(_WIN32)
  178. static LRESULT __declspec(dllexport) CALLBACK 
  179. WaveOutWndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
  180. #else
  181. static LRESULT CALLBACK __export 
  182. WaveOutWndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
  183. #endif
  184. protected:
  185. virtual ~CAudioOutWindows();
  186. HX_RESULT        _Imp_Open( const HXAudioFormat* pFormat );
  187. HX_RESULT        _Imp_Close( void );
  188. HX_RESULT     _Imp_Seek(ULONG32 ulSeekTime);
  189. HX_RESULT        _Imp_Pause( void );
  190. HX_RESULT        _Imp_Resume( void );
  191. HX_RESULT        _Imp_Write( const HXAudioData* pAudioOutData );
  192. HX_RESULT        _Imp_Reset( void );
  193. HX_RESULT       _Imp_Drain( void );
  194. BOOL      _Imp_SupportsVolume( void );
  195. UINT16        _Imp_GetVolume( void );
  196. HX_RESULT        _Imp_SetVolume( const UINT16 uVolume );
  197. HX_RESULT        _Imp_CheckFormat( const HXAudioFormat* pFormat);
  198. HX_RESULT      _Imp_GetCurrentTime( ULONG32& ulCurrentTime);
  199. INT16     _Imp_GetAudioFd(void) {return 0;};
  200. UINT16     _NumberOfBlocksRemainingToPlay(void);
  201. BOOL     _IsWaveOutDevice(void) { return TRUE; };
  202. private:
  203. static BOOL     zm_bVolSupport;
  204. static BOOL     zm_bLRVolSupport;
  205. static WORD     zm_uMaxVolume;
  206. static BOOL     zm_bMixerVolSupport;
  207. static BOOL     zm_bMixerVolSupportChecked;
  208. CWindowsWaveFormat  m_WaveFormat;
  209. HWAVEOUT     m_hWave;
  210. WAVEOUTCAPS     m_waveOutCap;
  211. UINT16     m_unAllocedBufferCnt;
  212. UINT16     m_unAllocedBuffSize;
  213.         UCHAR**     m_ppAllocedBuffers;
  214. CWaveHeader*     m_pWaveHdrs;
  215. CPtrQueue     m_rAvailBuffers;
  216. CHXSimpleList     m_UsedBuffersList;
  217. BOOL     m_bInitialized;
  218. BOOL     m_bResetting;
  219. HXMutex*     m_pMutex;
  220. BOOL     m_bIsFirstPacket;
  221. BOOL     AllocateBuffers(UINT16 unNumBuffers, UINT16 unBufSize);
  222. HINSTANCE     m_hInst;
  223. HWND     m_hWnd;
  224. BOOL     m_bClassRegistered;
  225. #if defined(_WIN32)
  226. UINT32     m_ulOriginalThreadId;
  227. #endif
  228. #if !defined(_WINCE) && ( !defined(_WINDOWS) || defined(_WIN32) ) 
  229. void     CheckForVolumeSupport(void);
  230.         HMIXER               m_hMixer;
  231.         MIXERCONTROLDETAILS  m_VolumeControlDetails;
  232. #endif // !defined(_WINDOWS) || defined(_WIN32) 
  233. HX_RESULT     Register();
  234. void     UnRegister();
  235. INT64     m_llDeviceBytesPlayed;
  236. INT64     m_llDeviceSamplesPlayed;
  237. UINT32     m_ulLastDeviceBytesPlayed;
  238. UINT32     m_ulLastDeviceSamplesPlayed;
  239. UINT32     m_ulDevPosRollOver;
  240. static audioDevice  zm_audioDevice;
  241. static BOOL     zm_bClosed;
  242. static UINT     zm_uDestroyMessage;
  243. };
  244. #endif  // _WINAUDIO_H_