亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? wavein.c

?? 基于AMD Au1200(MIPS32處理器)的AC97驅動源碼
?? C
字號:
/*++
Copyright (c) 2001-2004  BSQUARE Corporation.  All rights reserved.

Module Name:

    wavein.c

Module Description:

    This module contains the implementation of the audio input 
    driver.

Author:

    Ian Rae 25-April-2001

Revision History:

	Ian Rae January 2004 - modified for Au1550 DDMA API

--*/
#include <windows.h>
#include <bceddk.h>
#include "ac97.h"
#include "ac97aud.h"
#include "au1kac97.h"

#include <wavedbg.h>

//#undef  DEBUGMSG
//#define DEBUGMSG(cond, msg)  NKDbgPrintfW##msg

extern PWAVE_DEVICE_INSTANCE WaveDevice;

#define AVERAGE_ST_TO_MO

// number of right shifts to covert a 16bit sample to 8bit
#define REC_SAMP_SCALE  (8)


static
SHORT
StereoToMono(
	IN SHORT leftSample,
	IN SHORT rightSample
	)
{
#ifdef AVERAGE_ST_TO_MO
	LONG average;

	average = leftSample + rightSample;
	average /= 2;

	return (SHORT)average;
#else
	return rightSample;
#endif
}

VOID
EmptyDmaBufferHW(
	IN OUT PWAVE_RESOURCE WaveResource,
	IN PUSHORT srcBuffer,
	IN ULONG  srcLength
	)
/*++

--*/
{
	BOOLEAN  data16;
	BOOLEAN  stereo;
	ULONG    samplesPerSecond;
	SHORT   *srcData;
	CHAR    *destData8;
	SHORT   *destData16;
	PWAVEHDR  Header;
	ULONG    iterations,i;
	SHORT   sampleLeft, sampleRight;
	ULONG    destBytesRemaining;


	samplesPerSecond = WaveResource->WaveFormat.nSamplesPerSec;
	data16 = (WaveResource->WaveFormat.wBitsPerSample == 16);
	stereo = (WaveResource->WaveFormat.nChannels == 2);

	srcData = srcBuffer;

	Header = WaveResource->WaveHeader;

	if( Header==NULL )
	{
		DEBUGMSG( 1, (TEXT("EmptyDmaBufferHW: NULL Header.\r\n")));
		goto ErrorReturn;
	}

    DEBUGMSG(0, (
             TEXT("EmptyDmaBufferHW: Buffer information:\r\n")
             TEXT("    Length=%u  Recorded=%u  16-bit=%u  Stereo=%u")
             TEXT("  Rate=%u.\r\n"),
             Header->dwBufferLength,
             Header->dwBytesRecorded,
             (ULONG)data16,
             (ULONG)stereo,
             samplesPerSecond));

	destBytesRemaining = Header->dwBufferLength - Header->dwBytesRecorded;
	destData8 = Header->lpData + Header->dwBytesRecorded;
	destData16 = (SHORT*)destData8;


    iterations = WaveResource->DmaBufferSize/BYTES_PER_SAMPLE; 

	for( i=0; i<iterations; i++ )
	{
		// Check that we aren't at the end of the output buffer already
		// If we are then mark this buffer as complete and move on to the next

		if( destBytesRemaining == 0 )
		{
			Header->dwBytesRecorded = Header->dwBufferLength;
			DEBUGMSG(0, (TEXT("EmptyDmaBufferHW: DMA buffer emptied.\r\n")
						 TEXT("    Header: Length=%u, Recorded=%u\r\n"),
						 Header->dwBufferLength,
						 Header->dwBytesRecorded ));
			Header = Header->lpNext;

			if( Header == NULL )
			{
				RETAILMSG(1, (TEXT("EmptyDmaBufferHW: NULL wave buffer found.\r\n")));
				goto dataDone;

			}

			DEBUGMSG(0, (TEXT("EmptyDmaBufferHW: Chained to new wave buffer.\r\n")
			             TEXT("     Length=%u Recorded=%u.\r\n"),
						 Header->dwBufferLength,
						 Header->dwBytesRecorded));

			destBytesRemaining = Header->dwBufferLength - Header->dwBytesRecorded;

			if( destBytesRemaining == 0)
			{
				DEBUGMSG(0, (TEXT("EmptyDmaBufferHW: Empty buffer found.\r\n")));
                break;
            }
            else
			{
				destData8 = Header->lpData + Header->dwBytesRecorded;
                destData16 = (USHORT*)destData8;
            }
		}

		sampleLeft = *srcData++;
		sampleRight = *srcData++;

		if( data16 )
		{
			// 16bit destination data
			if( stereo )
			{
				*destData16++ = sampleLeft;
				*destData16++ = sampleRight;
			}
			else
			{
				// Mono, store average of left and right
				sampleLeft = StereoToMono( sampleLeft, sampleRight );
				*destData16++ = sampleLeft;
			}
		}
		else
		{
			// 8bit destination data
			if( stereo )
			{
				*destData8++ = (CHAR)((sampleLeft>>REC_SAMP_SCALE)+128);
				*destData8++ = (CHAR)((sampleRight>>REC_SAMP_SCALE)+128);
			}
			else
			{
				// Mono, store average of left and right
				sampleLeft = StereoToMono( sampleLeft, sampleRight );
				*destData8++ = (CHAR)((sampleLeft>>REC_SAMP_SCALE)+128);
			}
		}
		// Adjust bytes remaining according to whether
		// stream is 16bit or stereo
		destBytesRemaining -= ((stereo ? 2:1) * (data16 ? 2:1 ));
	}

	Header->dwBytesRecorded = (Header->dwBufferLength - destBytesRemaining);

dataDone:
	WaveResource->WaveHeader = Header;

ErrorReturn:
	return;
}


//
// Exported Routines
//

VOID
WaveInStart(
	IN OUT PWAVE_RESOURCE WaveResource,
	IN OUT PWAVE_RESOURCE WaveOutResource,
	IN OUT PWAVEHDR WaveHeader
	)

/*++

Routine Description:

	This routine handles the set up of a new wave input stream.

Arguments

	WaveResource - Pointer to the wave resource structure corresponding to the
		stream to be started.
	
	WaveOutResource - Pointer to the wave resource structure corresponding to the
		output stream that will provide a clock for input data.

	WaveHeader - Pointer to the wave header information.

Return Value:

	None.

--*/

{
	ULONG *Buffer=NULL;

	WaveResource->MoreData = TRUE;

    //
    // Ensure the DMA channel is off off and any status bits are cleared.
    //

    ShutdownDma(WaveResource);

    //
    // Store a copy of the specified wave header pointer into the resource
    // structure.
    //

    WaveResource->WaveHeader = WaveHeader;

	HalSetDMAForReceive(WaveDevice->DMAChannelInput);

	DEBUGMSG(1, (
             TEXT("WaveInStart: Starting DMA.\r\n")));

 	// Start the RX DMA
	StartDma(WaveResource);
}



VOID
WaveInContinue (
    IN OUT PWAVE_RESOURCE WaveResource,
	IN OUT PWAVE_RESOURCE WaveOutResource,
    IN OUT PWAVEHDR WaveHeader
    )

/*++

Routine Description:

    This routine handles continuation of a recording audio input stream.

Arguments:

	WaveResource - Pointer to the wave resource structure corresponding to the
		stream to be started.
	
	WaveOutResource - Pointer to the wave resource structure corresponding to the
		output stream that will provide a clock for input data.

    WaveHeader - Pointer to the wave header information.

Return Value:

    None.

--*/

{
	PULONG Buffer=NULL;
	ULONG  BufferLength=0;

	WaveResource->WaveHeader = WaveHeader;

	// Get full buffer
	Buffer = HalGetNextDMABuffer(WaveDevice->DMAChannelInput);
	// Empty the buffer
	EmptyDmaBufferHW( WaveResource, (PUSHORT)Buffer, WaveResource->DmaBufferSize );
	// Give it back to the DMA
	HalActivateDMABuffer(WaveDevice->DMAChannelInput,
	                     Buffer,
						 WaveResource->DmaBufferSize);

	InterruptDone(WaveResource->SysIntr);
}



VOID
WaveInStop(
	IN OUT PWAVE_RESOURCE WaveResource,
	IN OUT PWAVE_RESOURCE WaveOutResource
	)

/*++

Routine Description:

	This routines handles stopping of the audio input stream. DMA transfers are halted
	and buffer data is handled appropriately.

Arguments:

	WaveResource - Pointer to the wave resource structure corresponding to the
		stream to be started.

Return Value:

	None.

--*/

{
	ShutdownDma(WaveResource);
	WaveResource->MoreData = FALSE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲免费电影在线| 国产午夜精品一区二区三区视频| 国产精品久久国产精麻豆99网站| 粉嫩av一区二区三区| 亚洲免费观看在线视频| 欧美人与z0zoxxxx视频| 国产麻豆欧美日韩一区| 亚洲一区自拍偷拍| 欧美国产精品一区二区三区| 欧美人妖巨大在线| 99热这里都是精品| 国产一区二区三区在线看麻豆| 亚洲黄色尤物视频| 国产欧美一区二区精品性色| 欧美精品一二三四| 91丨porny丨在线| 中文字幕中文字幕一区二区 | 亚洲欧美日韩国产手机在线| 欧美成人三级在线| 日韩欧美亚洲一区二区| 欧美视频第二页| 欧美无人高清视频在线观看| 99国产欧美另类久久久精品| 国产伦精品一区二区三区免费| 蜜臀国产一区二区三区在线播放| 亚洲成a人片在线观看中文| 日本一区二区电影| 日韩免费高清视频| 欧美日韩另类一区| 欧美系列日韩一区| 欧美丰满一区二区免费视频| 91麻豆精品国产综合久久久久久| 精品视频色一区| 欧美人伦禁忌dvd放荡欲情| 99久久伊人久久99| 欧洲一区二区三区在线| 欧美日韩精品欧美日韩精品一 | 午夜久久久影院| 日韩高清在线电影| 韩国女主播一区| 成人av在线一区二区三区| 91成人在线观看喷潮| 欧美女孩性生活视频| 精品国产乱码久久久久久老虎| 日本一区二区三区在线观看| 亚洲国产精品一区二区www在线| 国产午夜久久久久| 亚洲成在线观看| 国产成人在线电影| 7777精品伊人久久久大香线蕉| 久久综合久久综合亚洲| 视频一区视频二区在线观看| 国产成人午夜片在线观看高清观看| 91丨porny丨国产入口| 久久综合九色欧美综合狠狠| 亚洲成人自拍网| 91香蕉视频污在线| 亚洲人精品午夜| 国产成人高清在线| 精品国产电影一区二区| 蜜桃视频第一区免费观看| 欧美伦理电影网| 一区二区久久久| 久久久蜜臀国产一区二区| 亚洲高清视频中文字幕| 欧美日韩小视频| 一区二区三区高清在线| 在线免费观看成人短视频| 亚洲人成在线观看一区二区| 一本久道中文字幕精品亚洲嫩| 国产精品久久看| 91激情在线视频| 日韩电影在线免费| 欧美精品一区二区三区高清aⅴ| 久久 天天综合| 国产精品色一区二区三区| 91老师片黄在线观看| 亚洲一区二区三区爽爽爽爽爽| 欧美午夜精品一区| 激情成人综合网| 亚洲乱码国产乱码精品精可以看| 欧美区视频在线观看| 国产毛片精品国产一区二区三区| 国产亚洲一本大道中文在线| 色老头久久综合| 国产一区二区三区日韩| 一区二区三区小说| 久久久一区二区| 欧美午夜宅男影院| www.欧美日韩| 九一九一国产精品| 日韩高清不卡一区| 亚洲精品国产第一综合99久久| 91官网在线观看| 国模冰冰炮一区二区| 亚洲一区二区精品久久av| 精品免费国产一区二区三区四区| 色天天综合色天天久久| 国产91在线观看丝袜| 日本不卡的三区四区五区| 依依成人综合视频| 一区二区三区精品| 精品国产区一区| 99re亚洲国产精品| 成人午夜激情视频| 国产综合久久久久久鬼色| 热久久国产精品| 日韩精彩视频在线观看| 夜夜爽夜夜爽精品视频| 一区二区三区免费| 亚洲午夜精品在线| 日本中文字幕一区| 久久草av在线| 国产精品一区在线观看你懂的| 国产福利一区在线| 色综合婷婷久久| 欧美日韩国产a| 欧美刺激午夜性久久久久久久| 欧美精品一区二区三区四区| 国产欧美日韩精品a在线观看| 亚洲欧洲av在线| 午夜欧美在线一二页| 精品综合久久久久久8888| 国产成人精品影视| 欧美日韩免费一区二区三区视频| 91.成人天堂一区| 国产精品区一区二区三区| 一区二区三区在线视频观看58| 婷婷国产v国产偷v亚洲高清| 国产一区二区在线视频| 欧美亚洲丝袜传媒另类| 精品国产凹凸成av人网站| 亚洲精品视频在线看| 国内精品久久久久影院一蜜桃| 欧美高清视频不卡网| 欧美国产日韩a欧美在线观看| 午夜国产精品一区| 成人aa视频在线观看| 日韩欧美aaaaaa| 亚洲高清三级视频| 色欧美片视频在线观看在线视频| 日韩精品一区二区三区老鸭窝| 一区二区三区波多野结衣在线观看| 久久se这里有精品| 91精品国产高清一区二区三区蜜臀| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 国产成人三级在线观看| 精品国产一区二区三区久久久蜜月| 亚洲激情男女视频| 色综合久久88色综合天天6| 国产欧美日韩亚州综合| 国产成人aaa| 中文字幕在线观看一区| 成人av影视在线观看| 欧美激情综合在线| 91小视频在线| 亚洲综合久久av| 日韩一区二区三区av| 国产一区二区网址| 中文字幕成人网| 91免费视频网址| 日韩高清不卡一区二区| 日韩精品专区在线影院观看| 国产成人精品免费网站| 国产精品久久久久久久久久久免费看 | 亚洲欧美日本韩国| 欧美日韩在线综合| 国产高清亚洲一区| 亚洲精品国产a| 久久网站热最新地址| 欧美亚洲丝袜传媒另类| 国产精品一品二品| 婷婷国产v国产偷v亚洲高清| 国产女人水真多18毛片18精品视频 | 中文字幕 久热精品 视频在线| 欧美体内she精高潮| 国产一区二区精品久久91| 一区二区三区不卡视频| 日韩久久精品一区| 欧美日韩国产高清一区二区三区| 成人一级视频在线观看| 日精品一区二区| 一区二区三区日本| 日韩一级精品视频在线观看| 激情综合五月天| 丝袜美腿高跟呻吟高潮一区| 曰韩精品一区二区| 国产精品不卡一区| 国产精品高潮久久久久无| 国产欧美精品一区aⅴ影院 | 日韩视频免费观看高清完整版 | 麻豆成人久久精品二区三区小说| 久久久青草青青国产亚洲免观| 欧美高清精品3d| 欧美一区二区网站| 日韩欧美色电影| 久久综合视频网| 久久精品视频免费| 中文字幕av资源一区| 国产精品午夜电影|