📄 testplay.c
字号:
#include "S3C2410.h"
#include "AudioDrv.h"
//#include "2410lib.h"
#include "DmaAdmin.h"
#include "WindowsXP_Wav.h" //长度为243552个字节
#include "test.h"
U32 downloadAddress;
U32 downloadFileSize;
WAVEHDR hdr[20];
WAVEFORMATEX fmt;
HWAVEOUT hwo = 0;
HWAVEIN hwi = 1;
#define BUF_SIZE (16*1024)
//static U16 fsTable[] = {8000,11025,16000,22050,32000,44100,48000,0};
void RecordTest(void)
{
int size, i, j, err;
#if 0
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;
#else
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);
#endif
downloadAddress = (unsigned long)WindowsXP_Wav;
downloadFileSize = size = 243552 ;
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);
for(j=0;j<i;j++)
if(waveInAddBuffer(hwi, &hdr[j], 0))
{
//puts("Add buffer error!");
}
waveInStart(hwi);
// waveInClose(hwi);
}
void PlayMusicTest(void)
{
int size, i, j, err;
U8 pause = 0;
U8 mute = 0;
downloadAddress = (unsigned long)WindowsXP_Wav;
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);
hwo = 0;
err = waveOutOpen(&hwo,
0,
&fmt,
0,
0,
0);
for(j=0;j<i;j++)
{
waveOutWrite(0, &hdr[j], 0);
}
}
int recording = 0;
int playing = 0;
int pause = 0;
int mute = 0;
unsigned int lastvolume = 0;
void ShowAudio(void)
{
int j = 0;
buf[0] = 0;
if( playing == 1 )
{
j += sprintf((char*)buf+j,"采样率=%d,通道数=%d,%d位/样本,大小=%d 音量=%d",
fmt.nSamplesPerSec, fmt.nChannels, fmt.wBitsPerSample,
*(U32 *)(downloadAddress+0x28),lastvolume);
if( pause & 1)
j += sprintf((char*)buf+j," 暂停播放");
if( mute & 1)
j += sprintf((char*)buf+j," 静音");
}
if( recording == 1)
{
j += sprintf((char*)buf+j," 正在录音...");
}
StatusMessage((const char *)buf);
}
int PlayAuditoControl(int v)
{
switch(v)
{
case 1: // play
if( playing == 0 )
{
playing = 1;
PlayMusicTest();
}
break;
case 2: // close
waveOutClose(hwo);
playing = 0;
break;
case 3: // volume +
case 4: // volume -
if((v==3)&&(lastvolume<=64535))
lastvolume += 1000;
else if((v==4)&&(lastvolume>=1000))
lastvolume -= 1000;
waveOutSetVolume(hwo, lastvolume);
break;
case 5: // pause
pause ^= 1;
if(pause&1)
waveOutPause(hwo);
else
waveOutRestart(hwo);
break;
case 6: // mute
mute ^= 1;
if(mute&1)
waveOutSetVolume(hwo, 0);
else
waveOutSetVolume(hwo, lastvolume);
break;
case 0xff:
return MENU_EXIT;
}
if( lastvolume == 0 )
waveOutGetVolume(hwo,&lastvolume);
ShowAudio();
SetMenuReShow(0);
return MENU_RETAIN;
}
int RecordAuditoControl(int v)
{
switch(v)
{
case 1:
if( recording == 0 )
{
RecordTest();
recording = 1;
}
break;
case 2:
waveInClose(hwi);
recording = 0;
break;
}
ShowAudio();
SetMenuReShow(0);
return MENU_RETAIN;
}
int test_Audito_idle(int v)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -