#include <SharedData.h>

SharedData::SharedData()
{;}

void SharedData::generateRandomNumbers()
{
   for (int i = 0 ; i < 16 ; i++)
   {
      mRandomNumbers[i] = rand();
   }
}

void SharedData::getRandomNumbers(int* nums)
{
   //std::cout << "Rands:";
   for (int i = 0 ; i < 16 ; i++)
   {
      nums[i] = mRandomNumbers[i];
      //std::cout << " " << nums[i];
   }
   //std::cout << std::endl;
}

void SharedData::takeSnapshot(float* src)
{
   std::vector<float> sample(16);
   
//   std::cout << "Values:";
   
   for (int i = 0 ; i < 16 ; i++)
   {
//      std::cout << " " << src[i];
      sample[i] = src[i];
   }
//   std::cout << std::endl;

   mSamples.push_back(sample);
//   std::cout << "Size: " << mSamples.size() << std::endl;
}

void SharedData::takeEvent(int* src)
{
   std::vector<int> event(9);
   
//   std::cout << "Values:";
   
   for (int i = 0 ; i < 9 ; i++)
   {
//      std::cout << " " << src[i];
      event[i] = src[i];
   }
//   std::cout << std::endl;

   mEvents.push_back(event);
//   std::cout << "Size: " << mSamples.size() << std::endl;
}


void SharedData::retrieveSample(float* dst, int num)
{
   for (int i = 0 ; i < 16 ; i++)
   {
      dst[i] = mSamples[num][i];
   }
}

void SharedData::retrieveEvent(int* dst, int num)
{
   for (int i = 0 ; i < 9 ; i++)
   {
      dst[i] = mEvents[num][i];
   }
}

vpr::ReturnStatus SharedData::readObject(vpr::ObjectReader* reader)
{
//   vpr::BufferObjectReader* r = dynamic_cast<vpr::BufferObjectReader*>(reader);

   mSamples.clear();
   mEvents.clear();

   vpr::Uint16 numSamples = reader->readUint16();
   mSamples.resize(numSamples);
   //std::cout << "Reading: " << numSamples << " samples." << std::endl;
   //std::cout << "Data size: " << r->mData->size();
   
   for ( unsigned int i = 0 ; i < numSamples ; i++)
   {
      //std::cout << "Values(" << i << "):" << std::flush;
      mSamples[i].resize(16);
      for ( int n=0 ; n < 16 ; n++ )
      {
         //mSamples[i][n] = 0;
         float f = reader->readFloat();
         //mSamples[i][n] = reader->readFloat();
         mSamples[i][n] = f;
         //std::cout << " " << f;
      }
      //std::cout << std::endl;
   }
   

   // read random numbers
   for (int i = 0 ; i < 16 ; i++)
   {
      mRandomNumbers[i] = reader->readUint32();
   }

   // read midi events

   vpr::Uint16 numEvents = reader->readUint32();
   mEvents.resize(numEvents);

   for ( unsigned int i = 0 ; i < numEvents ; i++)
   {
      //std::cout << "Values(" << i << "):" << std::flush;
      mEvents[i].resize(9);
      for ( int n=0 ; n < 9 ; n++ )
      {
         int ri = reader->readUint32();
         mEvents[i][n] = ri;
         //std::cout << " " << ri;
      }
      //std::cout << std::endl;
   }

   return vpr::ReturnStatus::Succeed;
}

vpr::ReturnStatus SharedData::writeObject(vpr::ObjectWriter* writer)
{
   writer->writeUint16(mSamples.size());
   
   //std::cout << "Writing: " << mSamples.size() << " samples." << std::endl;
   
   for ( unsigned int i = 0 ; i < mSamples.size() ; i++)
   {
      //std::cout << "Values(" << i << "):";
      for ( int n=0 ; n < 16 ; n++ )
      {
         //std::cout << " " << mSamples[i][n];
         writer->writeFloat(mSamples[i][n]);
      }
      //std::cout << std::endl;
   }
   
   // random numbers

   for (int i = 0 ; i < 16 ; i++)
   {
      writer->writeUint32(mRandomNumbers[i]);
   }
   
   // write midi events

   writer->writeUint32(mEvents.size());

   for ( unsigned int i = 0 ; i < mEvents.size() ; i++)
   {
      //std::cout << "Values(" << i << "):";
      for ( int n=0 ; n < 9 ; n++ )
      {
         //std::cout << " " << mEvents[i][n];
         writer->writeUint32(mEvents[i][n]);
      }
      //std::cout << std::endl;
   }

   return vpr::ReturnStatus::Succeed;
}

