35 #define SND_MAGIC 0x2e736e64
46 inline static short double_to_short(
double x)
50 else if (x <= -32768.0)
53 return static_cast<short>(
round_i(x));
56 inline static signed char double_to_char(
double x)
63 return static_cast<char>(
round_i(x));
68 ifstream file(fname, ios::in | ios::binary);
73 file.seekg(0, ios::end);
74 int size = int(file.tellg());
75 file.seekg(0, ios::beg);
80 for (
int i = 0; i < n; i++)
81 v(i) = read_endian<short>(file, switch_endian) / 32768.0;
86 bool raw16le_read(
const char *fname, vec &v,
int beg,
int len)
89 ifstream file(fname, ios::in | ios::binary);
94 v.set_size(len,
false);
96 for (
int i = 0; i < len; i++)
97 v(i) = read_endian<short>(file, switch_endian) / 32768.0;
102 bool raw16le_write(
const char *fname,
const vec &v,
bool append)
104 ofstream file(fname, (append ? ios::app | ios::ate : ios::out | ios::trunc) | ios::binary);
109 for (
int i = 0; i < v.size(); i++)
110 write_endian<short>(file, double_to_short(v(i) * 32768.0), switch_endian);
117 ifstream file(fname, ios::in | ios::binary);
122 file.seekg(0, ios::end);
123 int size = int(file.tellg());
124 file.seekg(0, ios::beg);
128 v.set_size(n,
false);
129 for (
int i = 0; i < n; i++)
130 v(i) = read_endian<short>(file, switch_endian) / 32768.0;
135 bool raw16be_read(
const char *fname, vec &v,
int beg,
int len)
138 ifstream file(fname, ios::in | ios::binary);
143 v.set_size(len,
false);
145 for (
int i = 0; i < len; i++)
146 v(i) = read_endian<short>(file, switch_endian) / 32768.0;
151 bool raw16be_write(
const char *fname,
const vec &v,
bool append)
153 ofstream file(fname, (append ? ios::app | ios::ate : ios::out | ios::trunc) | ios::binary);
158 for (
int i = 0; i < v.size(); i++)
159 write_endian<short>(file, double_to_short(v(i) * 32768.0), switch_endian);
181 switch (
header.encoding) {
206 header.magic = read_endian<unsigned int>(f, switch_endian);
207 header.hdr_size = read_endian<unsigned int>(f, switch_endian);
208 header.data_size = read_endian<unsigned int>(f, switch_endian);
209 header.encoding = read_endian<unsigned int>(f, switch_endian);
210 header.sample_rate = read_endian<unsigned int>(f, switch_endian);
211 header.channels = read_endian<unsigned int>(f, switch_endian);
212 f.read(
header.info, SND_INFO_LEN);
213 if (!f ||
header.magic != SND_MAGIC) {
214 std::cerr <<
header.magic <<
" != " << SND_MAGIC << std::endl;
215 it_warning(
"SND_Format::read_header(): This is not a .snd file!");
228 memset(
header.info, 0, SND_INFO_LEN);
231 write_endian<unsigned int>(f,
header.magic, switch_endian);
232 write_endian<unsigned int>(f,
header.hdr_size, switch_endian);
233 write_endian<unsigned int>(f,
header.data_size, switch_endian);
234 write_endian<unsigned int>(f,
header.encoding, switch_endian);
235 write_endian<unsigned int>(f,
header.sample_rate, switch_endian);
236 write_endian<unsigned int>(f,
header.channels, switch_endian);
237 f.write(reinterpret_cast<char *>(&
header.info), SND_INFO_LEN);
263 file.open(fname, ios::in | ios::binary);
284 file.seekg(0, ios::end);
295 return ((static_cast<int>(
file.tellg()) -
sizeof(
header))
307 v.set_size(n,
false);
311 switch (
header.encoding) {
313 for (i = 0; i < n; i++)
314 v(i) = read_endian<char>(
file, switch_endian) / 128.0;
317 for (i = 0; i < n; i++)
318 v(i) = read_endian<short>(
file, switch_endian) / 32768.0;
321 for (i = 0; i < n; i++)
322 v(i) = read_endian<float>(
file, switch_endian);
325 for (i = 0; i < n; i++)
326 v(i) = read_endian<double>(
file, switch_endian);
329 it_warning(
"SND_In_File::read(): Unsupported encoding!");
343 v.set_size(n,
false);
344 switch (
header.encoding) {
346 for (i = 0; i < n; i++)
347 v(i) = read_endian<char>(
file, switch_endian) / 128.0;
350 for (i = 0; i < n; i++)
351 v(i) = read_endian<short>(
file, switch_endian) / 32768.0;
354 for (i = 0; i < n; i++)
355 v(i) = read_endian<float>(
file, switch_endian);
358 for (i = 0; i < n; i++)
359 v(i) = read_endian<double>(
file, switch_endian);
362 it_warning(
"SND_In_File::read(): Unsupported encoding!");
379 open(fname, rate, e);
388 file.open(fname, ios::out | ios::trunc | ios::binary);
393 header.encoding =
static_cast<unsigned int>(e);
406 file.seekp(0, ios::end);
407 header.data_size =
static_cast<int>(file.tellp()) -
sizeof(
header);
419 file.seekp(0, ios::end);
430 return ((static_cast<int>(file.tellp()) -
sizeof(
header))
442 switch (
header.encoding) {
444 for (i = 0; i < v.size(); i++)
445 write_endian<char>(file, double_to_char(v(i) * 128.0), switch_endian);
448 for (i = 0; i < v.size(); i++)
449 write_endian<short>(file, double_to_short(v(i) * 32768.0),
453 for (i = 0; i < v.size(); i++)
454 write_endian<float>(file, static_cast<float>(v(i)), switch_endian);
457 for (i = 0; i < v.size(); i++)
458 write_endian<double>(file, static_cast<double>(v(i)), switch_endian);
461 it_warning(
"SND_Out_File::write(): Unsupported encoding!");
479 file.open(fname, ios::in | ios::out | ios::binary);
504 bool snd_read(
const char *fname, vec &v)
508 if (!file.open(fname))
514 bool snd_read(
const char *fname, vec &v,
int beg,
int len)
518 if (!file.open(fname))
522 return file.read(v, len);
529 if (!file.open(fname, rate, e))
532 return file.write(v);