rocket/sync/device_player.cpp

85 lines
1.7 KiB
C++

/* Copyright (C) 2007-2008 Erik Faye-Lund and Egbert Teeselink
* For conditions of distribution and use, see copyright notice in LICENSE.TXT
*/
#include "device.h"
#include "data.h"
#include "network.h"
using namespace sync;
class PlayerDevice : public Device
{
public:
PlayerDevice(const std::string &baseName, Timer &timer) :
Device(baseName),
timer(timer)
{
}
~PlayerDevice();
Track &getTrack(const std::string &trackName);
bool update(float row);
private:
sync::Data syncData;
Timer &timer;
};
PlayerDevice::~PlayerDevice() { }
static bool loadTrack(sync::Track &track, std::string fileName)
{
FILE *fp = fopen(fileName.c_str(), "rb");
if (NULL == fp) return false;
size_t keyFrameCount;
fread(&keyFrameCount, sizeof(size_t), 1, fp);
for (size_t i = 0; i < keyFrameCount; ++i)
{
size_t row;
float value;
char interp;
fread(&row, sizeof(size_t), 1, fp);
fread(&value, sizeof(float), 1, fp);
fread(&interp, sizeof(char), 1, fp);
track.setKeyFrame(row,
Track::KeyFrame(
value,
Track::KeyFrame::InterpolationType(interp)
)
);
}
fclose(fp);
fp = NULL;
return true;
}
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);
size_t trackIndex = syncData.getTrackIndex(trackName);
sync::Track &track = syncData.getTrack(trackIndex);
loadTrack(track, getTrackFileName(trackName));
return track;
}
bool PlayerDevice::update(float row)
{
return true;
}
Device *sync::createDevice(const std::string &baseName, Timer &timer)
{
Device *device = new PlayerDevice(baseName, timer);
return device;
}