summaryrefslogtreecommitdiffstats
path: root/src/SMFReader.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-03-12 01:33:51 +0000
committerDavid Robillard <d@drobilla.net>2007-03-12 01:33:51 +0000
commit48df4a4510195c5036ff02e6c1a6b83488530e2f (patch)
treeaaac9b0e6916c853c00149338831099a217808ef /src/SMFReader.cpp
parent973336f178defc24f65f4e7cd581a16a27b3bed0 (diff)
downloadraul-48df4a4510195c5036ff02e6c1a6b83488530e2f.tar.gz
raul-48df4a4510195c5036ff02e6c1a6b83488530e2f.tar.bz2
raul-48df4a4510195c5036ff02e6c1a6b83488530e2f.zip
Flowcanvas resizing, auto-arrange resizes if necessary.
Per-track SMF reading (raul and machina) git-svn-id: http://svn.drobilla.net/lad/raul@354 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/SMFReader.cpp')
-rw-r--r--src/SMFReader.cpp52
1 files changed, 51 insertions, 1 deletions
diff --git a/src/SMFReader.cpp b/src/SMFReader.cpp
index bb28f0e..4c03229 100644
--- a/src/SMFReader.cpp
+++ b/src/SMFReader.cpp
@@ -113,14 +113,64 @@ SMFReader::open(const string& filename)
fread(&ppqn_be, 2, 1, _fd);
_ppqn = GUINT16_FROM_BE(ppqn_be);
+ seek_to_track(1);
// Read Track size (skip bytes 14..17 'Mtrk')
// FIXME: first track read only
- fseek(_fd, 18, SEEK_SET);
+ /*fseek(_fd, 18, SEEK_SET);
uint32_t track_size_be = 0;
fread(&track_size_be, 4, 1, _fd);
_track_size = GUINT32_FROM_BE(track_size_be);
std::cerr << "SMF - read track size " << _track_size << std::endl;
+ */
+
+ return true;
+ } else {
+ return false;
+ }
+}
+
+
+/** Seek to the start of a given track, starting from 1.
+ * Returns true if specified track was found.
+ */
+bool
+SMFReader::seek_to_track(unsigned track)
+{
+ assert(track > 0);
+
+ if (!_fd)
+ throw logic_error("Attempt to seek to track on unopen SMF file.");
+
+ unsigned track_pos = 0;
+
+ fseek(_fd, 14, SEEK_SET);
+ char id[5];
+ id[4] = '\0';
+ uint32_t chunk_size = 0;
+
+ while (!feof(_fd)) {
+ fread(id, 1, 4, _fd);
+
+ if (!strcmp(id, "MTrk")) {
+ ++track_pos;
+ std::cerr << "Found track " << track_pos << endl;
+ } else {
+ std::cerr << "Unknown chunk ID " << id << endl;
+ }
+
+ uint32_t chunk_size_be;
+ fread(&chunk_size_be, 4, 1, _fd);
+ chunk_size = GUINT32_FROM_BE(chunk_size_be);
+
+ if (track_pos == track)
+ break;
+
+ fseek(_fd, chunk_size, SEEK_CUR);
+ }
+ if (!feof(_fd) && track_pos == track) {
+ //_track = track;
+ _track_size = chunk_size;
return true;
} else {
return false;