diff --git a/editor/syncdocument.cpp b/editor/syncdocument.cpp index e062734..6056c7a 100644 --- a/editor/syncdocument.cpp +++ b/editor/syncdocument.cpp @@ -8,13 +8,7 @@ SyncDocument::~SyncDocument() size_t SyncDocument::getTrackIndexFromPos(size_t track) const { - assert(track < tracks.size()); - - sync::Data::TrackContainer::const_iterator trackIter = tracks.begin(); - for (size_t currTrack = 0; currTrack < track; ++currTrack, ++trackIter); - - assert(tracks.end() != trackIter); - return trackIter->second; + return track; } /* void SyncDocument::purgeUnusedTracks() @@ -38,7 +32,10 @@ bool SyncDocument::load(const std::string &fileName) MSXML2::IXMLDOMNamedNodeMapPtr attribs = trackNode->Getattributes(); std::string name = attribs->getNamedItem("name")->Gettext(); - size_t trackIndex = getTrackIndex(name); + + // look up track-name, create it if it doesn't exist + int trackIndex = getTrackIndex(name); + if (0 > trackIndex) trackIndex = int(createTrack(name)); MSXML2::IXMLDOMNodeListPtr rowNodes = trackNode->GetchildNodes(); for (int i = 0; i < rowNodes->Getlength(); ++i) @@ -89,14 +86,12 @@ bool SyncDocument::save(const std::string &fileName) MSXML2::IXMLDOMNodePtr rootNode = doc->createNode(varNodeType, _T("tracks"), _T("")); doc->appendChild(rootNode); - sync::Data::TrackContainer::iterator iter; - for (iter = tracks.begin(); iter != tracks.end(); ++iter) + for (size_t i = 0; i < getTrackCount(); ++i) { - size_t index = iter->second; - const sync::Track &track = getTrack(index); + const sync::Track &track = getTrack(i); MSXML2::IXMLDOMElementPtr trackElem = doc->createElement(_T("track")); - trackElem->setAttribute(_T("name"), iter->first.c_str()); + trackElem->setAttribute(_T("name"), track.getName().c_str()); rootNode->appendChild(trackElem); sync::Track::KeyFrameContainer::const_iterator it; diff --git a/editor/synctracker2.cpp b/editor/synctracker2.cpp index 31d059d..ea19e73 100644 --- a/editor/synctracker2.cpp +++ b/editor/synctracker2.cpp @@ -523,7 +523,8 @@ int _tmain(int argc, _TCHAR* argv[]) clientSocket.recv(&trackName[0], str_len, 0); // find track - size_t serverIndex = document.getTrackIndex(trackName.c_str()); + int serverIndex = document.getTrackIndex(trackName); + if (0 > serverIndex) serverIndex = int(document.createTrack(trackName)); // setup remap document.clientRemap[serverIndex] = clientIndex; diff --git a/editor/trackview.cpp b/editor/trackview.cpp index 7a1e94c..77f4acd 100644 --- a/editor/trackview.cpp +++ b/editor/trackview.cpp @@ -117,19 +117,14 @@ void TrackView::paintTopMargin(HDC hdc, RECT rcTracks) DrawEdge(hdc, &fillRect, BDR_RAISEDINNER | BDR_RAISEDOUTER, BF_ADJUST | BF_BOTTOM); FillRect(hdc, &fillRect, GetSysColorBrush(COLOR_3DFACE)); - int firstTrack = min(max(scrollPosX / trackWidth, 0), getTrackCount() - 1); - int lastTrack = min(max(firstTrack + windowTracks + 1, 0), getTrackCount() - 1); + int startTrack = scrollPosX / trackWidth; + int endTrack = min(startTrack + windowTracks, getTrackCount()); - SyncDocument *document = getDocument(); - if (NULL == document) return; - SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT)); - sync::Data::TrackContainer::iterator trackIter = document->tracks.begin(); - for (int track = 0; track <= lastTrack; ++track, ++trackIter) + for (int track = startTrack; track < endTrack; ++track) { - assert(trackIter != document->tracks.end()); - if (track < firstTrack) continue; + sync::Track &t = document->getTrack(document->getTrackIndexFromPos(track)); RECT topMargin; @@ -149,7 +144,7 @@ void TrackView::paintTopMargin(HDC hdc, RECT rcTracks) DrawEdge(hdc, &fillRect, BDR_RAISEDINNER | BDR_RAISEDOUTER, BF_ADJUST | BF_LEFT | BF_RIGHT | BF_BOTTOM); FillRect(hdc, &fillRect, bgBrush); - const std::basic_string &trackName = trackIter->first; + const std::basic_string &trackName = t.getName(); if (this->document->clientRemap.count(document->getTrackIndexFromPos(track)) == 0) SetTextColor(hdc, GetSysColor(COLOR_GRAYTEXT)); else SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT)); @@ -176,9 +171,6 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) { TCHAR temp[256]; - int firstTrack = min(max(scrollPosX / trackWidth, 0), getTrackCount() - 1); - int lastTrack = min(max(firstTrack + windowTracks + 1, 0), getTrackCount() - 1); - int firstRow = editRow - windowRows / 2 - 1; int lastRow = editRow + windowRows / 2 + 1; /* clamp first & last row */ @@ -225,14 +217,13 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks) int selectTop = min(selectStartRow, selectStopRow); int selectBottom = max(selectStartRow, selectStopRow); - sync::Data::TrackContainer::iterator trackIter = document->tracks.begin(); - for (int track = 0; track <= lastTrack; ++track, ++trackIter) + int startTrack = scrollPosX / trackWidth; + int endTrack = min(startTrack + windowTracks, getTrackCount()); + + for (int track = startTrack; track < endTrack; ++track) { - assert(trackIter != document->tracks.end()); - size_t trackIndex = trackIter->second; - const sync::Track &t = document->getTrack(trackIndex); - - if (track < firstTrack) continue; + const sync::Track &t = document->getTrack(document->getTrackIndexFromPos(track)); + for (int row = firstRow; row <= lastRow; ++row) { RECT patternDataRect; diff --git a/example_bass/example_bass.cpp b/example_bass/example_bass.cpp index 1a79157..fa05731 100644 --- a/example_bass/example_bass.cpp +++ b/example_bass/example_bass.cpp @@ -17,19 +17,19 @@ class BassTimer : public sync::Timer public: BassTimer(HSTREAM stream, float bpm, int rowsPerBeat) : stream(stream) { - rowRate = (bpm / 60) * rowsPerBeat; + rowRate = (double(bpm) / 60) * rowsPerBeat; } // BASS hooks void pause() { BASS_ChannelPause(stream); } void play() { BASS_ChannelPlay(stream, false); } float getTime() { return BASS_ChannelBytes2Seconds(stream, BASS_ChannelGetPosition(stream)); } - float getRow() { return getTime() * rowRate; } - void setRow(float row) { BASS_ChannelSetPosition(stream, BASS_ChannelSeconds2Bytes(stream, row / rowRate)); } + float getRow() { return float(getTime() * rowRate); } + void setRow(float row) { BASS_ChannelSetPosition(stream, BASS_ChannelSeconds2Bytes(stream, float(row / rowRate))); } bool isPlaying() { return (BASS_ChannelIsActive(stream) == BASS_ACTIVE_PLAYING); } private: HSTREAM stream; - float rowRate; + double rowRate; }; #define WINDOWED 1 @@ -63,7 +63,7 @@ int main(int argc, char *argv[]) if (!stream) throw std::string("failed to open tune"); // setup timer and construct sync-device - BassTimer timer(stream, 150.0f, 4); + BassTimer timer(stream, 150.0f, 8); std::auto_ptr syncDevice = std::auto_ptr(sync::createDevice("sync", timer)); if (NULL == syncDevice.get()) throw std::string("something went wrong - failed to connect to host?"); diff --git a/sync/data.cpp b/sync/data.cpp index c9df3cd..a623d94 100644 --- a/sync/data.cpp +++ b/sync/data.cpp @@ -12,29 +12,26 @@ Data::~Data() delete actualTracks[i]; } -size_t Data::getTrackIndex(const std::basic_string &name) +size_t Data::createTrack(const std::basic_string &name) { - TrackContainer::iterator iter = tracks.find(name); - if (iter != tracks.end()) - { - return iter->second; - } - + assert(0 > getTrackIndex(name)); size_t index = actualTracks.size(); - tracks[name] = index; - actualTracks.push_back(new sync::Track); + + // insert new track + actualTracks.push_back(new sync::Track(name)); + return index; } -Track &Data::getTrack(const std::basic_string &name) +int Data::getTrackIndex(const std::basic_string &name) { - size_t index = getTrackIndex(name); - assert(index < int(actualTracks.size())); - assert(NULL != actualTracks[index]); - return *actualTracks[index]; -} - -size_t Data::getTrackCount() const -{ - return tracks.size(); + // search for track + size_t index; + for (index = 0; index < actualTracks.size(); ++index) + { + if (name == actualTracks[index]->getName()) return int(index); + } + + // not found + return -1; } diff --git a/sync/data.h b/sync/data.h index ee3862f..f87fe2b 100644 --- a/sync/data.h +++ b/sync/data.h @@ -26,20 +26,27 @@ namespace sync { public: ~Data(); - size_t getTrackIndex(const std::basic_string &name); - Track &getTrack(const std::basic_string &name); - Track &getTrack(size_t track) + int + getTrackIndex(const std::basic_string &name); + + size_t + createTrack(const std::basic_string &name); + + Track & + getTrack(size_t track) { assert(track < actualTracks.size()); assert(NULL != actualTracks[track]); return *actualTracks[track]; } - size_t getTrackCount() const; + size_t + getTrackCount() const + { + return actualTracks.size(); + } - typedef std::map, size_t> TrackContainer; - TrackContainer tracks; protected: std::vector actualTracks; }; diff --git a/sync/device_client.cpp b/sync/device_client.cpp index 2996312..7d0bf8e 100644 --- a/sync/device_client.cpp +++ b/sync/device_client.cpp @@ -35,7 +35,7 @@ private: sync::Data syncData; Timer &timer; - int serverRow; + int serverRow; NetworkSocket serverSocket; }; @@ -45,8 +45,8 @@ ClientDevice::~ClientDevice() Track &ClientDevice::getTrack(const std::string &trackName) { - sync::Data::TrackContainer::iterator iter = syncData.tracks.find(trackName); - if (iter != syncData.tracks.end()) return syncData.getTrack(iter->second); + int index = syncData.getTrackIndex(trackName); + if (0 <= index) return syncData.getTrack(size_t(index)); // send request data unsigned char cmd = GET_TRACK; @@ -59,7 +59,8 @@ Track &ClientDevice::getTrack(const std::string &trackName) serverSocket.send(name_str, int(name_len), 0); // insert new track - return syncData.getTrack(trackName); + index = int(syncData.createTrack(trackName)); + return syncData.getTrack(size_t(index)); } bool ClientDevice::update(float row) @@ -182,12 +183,10 @@ static bool saveTrack(const sync::Track &track, std::string fileName) void ClientDevice::saveTracks() { - sync::Data::TrackContainer::iterator iter; - for (iter = syncData.tracks.begin(); iter != syncData.tracks.end(); ++iter) + for (size_t i = 0; i < syncData.getTrackCount(); ++i) { - size_t index = iter->second; - const sync::Track &track = syncData.getTrack(index); - saveTrack(track, getTrackFileName(iter->first)); + const sync::Track &track = syncData.getTrack(i); + saveTrack(track, getTrackFileName(track.getName())); } } diff --git a/sync/device_player.cpp b/sync/device_player.cpp index 696ad30..fe2a069 100644 --- a/sync/device_player.cpp +++ b/sync/device_player.cpp @@ -62,12 +62,11 @@ static bool loadTrack(sync::Track &track, std::string fileName) Track &PlayerDevice::getTrack(const std::string &trackName) { - sync::Data::TrackContainer::iterator iter = syncData.tracks.find(trackName); - if (iter != syncData.tracks.end()) return syncData.getTrack(iter->second); + int trackIndex = syncData.getTrackIndex(trackName); + if (0 <= trackIndex) return syncData.getTrack(trackIndex); - size_t trackIndex = syncData.getTrackIndex(trackName); + trackIndex = int(syncData.createTrack(trackName)); sync::Track &track = syncData.getTrack(trackIndex); - loadTrack(track, getTrackFileName(trackName)); return track; } diff --git a/sync/track.h b/sync/track.h index 5826794..fd47fab 100644 --- a/sync/track.h +++ b/sync/track.h @@ -12,6 +12,11 @@ namespace sync class Track { public: + explicit Track(const std::string &name) : name(name) + { + + } + struct KeyFrame { enum InterpolationType @@ -44,10 +49,12 @@ namespace sync void truncate(); - // private: + const std::string &getName() const { return name; } typedef std::map KeyFrameContainer; KeyFrameContainer keyFrames; + private: + std::string name; }; } diff --git a/sync_player.vcproj b/sync_player.vcproj index 57de3e2..cf14bb6 100644 --- a/sync_player.vcproj +++ b/sync_player.vcproj @@ -43,7 +43,7 @@ PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE" MinimalRebuild="true" BasicRuntimeChecks="3" - RuntimeLibrary="3" + RuntimeLibrary="1" UsePrecompiledHeader="0" WarningLevel="3" Detect64BitPortabilityProblems="true"