Mercurial > octave-nkf
annotate scripts/audio/wavread.m @ 20354:227d582fa300 stable
build: Sort generated PKG_ADD contents consistently
* libinterp/mk-pkg-add: Set LC_COLLATE=C when sorting for consistent output.
author | Mike Miller <mtmiller@octave.org> |
---|---|
date | Fri, 10 Jul 2015 01:10:30 -0400 |
parents | 7503499a252b |
children |
rev | line source |
---|---|
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
1 ## Copyright (C) 2015 Mike Miller |
19731
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
19627
diff
changeset
|
2 ## Copyright (C) 2005-2015 Michael Zeising |
5565 | 3 ## |
4 ## This file is part of Octave. | |
5 ## | |
6 ## Octave is free software; you can redistribute it and/or modify it | |
7 ## under the terms of the GNU General Public License as published by | |
7016 | 8 ## the Free Software Foundation; either version 3 of the License, or (at |
9 ## your option) any later version. | |
5565 | 10 ## |
11 ## Octave is distributed in the hope that it will be useful, but | |
12 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 ## General Public License for more details. | |
15 ## | |
16 ## You should have received a copy of the GNU General Public License | |
7016 | 17 ## along with Octave; see the file COPYING. If not, see |
18 ## <http://www.gnu.org/licenses/>. | |
5565 | 19 |
20 ## -*- texinfo -*- | |
16491
b10a23fe80bb
doc: Tweak docstrings of functions changed for Texinfo 5.0 compatibility.
Rik <rik@octave.org>
parents:
16489
diff
changeset
|
21 ## @deftypefn {Function File} {@var{y} =} wavread (@var{filename}) |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
22 ## @deftypefnx {Function File} {[@var{y}, @var{fs}, @var{nbits}] =} wavread (@var{filename}) |
16489
36dba9be680b
doc: Make documentation compatible with Texinfo 5.0 (bug #38392)
Amod Mulay <amodmulay1@gmail.com>
parents:
15530
diff
changeset
|
23 ## @deftypefnx {Function File} {[@dots{}] =} wavread (@var{filename}, @var{n}) |
16491
b10a23fe80bb
doc: Tweak docstrings of functions changed for Texinfo 5.0 compatibility.
Rik <rik@octave.org>
parents:
16489
diff
changeset
|
24 ## @deftypefnx {Function File} {[@dots{}] =} wavread (@var{filename}, [@var{n1} @var{n2}]) |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
25 ## @deftypefnx {Function File} {[@dots{}] =} wavread (@dots{}, @var{datatype}) |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
26 ## @deftypefnx {Function File} {@var{sz} =} wavread (@var{filename}, "size") |
20193
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19867
diff
changeset
|
27 ## @deftypefnx {Function File} {[@var{n_samp}, @var{n_chan}] =} wavread (@var{filename}, "size") |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
28 ## Read the audio signal @var{y} from the RIFF/WAVE sound file @var{filename}. |
20193
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19867
diff
changeset
|
29 ## |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
30 ## If the file contains multichannel data, then @var{y} is a matrix with the |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
31 ## channels represented as columns. |
19627
446c46af4b42
strip trailing whitespace from most source files
John W. Eaton <jwe@octave.org>
parents:
17744
diff
changeset
|
32 ## |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
33 ## If @var{n} is specified, only the first @var{n} samples of the file are |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
34 ## returned. If [@var{n1} @var{n2}] is specified, only the range of samples |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
35 ## from @var{n1} to @var{n2} is returned. A value of @code{Inf} can be used |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
36 ## to represent the total number of samples in the file. |
16491
b10a23fe80bb
doc: Tweak docstrings of functions changed for Texinfo 5.0 compatibility.
Rik <rik@octave.org>
parents:
16489
diff
changeset
|
37 ## |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
38 ## If the option @qcode{"size"} is given, then the size of the audio signal |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
39 ## is returned instead of the data. The size is returned in a row vector of |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
40 ## the form [@var{samples} @var{channels}]. If there are two output arguments, |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
41 ## the number of samples is assigned to the first and the number of channels |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
42 ## is assigned to the second. |
20193
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19867
diff
changeset
|
43 ## |
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19867
diff
changeset
|
44 ## The optional return value @var{fs} is the sample rate of the audio file in |
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19867
diff
changeset
|
45 ## Hz. The optional return value @var{nbits} is the number of bits per sample |
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19867
diff
changeset
|
46 ## as encoded in the file. |
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19867
diff
changeset
|
47 ## |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
48 ## @seealso{audioread, audiowrite, wavwrite} |
5565 | 49 ## @end deftypefn |
50 | |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
51 function [y, fs, nbits] = wavread (filename, varargin) |
5567 | 52 |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
53 if (nargin < 1 || nargin > 3) |
6046 | 54 print_usage (); |
5567 | 55 endif |
56 | |
57 if (! ischar (filename)) | |
10738
a4b8364e04c7
wavread.m: Correctly handle non-word aligned chunks (bug #30309).
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
58 error ("wavread: FILENAME must be a character string"); |
5567 | 59 endif |
60 | |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
61 datatype = "double"; |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
62 samples = [1, Inf]; |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
63 do_file_size = false; |
5567 | 64 |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
65 if (nargin == 3) |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
66 samples = varargin{1}; |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
67 datatype = varargin{2}; |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
68 elseif (nargin == 2) |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
69 if (strcmp (varargin{1}, "size")) |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
70 do_file_size = true; |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
71 elseif (ischar (varargin{1})) |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
72 datatype = varargin{1}; |
13003
74c5fa5cef47
use unwind_protect to ensure wavread closes file.
John W. Eaton <jwe@octave.org>
parents:
13001
diff
changeset
|
73 else |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
74 samples = varargin{1}; |
13003
74c5fa5cef47
use unwind_protect to ensure wavread closes file.
John W. Eaton <jwe@octave.org>
parents:
13001
diff
changeset
|
75 endif |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
76 endif |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
77 |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
78 if (isscalar (samples)) |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
79 samples = [1, samples]; |
6304 | 80 endif |
81 | |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
82 if (! (isrow (samples) && numel (samples) == 2 && all (samples > 0) |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
83 && all (fix (samples) == samples))) |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
84 error ("wavread: SAMPLES must be a 1- or 2-element integer row vector"); |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
85 endif |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
86 |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
87 if (! (ischar (datatype) && any (strcmp (datatype, {"double", "native"})))) |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
88 error ('wavread: DATATYPE must be either "double" or "native"'); |
7151 | 89 endif |
90 | |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
91 info = audioinfo (filename); |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
92 |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
93 if (do_file_size) |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
94 if (nargout > 1) |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
95 [y, fs] = deal (info.TotalSamples, info.NumChannels); |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
96 else |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
97 y = [info.TotalSamples, info.NumChannels]; |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
98 endif |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
99 else |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
100 [y, fs] = audioread (filename, samples, datatype); |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
101 nbits = info.BitsPerSample; |
5565 | 102 endif |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
103 |
5565 | 104 endfunction |
8796
9662dfb26652
wavread.m: improve search for data chunks
Frederick Umminger <Frederick_Umminger@playstation.sony.com>
parents:
8506
diff
changeset
|
105 |
9662dfb26652
wavread.m: improve search for data chunks
Frederick Umminger <Frederick_Umminger@playstation.sony.com>
parents:
8506
diff
changeset
|
106 |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
107 ## Functional tests for wavread/wavwrite pair are in wavwrite.m. |
8796
9662dfb26652
wavread.m: improve search for data chunks
Frederick Umminger <Frederick_Umminger@playstation.sony.com>
parents:
8506
diff
changeset
|
108 |
19867
9fc020886ae9
maint: Clean up m-files to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19848
diff
changeset
|
109 ## Test input validation |
19848
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
110 %!error wavread () |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
111 %!error wavread (1) |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
112 %!error wavread ("foo.wav", 2, 3, 4) |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
113 %!error wavread ("foo.wav", "foo") |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
114 %!error wavread ("foo.wav", -1) |
71770cf07c30
wavread, wavwrite: Overhaul functions.
Mike Miller <mtmiller@ieee.org>
parents:
19731
diff
changeset
|
115 %!error wavread ("foo.wav", [1, Inf], "foo"); |
12701
de3e90a420e3
Overhaul wavwrite, wavread and fix normalization problem (Bug #33420).
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
116 |