00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "DataBuffer.h"
00024
00025 #include <iostream>
00026 #include <iomanip>
00027 using namespace std;
00028
00029 namespace MIDI
00030 {
00031 DataBuffer::DataBuffer()
00032 : _data(0),_size(0),_maxsize(0),_pos(0)
00033 { }
00034
00035 DataBuffer::DataBuffer(const DataBuffer& o)
00036 : _size(o._size),_maxsize(o._maxsize),_pos(o._pos)
00037 {
00038 _data=new byte[_maxsize];
00039 for(int i=0;i<_maxsize;i++)
00040 if(i<_size)
00041 _data[i]=o._data[i];
00042 else
00043 _data[i]='\0';
00044 }
00045
00046 DataBuffer::DataBuffer(byte data[],unsigned int size)
00047 : _data(0),_size(size),_maxsize(size),_pos(0)
00048 {
00049 _data=new byte[_maxsize];
00050 for(int i=0;i<_maxsize;i++)
00051 _data[i]=data[i];
00052 }
00053
00054 DataBuffer::DataBuffer(unsigned int maxsize)
00055 : _data(new byte[maxsize]),_size(0),_maxsize(maxsize),_pos(0)
00056 {
00057 for(int i=0;i<_maxsize;i++)
00058 _data[i]='\0';
00059 }
00060
00061 byte* DataBuffer::data()
00062 {
00063 return _data;
00064 }
00065
00066 unsigned int DataBuffer::size()
00067 {
00068 return _size;
00069 }
00070
00071 unsigned int DataBuffer::maxsize()
00072 {
00073 return _maxsize;
00074 }
00075
00076 void DataBuffer::writeVariableLength(dword data)
00077 {
00078
00079 byte bytedata[4];
00080
00081 for(int i=0;i<4;i++)
00082 {
00083 bytedata[i]=(0x7F & data)+0x80;
00084 data=(data>>7);
00085 }
00086 bytedata[0]=(bytedata[0]&0x7F);
00087
00088
00089 int i;
00090 for(i=3;i>=1;i--)
00091 {
00092 if((bytedata[i] & 0x7F)!=0)
00093 break;
00094 }
00095 for(i;i>=0;i--)
00096 write(bytedata[i]);
00097 }
00098
00099
00100 void DataBuffer::write(byte data)
00101 {
00102
00103 if(_size+1>_maxsize) return;
00104
00105 _data[_pos]=data;
00106 _pos++;
00107 _size+=1;
00108 }
00109
00110 void DataBuffer::write(byte* data,unsigned int size)
00111 {
00112
00113 if(_size+size>_maxsize) return;
00114
00115 for(int i=0;i<size;i++)
00116 {
00117 _data[_pos]=data[i];
00118 _pos++;
00119 }
00120 _size+=size;
00121 }
00122
00123 void DataBuffer::write(DataBuffer data)
00124 {
00125
00126 write(data.data(),data.size());
00127 }
00128
00129 void DataBuffer::seek(int pos)
00130 {
00131 _pos=pos;
00132 }
00133
00134 void DataBuffer::remove(int numBytes)
00135 {
00136 for(int i=_pos+numBytes;i<_size;i++)
00137 {
00138 _data[i-numBytes]=_data[i];
00139 }
00140
00141 _size-=numBytes;
00142 if(_size<0) _size=0;
00143 }
00144 }