4 using System.Runtime.InteropServices;
13 abstract class AudioData {
14 protected const int buffer_size = 4096;
17 public abstract int Channels {
21 public abstract int Rate {
25 public abstract AudioFormat Format {
29 public virtual void Setup (AudioDevice dev) {
30 dev.SetFormat (Format, Channels, Rate);
33 public abstract void Play (AudioDevice dev);
35 public virtual bool IsStopped {
45 /*public enum WavCmpCodes {
56 class WavData : AudioData {
64 public WavData (Stream data) {
66 byte[] buffer = new byte [12+32];
67 int c = stream.Read (buffer, 0, 12 + 32);
69 buffer [0] != 'R' || buffer [1] != 'I' || buffer [2] != 'F' || buffer [3] != 'F' ||
70 buffer [8] != 'W' || buffer [9] != 'A' || buffer [10] != 'V' || buffer [11] != 'E') {
71 throw new Exception ("incorrect format" + c);
73 if (buffer [12] != 'f' || buffer [13] != 'm' || buffer [14] != 't' || buffer [15] != ' ') {
74 throw new Exception ("incorrect format (fmt)");
76 int extra_size = buffer [16];
77 extra_size |= buffer [17] << 8;
78 extra_size |= buffer [18] << 16;
79 extra_size |= buffer [19] << 24;
80 int compression = buffer [20] | (buffer [21] << 8);
82 throw new Exception ("incorrect format (not PCM)");
83 channels = (short)(buffer [22] | (buffer [23] << 8));
84 sample_rate = buffer [24];
85 sample_rate |= buffer [25] << 8;
86 sample_rate |= buffer [26] << 16;
87 sample_rate |= buffer [27] << 24;
88 int avg_bytes = buffer [28];
89 avg_bytes |= buffer [29] << 8;
90 avg_bytes |= buffer [30] << 16;
91 avg_bytes |= buffer [31] << 24;
92 //int block_align = buffer [32] | (buffer [33] << 8);
93 int sign_bits = buffer [34] | (buffer [35] << 8);
94 /*Console.WriteLine (extra_size);
95 Console.WriteLine (compression);
96 Console.WriteLine (channels);
97 Console.WriteLine (sample_rate);
98 Console.WriteLine (avg_bytes);
99 Console.WriteLine (block_align);
100 Console.WriteLine (sign_bits);*/
101 if (buffer [36] != 'd' || buffer [37] != 'a' || buffer [38] != 't' || buffer [39] != 'a') {
102 throw new Exception ("incorrect format (data)");
104 int sample_size = buffer [40];
105 sample_size |= buffer [41] << 8;
106 sample_size |= buffer [42] << 16;
107 sample_size |= buffer [43] << 24;
108 data_len = sample_size;
109 //Console.WriteLine (sample_size);
113 format = AudioFormat.U8; break;
116 format = AudioFormat.S16_LE; break;
118 throw new Exception ("bits per sample");
122 public override void Play (AudioDevice dev) {
124 int count = data_len;
125 byte[] buffer = new byte [buffer_size];
127 while (!IsStopped && count >= 0 && (read = stream.Read (buffer, 0, System.Math.Min (buffer.Length, count))) > 0) {
128 // FIXME: account for leftover bytes
129 dev.PlaySample (buffer, read/frame_divider);
134 public override int Channels {
135 get {return channels;}
137 public override int Rate {
138 get {return sample_rate;}
140 public override AudioFormat Format {
145 // http://en.wikipedia.org/wiki/Au_file_format
151 class AuData : AudioData {
154 ushort frame_divider;
159 public AuData (Stream data) {
161 byte[] buffer = new byte [24];
162 int c = stream.Read (buffer, 0, 24);
164 buffer [0] != '.' || buffer [1] != 's' || buffer [2] != 'n' || buffer [3] != 'd') {
165 throw new Exception ("incorrect format" + c);
167 int data_offset = buffer [7];
168 data_offset |= buffer [6] << 8;
169 data_offset |= buffer [5] << 16;
170 data_offset |= buffer [4] << 24;
171 data_len = buffer [11];
172 data_len |= buffer [10] << 8;
173 data_len |= buffer [9] << 16;
174 data_len |= buffer [8] << 24;
175 int encoding = buffer [15];
176 encoding |= buffer [14] << 8;
177 encoding |= buffer [13] << 16;
178 encoding |= buffer [12] << 24;
179 sample_rate = buffer [19];
180 sample_rate |= buffer [18] << 8;
181 sample_rate |= buffer [17] << 16;
182 sample_rate |= buffer [16] << 24;
183 int chans = buffer [23];
184 chans |= buffer [22] << 8;
185 chans |= buffer [21] << 16;
186 chans |= buffer [20] << 24;
187 channels = (short)chans;
188 if (data_offset < 24 || (chans != 1 && chans != 2)) {
189 throw new Exception ("incorrect format offset" + data_offset);
191 if (data_offset != 24) {
192 for (int l = 24; l < data_offset; ++l)
198 format = AudioFormat.MU_LAW; break;
200 throw new Exception ("incorrect format encoding" + encoding);
202 if (data_len == -1) {
203 data_len = (int)stream.Length - data_offset;
205 // Console.WriteLine ("format: {0}, rate: {1}", format, sample_rate);
208 public override void Play (AudioDevice dev) {
210 int count = data_len;
211 byte[] buffer = new byte [buffer_size];
213 while (!IsStopped && count >= 0 && (read = stream.Read (buffer, 0, System.Math.Min (buffer.Length, count))) > 0) {
214 // FIXME: account for leftover bytes
215 dev.PlaySample (buffer, read/frame_divider);
220 public override int Channels {
221 get {return channels;}
223 public override int Rate {
224 get {return sample_rate;}
226 public override AudioFormat Format {