Mercurial > hg > octave-nkf
diff scripts/audio/wavwrite.m @ 6304:78a3254741b2
[project @ 2007-02-14 21:22:59 by jwe]
author | jwe |
---|---|
date | Wed, 14 Feb 2007 21:22:59 +0000 |
parents | 7fad1fad19e1 |
children | cf2f6090147a |
line wrap: on
line diff
--- a/scripts/audio/wavwrite.m +++ b/scripts/audio/wavwrite.m @@ -42,17 +42,23 @@ print_usage (); endif + ## test arguments + if (columns (y) < 1) + error ("wavwrite: Y must have at least one column"); + endif + if (columns (y) > 2^15-1) + error ("wavwrite: Y has more than 32767 columns (too many for a WAV-file)"); + endif + ## parse arguments if (nargin < 3) - warning ("wavwrite: sample rate set to 8000 Hz"); samples_per_sec = 8000; endif if (nargin < 4) - warning ("wavwrite: sample resolution set to 16-bit"); bits_per_sample = 16; endif - + ## determine sample format switch (bits_per_sample) case 8 @@ -62,12 +68,11 @@ case 32 format = "int32"; otherwise - error ("wavread: sample resolution not supported"); + error ("wavwrite: sample resolution not supported"); endswitch ## calculate filesize - channels = size(y)(2); - n = size(y)(1); + [n, channels] = size(y); ## size of data chunk ck_size = n*channels*(bits_per_sample/8); @@ -88,35 +93,35 @@ c += fwrite (fid, "RIFF", "uchar"); ## file size - 8 - c += fwrite (fid, ck_size + 36, "ulong", 0, BYTEORDER); + c += fwrite (fid, ck_size + 36, "uint32", 0, BYTEORDER); c += fwrite (fid, "WAVEfmt ", "uchar"); ## size of fmt chunk - c += fwrite (fid, 16, "ulong", 0, BYTEORDER); + c += fwrite (fid, 16, "uint32", 0, BYTEORDER); ## sample format code (PCM) - c += fwrite (fid, 0x0001, "short", 0, BYTEORDER); + c += fwrite (fid, 1, "uint16", 0, BYTEORDER); ## channels - c += fwrite (fid, channels, "short", 0, BYTEORDER); + c += fwrite (fid, channels, "uint16", 0, BYTEORDER); ## sample rate - c += fwrite (fid, samples_per_sec, "ulong", 0, BYTEORDER); + c += fwrite (fid, samples_per_sec, "uint32", 0, BYTEORDER); ## bytes per second bps = samples_per_sec*channels*bits_per_sample/8; - c += fwrite (fid, bps, "ulong", 0, BYTEORDER); + c += fwrite (fid, bps, "uint32", 0, BYTEORDER); ## block align - c += fwrite (fid, channels*bits_per_sample/8, "short", 0, BYTEORDER); + c += fwrite (fid, channels*bits_per_sample/8, "uint16", 0, BYTEORDER); - c += fwrite (fid, bits_per_sample, "short", 0, BYTEORDER); + c += fwrite (fid, bits_per_sample, "uint16", 0, BYTEORDER); c += fwrite (fid, "data", "uchar"); - c += fwrite (fid, ck_size, "ulong", 0, BYTEORDER); + c += fwrite (fid, ck_size, "uint32", 0, BYTEORDER); if (c < 25) fclose (fid); - error ("wavread: writing to file failed"); + error ("wavwrite: writing to file failed"); endif ## interleave samples @@ -125,11 +130,11 @@ ## scale samples switch (bits_per_sample) case 8 - yi = round (yi*127.5 + 127.5); + yi = round (yi*128 + 128); case 16 - yi = floor (yi*32767.5); + yi = round (yi*32768); case 32 - yi = floor (yi*2147483647.5); + yi = round (yi*2147483648); endswitch ## write to file @@ -138,3 +143,27 @@ fclose (fid); endfunction + +%!test +%! A = [1:10; 1:10]/10; +%! wavwrite("a.wav", A); +%! [B, samples_per_sec, bits_per_sample] = wavread("a.wav"); +%! assert(A,B, 10^(-4)); +%! assert(samples_per_sec, 8000); +%! assert(bits_per_sample, 16); +% +%!test +%! A=[1:10; 1:10] / 10; +%! wavwrite("a.wav", A, 4000); +%! [B, samples_per_sec, bits_per_sample] = wavread("a.wav"); +%! assert(A,B, 10^(-4)); +%! assert(samples_per_sec, 4000); +%! assert(bits_per_sample, 16); +% +%!test +%! A=[1:10; 1:10] / 10; +%! wavwrite("a.wav", A, 4000, 8); +%! [B, samples_per_sec, bits_per_sample] = wavread("a.wav"); +%! assert(A,B, 10^(-2)); +%! assert(samples_per_sec, 4000); +%! assert(bits_per_sample, 8);