]> 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 }\r
119 //////////////////////////////////////////////////////////////////////////////\r
120 //\r
121 //////////////////////////////////////////////////////////////////////////////\r
122 //\r
123 //\r
124 //\r
125 //\r
126 //\r
127 //\r
128 //////////////////////////////////////////////////////////////////////////////\r
129 void pcm_update(void)\r
130 {\r
131 }\r
132 //////////////////////////////////////////////////////////////////////////////\r
133 //\r
134 //////////////////////////////////////////////////////////////////////////////\r
135 //\r
136 //\r
137 //\r
138 //\r
139 //\r
140 //\r
141 //////////////////////////////////////////////////////////////////////////////\r
142 void pcm_render_left_dac(void)\r
143 {\r
144 #ifdef PCM_DUMP\r
145         fwrite(pcm_left,1,sample_rate*2,fp_left);\r
146 #endif\r
147 }\r
148 //////////////////////////////////////////////////////////////////////////////\r
149 //\r
150 //////////////////////////////////////////////////////////////////////////////\r
151 //\r
152 //\r
153 //\r
154 //\r
155 //\r
156 //\r
157 //////////////////////////////////////////////////////////////////////////////\r
158 void pcm_render_right_dac(void)\r
159 {\r
160 #ifdef PCM_DUMP\r
161         fwrite(pcm_right,1,sample_rate*2,fp_right);\r
162 #endif\r
163 }\r
164 //////////////////////////////////////////////////////////////////////////////\r
165 //\r
166 //////////////////////////////////////////////////////////////////////////////\r
167 //\r
168 //\r
169 //\r
170 //\r
171 //\r
172 //\r
173 //////////////////////////////////////////////////////////////////////////////\r
174 void pcm_byte_write(uint32 offset, uint8 data)\r
175 {\r
176 //      fprintf(log_get(),"pcm: writing 0x%.2x at 0x%.8x\n",data,offset);\r
177 }\r
178 //////////////////////////////////////////////////////////////////////////////\r
179 //\r
180 //////////////////////////////////////////////////////////////////////////////\r
181 //\r
182 //\r
183 //\r
184 //\r
185 //\r
186 //\r
187 //////////////////////////////////////////////////////////////////////////////\r
188 void pcm_word_write(uint32 offset, uint16 data)\r
189 {\r
190         if (offset==2)\r
191         {\r
192                 pcm_left[pcm_left_pos%buffer_modulo]=data;\r
193                 pcm_left_pos++;\r
194                 if ((pcm_left_pos%buffer_modulo)==0)\r
195                         pcm_render_left_dac();\r
196         }\r
197         else\r
198         if (offset==6)\r
199         {\r
200                 pcm_right[pcm_right_pos%buffer_modulo]=data;\r
201                 pcm_right_pos++;\r
202                 if ((pcm_right_pos%buffer_modulo)==0)\r
203                         pcm_render_right_dac();\r
204         }\r
205 }\r
206 //////////////////////////////////////////////////////////////////////////////\r
207 //\r
208 //////////////////////////////////////////////////////////////////////////////\r
209 //\r
210 //\r
211 //\r
212 //\r
213 //\r
214 //\r
215 //////////////////////////////////////////////////////////////////////////////\r
216 uint8 pcm_byte_read(uint32 offset)\r
217 {\r
218 //      fprintf(log_get(),"pcm: reading byte from 0x%.8x\n",offset);\r
219         return(0xff);\r
220 }\r
221 //////////////////////////////////////////////////////////////////////////////\r
222 //\r
223 //////////////////////////////////////////////////////////////////////////////\r
224 //\r
225 //\r
226 //\r
227 //\r
228 //\r
229 //\r
230 //////////////////////////////////////////////////////////////////////////////\r
231 uint16 pcm_word_read(uint32 offset)\r
232 {\r
233 //      fprintf(log_get(),"pcm: reading word from 0x%.8x\n",offset);\r
234         return(0xffff);\r
235 }\r