AudioCodecs_Stream.cxx
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "AudioCodecs_Stream.hxx"
00023
00024 namespace CLAM
00025 {
00026
00027 namespace AudioCodecs
00028 {
00029 Stream::Stream()
00030 : mFramesLastRead(0)
00031 , mFramePosition(0)
00032 {
00033 }
00034
00035 Stream::~Stream()
00036 {
00037 }
00038
00039 bool Stream::ReadData( int channel, TData* buffer, unsigned nFrames )
00040 {
00041 AdjustInterleavedBuffer( nFrames );
00042 DiskToMemoryTransfer();
00043 if ( mFramesLastRead == 0 ) return mEOFReached;
00044
00045
00046 const TData* begin = &mInterleavedData[0];
00047 const TData* end = begin + mInterleavedData.size();
00048 for (const TData* i = begin + channel; i < end; i+=mChannels, buffer++ )
00049 *buffer = *i;
00050
00051 return mEOFReached;
00052
00053 }
00054 bool Stream::ReadData(TData** buffers, unsigned nFrames )
00055 {
00056 AdjustInterleavedBuffer( nFrames );
00057 DiskToMemoryTransfer();
00058 if ( mFramesLastRead == 0 ) return mEOFReached;
00059
00060 const TData * interleaved = &mInterleavedData[0];
00061 for (unsigned iFrame=0; iFrame<nFrames; iFrame++)
00062 for (unsigned iChannel=0; iChannel<mChannels; iChannel++)
00063 buffers[iChannel][iFrame] = *interleaved++;
00064
00065 return mEOFReached;
00066 }
00067
00068 bool Stream::ReadData( int* channels, int nchannels, TData** buffers, unsigned nFrames )
00069 {
00070 AdjustInterleavedBuffer( nFrames );
00071 DiskToMemoryTransfer();
00072 if ( mFramesLastRead == 0 ) return mEOFReached;
00073
00074
00075 const TData* begin = &mInterleavedData[0];
00076 const TData* end = begin + mInterleavedData.size();
00077 const int* endChannels = channels + nchannels;
00078
00079 for( int* currentChannel = channels;
00080 currentChannel != endChannels;
00081 currentChannel++ )
00082 {
00083 const int channelIndex = *currentChannel;
00084 TData* pSamples = buffers[channelIndex];
00085 for ( const TData* i = begin + channelIndex; i<end; i+=mChannels)
00086 {
00087 *pSamples++ = *i;
00088 }
00089 }
00090 return mEOFReached;
00091 }
00092
00093 void Stream::AdjustInterleavedBuffer( unsigned nFrames )
00094 {
00095 unsigned newSize = nFrames * mChannels;
00096 if (newSize == mInterleavedData.size()) return;
00097 mInterleavedData.resize( nFrames * mChannels );
00098 }
00099
00100 void Stream::WriteData( int channel, const TData* buffer, unsigned nFrames )
00101 {
00102 AdjustInterleavedBuffer( nFrames );
00103 TData* beginData = &mInterleavedData[0];
00104 TData* endData = beginData + mInterleavedData.size();
00105 for (TData* data = beginData+channel; data < endData; data += mChannels)
00106 *data = *buffer++;
00107
00108 MemoryToDiskTransfer();
00109 }
00110
00111 void Stream::WriteData(TData ** const buffers, unsigned nFrames)
00112 {
00113 AdjustInterleavedBuffer( nFrames );
00114
00115 TData * interleaved = &mInterleavedData[0];
00116 for (unsigned iFrame=0; iFrame<nFrames; iFrame++)
00117 for (unsigned iChannel=0; iChannel<mChannels; iChannel++)
00118 *interleaved++ = buffers[iChannel][iFrame];
00119
00120 MemoryToDiskTransfer();
00121 }
00122
00123 void Stream::WriteData( int* channels, int nchannels,
00124 TData** const samples, unsigned nFrames )
00125 {
00126 AdjustInterleavedBuffer( nFrames );
00127
00128 TData* begin = &mInterleavedData[0];
00129 TData* end = begin + mInterleavedData.size();
00130 const int* endChannels = channels + nchannels;
00131
00132 for( int* currentChannel = channels;
00133 currentChannel != endChannels;
00134 currentChannel++ )
00135 {
00136 const int channelIndex = *currentChannel;
00137 const TData* pSamples = *(samples + channelIndex);
00138 for ( TData* i = begin + channelIndex; i<end; i+=mChannels, pSamples++ )
00139 {
00140 *i = *pSamples;
00141 }
00142 }
00143
00144 MemoryToDiskTransfer();
00145 }
00146
00147 void Stream::SetChannels( unsigned nChannels )
00148 {
00149 mChannels = nChannels;
00150 }
00151
00152 }
00153
00154 }
00155