1 #include "include/pcm.h"
\r
5 #define sample_rate 44100
\r
6 #define sample_bits 16
\r
7 #define buffer_size 4
\r
8 #define buffer_modulo (sample_rate * buffer_size)
\r
10 static int16 * pcm_left;
\r
11 static int16 * pcm_right;
\r
12 static uint32 pcm_left_pos;
\r
13 static uint32 pcm_right_pos;
\r
14 static uint32 pcm_left_playback_pos;
\r
15 static uint32 pcm_right_playback_pos;
\r
16 static FILE * fp_left;
\r
17 static FILE * fp_right;
\r
18 static uint32 pcm_sample_rate = sample_rate;
\r
19 static uint32 pcm_inc = (pcm_sample_rate << 8) / sample_rate;
\r
21 //////////////////////////////////////////////////////////////////////////////
\r
23 //////////////////////////////////////////////////////////////////////////////
\r
30 //////////////////////////////////////////////////////////////////////////////
\r
31 void pcm_set_sample_rate(int rate)
\r
33 pcm_sample_rate = rate;
\r
34 pcm_inc = (pcm_sample_rate << 8) / sample_rate;
\r
35 // fprintf(log_get(),"pcm: sample rate is %i hz, sample increment is %i (%f)\n",pcm_sample_rate,pcm_inc,((float)pcm_inc)/256.0f);
\r
37 //////////////////////////////////////////////////////////////////////////////
\r
39 //////////////////////////////////////////////////////////////////////////////
\r
46 //////////////////////////////////////////////////////////////////////////////
\r
47 void pcm_updateOne(int channel, int16 *data, uint32 length)
\r
53 *data++=pcm_left[(pcm_left_playback_pos>>8)%buffer_modulo];
\r
54 pcm_left_playback_pos+=pcm_inc;
\r
62 *data++=pcm_right[(pcm_right_playback_pos>>8)%buffer_modulo];
\r
63 pcm_right_playback_pos+=pcm_inc;
\r
68 //////////////////////////////////////////////////////////////////////////////
\r
70 //////////////////////////////////////////////////////////////////////////////
\r
77 //////////////////////////////////////////////////////////////////////////////
\r
80 memory_malloc_secure((void**)&pcm_left,buffer_modulo*sizeof(int16),"Left dac buffer");
\r
81 memory_malloc_secure((void**)&pcm_right,buffer_modulo*sizeof(int16),"Right dac buffer");
\r
83 fp_left=fopen("leftdac.raw","wb");
\r
84 fp_right=fopen("rightdac.raw","wb");
\r
87 //////////////////////////////////////////////////////////////////////////////
\r
89 //////////////////////////////////////////////////////////////////////////////
\r
96 //////////////////////////////////////////////////////////////////////////////
\r
97 void pcm_reset(void)
\r
101 pcm_left_playback_pos=0;
\r
102 pcm_right_playback_pos=0;
\r
104 //////////////////////////////////////////////////////////////////////////////
\r
106 //////////////////////////////////////////////////////////////////////////////
\r
113 //////////////////////////////////////////////////////////////////////////////
\r
114 void pcm_done(void)
\r
118 fprintf(log_get(), "PCM: Done.\n");
\r
120 //////////////////////////////////////////////////////////////////////////////
\r
122 //////////////////////////////////////////////////////////////////////////////
\r
129 //////////////////////////////////////////////////////////////////////////////
\r
130 void pcm_update(void)
\r
133 //////////////////////////////////////////////////////////////////////////////
\r
135 //////////////////////////////////////////////////////////////////////////////
\r
142 //////////////////////////////////////////////////////////////////////////////
\r
143 void pcm_render_left_dac(void)
\r
146 fwrite(pcm_left,1,sample_rate*2,fp_left);
\r
149 //////////////////////////////////////////////////////////////////////////////
\r
151 //////////////////////////////////////////////////////////////////////////////
\r
158 //////////////////////////////////////////////////////////////////////////////
\r
159 void pcm_render_right_dac(void)
\r
162 fwrite(pcm_right,1,sample_rate*2,fp_right);
\r
165 //////////////////////////////////////////////////////////////////////////////
\r
167 //////////////////////////////////////////////////////////////////////////////
\r
174 //////////////////////////////////////////////////////////////////////////////
\r
175 void pcm_byte_write(uint32 offset, uint8 data)
\r
177 // fprintf(log_get(),"pcm: writing 0x%.2x at 0x%.8x\n",data,offset);
\r
179 //////////////////////////////////////////////////////////////////////////////
\r
181 //////////////////////////////////////////////////////////////////////////////
\r
188 //////////////////////////////////////////////////////////////////////////////
\r
189 void pcm_word_write(uint32 offset, uint16 data)
\r
193 pcm_left[pcm_left_pos%buffer_modulo]=data;
\r
195 if ((pcm_left_pos%buffer_modulo)==0)
\r
196 pcm_render_left_dac();
\r
201 pcm_right[pcm_right_pos%buffer_modulo]=data;
\r
203 if ((pcm_right_pos%buffer_modulo)==0)
\r
204 pcm_render_right_dac();
\r
207 //////////////////////////////////////////////////////////////////////////////
\r
209 //////////////////////////////////////////////////////////////////////////////
\r
216 //////////////////////////////////////////////////////////////////////////////
\r
217 uint8 pcm_byte_read(uint32 offset)
\r
219 // fprintf(log_get(),"pcm: reading byte from 0x%.8x\n",offset);
\r
222 //////////////////////////////////////////////////////////////////////////////
\r
224 //////////////////////////////////////////////////////////////////////////////
\r
231 //////////////////////////////////////////////////////////////////////////////
\r
232 uint16 pcm_word_read(uint32 offset)
\r
234 // fprintf(log_get(),"pcm: reading word from 0x%.8x\n",offset);
\r