Cleaner code for the track-reordering
This commit is contained in:
parent
f405a24e07
commit
3b014fd04a
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
SyncDocument *document = getDocument();
|
||||
if (NULL == document) return;
|
||||
int startTrack = scrollPosX / trackWidth;
|
||||
int endTrack = min(startTrack + windowTracks, getTrackCount());
|
||||
|
||||
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<TCHAR> &trackName = trackIter->first;
|
||||
const std::basic_string<TCHAR> &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)
|
||||
{
|
||||
assert(trackIter != document->tracks.end());
|
||||
size_t trackIndex = trackIter->second;
|
||||
const sync::Track &t = document->getTrack(trackIndex);
|
||||
int startTrack = scrollPosX / trackWidth;
|
||||
int endTrack = min(startTrack + windowTracks, getTrackCount());
|
||||
|
||||
for (int track = startTrack; track < endTrack; ++track)
|
||||
{
|
||||
const sync::Track &t = document->getTrack(document->getTrackIndexFromPos(track));
|
||||
|
||||
if (track < firstTrack) continue;
|
||||
for (int row = firstRow; row <= lastRow; ++row)
|
||||
{
|
||||
RECT patternDataRect;
|
||||
|
||||
@ -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<sync::Device> syncDevice = std::auto_ptr<sync::Device>(sync::createDevice("sync", timer));
|
||||
if (NULL == syncDevice.get()) throw std::string("something went wrong - failed to connect to host?");
|
||||
|
||||
|
||||
@ -12,29 +12,26 @@ Data::~Data()
|
||||
delete actualTracks[i];
|
||||
}
|
||||
|
||||
size_t Data::getTrackIndex(const std::basic_string<TCHAR> &name)
|
||||
size_t Data::createTrack(const std::basic_string<TCHAR> &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<TCHAR> &name)
|
||||
int Data::getTrackIndex(const std::basic_string<TCHAR> &name)
|
||||
{
|
||||
size_t index = getTrackIndex(name);
|
||||
assert(index < int(actualTracks.size()));
|
||||
assert(NULL != actualTracks[index]);
|
||||
return *actualTracks[index];
|
||||
// search for track
|
||||
size_t index;
|
||||
for (index = 0; index < actualTracks.size(); ++index)
|
||||
{
|
||||
if (name == actualTracks[index]->getName()) return int(index);
|
||||
}
|
||||
|
||||
size_t Data::getTrackCount() const
|
||||
{
|
||||
return tracks.size();
|
||||
// not found
|
||||
return -1;
|
||||
}
|
||||
|
||||
19
sync/data.h
19
sync/data.h
@ -26,20 +26,27 @@ namespace sync
|
||||
{
|
||||
public:
|
||||
~Data();
|
||||
size_t getTrackIndex(const std::basic_string<TCHAR> &name);
|
||||
Track &getTrack(const std::basic_string<TCHAR> &name);
|
||||
|
||||
Track &getTrack(size_t track)
|
||||
int
|
||||
getTrackIndex(const std::basic_string<TCHAR> &name);
|
||||
|
||||
size_t
|
||||
createTrack(const std::basic_string<TCHAR> &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<const std::basic_string<TCHAR>, size_t> TrackContainer;
|
||||
TrackContainer tracks;
|
||||
protected:
|
||||
std::vector<Track*> actualTracks;
|
||||
};
|
||||
|
||||
@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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<size_t, struct KeyFrame> KeyFrameContainer;
|
||||
KeyFrameContainer keyFrames;
|
||||
private:
|
||||
std::string name;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@ -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"
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user