📄 uda1341.c
字号:
#include "def.h"
#include "2440addr.h"
#include "2440lib.h"
#include "AudioDrv.h"
#include "WindowsXP_Wav.h" //长度为243552个字节
#define BUF_SIZE (16*1024)
extern U32 downloadAddress;
extern U32 downloadFileSize;
//extern U8 USB_OR_UART_Download_OK ;
//static U16 fsTable[] = {8000,11025,16000,22050,32000,44100,48000,0};
void PlayMusicTest(void)
{
int size, i, j, err;
WAVEFORMATEX fmt;
WAVEHDR hdr[2048];
HWAVEOUT hwo;
U8 pause = 0;
U8 mute = 0;
U32 volume;
unsigned char *buf;
downloadAddress = _NONCACHE_STARTADDRESS;
buf = (unsigned char *)downloadAddress ;
for( i = 0; i < 243552; i++ ) buf[i] = WindowsXP_Wav[i] ;
downloadFileSize = 243552 ;
size = *(U32 *)(downloadAddress+0x28);
i = 0;
while(size>0)
{
hdr[i].lpData = (LPSTR)(downloadAddress+0x2c+i*BUF_SIZE);
hdr[i].dwBufferLength = (size>BUF_SIZE)?BUF_SIZE:size;
size -= BUF_SIZE;
i++;
}
fmt.wFormatTag = WAVE_FORMAT_PCM;
fmt.nChannels = *(U16 *)(downloadAddress+0x16);
fmt.nSamplesPerSec = *(U32 *)(downloadAddress+0x18);
fmt.nAvgBytesPerSec = *(U32 *)(downloadAddress+0x1c);
fmt.nBlockAlign = *(U16 *)(downloadAddress+0x20);
fmt.wBitsPerSample = *(U16 *)(downloadAddress+0x22);
Uart_Printf("\nSample Rate = %d, Channels = %d, %dBitsPerSample, size = %d\n",
fmt.nSamplesPerSec, fmt.nChannels, fmt.wBitsPerSample, *(U32 *)(downloadAddress+0x28));
hwo = 0;
err = waveOutOpen(&hwo,
0,
&fmt,
0,
0,
0);
Uart_Printf("\nerr = %x\n", err);
for(j=0;j<i;j++)
waveOutWrite(0, &hdr[j], 0);
Uart_Printf("Now playing the file\n");
Uart_Printf("Press 'ESC' to quit, '+' to inc volume, '-' to dec volume, 'm' to mute, 'p' to pause\n");
waveOutGetVolume(0, &volume);
while(1)
{
U8 key = Uart_Getch();
if( key == ESC_KEY )
break;
if(key=='p')
{
pause ^= 1;
if(pause&1)
waveOutPause(0);
else
waveOutRestart(0);
}
if(key=='m')
{
mute ^= 1;
if(mute&1)
waveOutSetVolume(0, 0);
else
waveOutSetVolume(0, volume);
}
if((key=='+')&&(volume<=64535))
{
volume += 1000;
waveOutSetVolume(0, volume);
}
if((key=='-')&&(volume>=1000))
{
volume -= 1000;
waveOutSetVolume(0, volume);
}
}
waveOutClose(0);
}
void RecordTest(void)
{
int size, i, j, err;
WAVEFORMATEX fmt;
WAVEHDR hdr[2048];
HWAVEIN hwi = 1;
/*Uart_Printf("Please select Sample Rate:\n");
for(i=0; fsTable[i]; i++)
Uart_Printf("%d. %dHz\n", i, fsTable[i]);
while(1)
{
U8 key = Uart_Getch();
if((key-'0')>=0&&(key-'0'<=i-1))
{
fmt.nSamplesPerSec = fsTable[key-'0'];
break;
}
}*/
Uart_Printf( "\nThe Frequency of record is 48KHz\n" );
fmt.nSamplesPerSec = 48000; //采样频率为48KHz
fmt.wBitsPerSample = 16;
fmt.wFormatTag = WAVE_FORMAT_PCM;
fmt.nChannels = 2;
fmt.nBlockAlign = fmt.wBitsPerSample*fmt.nChannels/8;
fmt.nAvgBytesPerSec = fmt.nSamplesPerSec*fmt.nBlockAlign;
downloadAddress = 0x30800000;//_NONCACHE_STARTADDRESS;
downloadFileSize = size = 16*1024*1024;
i = 0;
while(size>0)
{
hdr[i].lpData = (LPSTR)(downloadAddress+0x2c+i*BUF_SIZE);
hdr[i].dwBufferLength = (size>BUF_SIZE)?BUF_SIZE:size;
size -= BUF_SIZE;
i++;
}
*(U16 *)(downloadAddress+0x14) = fmt.wFormatTag;
*(U16 *)(downloadAddress+0x16) = fmt.nChannels;
*(U32 *)(downloadAddress+0x18) = fmt.nSamplesPerSec;
*(U32 *)(downloadAddress+0x1c) = fmt.nAvgBytesPerSec;
*(U16 *)(downloadAddress+0x20) = fmt.nBlockAlign;
*(U16 *)(downloadAddress+0x22) = fmt.wBitsPerSample;
*(U32 *)(downloadAddress+0x28) = downloadFileSize;
err = waveInOpen(&hwi,
0,
&fmt,
0,
0,
0);
Uart_Printf("\nerr = %x\n", err);
for(j=0;j<i;j++)
if(waveInAddBuffer(hwi, &hdr[j], 0))
Uart_Printf("Add buffer error!");
Uart_Printf("Added %d buffer for record\n", i);
Uart_Printf("Press any to Record\n");
Uart_Getch();
Uart_Printf("Now begin recording, Press 'ESC' to quit\n");
waveInStart(hwi);
while(1)
{
U8 key;
key = Uart_GetKey();
if( key == ESC_KEY )
break;
// Uart_Printf("%x,%x,%x,%x,%x,%x,%x\n", rDISRC2, rDISRCC2, rDIDST2, rDIDSTC2, rDCON2, rDSTAT2, rDMASKTRIG2);
// Uart_Printf("%x,%x,%x,%x\n", rIISCON, rIISMOD, rIISPSR, rIISFCON);
}
waveInClose(hwi);
}
void RecordChannelOnOff(void)
{
static int ChannelOn = 0;
int err;
WAVEFORMATEX fmt;
WAVEHDR hdr;
HWAVEIN hwi = 1;
fmt.nSamplesPerSec = 22050;
fmt.wBitsPerSample = 16;
fmt.wFormatTag = WAVE_FORMAT_PCM;
fmt.nChannels = 2;
fmt.nBlockAlign = fmt.wBitsPerSample*fmt.nChannels/8;
fmt.nAvgBytesPerSec = fmt.nSamplesPerSec*fmt.nBlockAlign;
hdr.lpData = (LPSTR)0x30800000;//_NONCACHE_STARTADDRESS;
hdr.dwBufferLength = BUF_SIZE;
if(!ChannelOn) {
err = waveInOpen(&hwi,
0,
&fmt,
0,
0,
0);
Uart_Printf("\nerr = %x\n", err);
if(!err) {
waveInAddBuffer(hwi, &hdr, 0);
waveInStart(hwi);
Uart_Printf("Record channel on\n");
ChannelOn = 1;
}
} else {
waveInClose(hwi);
Uart_Printf("Record channel off\n");
ChannelOn = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -