/usr/share/octave/packages/audio-1.1.4/sound.m is in octave-audio 1.1.4-4build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | ## Copyright (C) 1999-2000 Paul Kienzle
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; If not, see <http://www.gnu.org/licenses/>.
## usage: sound(x [, fs, bs])
##
## Play the signal through the speakers. Data is a matrix with
## one column per channel. Rate fs defaults to 8000 Hz. The signal
## is clipped to [-1, 1]. Buffer size bs controls how many audio samples
## are clipped and buffered before sending them to the audio player. bs
## defaults to fs, which is equivalent to 1 second of audio.
##
## Note that if $DISPLAY != $HOSTNAME:n then a remote shell is opened
## to the host specified in $HOSTNAME to play the audio. See manual
## pages for ssh, ssh-keygen, ssh-agent and ssh-add to learn how to
## set it up.
##
## This function writes the audio data through a pipe to the program
## "play" from the sox distribution. sox runs pretty much anywhere,
## but it only has audio drivers for OSS (primarily linux and freebsd)
## and SunOS. In case your local machine is not one of these, write
## a shell script such as ~/bin/octaveplay, substituting AUDIO_UTILITY
## with whatever audio utility you happen to have on your system:
## #!/bin/sh
## cat > ~/.octave_play.au
## SYSTEM_AUDIO_UTILITY ~/.octave_play.au
## rm -f ~/.octave_play.au
## and set the global variable (e.g., in .octaverc)
## global sound_play_utility="~/bin/octaveplay";
##
## If your audio utility can accept an AU file via a pipe, then you
## can use it directly:
## global sound_play_utility="SYSTEM_AUDIO_UTILITY flags"
## where flags are whatever you need to tell it that it is receiving
## an AU file.
##
## With clever use of the command dd, you can chop out the header and
## dump the data directly to the audio device in big-endian format:
## global sound_play_utility="dd of=/dev/audio ibs=2 skip=12"
## or little-endian format:
## global sound_play_utility="dd of=/dev/dsp ibs=2 skip=12 conv=swab"
## but you lose the sampling rate in the process.
##
## Finally, you could modify sound.m to produce data in a format that
## you can dump directly to your audio device and use "cat >/dev/audio"
## as your sound_play_utility. Things you may want to do are resample
## so that the rate is appropriate for your machine and convert the data
## to mulaw and output as bytes.
##
## If you experience buffer underruns while playing audio data, the bs
## buffer size parameter can be increased to tradeoff interactivity
## for smoother playback. If bs=Inf, then all the data is clipped and
## buffered before sending it to the audio player pipe. By default, 1
## sec of audio is buffered.
function sound(data, rate, buffer_size)
if nargin<1 || nargin>3
usage("sound(x [, fs, bs])");
endif
if nargin<2 || isempty(rate), rate = 8000; endif
if nargin<3 || isempty(buffer_size), buffer_size = rate; endif
if rows(data) != length(data), data=data'; endif
[samples, channels] = size(data);
## Check if the octave engine is running locally by seeing if the
## DISPLAY environment variable is empty or if it is the same as the
## host name of the machine running octave. The host name is
## taken from the HOSTNAME environment variable if it is available,
## otherwise it is taken from the "uname -n" command.
display=getenv("DISPLAY");
colon = rindex(display,":");
if isempty(display) || colon==1
islocal = 1;
else
if colon, display = display(1:colon-1); endif
host=getenv("HOSTNAME");
if isempty(host),
[status, host] = system("uname -n");
## trim newline from end of hostname
if !isempty(host), host = host(1:length(host)-1); endif
endif
islocal = strcmp(tolower(host),tolower(display));
endif
## What do we use for playing?
global sound_play_utility;
if ~isempty(sound_play_utility),
## User specified command
elseif (file_in_path(EXEC_PATH, "ofsndplay"))
## Mac
sound_play_utility = "ofsndplay -"
elseif (file_in_path(EXEC_PATH, "play"))
## Linux (sox)
sound_play_utility = "play -t AU -";
else
error("sound.m: No command line utility found for sound playing");
endif
## If not running locally, then must use ssh to execute play command
if islocal
fid=popen(sound_play_utility, "w");
else
fid=popen(["ssh ", host, " ", sound_play_utility], "w");
end
if fid < 0,
warning("sound could not open play process");
else
## write sun .au format header to the pipe
fwrite(fid, toascii(".snd"), 'char');
fwrite(fid, 24, 'int32', 0, 'ieee-be');
fwrite(fid, -1, 'int32', 0, 'ieee-be');
fwrite(fid, 3, 'int32', 0, 'ieee-be');
fwrite(fid, rate, 'int32', 0, 'ieee-be');
fwrite(fid, channels, 'int32', 0, 'ieee-be');
if isinf(buffer_size),
fwrite(fid, 32767*clip(data,[-1, 1])', 'int16', 0, 'ieee-be');
else
## write data in blocks rather than all at once
nblocks = ceil(samples/buffer_size);
block_start = 1;
for i=1:nblocks,
block_end = min(size(data,1), block_start+buffer_size-1);
fwrite(fid, 32767*clip(data(block_start:block_end,:),[-1, 1])', 'int16', 0, 'ieee-be');
block_start = block_end + 1;
end
endif
pclose(fid);
endif
end
###### auplay based version: not needed if using sox
## ## If not running locally, then must use ssh to execute play command
## global sound_play_utility="~/bin/auplay"
## if islocal
## fid=popen(sound_play_utility, "w");
## else
## fid=popen(["ssh ", host, " ", sound_play_utility], "w");
## end
## fwrite(fid, rate, 'int32');
## fwrite(fid, channels, 'int32');
## fwrite(fid, 32767*clip(data,[-1, 1])', 'int16');
## pclose(fid);
%!demo
%! [x, fs] = auload(file_in_loadpath("sample.wav"));
%! sound(x,fs);
|