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