libGDF
EventHeader.cpp
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 }
 All Data Structures Functions Variables Friends