hwctxt.h
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:8k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. #pragma once
  2. //
  3. // Copyright (c) Microsoft Corporation.  All rights reserved.
  4. //
  5. //
  6. // Use of this source code is subject to the terms of the Microsoft end-user
  7. // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
  8. // If you did not accept the terms of the EULA, you are not authorized to use
  9. // this source code. For a copy of the EULA, please see the LICENSE.RTF on your
  10. // install media.
  11. //
  12. /*++
  13. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  14. ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  15. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  16. PARTICULAR PURPOSE.
  17.    
  18. Module Name: HWCTXT.H
  19. Abstract: Platform dependent code for the mixing audio driver.
  20.   
  21. Environment: Samsung SC2410 CPU and Windows 3.0 (or later)
  22.     
  23. -*/
  24. #include <oalintr.h>
  25. #include <pm.h>
  26. #include <s2440.h>
  27. #include "pmplatform.h"
  28. #define OUTCHANNELS (2)
  29. #define BITSPERSAMPLE (16)
  30. #define SAMPLERATE  (44100)
  31. // Inverse sample rate, in .32 fixed format, with 1 added at bottom to ensure round up.
  32. #define INVSAMPLERATE ((UINT32)(((1i64<<32)/SAMPLERATE)+1))
  33. typedef INT16 HWSAMPLE;
  34. typedef HWSAMPLE *PHWSAMPLE;
  35. // Set USE_MIX_SATURATE to 1 if you want the mixing code to guard against saturation
  36. // This costs a couple of instructions in the inner loop
  37. #define USE_MIX_SATURATE (1)
  38. // The code will use the follwing values as saturation points
  39. #define AUDIO_SAMPLE_MAX    (32767)
  40. #define AUDIO_SAMPLE_MIN    (-32768)
  41. #define AUDIO_DMA_PAGE_SIZE 2048 // Size in bytes
  42. //----- Used to track DMA controllers status -----
  43. #define DMA_CLEAR 0x00000000
  44. #define DMA_DONEA 0x00000008
  45. #define DMA_STRTA 0x00000010
  46. #define DMA_DONEB 0x00000020
  47. #define DMA_STRTB 0x00000040
  48. #define DMA_BIU 0x00000080 // Determines which buffer is in use: (A=0, B=1)
  49. //----- Used for scheduling DMA transfers -----
  50. #define  OUT_BUFFER_A 0
  51. #define  OUT_BUFFER_B 1
  52. #define  IN_BUFFER_A 0
  53. #define  IN_BUFFER_B 1
  54. class HardwareContext
  55. {
  56. public:
  57.     static BOOL CreateHWContext(DWORD Index);
  58.     HardwareContext();
  59.     ~HardwareContext();
  60.     void Lock()   {EnterCriticalSection(&m_Lock);}
  61.     void Unlock() {LeaveCriticalSection(&m_Lock);}
  62.     DWORD GetNumInputDevices()  {return 1;}
  63.     DWORD GetNumOutputDevices() {return 1;}
  64.     DeviceContext *GetInputDeviceContext(UINT DeviceId)
  65.     {
  66.         return &m_InputDeviceContext;
  67.     }
  68.     DeviceContext *GetOutputDeviceContext(UINT DeviceId)
  69.     {
  70.         return &m_OutputDeviceContext;
  71.     }
  72.     BOOL Init(DWORD Index);
  73.     BOOL Deinit();
  74.     void PowerUp();
  75.     void PowerDown();
  76.     BOOL StartInputDMA();
  77.     BOOL StartOutputDMA();
  78.     void StopInputDMA();
  79.     void StopOutputDMA();
  80.     void InterruptThread();
  81. DWORD ForceSpeaker (BOOL bSpeaker);
  82.     // IOCTL pass-through
  83.     BOOL IOControl( DWORD  dwOpenData,
  84.                     DWORD  dwCode,
  85.                     PBYTE  pBufIn,
  86.                     DWORD  dwLenIn,
  87.                     PBYTE  pBufOut,
  88.                     DWORD  dwLenOut,
  89.                     PDWORD pdwActualOut);
  90.     DWORD Open();
  91.     DWORD Close();
  92.     
  93.     CEDEVICE_POWER_STATE GetDx() { return m_Dx;}
  94.     
  95. protected:
  96.     DWORD m_MicrophoneRouting;
  97.     DWORD m_SpeakerRouting;
  98.     DWORD m_InternalRouting;
  99.     DWORD m_MasterOutputGain;
  100.     BOOL InitInterruptThread();
  101.     BOOL InitInputDMA();
  102.     BOOL InitOutputDMA();
  103.     BOOL Codec_channel();
  104.     BOOL InitCodec();
  105.     
  106.     BOOL MapRegisters();
  107.     BOOL UnmapRegisters();
  108.     BOOL MapDMABuffers();
  109. BOOL UnmapDMABuffers();
  110.     ULONG TransferInputBuffer(ULONG NumBuf);
  111.     ULONG TransferOutputBuffer(ULONG NumBuf);
  112.     ULONG TransferInputBuffers(DWORD dwDCSR);
  113.     ULONG TransferOutputBuffers(DWORD dwDCSR);
  114.     DWORD GetInterruptThreadPriority();
  115.     DWORD m_DriverIndex;
  116.     CRITICAL_SECTION m_Lock;
  117.     BOOL m_Initialized;
  118.     BOOL m_InPowerHandler;
  119.     DWORD m_IntrAudio;
  120.     InputDeviceContext m_InputDeviceContext;
  121.     OutputDeviceContext m_OutputDeviceContext;
  122.     PBYTE m_Input_pbDMA_PAGES[2];
  123.     PBYTE m_Output_pbDMA_PAGES[2];
  124.     BOOL m_InputDMARunning;
  125.     BOOL m_OutputDMARunning;
  126.     ULONG m_OutBytes[2];
  127.     ULONG m_InBytes[2];
  128.     WORD  m_nOutputVolume; // Current HW Playback Volume 
  129.     WORD  m_nInputVolume; // Current HW Input (Microphone) Volume 
  130. HANDLE m_hAudioInterrupt; // Handle to Audio Interrupt event.
  131.     HANDLE m_hAudioInterruptThread; // Handle to thread which waits on an audio interrupt event.
  132. //----------------------- Platform specific members ----------------------------------
  133. DWORD  m_OutputDMAStatus; // Output DMA channel's status
  134. DWORD  m_InputDMAStatus; // Input DMA channel's status
  135. BOOL AudioMute(DWORD channel, BOOL bMute);
  136. //------------------------------------------------------------------------------------
  137. LONG m_NumForcedSpeaker;
  138.     void SetSpeakerEnable(BOOL bEnable);
  139.     void RecalcSpeakerEnable();
  140. CEDEVICE_POWER_STATE    m_Dx;
  141. };
  142. void CallInterruptThread(HardwareContext *pHWContext);
  143. //----------------------------------- Helper Functions and Macros ----------------------------------------
  144. //======== Record =========
  145. #define ioRecordPointerLow (v_pDMAregs->rDIDST1)
  146. #define ioRecordPointerHigh (v_pDMAregs->rDIDST1)
  147. #define RECORD_DMA_BUFFER_PHYS (AUDIO_DMA_BUFFER_PHYS + 2 * AUDIO_DMA_PAGE_SIZE)
  148. //#define AUDIO_RESET_RECORD_POINTER() {ioRecordPointerLow  = (RECORD_DMA_BUFFER_PHYS);
  149. //  ioRecordPointerHigh = (RECORD_DMA_BUFFER_PHYS+ AUDIO_DMA_PAGE_SIZE); }
  150. //#define AUDIO_IN_CLEAR_INTERRUPTS() (v_pDMAregs->rDCON1 = v_pDMAregs->rDCON1)
  151. //#define AUDIO_IN_DMA_ENABLE() {  v_pDMAregs->rDMASKTRIG1 |= ENABLE_DMA_CHANNEL; 
  152. // v_pDMAregs->rDMASKTRIG1 &= ~STOP_DMA_TRANSFER; 
  153. // v_pIISregs->rIISFCON |= ( RECEIVE_FIFO_ACCESS_DMA  | RECEIVE_FIFO_ENABLE);
  154. // v_pIISregs->rIISCON  |= RECEIVE_DMA_REQUEST_ENABLE;  }
  155. //#define AUDIO_IN_DMA_DISABLE() {  StopI2SClock(); 
  156. // v_pIISregs->rIISCON &= ~RECEIVE_DMA_REQUEST_ENABLE;
  157. // v_pIISregs->rIISFCON &= ~( RECEIVE_FIFO_ACCESS_DMA  | RECEIVE_FIFO_ENABLE);
  158. // v_pDMAregs->rDMASKTRIG1 |= STOP_DMA_TRANSFER;    }
  159. //#define SELECT_AUDIO_DMA_INPUT_BUFFER_A() (v_pDMAregs->rDIDST1 = (int)(AUDIO_DMA_BUFFER_PHYS+2*AUDIO_DMA_PAGE_SIZE) )
  160. //#define SELECT_AUDIO_DMA_INPUT_BUFFER_B() (v_pDMAregs->rDIDST1 = (int)(AUDIO_DMA_BUFFER_PHYS+3*AUDIO_DMA_PAGE_SIZE) )
  161. //======== Playback =========
  162. #define ioPlaybackPointerLow (v_pDMAregs->rDISRC2)
  163. #define ioPlaybackPointerHigh (v_pDMAregs->rDISRC2)
  164. //#define AUDIO_RESET_PLAYBACK_POINTER() {ioPlaybackPointerLow  = (AUDIO_DMA_BUFFER_PHYS);
  165. //  ioPlaybackPointerHigh = (AUDIO_DMA_BUFFER_PHYS + AUDIO_DMA_PAGE_SIZE); }   
  166. //#define AUDIO_OUT_CLEAR_INTERRUPTS() (v_pDMAregs->rDCON2 = v_pDMAregs->rDCON2)
  167. //#define AUDIO_OUT_DMA_ENABLE() { v_pDMAregs->rDMASKTRIG2 &= ~STOP_DMA_TRANSFER; 
  168. //   v_pDMAregs->rDMASKTRIG2 |= ENABLE_DMA_CHANNEL; }
  169. //#define AUDIO_OUT_DMA_DISABLE() { v_pDMAregs->rDMASKTRIG2 |= STOP_DMA_TRANSFER; }
  170. //#define SELECT_AUDIO_DMA_OUTPUT_BUFFER_A() (v_pDMAregs->rDISRC2 = (int)(AUDIO_DMA_BUFFER_PHYS) )
  171. //#define SELECT_AUDIO_DMA_OUTPUT_BUFFER_B() (v_pDMAregs->rDISRC2 = (int)(AUDIO_DMA_BUFFER_PHYS+AUDIO_DMA_PAGE_SIZE) )
  172. //------------------------------------------ Externs ----------------------------------------------
  173. extern HardwareContext *g_pHWContext;