|
libGDF
|
00001 // 00002 // This file is part of libGDF. 00003 // 00004 // libGDF is free software: you can redistribute it and/or modify 00005 // it under the terms of the GNU Lesser General Public License as 00006 // published by the Free Software Foundation, either version 3 of 00007 // the License, or (at your option) any later version. 00008 // 00009 // libGDF is distributed in the hope that it will be useful, 00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 // GNU Lesser General Public License for more details. 00013 // 00014 // You should have received a copy of the GNU Lesser General Public License 00015 // along with libGDF. If not, see <http://www.gnu.org/licenses/>. 00016 // 00017 // Copyright 2010 Martin Billinger, Christoph Eibel 00018 00019 #include "GDF/EventHeader.h" 00020 #include "GDF/Exceptions.h" 00021 #include <algorithm> 00022 #include <iostream> 00023 #include <boost/lexical_cast.hpp> 00024 00025 namespace gdf 00026 { 00027 EventHeader::EventHeader( ) : m_mode1(), m_mode3() 00028 { 00029 m_mode = 1; 00030 m_efs = -1; 00031 } 00032 00033 EventHeader::~EventHeader( ) 00034 { 00035 } 00036 00037 void EventHeader::toStream( std::ostream &stream ) 00038 { 00039 stream.write( reinterpret_cast<const char*>(&m_mode), 1 ); 00040 00041 // convert number of events to 24bit little endian representation 00042 uint32 numev = getNumEvents( ); 00043 char tmp[3]; 00044 tmp[0] = numev % 256; 00045 tmp[1] = (numev / 256) % 256; 00046 tmp[2] = (numev / 65536) % 256; 00047 stream.write( tmp, 3 ); 00048 00049 writeLittleEndian( stream, getSamplingRate( ) ); 00050 00051 if( getMode() == 1 ) 00052 { 00053 Mode1Event e; 00054 // write event positions 00055 for( size_t i=0; i<getNumEvents(); i++) 00056 { 00057 getEvent( i, e ); 00058 writeLittleEndian( stream, e.position ); 00059 } 00060 // write event types 00061 for( size_t i=0; i<getNumEvents(); i++) 00062 { 00063 getEvent( i, e ); 00064 writeLittleEndian( stream, e.type ); 00065 } 00066 } 00067 else if( getMode() == 3 ) 00068 { 00069 Mode3Event e; 00070 // write event positions 00071 for( size_t i=0; i<getNumEvents(); i++) 00072 { 00073 getEvent( i, e ); 00074 writeLittleEndian( stream, e.position ); 00075 } 00076 // write event types 00077 for( size_t i=0; i<getNumEvents(); i++) 00078 { 00079 getEvent( i, e ); 00080 writeLittleEndian( stream, e.type ); 00081 } 00082 // write event channels 00083 for( size_t i=0; i<getNumEvents(); i++) 00084 { 00085 getEvent( i, e ); 00086 writeLittleEndian( stream, e.channel ); 00087 } 00088 // write event durations 00089 for( size_t i=0; i<getNumEvents(); i++) 00090 { 00091 getEvent( i, e ); 00092 writeLittleEndian( stream, e.duration ); 00093 } 00094 } 00095 } 00096 00097 void EventHeader::fromStream( std::istream &stream ) 00098 { 00099 clear( ); 00100 00101 uint8 mode; 00102 stream.read( reinterpret_cast<char*>(&mode), sizeof(mode) ); 00103 setMode( mode ); 00104 00105 char tmp[3]; 00106 stream.read( tmp, 3 ); 00107 00108 uint32 nev = tmp[0] + tmp[1]*256 + tmp[2]*65536; 00109 00110 float32 efs; 00111 readLittleEndian( stream, efs ); 00112 setSamplingRate( efs ); 00113 00114 std::vector<uint32> positions; 00115 std::vector<uint16> types; 00116 positions.resize( nev ); 00117 types.resize( nev ); 00118 for( size_t i=0; i<nev; i++ ) 00119 readLittleEndian( stream, positions[i] ); 00120 for( size_t i=0; i<nev; i++ ) 00121 readLittleEndian( stream, types[i] ); 00122 00123 if( getMode() == 1 ) 00124 { 00125 for( size_t i=0; i<nev; i++ ) 00126 { 00127 Mode1Event e; 00128 e.position = positions[i]; 00129 e.type = types[i]; 00130 addEvent( e ); 00131 } 00132 } 00133 else if( getMode() == 3 ) 00134 { 00135 std::vector<uint16> channels; 00136 std::vector<uint32> durations; 00137 channels.resize( nev ); 00138 durations.resize( nev ); 00139 for( size_t i=0; i<nev; i++ ) 00140 readLittleEndian( stream, channels[i] ); 00141 for( size_t i=0; i<nev; i++ ) 00142 readLittleEndian( stream, durations[i] ); 00143 for( size_t i=0; i<nev; i++ ) 00144 { 00145 Mode3Event e; 00146 e.position = positions[i]; 00147 e.type = types[i]; 00148 e.channel = channels[i]; 00149 e.duration = durations[i]; 00150 addEvent( e ); 00151 } 00152 } 00153 else 00154 throw exception::invalid_eventmode( boost::lexical_cast<std::string>( getMode() ) ); 00155 } 00156 00157 void EventHeader::setMode( uint8 mode ) 00158 { 00159 if( m_mode1.size() > 0 || m_mode3.size() > 0 ) 00160 throw exception::illegal_eventmode_change( "EventHeader::setMode called, but header already contains events" ); 00161 m_mode = mode; 00162 } 00163 00164 void EventHeader::setSamplingRate( float32 fs ) 00165 { 00166 m_efs = fs; 00167 } 00168 00169 uint32 EventHeader::getNumEvents( ) 00170 { 00171 switch( m_mode ) 00172 { 00173 case 1: return m_mode1.size( ); break; 00174 case 3: return m_mode3.size( ); break; 00175 default: throw exception::invalid_eventmode( boost::lexical_cast<std::string>( m_mode ) ); 00176 } 00177 } 00178 00179 //------------------------------------------------------------------------- 00180 std::vector<Mode1Event> EventHeader::getMode1Events () const 00181 { 00182 return m_mode1; 00183 } 00184 00185 //------------------------------------------------------------------------- 00186 std::vector<Mode3Event> EventHeader::getMode3Events () const 00187 { 00188 return m_mode3; 00189 } 00190 00191 //------------------------------------------------------------------------- 00192 void EventHeader::getEvent( uint32 index, Mode1Event &ev ) 00193 { 00194 if( m_mode != 1 ) 00195 throw exception::wrong_eventmode( "Expecting mode 1" ); 00196 ev = m_mode1[index]; 00197 } 00198 00199 void EventHeader::getEvent( uint32 index, Mode3Event &ev ) 00200 { 00201 if( m_mode != 3 ) 00202 throw exception::wrong_eventmode( "Expecting mode 3" ); 00203 ev = m_mode3[index]; 00204 } 00205 00206 void EventHeader::addEvent( const Mode1Event &ev ) 00207 { 00208 if( m_mode != 1 ) 00209 throw exception::wrong_eventmode( "Expecting mode 1" ); 00210 m_mode1.push_back( ev ); 00211 } 00212 00213 void EventHeader::addEvent( const Mode3Event &ev ) 00214 { 00215 if( m_mode != 3 ) 00216 throw exception::wrong_eventmode( "Expecting mode 3" ); 00217 m_mode3.push_back( ev ); 00218 } 00219 00220 void EventHeader::sort( ) 00221 { 00222 std::sort( m_mode1.begin(), m_mode1.end() ); 00223 std::sort( m_mode3.begin(), m_mode3.end() ); 00224 } 00225 00226 void EventHeader::clear( ) 00227 { 00228 m_mode1.clear( ); 00229 m_mode3.clear( ); 00230 } 00231 00232 }