catori 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. data/VERSION +1 -0
  2. data/bin/catori +9 -0
  3. data/changelog.txt +3 -0
  4. data/construir +3 -0
  5. data/crear_vista.sql +8 -0
  6. data/ext/audiofile/MANIFEST +8 -0
  7. data/ext/audiofile/README +11 -0
  8. data/ext/audiofile/audiofile.c +833 -0
  9. data/ext/audiofile/audiofile.rd +265 -0
  10. data/ext/audiofile/depend +0 -0
  11. data/ext/audiofile/extconf.rb +8 -0
  12. data/ext/audiofile/fail.rb +22 -0
  13. data/ext/audiofile/mkmf.log +34 -0
  14. data/ext/audiofile/test.rb +229 -0
  15. data/ext/flac/extconf.rb +5 -0
  16. data/ext/flac/flac.c +75 -0
  17. data/ext/flac/mkmf.log +12 -0
  18. data/ext/flac/test.rb +3 -0
  19. data/ext/mahoro-0.1/INSTALL +9 -0
  20. data/ext/mahoro-0.1/extconf.rb +7 -0
  21. data/ext/mahoro-0.1/mahoro.c +187 -0
  22. data/ext/mahoro-0.1/mkmf.log +24 -0
  23. data/ext/mahoro-0.1/test.rb +41 -0
  24. data/ext/mpc/extconf.rb +5 -0
  25. data/ext/mpc/id3tag.c +245 -0
  26. data/ext/mpc/id3tag.h +5 -0
  27. data/ext/mpc/mkmf.log +12 -0
  28. data/ext/mpc/mpc.c +56 -0
  29. data/ext/mpc/mpp.h +194 -0
  30. data/ext/mpc/mppdec.h +1171 -0
  31. data/ext/mpc/test.rb +3 -0
  32. data/ext/rmac/extconf.rb +7 -0
  33. data/ext/rmac/mkmf.log +22 -0
  34. data/ext/rmac/rmac.cpp +162 -0
  35. data/ext/vorbisfile/ChangeLog +11 -0
  36. data/ext/vorbisfile/README +33 -0
  37. data/ext/vorbisfile/configure +2 -0
  38. data/ext/vorbisfile/extconf.rb +9 -0
  39. data/ext/vorbisfile/mkmf.log +68 -0
  40. data/ext/vorbisfile/test.rb +78 -0
  41. data/ext/vorbisfile/vorbisfile.c +482 -0
  42. data/instalar.txt +19 -0
  43. data/install.rb +11 -0
  44. data/lib/audioinfo.rb +321 -0
  45. data/lib/catori.rb +131 -0
  46. data/lib/catori/Catalogador.rb +71 -0
  47. data/lib/catori/Db.rb +81 -0
  48. data/lib/catori/Gui.rb +52 -0
  49. data/lib/catori/Installer.rb +16 -0
  50. data/lib/catori/Query.rb +82 -0
  51. data/lib/catori/XML.rb +42 -0
  52. data/lib/catori/catori_gui.glade +340 -0
  53. data/lib/catori/catori_gui.glade.bak +340 -0
  54. data/lib/catori/catori_gui.gladep +8 -0
  55. data/lib/catori/catori_gui.gladep.bak +8 -0
  56. data/lib/catori/taglib.rb +227 -0
  57. data/lib/pixmaps/album.png +0 -0
  58. data/lib/pixmaps/artist.png +0 -0
  59. data/lib/pixmaps/cdr.png +0 -0
  60. data/lib/pixmaps/song.png +0 -0
  61. data/lib/taglib.rb +230 -0
  62. data/sql/catori_mysql.sql +68 -0
  63. data/sql/catori_pg.sql +65 -0
  64. data/tests/saw.ape +0 -0
  65. data/tests/saw.flac +0 -0
  66. data/tests/saw.mp3 +0 -0
  67. data/tests/saw.mpc +0 -0
  68. data/tests/saw.ogg +0 -0
  69. data/tests/saw.wav +0 -0
  70. data/tests/test_audioinfo.rb +43 -0
  71. metadata +217 -0
@@ -0,0 +1,265 @@
1
+ =begin RD
2
+
3
+ = ruby-audiofile
4
+ == a ruby binding to the audiofile library
5
+ == The underlying library
6
+
7
+ The ((<"http://dreamscape.68k.org/~michael/audiofile"|audiofile library>))
8
+ was originally proprietary to SGI, and was used in Irix to read and
9
+ write audio files of various types: wav, aiff, au, etc. After a bit of coding
10
+ by Michael Pruett, and a few more things, it's no longer proprietary, though
11
+ some parts are not yet in existence. We'll talk about that later. But here's
12
+
13
+ === What audiofile does:
14
+
15
+ * Reads audio files of various types
16
+ * Supports mu-law and A-law compression and uncompressed files
17
+ * Provides information on them, such as sampling rate, sample type, etc.
18
+ * Can switch byte order on the fly while reading, for user convenience
19
+ * Writes audio files
20
+ * Supports weird extensions (e.g. instruments in AIFF files, loops in WAV files)
21
+
22
+ === But audiofile doesn't:
23
+
24
+ * Read MP3's
25
+ * Read Vorbis files (see ((<"http://www.xiph.org/ogg/vorbis/">)) for that)
26
+ * Write either of these
27
+ * Resample files on the fly while writing or reading (yet)
28
+ * Change sample formats or compression on the fly (yet)
29
+ * Support multitrack files (yet). It does support multiple ((*channels*)),
30
+ i.e. stereo and whatnot, but doesn't support any formats yet that can store
31
+ multiple ((*tracks*)).
32
+
33
+ == This binding
34
+
35
+ This extension is a binding of the audiofile library to the Ruby language. With
36
+ the aid of this super-wonderful extension, you can do everything you could do
37
+ with audiofile in Ruby, except:
38
+
39
+ === Things supported by audiofile, but not ruby-audiofile
40
+
41
+ * reading non-raw files in a raw way
42
+ * handling errors elegantly (error handling works fairly well, but may
43
+ need changes)
44
+ * querying the capabilities of the library itself (afQuery)
45
+ * messing with loops, instruments, text data, or anything but the audio itself
46
+ * doing anything that audiofile has API for, but doesn't actually support
47
+
48
+ The last item may need a small bit of explanation: there are a number of
49
+ functions declared in audiofile.h (or commented out) which show that the
50
+ author has a clear idea of what it will look like to the user of the library
51
+ to use these not-yet-supported features, but there's not actually any code
52
+ behind these declarations.
53
+
54
+ == ruby-audiofile version 0.2.1
55
+
56
+ Version 0.2 adds file writing support, and fixes a bug with #read where
57
+ it returned half the data it was supposed to. Also the API has changed
58
+ some; the real_ prefixes no longer exist and there is a new virtual_
59
+ prefix. This makes code using ruby-audiofile shorter and more succinct.
60
+
61
+ Version 0.2.1 takes out a couple of debugging printf's i accidentally left in,
62
+ and changes the width/width= methods to bits/bits= to fit better with
63
+ Linux::SoundDSP. Minor documentation changes as well.
64
+
65
+ Version 0.2.2 has more documentation changes, and an update to my email
66
+ address.
67
+
68
+ == How to install
69
+ ruby extconf.rb
70
+ make
71
+ sudo make install
72
+
73
+ == How to use
74
+
75
+ In your scripts,
76
+ require 'audiofile'
77
+ This defines the AudioFile class, which has the following methods:
78
+
79
+ === AudioFile class
80
+
81
+ --- AudioFile.new( filename, [mode] )
82
+ --- AudioFile.open( filename, [mode] )
83
+ Open a new AudioFile and return it. The mode is either "r" or "w" - for read or
84
+ write.
85
+
86
+ If you open a file for writing, you must set the following properties before
87
+ writing to the file:
88
+
89
+ * rate
90
+ * bits
91
+ * channels
92
+ * byte_order
93
+ * compression
94
+ * file_format
95
+ * sample_format
96
+
97
+ If you do not set these properties before calling the #write method, the
98
+ results are unspecified.
99
+
100
+ --- AudioFile#close
101
+ Close the file.
102
+
103
+ --- AudioFile#read( [frames] )
104
+ Read frames frames from the file. A ((:frame:)) is one sample for each channel.
105
+ So in a 44100Hz, 16-bit, stereo file, a frame would take four bytes: two for
106
+ the left channel, and two for the right. (Two bytes is 16 bits of course.)
107
+ This returns a new string every time, so if you're reading many times from an
108
+ audio file, read_into is suggested. That way your script will not grow huge in
109
+ memory.
110
+
111
+ --- AudioFile#read_into( string )
112
+ Read into string from the file. This replaces the contents of the string by
113
+ reading the largest number of frames that will fit into the current length of
114
+ the string. It returns the number of bytes actually read. Example:
115
+ string = " " * 32
116
+ file.read_into(string)
117
+
118
+ --- AudioFile#write( string )
119
+ Write the string to the file. See the note under #open: in short, you must set
120
+ the properties of the file before writing to it.
121
+
122
+ Also note that both #read_into and #write round to the frame. That is,
123
+ read_into will only read as many whole frames as fit into the string you give
124
+ it, and write will only write as many whole frames as are contained in the
125
+ string you pass to it.
126
+
127
+ --- AudioFile#flush
128
+ Flush the write buffers for the file.
129
+
130
+ --- AudioFile#pos
131
+ Returns the current position inside the file, in frames. (See #read about
132
+ what frames are.)
133
+
134
+ --- AudioFile#pos=( [new_pos] )
135
+ Move to a new position inside the file. The position is specified in frames.
136
+ You cannot move backwards inside the file; #pos= will throw an exception if you
137
+ do.
138
+
139
+ --- AudioFile#frame_count
140
+ Returns how many frames are in this file.
141
+
142
+ --- AudioFile#virtual_byte_order=( [new_byte_order] )
143
+ Sets the virtual byte order. new_byte_order should be either
144
+ AudioFile::BIG_ENDIAN or AudioFile::LITTLE_ENDIAN.
145
+
146
+ When you read from the file, this byte order is the one the results will come
147
+ back in. So if you are reading a little-endian file and you use
148
+ #virtual_byte_order= AudioFile::BIG_ENDIAN, then #read, the data you get will
149
+ be in big-endian byte order, because the library will switch the bytes on the
150
+ fly.
151
+
152
+ Conversely, if you are writing a file, and you set the virtual byte order,
153
+ audiofile will take the bytes you give it in the virtual byte order, and swap
154
+ them if needed in order to get them into the file in the real byte order.
155
+
156
+ --- AudioFile#virtual_byte_order
157
+ Returns the virtual byte order. This will be one of:
158
+ * AudioFile::BIG_ENDIAN
159
+ * AudioFile::LITTLE_ENDIAN
160
+
161
+ --- AudioFile#byte_order
162
+ Returns the real byte order. See the constants above. This is the byte
163
+ order in which the file is stored and does not change when you use
164
+ #virtual_byte_order=.
165
+
166
+ --- AudioFile#byte_order=
167
+ Sets the byte order in which the file will be written. For use when writing
168
+ files only. Use before actually writing to the file.
169
+
170
+ --- AudioFile#compression
171
+ Returns the compression type, which will be one of:
172
+ * AudioFile::UNKNOWN
173
+ * AudioFile::NONE
174
+ * AudioFile::G722
175
+ * AudioFile::G711_ULAW
176
+ * AudioFile::G711_ALAW
177
+
178
+ Or one of these, which are detected but unsupported by the audiofile library:
179
+ * AudioFile::APPLE_ACE2
180
+ * AudioFile::APPLE_ACE8
181
+ * AudioFile::APPLE_MAC3
182
+ * AudioFile::APPLE_MAC6
183
+ * AudioFile::G726
184
+ * AudioFile::G728
185
+ * AudioFile::DVI_AUDIO
186
+ * AudioFile::GSM
187
+ * AudioFile::FS1016
188
+
189
+ --- AudioFile#compression=
190
+ Sets the compression type. See the constants above. For use when
191
+ writing files only. Use before actually writing to the file.
192
+
193
+ --- AudioFile#sample_format
194
+ Returns the sample format, which will be one of:
195
+ * AudioFile::TWOS_COMPLEMENT
196
+ * AudioFile::UNSIGNED
197
+ * AudioFile::FLOAT
198
+ * AudioFile::DOUBLE
199
+
200
+ --- AudioFile#sample_format=
201
+ Sets the sample format. See the constants above. For use when
202
+ writing files only. Use before actually writing to the file.
203
+
204
+ --- AudioFile#bits
205
+ Returns the number of bits in a sample. Commonly, this is 8 or 16. Some of the
206
+ file formats supported support sample widths greater than 16, which are usually
207
+ 24 or 32. The default behavior is to pad 24-bit samples to 32 bits for speed of
208
+ handling (and to expect padded samples when writing, thus throwing away every
209
+ fourth byte). To change this, look for the EXPAND_3TO4 define in the source
210
+ (audiofile.c, around line 90), change and recompile.
211
+
212
+ --- AudioFile#bits=
213
+ Sets the number of bits in a sample. For use when writing files only. Use
214
+ before actually writing to the file.
215
+
216
+ --- AudioFile#rate
217
+ Returns the number of samples per second. (commonly 44100, 22050, etc.)
218
+
219
+ --- AudioFile#rate=
220
+ Sets the number of samples per second. For use when writing files
221
+ only. Use before actually writing to the file.
222
+
223
+ --- AudioFile#channels
224
+ Returns the number of channels. (commonly 1 or 2)
225
+
226
+ --- AudioFile#channels=
227
+ Sets the number of channels. For use when writing files only. Use before
228
+ actually writing to the file.
229
+
230
+ --- AudioFile#pcm_mapping
231
+ Returns an array containing four floats. See below.
232
+
233
+ --- AudioFile#pcm_mapping=( param )
234
+ param is an array containing four floats, corresponding to the slope,
235
+ intercept, minimum clip and maximum clip values. This alters how the library
236
+ sees the samples. Example:
237
+ file.real_pcm_mapping = [0.0, 1.0, -1.0, 1.0]
238
+ The numbers define a piecewise linear function through which sample values are
239
+ mapped. By changing this, you can do things like make audiofile double all the
240
+ sample values it reads on the fly before you see them.
241
+
242
+ == About the virtual_ prefix on method names
243
+ The audiofile library (ideally) supports complete virtualization of all
244
+ parameters of a sound file (sampling frequency, sample type, compresson...)
245
+ such that the library would translate on the fly from the format in the file to
246
+ the format the user of the library wishes to see. All of this support isn't in
247
+ place yet: in fact, the only thing that is virtualized right now is the byte
248
+ order. So when complete virtualization is supported, this binding will have
249
+ #virtual_sample_rate=, #virtual_sample_format=, etc. methods. Right now there's
250
+ only #virtual_byte_order and #virtual_byte_order=.
251
+
252
+ == Have fun with it!
253
+ If you have any more questions about ruby-audiofile, you can look at the source
254
+ (by the way, many thanks to matz for writing extensions before I did; I copied
255
+ the structure of my extension from gdbm, which he wrote). Or you can ask me
256
+ questions at ((<"mailto:jjenning@fastmail.fm"|jjenning@fastmail.fm>)).
257
+
258
+ If you use this extension, I'd love to know! Email me and tell me.
259
+
260
+ == Possible future features
261
+ * querying the library for its capabilities.
262
+ * reading and writing non-strictly-audio data parts like instruments and loops.
263
+
264
+ The methods that return constants will hopefully end up more elegant in
265
+ some way.
File without changes
@@ -0,0 +1,8 @@
1
+ require 'mkmf'
2
+
3
+ dir_config("audiofile")
4
+ if have_library("audiofile", "afOpenFile") and have_header("audiofile.h")
5
+ create_makefile("audiofile")
6
+ else
7
+ print "*** ERROR: need to have all of this to compile this module\n"
8
+ end
@@ -0,0 +1,22 @@
1
+ require 'audiofile'
2
+
3
+ # Version 0.2: This script now works OK and does not fail.
4
+ # In an older version it caused Ruby to segfault (inside audiofile).
5
+
6
+ # change for your setup.
7
+ WORKING_AUDIO_FILE = "/home/jaredj/plasmoid.wav"
8
+
9
+ begin
10
+ bytes_read = 10000
11
+ while bytes_read > 0
12
+ print bytes_read, " "
13
+ bytes_read = bytes_read - 1
14
+ end
15
+ rescue
16
+ end
17
+
18
+ begin
19
+ f = AudioFile.new WORKING_AUDIO_FILE
20
+ f.close
21
+ rescue
22
+ end
@@ -0,0 +1,34 @@
1
+ have_library: checking for afOpenFile() in -laudiofile... -------------------- yes
2
+
3
+ "i686-pc-linux-gnu-gcc -o conftest -I. -I/usr/lib/ruby/1.8/i686-linux -I. -O2 -march=athlon-xp -m3dnow -msse -mfpmath=sse -mmmx -pipe -fno-strict-aliasing -fPIC conftest.c -L'.' -L'/usr/lib' -Wl,-R'/usr/lib' -L. -rdynamic -Wl,-export-dynamic -lruby18-static -laudiofile -ldl -lcrypt -lm -lc"
4
+ conftest.c: En la función ‘t’:
5
+ conftest.c:3: error: ‘afOpenFile’ no se declaró aquí (primer uso en esta función)
6
+ conftest.c:3: error: (Cada identificador no declarado solamente se reporta una vez
7
+ conftest.c:3: error: ara cada funcion en la que aparece.)
8
+ checked program was:
9
+ /* begin */
10
+ 1: /*top*/
11
+ 2: int main() { return 0; }
12
+ 3: int t() { void ((*volatile p)()); p = (void ((*)()))afOpenFile; return 0; }
13
+ /* end */
14
+
15
+ "i686-pc-linux-gnu-gcc -o conftest -I. -I/usr/lib/ruby/1.8/i686-linux -I. -O2 -march=athlon-xp -m3dnow -msse -mfpmath=sse -mmmx -pipe -fno-strict-aliasing -fPIC conftest.c -L'.' -L'/usr/lib' -Wl,-R'/usr/lib' -L. -rdynamic -Wl,-export-dynamic -lruby18-static -laudiofile -ldl -lcrypt -lm -lc"
16
+ checked program was:
17
+ /* begin */
18
+ 1: /*top*/
19
+ 2: int main() { return 0; }
20
+ 3: int t() { afOpenFile(); return 0; }
21
+ /* end */
22
+
23
+ --------------------
24
+
25
+ have_header: checking for audiofile.h... -------------------- yes
26
+
27
+ "i686-pc-linux-gnu-gcc -E -I. -I/usr/lib/ruby/1.8/i686-linux -I. -O2 -march=athlon-xp -m3dnow -msse -mfpmath=sse -mmmx -pipe -fno-strict-aliasing -fPIC conftest.c -o conftest.i"
28
+ checked program was:
29
+ /* begin */
30
+ 1: #include <audiofile.h>
31
+ /* end */
32
+
33
+ --------------------
34
+
@@ -0,0 +1,229 @@
1
+ require './audiofile'
2
+
3
+ # change for your setup.
4
+ WORKING_AUDIO_FILE = "/home/jaredj/plasmoid.wav"
5
+ WRITING_AUDIO_FILE = "/home/jaredj/plasmoid-new.wav"
6
+
7
+ # this should be nonexistent, or try files with the wrong format, etc
8
+ BOGUS_AUDIO_FILE = "/home/jaredj/wuhwiuthw4otwoti"
9
+
10
+ begin
11
+ one = AudioFile.new
12
+ rescue
13
+ print "OK ! illegal # parameters to AudioFile.new fails\n"
14
+ print " ", $!, "\n\n"
15
+ end
16
+
17
+ begin
18
+ two = AudioFile.new WORKING_AUDIO_FILE
19
+ two.close
20
+ three = AudioFile.new WORKING_AUDIO_FILE,"r"
21
+ three.close
22
+ rescue
23
+ print "FAILED! Opening #{WORKING_AUDIO_FILE} for reading\n"
24
+ print " ", $!, "\n\n"
25
+ end
26
+
27
+ begin
28
+ three_half = AudioFile.open WORKING_AUDIO_FILE
29
+ three_half.close
30
+ rescue
31
+ print "FAILED! AudioFile.open doesn't work\n"
32
+ print " ", $!, "\n\n"
33
+ end
34
+
35
+ begin
36
+ AudioFile.open(WORKING_AUDIO_FILE) do |file|
37
+ a = 4
38
+ end
39
+ rescue
40
+ print "FAILED! AudioFile.open with block doesn't work\n"
41
+ print " ", $!, "\n\n"
42
+ end
43
+
44
+
45
+
46
+
47
+ begin
48
+ four = AudioFile.new WORKING_AUDIO_FILE,"w"
49
+ four.close
50
+ rescue
51
+ print "OK ! Writing doesn't work without a FileSetup\n"
52
+ print " (In this version, writing doesn't work at all)\n"
53
+ print " ", $!, "\n\n"
54
+ end
55
+
56
+ begin
57
+ five = AudioFile.new WORKING_AUDIO_FILE,"foo"
58
+ five.close
59
+ rescue
60
+ print "OK ! AudioFile.new with nonsense mode fails\n"
61
+ print " ", $!, "\n\n"
62
+ end
63
+
64
+ begin
65
+ six = AudioFile.new BOGUS_AUDIO_FILE
66
+ rescue
67
+ print "OK ! Opening nonexistent or unsupported files doesn't work\n"
68
+ print " ", $!, "\n\n"
69
+ end
70
+
71
+ begin
72
+ f = AudioFile.new WORKING_AUDIO_FILE
73
+ [
74
+ "pos",
75
+ "rate",
76
+ "bits",
77
+ "channels",
78
+ "byte_order",
79
+ "compression",
80
+ "file_format",
81
+ "sample_format",
82
+ "virtual_byte_order",
83
+ "file_format_version",
84
+ "frame_count",
85
+ "frame_size",
86
+ ].each { |method|
87
+ print " ", method, " = ", f.instance_eval(method), "\n"
88
+ }
89
+ rescue
90
+ print "FAILED! Getting info about #{WORKING_AUDIO_FILE} doesn't work\n"
91
+ print " ", $!, "\n\n"
92
+ ensure
93
+ f.close
94
+ end
95
+
96
+ # take these $stdout.flush'es out and Ruby crashes when you run this script
97
+ # for minimum case that causes the error, see fail.rb
98
+
99
+ begin
100
+ f = AudioFile.new WORKING_AUDIO_FILE
101
+ string = " " * 10000;
102
+ bytes_read = 1
103
+ print "Reading from #{WORKING_AUDIO_FILE}... "
104
+ $stdout.flush
105
+ while bytes_read > 0
106
+ bytes_read = f.read_into(string)
107
+ print bytes_read, " "
108
+ $stdout.flush
109
+ end
110
+ print "\n"
111
+ rescue
112
+ print "FAILED! Couldn't read #{WORKING_AUDIO_FILE} properly.\n"
113
+ print " ", $!, "\n\n"
114
+ ensure
115
+ f.close
116
+ end
117
+
118
+ begin
119
+ f = AudioFile.new WORKING_AUDIO_FILE
120
+ f.pos
121
+ f.pos=100
122
+ rescue
123
+ print "FAILED! Couldn't seek/tell within #{WORKING_AUDIO_FILE}.\n"
124
+ print " ", $!, "\n\n"
125
+ ensure
126
+ f.close
127
+ end
128
+
129
+ begin
130
+ f = AudioFile.new WORKING_AUDIO_FILE
131
+ f.pos=100
132
+ f.pos=0
133
+ rescue
134
+ print "OK ! Couldn't seek backwards within #{WORKING_AUDIO_FILE}.\n"
135
+ print " ", $!, "\n\n"
136
+ ensure
137
+ f.close
138
+ end
139
+
140
+ begin
141
+ f = AudioFile.new WORKING_AUDIO_FILE
142
+ f.pcm_mapping= [0.1,0.9,0.1,0.9]
143
+ rescue
144
+ print "FAILED! Changing PCM mapping doesn't work\n"
145
+ print " ", $!, "\n\n"
146
+ ensure
147
+ f.close
148
+ end
149
+
150
+
151
+
152
+
153
+ # writing tests
154
+
155
+ begin
156
+ g = AudioFile.new WRITING_AUDIO_FILE, "w"
157
+ rescue
158
+ print "FAILED! Couldn't open #{WRITING_AUDIO_FILE} for writing.\n"
159
+ print " ", $!, "\n\n"
160
+ ensure
161
+ g.close
162
+ end
163
+
164
+ begin
165
+ f = AudioFile.new WORKING_AUDIO_FILE
166
+ g = AudioFile.new WRITING_AUDIO_FILE, "w"
167
+
168
+ g.rate= f.rate
169
+ g.bits= f.bits
170
+ g.channels= f.channels
171
+ g.byte_order= f.byte_order
172
+ g.compression= f.compression
173
+ g.file_format= f.file_format
174
+ g.sample_format= f.sample_format
175
+
176
+ rescue
177
+ print "FAILED! Couldn't change things about #{WRITING_AUDIO_FILE} while writing.\n"
178
+ print " ", $!, "\n\n"
179
+ ensure
180
+ f.close
181
+ g.close
182
+ end
183
+
184
+ begin
185
+ g = AudioFile.new WRITING_AUDIO_FILE, "w"
186
+
187
+ g.rate= 44100
188
+ g.write "poit"
189
+ g.bits= 16
190
+ rescue
191
+ print "OK ! Couldn't set things about a file after opening it for writing\n"
192
+ print " ", $!, "\n\n"
193
+ ensure
194
+ g.close
195
+ end
196
+
197
+ begin
198
+ f = AudioFile.new WORKING_AUDIO_FILE
199
+ g = AudioFile.new WRITING_AUDIO_FILE, "w"
200
+
201
+ g.rate= f.rate
202
+ g.bits= f.bits
203
+ g.channels= f.channels
204
+ g.byte_order= f.byte_order
205
+ g.compression= f.compression
206
+ g.file_format= f.file_format
207
+ g.sample_format= f.sample_format
208
+
209
+ print "Copying: "
210
+ bytes_read = 1
211
+ while(bytes_read != 0)
212
+ str = f.read 10000
213
+ bytes_read = str.length
214
+ print "read #{bytes_read} - "
215
+ $stdout.flush
216
+ bytes_written = g.write str
217
+ print "wrote #{bytes_written} - "
218
+ end
219
+ print "done!\n"
220
+ rescue
221
+ print "FAILED! Couldn't write #{WRITING_AUDIO_FILE}\n"
222
+ print " ", $!, "\n\n"
223
+ ensure
224
+ f.close
225
+ g.close
226
+ end
227
+
228
+ puts "Now play #{WORKING_AUDIO_FILE} and #{WRITING_AUDIO_FILE}."
229
+ puts "They should sound the same"