近日爲了解決telechips的wince平臺下百度carlife語音識別時,出現wavedev.dll報錯的問題。花了兩天的時間來閱讀wavedev的驅動源碼。得到了其調用的過程。比如app在調用waveoutOpen、waveoutWrite等函數時,驅動的執行路徑如下:
1、waveOutOpen,waveOutWrite--->WAV_IOControl(IOCTL_WAV_MESSAGE)--->HandleWaveMessage.switch (WODM_WRITE,WODM_OPEN) --->StreamContext.QueueBuffer---> OutputDeviceContext::StreamReadyToRender--->HardwareContext::StartOutputDMAByTransferType--->HardwareContext::TransferOutputBuffer(DWORD
dwDCSR, DWORD TransferType)---->HardwareContext::TransferOutputBuffer(ULONG NumBuf, DWORD TransferType)--->DeviceContext::TransferBuffer---->WaveStreamContext::Render---->OutputStreamContextNonPCM::Render2
2、硬件驅動層播放完pcm數據後,會產生中斷,下面是中斷調用過程:
HardwareContext::InterruptThread()--->HardwareContext::TransferOutputBuffer(DWORD dwDCSR, DWORD TransferType)---->HardwareContext::TransferOutputBuffer(ULONG NumBuf, DWORD TransferType)--->DeviceContext::TransferBuffer---->WaveStreamContext::Render---->OutputStreamContextNonPCM::Render2