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

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 SC2440 CPU and Windows 3.0 (or later)
  22.     
  23. -*/
  24. #include <oalintr.h>
  25. #include <pm.h>
  26. #include <s2440.h>
  27. #include "ac97.h"
  28. //#include "hw_ac97.h"
  29. #include "pmplatform.h"
  30. #define OUTCHANNELS (2)
  31. #define INCHANNELS (2)
  32. #define BITSPERSAMPLE (16)
  33. #define SAMPLERATE  (44100)
  34. // Inverse sample rate, in .32 fixed format, with 1 added at bottom to ensure round up.
  35. #define INVSAMPLERATE ((UINT32)(((1i64<<32)/SAMPLERATE)+1))
  36. typedef INT16 HWSAMPLE;
  37. typedef HWSAMPLE *PHWSAMPLE;
  38. // Set USE_MIX_SATURATE to 1 if you want the mixing code to guard against saturation
  39. // This costs a couple of instructions in the inner loop
  40. #define USE_MIX_SATURATE (1)
  41. // The code will use the follwing values as saturation points
  42. #define AUDIO_SAMPLE_MAX    (32767)
  43. #define AUDIO_SAMPLE_MIN    (-32768)
  44. #define AUDIO_DMA_PAGE_SIZE 2048 // Size in bytes
  45. //----- Used to track DMA controllers status -----
  46. #define DMA_CLEAR 0x00000000
  47. #define DMA_STRTA 0x00000001
  48. #define DMA_DONEA 0x00000002
  49. #define DMA_STRTB 0x00000010
  50. #define DMA_DONEB 0x00000020
  51. #define DMA_BIU 0x00000080 // DMA BUFFER PAGE Select (0 = A, 1 = B)
  52. //----- Used for scheduling DMA transfers -----
  53. #define  OUT_BUFFER_A 0
  54. #define  OUT_BUFFER_B 1
  55. #define  IN_BUFFER_A 0
  56. #define  IN_BUFFER_B 1
  57. class HardwareContext
  58. {
  59. public:
  60.     static BOOL CreateHWContext(DWORD Index);
  61.     HardwareContext();
  62.     ~HardwareContext();
  63.     void Lock()   {EnterCriticalSection(&m_Lock);}
  64.     void Unlock() {LeaveCriticalSection(&m_Lock);}
  65.     DWORD GetNumInputDevices()  {return 1;}
  66.     DWORD GetNumOutputDevices() {return 1;}
  67.     DeviceContext *GetInputDeviceContext(UINT DeviceId)
  68.     {
  69.         return &m_InputDeviceContext;
  70.     }
  71.     DeviceContext *GetOutputDeviceContext(UINT DeviceId)
  72.     {
  73.         return &m_OutputDeviceContext;
  74.     }
  75.     BOOL AC97_Init();
  76.     BOOL Init(DWORD Index);
  77.     BOOL Deinit();
  78.     void PowerUp();
  79.     void PowerDown();
  80.     BOOL StartInputDMA();
  81.     BOOL StartOutputDMA();
  82.     void StopInputDMA();
  83.     void StopOutputDMA();
  84.     void InterruptThread();
  85. DWORD ForceSpeaker (BOOL bSpeaker);
  86.     // IOCTL pass-through
  87.     BOOL IOControl( DWORD  dwOpenData,
  88.                     DWORD  dwCode,
  89.                     PBYTE  pBufIn,
  90.                     DWORD  dwLenIn,
  91.                     PBYTE  pBufOut,
  92.                     DWORD  dwLenOut,
  93.                     PDWORD pdwActualOut);
  94.     DWORD Open();
  95.     DWORD Close();
  96.     
  97.     CEDEVICE_POWER_STATE GetDx() { return m_Dx;}
  98.     
  99. protected:
  100.     DWORD m_MicrophoneRouting;
  101.     DWORD m_SpeakerRouting;
  102.     DWORD m_InternalRouting;
  103.     DWORD m_MasterOutputGain;
  104.     BOOL InitInterruptThread();
  105.     BOOL InitInputDMA();
  106.     BOOL InitOutputDMA();
  107.     BOOL Codec_channel();
  108.     BOOL InitCodec();
  109.     
  110.     BOOL MapRegisters();
  111.     BOOL UnmapRegisters();
  112.     BOOL MapDMABuffers();
  113. BOOL UnmapDMABuffers();
  114.     ULONG TransferInputBuffer(ULONG NumBuf);
  115.     ULONG TransferOutputBuffer(ULONG NumBuf);
  116.     ULONG TransferInputBuffers(DWORD dwDCSR);
  117.     ULONG TransferOutputBuffers(DWORD dwDCSR);
  118.     DWORD GetInterruptThreadPriority();
  119.     DWORD m_DriverIndex;
  120.     CRITICAL_SECTION m_Lock;
  121.     BOOL m_Initialized;
  122.     BOOL m_InPowerHandler;
  123.     DWORD m_IntrAudio;
  124.     InputDeviceContext m_InputDeviceContext;
  125.     OutputDeviceContext m_OutputDeviceContext;
  126.     PBYTE m_Input_pbDMA_PAGES[2];
  127.     PBYTE m_Output_pbDMA_PAGES[2];
  128.     BOOL m_InputDMARunning;
  129.     BOOL m_OutputDMARunning;
  130.     ULONG m_OutBytes[2];
  131.     ULONG m_InBytes[2];
  132.     WORD  m_nOutputVolume; // Current HW Playback Volume 
  133.     WORD  m_nInputVolume; // Current HW Input (Microphone) Volume 
  134. HANDLE m_hAudioInterrupt; // Handle to Audio Interrupt event.
  135.     HANDLE m_hAudioInterruptThread; // Handle to thread which waits on an audio interrupt event.
  136. //----------------------- Platform specific members ----------------------------------
  137. DWORD  m_OutputDMAStatus; // Output DMA channel's status
  138. DWORD  m_InputDMAStatus; // Input DMA channel's status
  139. BOOL AudioMute(DWORD channel, BOOL bMute);
  140. //------------------------------------------------------------------------------------
  141. LONG m_NumForcedSpeaker;
  142.     void SetSpeakerEnable(BOOL bEnable);
  143.     void RecalcSpeakerEnable();
  144. CEDEVICE_POWER_STATE    m_Dx;
  145. };
  146. void CallInterruptThread(HardwareContext *pHWContext);
  147. //----------------------------------- Helper Functions and Macros ----------------------------------------
  148. //======== Playback =========
  149. #define ioPlaybackPointerLow (v_pDMAregs->rDISRC1)
  150. #define ioPlaybackPointerHigh (v_pDMAregs->rDISRC1)
  151. #define PLAY_DMA_BUFFER_PHYS ( AUDIO_DMA_BUFFER_PHYS )
  152. #define AUDIO_RESET_PLAYBACK_POINTER() { ioPlaybackPointerLow  = (PLAY_DMA_BUFFER_PHYS); }
  153.    //ioPlaybackPointerHigh = (AUDIO_DMA_BUFFER_PHYS + AUDIO_DMA_PAGE_SIZE); 
  154. #define AUDIO_OUT_CLEAR_INTERRUPTS() ( v_pDMAregs->rDCON1 = v_pDMAregs->rDCON1 )
  155. #define AUDIO_OUT_DMA_ENABLE() { v_pDMAregs->rDMASKTRIG1 |= ENABLE_DMA_CHANNEL; }
  156. #define AUDIO_OUT_DMA_DISABLE() { v_pDMAregs->rDMASKTRIG1 &= ~ENABLE_DMA_CHANNEL; }
  157. #define SELECT_AUDIO_DMA_OUTPUT_BUFFER_A() (v_pDMAregs->rDISRC1 = (int)(PLAY_DMA_BUFFER_PHYS) )
  158. #define SELECT_AUDIO_DMA_OUTPUT_BUFFER_B() (v_pDMAregs->rDISRC1 = (int)(PLAY_DMA_BUFFER_PHYS+AUDIO_DMA_PAGE_SIZE) )
  159. //======== Record =========
  160. #define ioRecordPointerLow (v_pDMAregs->rDIDST2)
  161. #define ioRecordPointerHigh (v_pDMAregs->rDIDST2)
  162. #define RECORD_DMA_BUFFER_PHYS ( AUDIO_DMA_BUFFER_PHYS + 2 * AUDIO_DMA_PAGE_SIZE)
  163. #define AUDIO_RESET_RECORD_POINTER() { ioRecordPointerLow  = (RECORD_DMA_BUFFER_PHYS); }
  164.     //ioRecordPointerHigh = (RECORD_DMA_BUFFER_PHYS+ AUDIO_DMA_PAGE_SIZE); 
  165. #define AUDIO_IN_CLEAR_INTERRUPTS() ( v_pDMAregs->rDCON2 = v_pDMAregs->rDCON2 )
  166. #define AUDIO_IN_DMA_ENABLE() { v_pDMAregs->rDMASKTRIG2 = ENABLE_DMA_CHANNEL; 
  167.   v_pDMAregs->rDMASKTRIG2 &= STOP_DMA_TRANSFER; }
  168. #define AUDIO_IN_DMA_DISABLE() { v_pDMAregs->rDMASKTRIG2 |= STOP_DMA_TRANSFER; }
  169. #define SELECT_AUDIO_DMA_INPUT_BUFFER_A() (v_pDMAregs->rDIDST2 = (int)(RECORD_DMA_BUFFER_PHYS) )
  170. #define SELECT_AUDIO_DMA_INPUT_BUFFER_B() (v_pDMAregs->rDIDST2 = (int)(RECORD_DMA_BUFFER_PHYS+AUDIO_DMA_PAGE_SIZE) )
  171. //------------------------------------------ Externs ----------------------------------------------
  172. extern HardwareContext *g_pHWContext;