diff options
Diffstat (limited to 'sound')
-rw-r--r-- | sound/audiostream.cpp | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/sound/audiostream.cpp b/sound/audiostream.cpp index 02889fc714..26d7892e07 100644 --- a/sound/audiostream.cpp +++ b/sound/audiostream.cpp @@ -198,8 +198,10 @@ protected: byte *_end; bool _finalized; const int _rate; + uint32 _freeSpace; inline bool eosIntern() const { return _end == _pos; }; + void updateFreeSpace(); public: AppendableMemoryStream(int rate, uint bufferSize); ~AppendableMemoryStream() { free(_bufferStart); } @@ -217,6 +219,16 @@ public: uint32 getFreeSpace(); }; +template<bool stereo, bool is16Bit, bool isUnsigned> +void AppendableMemoryStream<stereo, is16Bit, isUnsigned>::updateFreeSpace() { + if (_pos <= _end) { + uint32 free_from_end = _bufferEnd - _end; + uint32 free_to_pos = _pos - _bufferStart; + _freeSpace = free_from_end + free_to_pos; + } else { + _freeSpace = _pos - _end; + } +} template<bool stereo, bool is16Bit, bool isUnsigned> AppendableMemoryStream<stereo, is16Bit, isUnsigned>::AppendableMemoryStream(int rate, uint bufferSize) @@ -231,6 +243,8 @@ AppendableMemoryStream<stereo, is16Bit, isUnsigned>::AppendableMemoryStream(int _bufferStart = (byte *)malloc(bufferSize); _pos = _end = _bufferStart; _bufferEnd = _bufferStart + bufferSize; + + updateFreeSpace(); } template<bool stereo, bool is16Bit, bool isUnsigned> @@ -244,6 +258,8 @@ inline int16 AppendableMemoryStream<stereo, is16Bit, isUnsigned>::read() { int16 val = READSAMPLE(is16Bit, isUnsigned, _pos); _pos += (is16Bit ? 2 : 1); + updateFreeSpace(); + return val; } @@ -263,6 +279,9 @@ int AppendableMemoryStream<stereo, is16Bit, isUnsigned>::readBuffer(int16 *buffe samples++; } } + + updateFreeSpace(); + return samples; } @@ -297,21 +316,12 @@ void AppendableMemoryStream<stereo, is16Bit, isUnsigned>::append(const byte *dat memcpy(_end, data, len); _end += len; } + updateFreeSpace(); } template<bool stereo, bool is16Bit, bool isUnsigned> uint32 AppendableMemoryStream<stereo, is16Bit, isUnsigned>::getFreeSpace() { - uint32 free; - - if (_pos <= _end) { - uint32 free_from_end = _bufferEnd - _end; - uint32 free_to_pos = _pos - _bufferStart; - free = free_from_end + free_to_pos; - } else { - free = _pos - _end; - } - - return free; + return _freeSpace; } #pragma mark - |