36 |
|
#include "debug.h" |
37 |
|
|
38 |
|
|
39 |
+ |
// Supported sample rates, sizes and channels |
40 |
+ |
vector<uint32> audio_sample_rates; |
41 |
+ |
vector<uint16> audio_sample_sizes; |
42 |
+ |
vector<uint16> audio_channel_counts; |
43 |
+ |
|
44 |
|
// Global variables |
45 |
|
struct audio_status AudioStatus; // Current audio status (sample rate etc.) |
46 |
|
bool audio_open = false; // Flag: audio is initialized and ready |
70 |
|
{ |
71 |
|
D(bug(" AudioGetInfo %c%c%c%c, infoPtr %08lx, source ID %08lx\n", selector >> 24, (selector >> 16) & 0xff, (selector >> 8) & 0xff, selector & 0xff, infoPtr, sourceID)); |
72 |
|
M68kRegisters r; |
68 |
– |
int i; |
73 |
|
|
74 |
|
switch (selector) { |
75 |
|
case siSampleSize: |
77 |
|
break; |
78 |
|
|
79 |
|
case siSampleSizeAvailable: { |
80 |
< |
r.d[0] = audio_num_sample_sizes * 2; |
80 |
> |
r.d[0] = audio_sample_sizes.size() * 2; |
81 |
|
Execute68kTrap(0xa122, &r); // NewHandle() |
82 |
|
uint32 h = r.a[0]; |
83 |
|
if (h == 0) |
84 |
|
return memFullErr; |
85 |
< |
WriteMacInt16(infoPtr + sil_count, audio_num_sample_sizes); |
85 |
> |
WriteMacInt16(infoPtr + sil_count, audio_sample_sizes.size()); |
86 |
|
WriteMacInt32(infoPtr + sil_infoHandle, h); |
87 |
|
uint32 sp = ReadMacInt32(h); |
88 |
< |
for (i=0; i<audio_num_sample_sizes; i++) |
88 |
> |
for (unsigned i=0; i<audio_sample_sizes.size(); i++) |
89 |
|
WriteMacInt16(sp + i*2, audio_sample_sizes[i]); |
90 |
|
break; |
91 |
|
} |
95 |
|
break; |
96 |
|
|
97 |
|
case siChannelAvailable: { |
98 |
< |
r.d[0] = audio_num_channel_counts * 2; |
98 |
> |
r.d[0] = audio_channel_counts.size() * 2; |
99 |
|
Execute68kTrap(0xa122, &r); // NewHandle() |
100 |
|
uint32 h = r.a[0]; |
101 |
|
if (h == 0) |
102 |
|
return memFullErr; |
103 |
< |
WriteMacInt16(infoPtr + sil_count, audio_num_channel_counts); |
103 |
> |
WriteMacInt16(infoPtr + sil_count, audio_channel_counts.size()); |
104 |
|
WriteMacInt32(infoPtr + sil_infoHandle, h); |
105 |
|
uint32 sp = ReadMacInt32(h); |
106 |
< |
for (i=0; i<audio_num_channel_counts; i++) |
106 |
> |
for (unsigned i=0; i<audio_channel_counts.size(); i++) |
107 |
|
WriteMacInt16(sp + i*2, audio_channel_counts[i]); |
108 |
|
break; |
109 |
|
} |
113 |
|
break; |
114 |
|
|
115 |
|
case siSampleRateAvailable: { |
116 |
< |
r.d[0] = audio_num_sample_rates * 4; |
116 |
> |
r.d[0] = audio_sample_rates.size() * 4; |
117 |
|
Execute68kTrap(0xa122, &r); // NewHandle() |
118 |
|
uint32 h = r.a[0]; |
119 |
|
if (h == 0) |
120 |
|
return memFullErr; |
121 |
< |
WriteMacInt16(infoPtr + sil_count, audio_num_sample_rates); |
121 |
> |
WriteMacInt16(infoPtr + sil_count, audio_sample_rates.size()); |
122 |
|
WriteMacInt32(infoPtr + sil_infoHandle, h); |
123 |
|
uint32 lp = ReadMacInt32(h); |
124 |
< |
for (i=0; i<audio_num_sample_rates; i++) |
124 |
> |
for (unsigned i=0; i<audio_sample_rates.size(); i++) |
125 |
|
WriteMacInt32(lp + i*4, audio_sample_rates[i]); |
126 |
|
break; |
127 |
|
} |
186 |
|
{ |
187 |
|
D(bug(" AudioSetInfo %c%c%c%c, infoPtr %08lx, source ID %08lx\n", selector >> 24, (selector >> 16) & 0xff, (selector >> 8) & 0xff, selector & 0xff, infoPtr, sourceID)); |
188 |
|
M68kRegisters r; |
185 |
– |
int i; |
189 |
|
|
190 |
|
switch (selector) { |
191 |
|
case siSampleSize: |
192 |
|
D(bug(" set sample size %08lx\n", infoPtr)); |
193 |
|
if (AudioStatus.num_sources) |
194 |
|
return siDeviceBusyErr; |
195 |
< |
for (i=0; i<audio_num_sample_sizes; i++) |
195 |
> |
if (infoPtr == AudioStatus.sample_size) |
196 |
> |
return noErr; |
197 |
> |
for (unsigned i=0; i<audio_sample_sizes.size(); i++) |
198 |
|
if (audio_sample_sizes[i] == infoPtr) { |
199 |
< |
audio_set_sample_size(i); |
200 |
< |
return noErr; |
199 |
> |
if (audio_set_sample_size(i)) |
200 |
> |
return noErr; |
201 |
> |
else |
202 |
> |
return siInvalidSampleSize; |
203 |
|
} |
204 |
|
return siInvalidSampleSize; |
205 |
|
|
207 |
|
D(bug(" set sample rate %08lx\n", infoPtr)); |
208 |
|
if (AudioStatus.num_sources) |
209 |
|
return siDeviceBusyErr; |
210 |
< |
for (i=0; i<audio_num_sample_rates; i++) |
210 |
> |
if (infoPtr == AudioStatus.sample_rate) |
211 |
> |
return noErr; |
212 |
> |
for (unsigned i=0; i<audio_sample_rates.size(); i++) |
213 |
|
if (audio_sample_rates[i] == infoPtr) { |
214 |
< |
audio_set_sample_rate(i); |
215 |
< |
return noErr; |
214 |
> |
if (audio_set_sample_rate(i)) |
215 |
> |
return noErr; |
216 |
> |
else |
217 |
> |
return siInvalidSampleRate; |
218 |
|
} |
219 |
|
return siInvalidSampleRate; |
220 |
|
|
222 |
|
D(bug(" set number of channels %08lx\n", infoPtr)); |
223 |
|
if (AudioStatus.num_sources) |
224 |
|
return siDeviceBusyErr; |
225 |
< |
for (i=0; i<audio_num_channel_counts; i++) |
225 |
> |
if (infoPtr == AudioStatus.channels) |
226 |
> |
return noErr; |
227 |
> |
for (unsigned i=0; i<audio_channel_counts.size(); i++) |
228 |
|
if (audio_channel_counts[i] == infoPtr) { |
229 |
< |
audio_set_channels(i); |
230 |
< |
return noErr; |
229 |
> |
if (audio_set_channels(i)) |
230 |
> |
return noErr; |
231 |
> |
else |
232 |
> |
return badChannel; |
233 |
|
} |
234 |
|
return badChannel; |
235 |
|
|