]> Shamusworld >> Repos - virtualjaguar/blob - src/pcm.cpp
Adding 1.0.1/2 uncompressed tarballs to tags for historical purposes.
[virtualjaguar] / src / pcm.cpp
1 #include "include/pcm.h"\r
2 \r
3 #define PCM_DUMP\r
4 \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
9 \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
20 \r
21 //////////////////////////////////////////////////////////////////////////////\r
22 //\r
23 //////////////////////////////////////////////////////////////////////////////\r
24 //\r
25 //\r
26 //\r
27 //\r
28 //\r
29 //\r
30 //////////////////////////////////////////////////////////////////////////////\r
31 void pcm_set_sample_rate(int rate)\r
32 {\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
36 }\r
37 //////////////////////////////////////////////////////////////////////////////\r
38 //\r
39 //////////////////////////////////////////////////////////////////////////////\r
40 //\r
41 //\r
42 //\r
43 //\r
44 //\r
45 //\r
46 //////////////////////////////////////////////////////////////////////////////\r
47 void pcm_updateOne(int channel, int16 *data, uint32 length)\r
48 {\r
49         if (channel==0)\r
50         {\r
51                 while (length)\r
52                 {\r
53                         *data++=pcm_left[(pcm_left_playback_pos>>8)%buffer_modulo];\r
54                         pcm_left_playback_pos+=pcm_inc;\r
55                         length--;\r
56                 }\r
57         }\r
58         else\r
59         {\r
60                 while (length)\r
61                 {\r
62                         *data++=pcm_right[(pcm_right_playback_pos>>8)%buffer_modulo];\r
63                         pcm_right_playback_pos+=pcm_inc;\r
64                         length--;\r
65                 }\r
66         }\r
67 }\r
68 //////////////////////////////////////////////////////////////////////////////\r
69 //\r
70 //////////////////////////////////////////////////////////////////////////////\r
71 //\r
72 //\r
73 //\r
74 //\r
75 //\r
76 //\r
77 //////////////////////////////////////////////////////////////////////////////\r
78 void pcm_init(void)\r
79 {\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
82         pcm_reset();\r
83         fp_left=fopen("leftdac.raw","wb");\r
84         fp_right=fopen("rightdac.raw","wb");\r
85 \r
86 }\r
87 //////////////////////////////////////////////////////////////////////////////\r
88 //\r
89 //////////////////////////////////////////////////////////////////////////////\r
90 //\r
91 //\r
92 //\r
93 //\r
94 //\r
95 //\r
96 //////////////////////////////////////////////////////////////////////////////\r
97 void pcm_reset(void)\r
98 {\r
99         pcm_left_pos=0;\r
100         pcm_right_pos=0;\r
101         pcm_left_playback_pos=0;\r
102         pcm_right_playback_pos=0;\r
103 }\r
104 //////////////////////////////////////////////////////////////////////////////\r
105 //\r
106 //////////////////////////////////////////////////////////////////////////////\r
107 //\r
108 //\r
109 //\r
110 //\r
111 //\r
112 //\r
113 //////////////////////////////////////////////////////////////////////////////\r
114 void pcm_done(void)\r
115 {\r
116         fclose(fp_left);\r
117         fclose(fp_right);\r
118         fprintf(log_get(), "PCM: Done.\n");\r
119 }\r
120 //////////////////////////////////////////////////////////////////////////////\r
121 //\r
122 //////////////////////////////////////////////////////////////////////////////\r
123 //\r
124 //\r
125 //\r
126 //\r
127 //\r
128 //\r
129 //////////////////////////////////////////////////////////////////////////////\r
130 void pcm_update(void)\r
131 {\r
132 }\r
133 //////////////////////////////////////////////////////////////////////////////\r
134 //\r
135 //////////////////////////////////////////////////////////////////////////////\r
136 //\r
137 //\r
138 //\r
139 //\r
140 //\r
141 //\r
142 //////////////////////////////////////////////////////////////////////////////\r
143 void pcm_render_left_dac(void)\r
144 {\r
145 #ifdef PCM_DUMP\r
146         fwrite(pcm_left,1,sample_rate*2,fp_left);\r
147 #endif\r
148 }\r
149 //////////////////////////////////////////////////////////////////////////////\r
150 //\r
151 //////////////////////////////////////////////////////////////////////////////\r
152 //\r
153 //\r
154 //\r
155 //\r
156 //\r
157 //\r
158 //////////////////////////////////////////////////////////////////////////////\r
159 void pcm_render_right_dac(void)\r
160 {\r
161 #ifdef PCM_DUMP\r
162         fwrite(pcm_right,1,sample_rate*2,fp_right);\r
163 #endif\r
164 }\r
165 //////////////////////////////////////////////////////////////////////////////\r
166 //\r
167 //////////////////////////////////////////////////////////////////////////////\r
168 //\r
169 //\r
170 //\r
171 //\r
172 //\r
173 //\r
174 //////////////////////////////////////////////////////////////////////////////\r
175 void pcm_byte_write(uint32 offset, uint8 data)\r
176 {\r
177 //      fprintf(log_get(),"pcm: writing 0x%.2x at 0x%.8x\n",data,offset);\r
178 }\r
179 //////////////////////////////////////////////////////////////////////////////\r
180 //\r
181 //////////////////////////////////////////////////////////////////////////////\r
182 //\r
183 //\r
184 //\r
185 //\r
186 //\r
187 //\r
188 //////////////////////////////////////////////////////////////////////////////\r
189 void pcm_word_write(uint32 offset, uint16 data)\r
190 {\r
191         if (offset==2)\r
192         {\r
193                 pcm_left[pcm_left_pos%buffer_modulo]=data;\r
194                 pcm_left_pos++;\r
195                 if ((pcm_left_pos%buffer_modulo)==0)\r
196                         pcm_render_left_dac();\r
197         }\r
198         else\r
199         if (offset==6)\r
200         {\r
201                 pcm_right[pcm_right_pos%buffer_modulo]=data;\r
202                 pcm_right_pos++;\r
203                 if ((pcm_right_pos%buffer_modulo)==0)\r
204                         pcm_render_right_dac();\r
205         }\r
206 }\r
207 //////////////////////////////////////////////////////////////////////////////\r
208 //\r
209 //////////////////////////////////////////////////////////////////////////////\r
210 //\r
211 //\r
212 //\r
213 //\r
214 //\r
215 //\r
216 //////////////////////////////////////////////////////////////////////////////\r
217 uint8 pcm_byte_read(uint32 offset)\r
218 {\r
219 //      fprintf(log_get(),"pcm: reading byte from 0x%.8x\n",offset);\r
220         return(0xff);\r
221 }\r
222 //////////////////////////////////////////////////////////////////////////////\r
223 //\r
224 //////////////////////////////////////////////////////////////////////////////\r
225 //\r
226 //\r
227 //\r
228 //\r
229 //\r
230 //\r
231 //////////////////////////////////////////////////////////////////////////////\r
232 uint16 pcm_word_read(uint32 offset)\r
233 {\r
234 //      fprintf(log_get(),"pcm: reading word from 0x%.8x\n",offset);\r
235         return(0xffff);\r
236 }\r