diff options
author | David Robillard <d@drobilla.net> | 2007-03-12 01:33:51 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2007-03-12 01:33:51 +0000 |
commit | 48df4a4510195c5036ff02e6c1a6b83488530e2f (patch) | |
tree | aaac9b0e6916c853c00149338831099a217808ef /src/SMFReader.cpp | |
parent | 973336f178defc24f65f4e7cd581a16a27b3bed0 (diff) | |
download | raul-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.cpp | 52 |
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; |