ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/audio.cpp
(Generate patch)

Comparing BasiliskII/src/audio.cpp (file contents):
Revision 1.6 by cebix, 2000-07-25T17:02:23Z vs.
Revision 1.9 by cebix, 2001-07-11T19:26:13Z

# Line 1 | Line 1
1   /*
2   *  audio.cpp - Audio support
3   *
4 < *  Basilisk II (C) 1997-2000 Christian Bauer
4 > *  Basilisk II (C) 1997-2001 Christian Bauer
5   *  Portions (C) 1997-1999 Marc Hellwig
6   *
7   *  This program is free software; you can redistribute it and/or modify
# Line 36 | Line 36
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
# Line 65 | Line 70 | static int32 AudioGetInfo(uint32 infoPtr
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:
# Line 73 | Line 77 | static int32 AudioGetInfo(uint32 infoPtr
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                  }
# Line 91 | Line 95 | static int32 AudioGetInfo(uint32 infoPtr
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                  }
# Line 109 | Line 113 | static int32 AudioGetInfo(uint32 infoPtr
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                  }
# Line 182 | Line 186 | static int32 AudioSetInfo(uint32 infoPtr
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  
# Line 200 | Line 207 | static int32 AudioSetInfo(uint32 infoPtr
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  
# Line 211 | Line 222 | static int32 AudioSetInfo(uint32 infoPtr
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  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines