From d5e7260f59ef59ca70023281884908ed39391b0e Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Sun, 26 Nov 2006 18:33:29 +0000 Subject: [PATCH] use AutoPtrCopyOnWrite --- stepmania/src/RageSoundReader_Preload.cpp | 61 +++++------------------ stepmania/src/RageSoundReader_Preload.h | 21 ++------ 2 files changed, 16 insertions(+), 66 deletions(-) diff --git a/stepmania/src/RageSoundReader_Preload.cpp b/stepmania/src/RageSoundReader_Preload.cpp index b889a2eaa5..e80ed2e35f 100644 --- a/stepmania/src/RageSoundReader_Preload.cpp +++ b/stepmania/src/RageSoundReader_Preload.cpp @@ -24,9 +24,14 @@ bool RageSoundReader_Preload::PreloadSound( SoundReader *&pSound ) return true; } +RageSoundReader_Preload::RageSoundReader_Preload(): + m_Buffer( new RString ) +{ +} + int RageSoundReader_Preload::GetTotalSamples() const { - return m_Buffer.get().size() / samplesize; + return m_Buffer->size() / samplesize; } bool RageSoundReader_Preload::Open( SoundReader *pSource ) @@ -45,7 +50,7 @@ bool RageSoundReader_Preload::Open( SoundReader *pSource ) if( iPCMSize > max_prebuf_size ) return false; /* Don't bother trying to preload it. */ - m_Buffer.get_owned().reserve( iPCMSize ); + m_Buffer.Get()->reserve( iPCMSize ); } while(1) @@ -64,9 +69,9 @@ bool RageSoundReader_Preload::Open( SoundReader *pSource ) break; /* eof */ /* Add the buffer. */ - m_Buffer.get_owned().append( buffer, buffer+iCnt ); + m_Buffer.Get()->append( buffer, buffer+iCnt ); - if( m_Buffer.get_owned().size() > max_prebuf_size ) + if( m_Buffer.Get()->size() > max_prebuf_size ) return false; /* too big */ } @@ -90,9 +95,9 @@ int RageSoundReader_Preload::SetPosition_Accurate(int ms) const int sample = int((ms / 1000.0f) * m_iSampleRate); m_iPosition = sample * samplesize; - if( m_iPosition >= int(m_Buffer.get().size()) ) + if( m_iPosition >= int(m_Buffer->size()) ) { - m_iPosition = m_Buffer.get().size(); + m_iPosition = m_Buffer->size(); return 0; } @@ -106,10 +111,10 @@ int RageSoundReader_Preload::SetPosition_Fast( int iMS ) int RageSoundReader_Preload::Read( char *pBuffer, unsigned iLen ) { - const unsigned bytes_avail = m_Buffer.get().size() - m_iPosition; + const unsigned bytes_avail = m_Buffer->size() - m_iPosition; iLen = min( iLen, bytes_avail ); - memcpy( pBuffer, m_Buffer.get().data()+m_iPosition, iLen ); + memcpy( pBuffer, m_Buffer->data()+m_iPosition, iLen ); m_iPosition += iLen; return iLen; @@ -125,46 +130,6 @@ int RageSoundReader_Preload::GetReferenceCount() const return m_Buffer.GetReferenceCount(); } -rc_string::rc_string() -{ - buf = new string; - cnt = new int(1); -} - -rc_string::rc_string(const rc_string &rhs) -{ - buf = rhs.buf; - cnt = rhs.cnt; - (*cnt)++; -} - -rc_string::~rc_string() -{ - (*cnt)--; - if(!*cnt) - { - delete buf; - delete cnt; - } -} - -string &rc_string::get_owned() -{ - if(*cnt != 1) - { - (*cnt)--; - buf = new string(*buf); - cnt = new int(1); - } - - return *buf; -} - -const string &rc_string::get() const -{ - return *buf; -} - /* * Copyright (c) 2003 Glenn Maynard * All rights reserved. diff --git a/stepmania/src/RageSoundReader_Preload.h b/stepmania/src/RageSoundReader_Preload.h index ef5eaa2e1d..f09c753139 100644 --- a/stepmania/src/RageSoundReader_Preload.h +++ b/stepmania/src/RageSoundReader_Preload.h @@ -4,27 +4,12 @@ #define RAGE_SOUND_READER_PRELOAD #include "RageSoundReader.h" - -/* Trivial wrapper to refcount strings, since std::string is not always - * refcounted. Without this, Copy() is very slow. */ -class rc_string -{ -public: - rc_string(); - rc_string(const rc_string &rhs); - ~rc_string(); - string &get_owned(); - const string &get() const; - int GetReferenceCount() const { return *cnt; } - -private: - mutable string *buf; - mutable int *cnt; -}; +#include "RageUtil_AutoPtr.h" class RageSoundReader_Preload: public SoundReader { public: + RageSoundReader_Preload(); /* Return true if the sound has been preloaded, in which case source will * be deleted. Otherwise, return false. */ bool Open( SoundReader *pSource ); @@ -48,7 +33,7 @@ public: static bool PreloadSound( SoundReader *&pSound ); private: - rc_string m_Buffer; + AutoPtrCopyOnWrite m_Buffer; /* Bytes: */ int m_iPosition;