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
119 //////////////////////////////////////////////////////////////////////////////
\r
121 //////////////////////////////////////////////////////////////////////////////
\r
128 //////////////////////////////////////////////////////////////////////////////
\r
129 void pcm_update(void)
\r
132 //////////////////////////////////////////////////////////////////////////////
\r
134 //////////////////////////////////////////////////////////////////////////////
\r
141 //////////////////////////////////////////////////////////////////////////////
\r
142 void pcm_render_left_dac(void)
\r
145 fwrite(pcm_left,1,sample_rate*2,fp_left);
\r
148 //////////////////////////////////////////////////////////////////////////////
\r
150 //////////////////////////////////////////////////////////////////////////////
\r
157 //////////////////////////////////////////////////////////////////////////////
\r
158 void pcm_render_right_dac(void)
\r
161 fwrite(pcm_right,1,sample_rate*2,fp_right);
\r
164 //////////////////////////////////////////////////////////////////////////////
\r
166 //////////////////////////////////////////////////////////////////////////////
\r
173 //////////////////////////////////////////////////////////////////////////////
\r
174 void pcm_byte_write(uint32 offset, uint8 data)
\r
176 // fprintf(log_get(),"pcm: writing 0x%.2x at 0x%.8x\n",data,offset);
\r
178 //////////////////////////////////////////////////////////////////////////////
\r
180 //////////////////////////////////////////////////////////////////////////////
\r
187 //////////////////////////////////////////////////////////////////////////////
\r
188 void pcm_word_write(uint32 offset, uint16 data)
\r
192 pcm_left[pcm_left_pos%buffer_modulo]=data;
\r
194 if ((pcm_left_pos%buffer_modulo)==0)
\r
195 pcm_render_left_dac();
\r
200 pcm_right[pcm_right_pos%buffer_modulo]=data;
\r
202 if ((pcm_right_pos%buffer_modulo)==0)
\r
203 pcm_render_right_dac();
\r
206 //////////////////////////////////////////////////////////////////////////////
\r
208 //////////////////////////////////////////////////////////////////////////////
\r
215 //////////////////////////////////////////////////////////////////////////////
\r
216 uint8 pcm_byte_read(uint32 offset)
\r
218 // fprintf(log_get(),"pcm: reading byte from 0x%.8x\n",offset);
\r
221 //////////////////////////////////////////////////////////////////////////////
\r
223 //////////////////////////////////////////////////////////////////////////////
\r
230 //////////////////////////////////////////////////////////////////////////////
\r
231 uint16 pcm_word_read(uint32 offset)
\r
233 // fprintf(log_get(),"pcm: reading word from 0x%.8x\n",offset);
\r