#include "fvec.h"
#include "fmat.h"
+#include "ioutils.h"
#include "source_wavread.h"
-#include <errno.h>
-
#define AUBIO_WAVREAD_BUFSIZE 1024
#define SHORT_TO_FLOAT(x) (smpl_t)(x * 3.0517578125e-05)
s->fid = fopen((const char *)path, "rb");
if (!s->fid) {
- AUBIO_ERR("source_wavread: Failed opening %s (System error: %s)\n", s->path, strerror(errno));
+ AUBIO_STRERR("source_wavread: Failed opening %s (%s)\n", s->path, errorstr);
goto beach;
}
buf[4] = '\0';
bytes_junk += read_little_endian(buf, 4);
if (fseek(s->fid, bytes_read + bytes_junk, SEEK_SET) != 0) {
- AUBIO_ERR("source_wavread: Failed opening %s (could not seek past JUNK Chunk: %s)\n",
- s->path, strerror(errno));
+ AUBIO_STRERR("source_wavread: Failed opening %s (could not seek past JUNK Chunk: %s)\n",
+ s->path, errorstr);
goto beach;
}
bytes_read += bytes_junk;
buf[4] = '\0';
bytes_junk += read_little_endian(buf, 4);
if (fseek(s->fid, bytes_read + bytes_junk, SEEK_SET) != 0) {
- AUBIO_ERR("source_wavread: could not seek past unknown chunk in %s (%s)\n",
- s->path, strerror(errno));
+ AUBIO_STRERR("source_wavread: could not seek past unknown chunk in %s (%s)\n",
+ s->path, errorstr);
goto beach;
}
bytes_read += bytes_junk;
uint_t i, j;
uint_t end = 0;
uint_t total_wrote = 0;
+ uint_t length = aubio_source_validate_input_length("source_wavread", s->path,
+ s->hop_size, read_data->length);
if (s->fid == NULL) {
AUBIO_ERR("source_wavread: could not read from %s (file not opened)\n",
s->path);
return;
}
- while (total_wrote < s->hop_size) {
- end = MIN(s->read_samples - s->read_index, s->hop_size - total_wrote);
+ while (total_wrote < length) {
+ end = MIN(s->read_samples - s->read_index, length - total_wrote);
for (i = 0; i < end; i++) {
read_data->data[i + total_wrote] = 0;
for (j = 0; j < s->input_channels; j++ ) {
read_data->data[i + total_wrote] /= (smpl_t)(s->input_channels);
}
total_wrote += end;
- if (total_wrote < s->hop_size) {
+ if (total_wrote < length) {
uint_t wavread_read = 0;
aubio_source_wavread_readframe(s, &wavread_read);
s->read_samples = wavread_read;
s->read_index += end;
}
}
- if (total_wrote < s->hop_size) {
- for (i = end; i < s->hop_size; i++) {
- read_data->data[i] = 0.;
- }
- }
+
+ aubio_source_pad_output (read_data, total_wrote);
+
*read = total_wrote;
}
uint_t i,j;
uint_t end = 0;
uint_t total_wrote = 0;
+ uint_t length = aubio_source_validate_input_length("source_wavread", s->path,
+ s->hop_size, read_data->length);
+ uint_t channels = aubio_source_validate_input_channels("source_wavread",
+ s->path, s->input_channels, read_data->height);
if (s->fid == NULL) {
AUBIO_ERR("source_wavread: could not read from %s (file not opened)\n",
s->path);
return;
}
- while (total_wrote < s->hop_size) {
- end = MIN(s->read_samples - s->read_index, s->hop_size - total_wrote);
- for (j = 0; j < read_data->height; j++) {
+ while (total_wrote < length) {
+ end = MIN(s->read_samples - s->read_index, length - total_wrote);
+ for (j = 0; j < channels; j++) {
for (i = 0; i < end; i++) {
read_data->data[j][i + total_wrote] = s->output->data[j][i];
}
}
total_wrote += end;
- if (total_wrote < s->hop_size) {
+ if (total_wrote < length) {
uint_t wavread_read = 0;
aubio_source_wavread_readframe(s, &wavread_read);
s->read_samples = wavread_read;
s->read_index += end;
}
}
- if (total_wrote < s->hop_size) {
- for (j = 0; j < read_data->height; j++) {
- for (i = end; i < s->hop_size; i++) {
- read_data->data[j][i] = 0.;
- }
- }
- }
+
+ aubio_source_pad_multi_output(read_data, s->input_channels, total_wrote);
+
*read = total_wrote;
}
}
ret = fseek(s->fid, s->seek_start + pos * s->blockalign, SEEK_SET);
if (ret != 0) {
- AUBIO_ERR("source_wavread: could not seek %s at %d (%s)\n", s->path, pos, strerror(errno));
+ AUBIO_STRERR("source_wavread: could not seek %s at %d (%s)\n", s->path, pos, errorstr);
return AUBIO_FAIL;
}
// reset some values
return AUBIO_OK;
}
if (fclose(s->fid)) {
- AUBIO_ERR("source_wavread: could not close %s (%s)\n", s->path, strerror(errno));
+ AUBIO_STRERR("source_wavread: could not close %s (%s)\n", s->path, errorstr);
return AUBIO_FAIL;
}
s->fid = NULL;