summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2015-04-12 20:24:16 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2016-01-20 13:23:14 +0100
commitfac1074163dc31f7aea8857d261811a241f19925 (patch)
treeb12afcf0a8cffc530d3f808f76e4389a826c71e1 /src
parent2af32535862d1ffea36803a92a13d1fd013145a9 (diff)
Fix file loading.
Diffstat (limited to 'src')
-rw-r--r--src/cachemanager.cc26
-rw-r--r--src/cachemanager.h3
2 files changed, 17 insertions, 12 deletions
diff --git a/src/cachemanager.cc b/src/cachemanager.cc
index 51323d1..3984447 100644
--- a/src/cachemanager.cc
+++ b/src/cachemanager.cc
@@ -33,13 +33,12 @@
#include <hugin.hpp>
-#define FRAMESIZE 256
-#define CHUNKSIZE FRAMESIZE*100
-
static sample_t nodata[FRAMESIZE];
-#define BUFFER_SIZE FRAMESIZE
-static size_t readChunk(std::string filename, int filechannel, size_t from, size_t num_samples, sample_t* buf)
+#define BUFFER_SIZE 4092
+
+static size_t readChunk(std::string filename, int filechannel, size_t pos,
+ size_t num_samples, sample_t* buf)
{
SF_INFO sf_info;
SNDFILE *fh = sf_open(filename.c_str(), SFM_READ, &sf_info);
@@ -49,14 +48,17 @@ static size_t readChunk(std::string filename, int filechannel, size_t from, size
return 0;
}
- sf_seek(fh, from, SEEK_SET);
+ if(pos > sf_info.frames) return 0;
+
+ sf_seek(fh, pos, SEEK_SET);
- size_t size = num_samples;
- sample_t* data = buf;
+ size_t size = sf_info.frames - pos;
+ if(size > num_samples) size = num_samples;
+
+ sample_t* data = buf;
if(sf_info.channels == 1) {
size = sf_read_float(fh, data, size);
- }
- else {
+ } else {
// check filechannel exists
if(filechannel >= sf_info.channels) {
filechannel = sf_info.channels - 1;
@@ -67,10 +69,10 @@ static size_t readChunk(std::string filename, int filechannel, size_t from, size
int read;
do {
read = sf_readf_float(fh, buffer, readsize);
- for (int i = 0; i < read; i++) {
+ for (int i = 0; i < read && totalread < (int)size; i++) {
data[totalread++] = buffer[i * sf_info.channels + filechannel];
}
- } while(read > 0 && totalread < (int)size);
+ } while(read > 0 && totalread < (int)size && totalread < sf_info.frames);
// set data size to total bytes read
size = totalread;
}
diff --git a/src/cachemanager.h b/src/cachemanager.h
index 21579d9..25115c3 100644
--- a/src/cachemanager.h
+++ b/src/cachemanager.h
@@ -41,6 +41,9 @@
#define CACHE_DUMMYID -2
#define CACHE_NOID -1
+#define FRAMESIZE 256
+#define CHUNKSIZE FRAMESIZE*100
+
class AudioFile;
typedef int cacheid_t;