|
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 00018 00019 #ifndef __RECORDBUFFER_H_INCLUDED__ 00020 #define __RECORDBUFFER_H_INCLUDED__ 00021 00022 #include "GDF/Channel.h" 00023 #include "GDF/pointerpool.h" 00024 00025 #include <list> 00026 #include <vector> 00027 00028 namespace gdf 00029 { 00030 class Record; 00031 class GDFHeaderAccess; 00032 00034 00037 class RecordBuffer 00038 { 00039 public: 00040 00041 class RecordFullHandler 00042 { 00043 public: 00044 virtual void triggerRecordFull( Record *rec ) = 0; 00045 }; 00046 00048 RecordBuffer( const GDFHeaderAccess *gdfh ); 00049 00051 virtual ~RecordBuffer( ); 00052 00054 void clearBuffers( ); 00055 00057 void reset( ); 00058 00060 00063 void handleChannelFull( const size_t channel_idx ); 00064 00066 00067 void handleRecordFull( ); 00068 00070 void registerRecordFullCallback( RecordFullHandler *h ); 00071 00073 void unregisterRecordFullCallback( RecordFullHandler *h ); 00074 00076 void addSamplePhys( const size_t channel_idx, const double value ); 00077 00079 template<typename T> void addSampleRaw( const size_t channel_idx, const T rawval ) 00080 { 00081 Channel *ch = getValidChannel( channel_idx ); 00082 ch->addSampleRaw<T>( rawval ); 00083 if( ch->getFree( ) == 0 ) 00084 handleChannelFull( channel_idx ); 00085 } 00086 00088 void blitSamplesPhys( const size_t channel_idx, const double *values, size_t num ); 00089 00091 template<typename T> void blitSamplesRaw( const size_t channel_idx, const T *values, size_t num ) 00092 { 00093 size_t i = 0; 00094 while( i<num ) 00095 { 00096 Channel *ch = getValidChannel( channel_idx ); 00097 size_t n = std::min( num-i, ch->getFree( ) ); 00098 ch->blitSamplesRaw( &values[i], n ); 00099 if( ch->getFree( ) == 0 ) 00100 handleChannelFull( channel_idx ); 00101 i += n; 00102 } 00103 } 00104 00106 void fillPhys( const size_t channel_idx, const double value, size_t num ); 00107 00109 template<typename T> void fillRaw( const size_t channel_idx, const T value, size_t num ); 00110 00112 00113 void addRecord( Record *r ); 00114 00116 00117 Record *acquireRecord( ); 00118 00120 std::list< Record* >::iterator createNewRecord( ); 00121 00123 Record *getFirstFullRecord( ); 00124 00126 void removeFirstFullRecord( ); 00127 00129 inline size_t getNumFullRecords( ) const { return m_num_full; } 00130 00132 inline size_t getNumPartialRecords( ) const { return m_records.size( ); } 00133 00135 00137 Channel *getValidChannel( const size_t channel_idx ); 00138 00140 size_t getNumFreeAlloc( const size_t channel_idx ); 00141 00143 void flood( ); 00144 00145 protected: 00146 00147 private: 00148 const GDFHeaderAccess *m_gdfh; 00149 PointerPool<Record> *m_pool; 00150 std::list< Record* > m_records; 00151 std::list< Record* > m_records_full; 00152 size_t m_num_full; 00153 std::vector< std::list< Record* >::iterator > m_channelhead; 00154 std::list<RecordFullHandler*> m_recfull_callbacks; 00155 }; 00156 } 00157 00158 #endif