diff options
| author | Mike Buland <eichlan@xagasoft.com> | 2010-04-12 07:37:09 +0000 |
|---|---|---|
| committer | Mike Buland <eichlan@xagasoft.com> | 2010-04-12 07:37:09 +0000 |
| commit | 41c9581b48f055f6559335ffc0316f27ed1b3657 (patch) | |
| tree | 22c6737ff5e6fd7732597dcd83a190ae917f0079 /src/myriadstream.cpp | |
| parent | 943cf16f5661357086532b2241e6f85bfe43565a (diff) | |
| download | libbu++-41c9581b48f055f6559335ffc0316f27ed1b3657.tar.gz libbu++-41c9581b48f055f6559335ffc0316f27ed1b3657.tar.bz2 libbu++-41c9581b48f055f6559335ffc0316f27ed1b3657.tar.xz libbu++-41c9581b48f055f6559335ffc0316f27ed1b3657.zip | |
Myriad is getting pretty close, just have to finish the writing code and
probably tweak the header init.
Diffstat (limited to 'src/myriadstream.cpp')
| -rw-r--r-- | src/myriadstream.cpp | 157 |
1 files changed, 79 insertions, 78 deletions
diff --git a/src/myriadstream.cpp b/src/myriadstream.cpp index 04f98ed..0e6fc89 100644 --- a/src/myriadstream.cpp +++ b/src/myriadstream.cpp | |||
| @@ -6,19 +6,22 @@ | |||
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | #include "bu/myriadstream.h" | 8 | #include "bu/myriadstream.h" |
| 9 | #include "bu/sio.h" | ||
| 10 | |||
| 11 | using Bu::sio; | ||
| 12 | using Bu::Fmt; | ||
| 9 | 13 | ||
| 10 | #include <string.h> | 14 | #include <string.h> |
| 11 | 15 | ||
| 12 | Bu::MyriadStream::MyriadStream( Myriad &rMyriad, uint32_t uStream ) : | 16 | Bu::MyriadStream::MyriadStream( Bu::Myriad &rMyriad, |
| 17 | Bu::Myriad::Stream *pStream ) : | ||
| 13 | rMyriad( rMyriad ), | 18 | rMyriad( rMyriad ), |
| 14 | uStream( uStream ), | 19 | pStream( pStream ), |
| 15 | pCurBlock( NULL ), | 20 | pCurBlock( NULL ), |
| 16 | uCurBlock( uStream ), | 21 | iPos( 0 ) |
| 17 | uSize( 0 ), | ||
| 18 | uBlockSize( rMyriad.iBlockSize ), | ||
| 19 | uPos( 0 ) | ||
| 20 | { | 22 | { |
| 21 | //printf("MyriadStream::allocated\n"); | 23 | sio << "MyriadStream: Created, iId=" << pStream->iId << ", iSize=" |
| 24 | << pStream->iSize << sio.nl; | ||
| 22 | //pCurBlock = rMyriad.newBlock(); | 25 | //pCurBlock = rMyriad.newBlock(); |
| 23 | //rMyriad.getBlock( uStream, pCurBlock ); | 26 | //rMyriad.getBlock( uStream, pCurBlock ); |
| 24 | //uSize = pCurBlock->uBytesUsed; | 27 | //uSize = pCurBlock->uBytesUsed; |
| @@ -26,7 +29,8 @@ Bu::MyriadStream::MyriadStream( Myriad &rMyriad, uint32_t uStream ) : | |||
| 26 | 29 | ||
| 27 | Bu::MyriadStream::~MyriadStream() | 30 | Bu::MyriadStream::~MyriadStream() |
| 28 | { | 31 | { |
| 29 | //printf("Destroying stream?\n"); | 32 | if( pCurBlock ) |
| 33 | rMyriad.releaseBlock( pCurBlock ); | ||
| 30 | //rMyriad.updateStreamSize( uStream, uSize ); | 34 | //rMyriad.updateStreamSize( uStream, uSize ); |
| 31 | //rMyriad.deleteBlock( pCurBlock ); | 35 | //rMyriad.deleteBlock( pCurBlock ); |
| 32 | } | 36 | } |
| @@ -37,57 +41,54 @@ void Bu::MyriadStream::close() | |||
| 37 | 41 | ||
| 38 | size_t Bu::MyriadStream::read( void *pBuf, size_t nBytes ) | 42 | size_t Bu::MyriadStream::read( void *pBuf, size_t nBytes ) |
| 39 | { | 43 | { |
| 40 | /* | 44 | sio << "MyriadStream: Read: Started, asked to read " << nBytes << "b." |
| 41 | if( nBytes == 0 ) | 45 | << sio.nl; |
| 46 | if( nBytes <= 0 ) | ||
| 42 | return 0; | 47 | return 0; |
| 43 | if( nBytes + uPos > uSize ) | 48 | if( nBytes > pStream->iSize-iPos ) |
| 44 | nBytes = uSize - uPos; | 49 | nBytes = pStream->iSize-iPos; |
| 45 | if( (uPos%uBlockSize)+nBytes < uBlockSize ) | 50 | int iLeft = nBytes; |
| 51 | sio << "MyriadStream: Read: Started, going to read " << nBytes << "b." | ||
| 52 | << sio.nl; | ||
| 53 | if( pCurBlock == NULL ) | ||
| 46 | { | 54 | { |
| 47 | size_t iRead = nBytes; | 55 | sio << "MyriadStream: Read: No block loaded, loading initial block." |
| 48 | if( iRead > pCurBlock->uBytesUsed-(uPos%uBlockSize) ) | 56 | << sio.nl; |
| 49 | iRead = pCurBlock->uBytesUsed-(uPos%uBlockSize); | 57 | pCurBlock = rMyriad.getBlock( |
| 50 | memcpy( pBuf, pCurBlock->pData+(uPos%uBlockSize), iRead ); | 58 | pStream->aBlocks[iPos/rMyriad.iBlockSize] |
| 51 | //printf("read buffill: %ub, %u-%u/%u -> %d-%d/%d (a:%u)", | 59 | ); |
| 52 | // iRead, uPos, uPos+iRead-1, uSize, 0, iRead-1, nBytes, uCurBlock ); | ||
| 53 | uPos += iRead; | ||
| 54 | //printf(" -- %u\n", uPos%uBlockSize ); | ||
| 55 | //printf("ra: block %u = %ub:%u (%ub total)\n", | ||
| 56 | // uCurBlock, uPos, nBytes, uSize ); | ||
| 57 | |||
| 58 | // This can't happen, if we're right on a boundery, it goes to the | ||
| 59 | // other case | ||
| 60 | //if( uPos%uBlockSize == 0 ) | ||
| 61 | // uCurBlock = rMyriad.getNextBlock( uCurBlock, pCurBlock, false ); | ||
| 62 | return iRead; | ||
| 63 | } | 60 | } |
| 64 | else | 61 | while( iLeft > 0 ) |
| 65 | { | 62 | { |
| 66 | size_t nTotal = 0; | 63 | int iCurBlock = pStream->aBlocks[iPos/rMyriad.iBlockSize]; |
| 67 | for(;;) | 64 | if( pCurBlock->iBlockIndex != iCurBlock ) |
| 68 | { | 65 | { |
| 69 | uint32_t iRead = nBytes; | 66 | sio << "MyriadStream: Read: Loading new block " << iCurBlock << "." |
| 70 | if( iRead > uBlockSize-(uPos%uBlockSize) ) | 67 | << sio.nl; |
| 71 | iRead = uBlockSize-(uPos%uBlockSize); | 68 | rMyriad.releaseBlock( pCurBlock ); |
| 72 | if( iRead > pCurBlock->uBytesUsed-(uPos%uBlockSize) ) | 69 | pCurBlock = rMyriad.getBlock( iCurBlock ); |
| 73 | iRead = pCurBlock->uBytesUsed-(uPos%uBlockSize); | ||
| 74 | memcpy( ((char *)pBuf)+nTotal, | ||
| 75 | pCurBlock->pData+(uPos%uBlockSize), iRead ); | ||
| 76 | //printf(" read buffill: %ub, %u-%u/%u -> %d-%d/%d (b:%u)\n", | ||
| 77 | // iRead, uPos, uPos+iRead-1, uSize, | ||
| 78 | // nTotal, nTotal+nBytes-1, nBytes, uCurBlock ); | ||
| 79 | uPos += iRead; | ||
| 80 | nBytes -= iRead; | ||
| 81 | nTotal += iRead; | ||
| 82 | //printf("rb: block %u = %ub:%u (%ub total)\n", | ||
| 83 | // uCurBlock, uPos, iRead, uSize ); | ||
| 84 | if( uPos%uBlockSize == 0 ) | ||
| 85 | uCurBlock = rMyriad.getNextBlock( uCurBlock, pCurBlock, false ); | ||
| 86 | if( nBytes == 0 || uPos >= uSize ) | ||
| 87 | return nTotal; | ||
| 88 | } | 70 | } |
| 89 | }*/ | 71 | |
| 90 | return 0; | 72 | int iAmnt = Bu::min( |
| 73 | rMyriad.iBlockSize - iPos%rMyriad.iBlockSize, | ||
| 74 | iLeft | ||
| 75 | ); | ||
| 76 | // if( iLeft > iAmnt ) | ||
| 77 | // iAmnt = iLeft; | ||
| 78 | sio << "MyriadStream: Read: Copying out bytes: " | ||
| 79 | << (iPos%rMyriad.iBlockSize) << " - " | ||
| 80 | << iAmnt | ||
| 81 | << ", " << iLeft << "b left." << sio.nl; | ||
| 82 | memcpy( | ||
| 83 | pBuf, | ||
| 84 | pCurBlock->pData+iPos%rMyriad.iBlockSize, | ||
| 85 | iAmnt | ||
| 86 | ); | ||
| 87 | iPos += iAmnt; | ||
| 88 | pBuf = &((char *)pBuf)[iAmnt]; | ||
| 89 | iLeft -= iAmnt; | ||
| 90 | } | ||
| 91 | return nBytes; | ||
| 91 | } | 92 | } |
| 92 | 93 | ||
| 93 | size_t Bu::MyriadStream::write( const void *pBuf, size_t nBytes ) | 94 | size_t Bu::MyriadStream::write( const void *pBuf, size_t nBytes ) |
| @@ -101,22 +102,22 @@ size_t Bu::MyriadStream::write( const void *pBuf, size_t nBytes ) | |||
| 101 | uCurBlock = rMyriad.getNextBlock( uCurBlock, pCurBlock ); | 102 | uCurBlock = rMyriad.getNextBlock( uCurBlock, pCurBlock ); |
| 102 | } */ | 103 | } */ |
| 103 | /* | 104 | /* |
| 104 | if( (uPos%uBlockSize)+nBytes < uBlockSize ) | 105 | if( (iPos%uBlockSize)+nBytes < uBlockSize ) |
| 105 | { | 106 | { |
| 106 | //printf("wa: %u:%u:%u:%u -> ", uPos, uPos%uBlockSize, uSize, pCurBlock->uBytesUsed ); | 107 | //printf("wa: %u:%u:%u:%u -> ", iPos, iPos%uBlockSize, uSize, pCurBlock->uBytesUsed ); |
| 107 | memcpy( pCurBlock->pData+(uPos%uBlockSize), pBuf, nBytes ); | 108 | memcpy( pCurBlock->pData+(iPos%uBlockSize), pBuf, nBytes ); |
| 108 | //printf("write buffill: %ub, %u-%u/%u -> %d-%d/%d (a:%u:%u)\n", | 109 | //printf("write buffill: %ub, %u-%u/%u -> %d-%d/%d (a:%u:%u)\n", |
| 109 | // nBytes, 0, nBytes-1, nBytes, | 110 | // nBytes, 0, nBytes-1, nBytes, |
| 110 | // uPos, uPos+nBytes-1, uSize, uCurBlock, | 111 | // iPos, iPos+nBytes-1, uSize, uCurBlock, |
| 111 | // pCurBlock->uBytesUsed ); | 112 | // pCurBlock->uBytesUsed ); |
| 112 | if( (uPos%uBlockSize)+nBytes > pCurBlock->uBytesUsed ) | 113 | if( (iPos%uBlockSize)+nBytes > pCurBlock->uBytesUsed ) |
| 113 | pCurBlock->uBytesUsed = (uPos%uBlockSize)+nBytes; | 114 | pCurBlock->uBytesUsed = (iPos%uBlockSize)+nBytes; |
| 114 | rMyriad.setBlock( uCurBlock, pCurBlock ); | 115 | rMyriad.setBlock( uCurBlock, pCurBlock ); |
| 115 | uPos += nBytes; | 116 | iPos += nBytes; |
| 116 | if( uPos > uSize ) | 117 | if( iPos > uSize ) |
| 117 | uSize = uPos; | 118 | uSize = iPos; |
| 118 | //printf("block %u = %ub (%ub total) %d:%u\n", | 119 | //printf("block %u = %ub (%ub total) %d:%u\n", |
| 119 | // uCurBlock, pCurBlock->uBytesUsed, uSize, nBytes, uPos ); | 120 | // uCurBlock, pCurBlock->uBytesUsed, uSize, nBytes, iPos ); |
| 120 | return nBytes; | 121 | return nBytes; |
| 121 | } | 122 | } |
| 122 | else | 123 | else |
| @@ -124,27 +125,27 @@ size_t Bu::MyriadStream::write( const void *pBuf, size_t nBytes ) | |||
| 124 | size_t nTotal = 0; | 125 | size_t nTotal = 0; |
| 125 | for(;;) | 126 | for(;;) |
| 126 | { | 127 | { |
| 127 | uint32_t uNow = uBlockSize-(uPos%uBlockSize); | 128 | uint32_t uNow = uBlockSize-(iPos%uBlockSize); |
| 128 | //printf("uNow: %u (%u-(%u%%%u)) %d req\n", uNow, uBlockSize, uPos, uBlockSize, nBytes ); | 129 | //printf("uNow: %u (%u-(%u%%%u)) %d req\n", uNow, uBlockSize, iPos, uBlockSize, nBytes ); |
| 129 | if( nBytes < uNow ) | 130 | if( nBytes < uNow ) |
| 130 | uNow = nBytes; | 131 | uNow = nBytes; |
| 131 | memcpy( pCurBlock->pData+(uPos%uBlockSize), | 132 | memcpy( pCurBlock->pData+(iPos%uBlockSize), |
| 132 | &((char *)pBuf)[nTotal], uNow ); | 133 | &((char *)pBuf)[nTotal], uNow ); |
| 133 | //printf("write buffill: %ub, %u-%u/%u -> %d-%d/%d (b:%u:%u)\n", | 134 | //printf("write buffill: %ub, %u-%u/%u -> %d-%d/%d (b:%u:%u)\n", |
| 134 | // uNow, nTotal, nTotal+uNow-1, nBytes, | 135 | // uNow, nTotal, nTotal+uNow-1, nBytes, |
| 135 | // uPos, uPos+uNow-1, uSize, uCurBlock, pCurBlock->uBytesUsed ); | 136 | // iPos, iPos+uNow-1, uSize, uCurBlock, pCurBlock->uBytesUsed ); |
| 136 | if( (uPos%uBlockSize)+uNow > pCurBlock->uBytesUsed ) | 137 | if( (iPos%uBlockSize)+uNow > pCurBlock->uBytesUsed ) |
| 137 | pCurBlock->uBytesUsed = (uPos%uBlockSize)+uNow; | 138 | pCurBlock->uBytesUsed = (iPos%uBlockSize)+uNow; |
| 138 | rMyriad.setBlock( uCurBlock, pCurBlock ); | 139 | rMyriad.setBlock( uCurBlock, pCurBlock ); |
| 139 | uPos += uNow; | 140 | iPos += uNow; |
| 140 | if( uPos > uSize ) | 141 | if( iPos > uSize ) |
| 141 | uSize = uPos; | 142 | uSize = iPos; |
| 142 | nTotal += uNow; | 143 | nTotal += uNow; |
| 143 | nBytes -= uNow; | 144 | nBytes -= uNow; |
| 144 | //printf("wb: block %u = %ub (%ub total)\n", | 145 | //printf("wb: block %u = %ub (%ub total)\n", |
| 145 | // uCurBlock, pCurBlock->uBytesUsed, uSize ); | 146 | // uCurBlock, pCurBlock->uBytesUsed, uSize ); |
| 146 | //if( pCurBlock->uBytesUsed == uBlockSize ) | 147 | //if( pCurBlock->uBytesUsed == uBlockSize ) |
| 147 | if( uPos%uBlockSize == 0 ) | 148 | if( iPos%uBlockSize == 0 ) |
| 148 | uCurBlock = rMyriad.getNextBlock( uCurBlock, pCurBlock ); | 149 | uCurBlock = rMyriad.getNextBlock( uCurBlock, pCurBlock ); |
| 149 | if( nBytes == 0 ) | 150 | if( nBytes == 0 ) |
| 150 | return nTotal; | 151 | return nTotal; |
| @@ -155,27 +156,27 @@ size_t Bu::MyriadStream::write( const void *pBuf, size_t nBytes ) | |||
| 155 | 156 | ||
| 156 | long Bu::MyriadStream::tell() | 157 | long Bu::MyriadStream::tell() |
| 157 | { | 158 | { |
| 158 | return uPos; | 159 | return iPos; |
| 159 | } | 160 | } |
| 160 | 161 | ||
| 161 | void Bu::MyriadStream::seek( long offset ) | 162 | void Bu::MyriadStream::seek( long offset ) |
| 162 | { | 163 | { |
| 163 | uPos += offset; | 164 | iPos += offset; |
| 164 | } | 165 | } |
| 165 | 166 | ||
| 166 | void Bu::MyriadStream::setPos( long pos ) | 167 | void Bu::MyriadStream::setPos( long pos ) |
| 167 | { | 168 | { |
| 168 | uPos = pos; | 169 | iPos = pos; |
| 169 | } | 170 | } |
| 170 | 171 | ||
| 171 | void Bu::MyriadStream::setPosEnd( long pos ) | 172 | void Bu::MyriadStream::setPosEnd( long pos ) |
| 172 | { | 173 | { |
| 173 | uPos = uSize-pos-1; | 174 | iPos = pStream->iSize-pos-1; |
| 174 | } | 175 | } |
| 175 | 176 | ||
| 176 | bool Bu::MyriadStream::isEos() | 177 | bool Bu::MyriadStream::isEos() |
| 177 | { | 178 | { |
| 178 | return true; | 179 | return iPos >= pStream->iSize; |
| 179 | } | 180 | } |
| 180 | 181 | ||
| 181 | bool Bu::MyriadStream::isOpen() | 182 | bool Bu::MyriadStream::isOpen() |
