BOOTLOADER
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
testaudio.c
Go to the documentation of this file.
1 //===================================
2 // Project: MyS3c2410
3 // Author: Book Chen
4 // function: play audio
5 //===================================
6 #include "includes.h"
7 
8 #define TestAudioIdleState 0
9 #define TestAudioPlayState0 1
10 #define TestAudioPlayState1 2
11 #define TestAudioRecordState0 3
12 #define TestAudioRecordState1 4
13 
14 #define BLOCK_SIZE (16*1024)
15 
17 volatile WAVE_DATA WaveData[2048];
19  {8000, (123<<12)|(6<<4)|0,(23<<5)|23,0},
20  {11025,(229<<12)|(5<<4)|1,(11<<5)|11,1},
21  {16000,(123<<12)|(6<<4)|0,(11<<5)|11,0},
22  {22050,(229<<12)|(5<<4)|1,( 5<<5)|5 ,1},
23  {32000,(123<<12)|(6<<4)|0,( 5<<5)|5 ,0},
24  {44100,(229<<12)|(5<<4)|1,( 2<<5)|2 ,1},
25  {48000,(123<<12)|(6<<4)|0,( 3<<5)|3 ,0}
26 };
27 
28 void F_TestAudioInit(void);
29 void F_TestAudioSvc(void);
30 void F_TestAudioPlay(void);
31 void F_TestAudioRecord(void);
34 
35 void F_TestAudioInit(void){
36  TestAudioCtrl.WaveBlockCount=0;
37  TestAudioCtrl.Id=ID_TESTAUDIO;
38  TestAudioCtrl.State=TestAudioIdleState;
39 }
40 void F_TestAudioSvc(void){
41  switch(TestAudioCtrl.State){
42  case TestAudioIdleState:
43  return;
45  if(F_IisInUseCheck()==TRUE) return;
46  F_IisAllocate(TestAudioCtrl.Id);
47  if(F_TestAudioWavePrepare()==FALSE){ // prepare wave out data,format...
48  printf("F_TestAudioWavePrepare Fail");
49  F_IisRelease(TestAudioCtrl.Id);
50  TestAudioCtrl.State=TestAudioIdleState;
51  return;
52  }
53  F_IisPlay(TestAudioCtrl.Id); // enable IIS to play audio
54  TestAudioCtrl.State=TestAudioPlayState1;
55  return;
57  //F_IisRelease(TestAudioCtrl.Id);
58  //TestAudioCtrl.State=TestAudioIdleState;
59  //return;
60  if(F_IisStatusCheck()==TRUE){ // iis check idle
61  F_IisRelease(TestAudioCtrl.Id);
62  printf("\n audio done ");
63  TestAudioCtrl.State=TestAudioIdleState;
64  }
65  return;
67  if(F_IisInUseCheck()==TRUE) return;
68  F_IisAllocate(TestAudioCtrl.Id);
69  F_IisRecord(TestAudioCtrl.Id);
70  TestAudioCtrl.State=TestAudioRecordState1;
71  return;
73  if(F_IisStatusCheck()==TRUE){ // iis check idle
74  F_IisRelease(TestAudioCtrl.Id);
75  TestAudioCtrl.State=TestAudioIdleState;
76  }
77  return;
78  default:
79  return;
80  }
81 }
83  //INT32U Who;
84  INT8U *pBuffer;
85  INT32U Size;
86  INT32U i;
87  INT8U j;
88 
89  pBuffer=(INT8U *)AUDIO_DOWNLOAD_ADDR; // config.h
90  for(i=0;i<243552;i++)
91  pBuffer[i]=WindowsXpWav[i]; // move wace data to audio buffer
92  TestAudioCtrl.WaveFormat.FormatTag=WAVE_FORMAT_PCM; // get wave format info.
93  TestAudioCtrl.WaveFormat.Channel=*(INT16U *)(AUDIO_DOWNLOAD_ADDR+0x16);
94  TestAudioCtrl.WaveFormat.SamplePerSec=*(INT32U *)(AUDIO_DOWNLOAD_ADDR+0x18);
95  TestAudioCtrl.WaveFormat.AvgBytePerSec=*(INT32U *)(AUDIO_DOWNLOAD_ADDR+0x1c);
96  TestAudioCtrl.WaveFormat.BlockAlign=*(INT16U *)(AUDIO_DOWNLOAD_ADDR+0x20);
97  TestAudioCtrl.WaveFormat.BitPerSample=*(INT16U *)(AUDIO_DOWNLOAD_ADDR+0x22);
98  printf("\n Wave info. done");
99  Size=*(INT32U *)(AUDIO_DOWNLOAD_ADDR+0x28); // get wave total data size
100  TestAudioCtrl.WaveBlockCount=0; // initial wave block count
101  while(Size>0){ // analyze wave data to blocks
102  WaveData[TestAudioCtrl.WaveBlockCount].pData=(INT8U *)(AUDIO_DOWNLOAD_ADDR+0x2c+TestAudioCtrl.WaveBlockCount*BLOCK_SIZE);
103  if(Size>BLOCK_SIZE){
104  WaveData[TestAudioCtrl.WaveBlockCount].BufferLength=BLOCK_SIZE;
105  Size=Size-BLOCK_SIZE;
106  }
107  else{
108  WaveData[TestAudioCtrl.WaveBlockCount].BufferLength=Size;
109  Size=0;
110  }
111  TestAudioCtrl.WaveBlockCount++;
112  if(TestAudioCtrl.WaveBlockCount>2047) break; // max 2048 blocks...0~2047
113  }
114  printf("\n Wave data. done");
115  if(TestAudioCtrl.WaveFormat.FormatTag!=WAVE_FORMAT_PCM) return FALSE;
116  if(TestAudioCtrl.WaveFormat.Channel!=2) return FALSE; // must be stereo
117  for(j=0;j<MAX_CODEC_PARAMETER;j++)
118  if(TestAudioCtrl.WaveFormat.SamplePerSec==CodecParam[j].Frequency)
119  break;
120  if(j==7) return FALSE; // 0~6 valid
121  else IisCtrl.CodecIndex=j;
122  if(((TestAudioCtrl.WaveFormat.Channel*TestAudioCtrl.WaveFormat.BitPerSample)/8)
123  !=TestAudioCtrl.WaveFormat.BlockAlign)
124  return FALSE;
125  if((TestAudioCtrl.WaveFormat.SamplePerSec*TestAudioCtrl.WaveFormat.BlockAlign)
126  !=TestAudioCtrl.WaveFormat.AvgBytePerSec)
127  return FALSE;
128  printf("\n Wave analyze pass");
129  return TRUE;
130 }
131 void F_TestAudioPlay(void){
132  TestAudioCtrl.State=TestAudioPlayState0;
133 }
134 void F_TestAudioRecord(void){
135  //TestAudioCtrl.State=TestAudioRecordState0;
136 }
138  if(TestAudioCtrl.State==TestAudioIdleState) return TRUE;
139  else return FALSE;
140 }