From 8d7ac095c9c8f60edbf8cf678f1fe3cb6815eb6b Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Mon, 5 May 2014 23:02:13 -0700 Subject: [PATCH] Reduced memory utilization of Siren audio engine by dyanmically opening and closing the CoreAudio virtual file. --HG-- branch : nfb --- KREngine/kraken/KRAudioManager.cpp | 17 +++++++++++++ KREngine/kraken/KRAudioManager.h | 5 ++++ KREngine/kraken/KRAudioSample.cpp | 38 +++++++++++++++++++++++++----- KREngine/kraken/KRAudioSample.h | 4 ++++ 4 files changed, 58 insertions(+), 6 deletions(-) diff --git a/KREngine/kraken/KRAudioManager.cpp b/KREngine/kraken/KRAudioManager.cpp index eecaec2..5295c4a 100644 --- a/KREngine/kraken/KRAudioManager.cpp +++ b/KREngine/kraken/KRAudioManager.cpp @@ -414,6 +414,13 @@ void KRAudioManager::renderBlock() // ----====---- Advance audio sources ----====---- m_audio_frame += KRENGINE_AUDIO_BLOCK_LENGTH; + std::set open_samples = m_openAudioSamples; + + for(auto itr=open_samples.begin(); itr != open_samples.end(); itr++) { + KRAudioSample *sample = *itr; + sample->_endFrame(); + } + m_anticlick_block = false; m_mutex.unlock(); } @@ -1429,6 +1436,16 @@ void KRAudioManager::deactivateAudioSource(KRAudioSource *audioSource) m_activeAudioSources.erase(audioSource); } +void KRAudioManager::_registerOpenAudioSample(KRAudioSample *audioSample) +{ + m_openAudioSamples.insert(audioSample); +} + +void KRAudioManager::_registerCloseAudioSample(KRAudioSample *audioSample) +{ + m_openAudioSamples.erase(audioSample); +} + __int64_t KRAudioManager::getAudioFrame() { return m_audio_frame; diff --git a/KREngine/kraken/KRAudioManager.h b/KREngine/kraken/KRAudioManager.h index 33266f8..7b67b97 100644 --- a/KREngine/kraken/KRAudioManager.h +++ b/KREngine/kraken/KRAudioManager.h @@ -160,6 +160,9 @@ public: float getReverbMaxLength(); void setReverbMaxLength(float max_length); + void _registerOpenAudioSample(KRAudioSample *audioSample); + void _registerCloseAudioSample(KRAudioSample *audioSample); + private: bool m_enable_audio; bool m_enable_hrtf; @@ -184,6 +187,8 @@ private: std::set m_activeAudioSources; + std::set m_openAudioSamples; + void initAudio(); void initOpenAL(); void initSiren(); diff --git a/KREngine/kraken/KRAudioSample.cpp b/KREngine/kraken/KRAudioSample.cpp index f1f7cc4..a45fa6f 100644 --- a/KREngine/kraken/KRAudioSample.cpp +++ b/KREngine/kraken/KRAudioSample.cpp @@ -49,7 +49,7 @@ KRAudioSample::KRAudioSample(KRContext &context, std::string name, std::string e m_frameRate = 0; m_bufferCount = 0; - openFile(); + m_last_frame_used = 0; } KRAudioSample::KRAudioSample(KRContext &context, std::string name, std::string extension, KRDataBlock *data) : KRResource(context, name) @@ -64,8 +64,7 @@ KRAudioSample::KRAudioSample(KRContext &context, std::string name, std::string e m_frameRate = 0; m_bufferCount = 0; - openFile(); - + m_last_frame_used = 0; } KRAudioSample::~KRAudioSample() @@ -76,18 +75,21 @@ KRAudioSample::~KRAudioSample() int KRAudioSample::getChannelCount() { - openFile(); + loadInfo(); return m_channelsPerFrame; } int KRAudioSample::getFrameCount() { + loadInfo(); //return (int)((__int64_t)m_totalFrames * (__int64_t)frame_rate / (__int64_t)m_frameRate); return m_totalFrames; } float KRAudioSample::sample(int frame_offset, int frame_rate, int channel) { + loadInfo(); + int c = KRMIN(channel, m_channelsPerFrame - 1); if(frame_offset < 0) { @@ -123,6 +125,10 @@ float KRAudioSample::sample(int frame_offset, int frame_rate, int channel) void KRAudioSample::sample(__int64_t frame_offset, int frame_count, int channel, float *buffer, float amplitude, bool loop) { + loadInfo(); + + m_last_frame_used = getContext().getAudioManager()->getAudioFrame(); + if(loop) { int buffer_offset = 0; int frames_left = frame_count; @@ -275,6 +281,8 @@ void KRAudioSample::openFile() m_dataFormat = (outputFormat.mChannelsPerFrame > 1) ? AL_FORMAT_STEREO16 : AL_FORMAT_MONO16; m_channelsPerFrame = outputFormat.mChannelsPerFrame; + + getContext().getAudioManager()->_registerOpenAudioSample(this); } } @@ -289,6 +297,16 @@ void KRAudioSample::closeFile() AudioFileClose(m_audio_file_id); m_audio_file_id = 0; } + + getContext().getAudioManager()->_registerCloseAudioSample(this); +} + +void KRAudioSample::loadInfo() +{ + if(m_frameRate == 0) { + openFile(); + closeFile(); + } } std::string KRAudioSample::getExtension() @@ -304,13 +322,13 @@ bool KRAudioSample::save(KRDataBlock &data) float KRAudioSample::getDuration() { - openFile(); + loadInfo(); return (float)m_totalFrames / (float)m_frameRate; } int KRAudioSample::getBufferCount() { - openFile(); + loadInfo(); return m_bufferCount; } @@ -348,3 +366,11 @@ KRAudioBuffer *KRAudioSample::getBuffer(int index) return buffer; } +void KRAudioSample::_endFrame() +{ + const __int64_t AUDIO_SAMPLE_EXPIRY_FRAMES = 500; + long current_frame = getContext().getAudioManager()->getAudioFrame(); + if(current_frame > m_last_frame_used + AUDIO_SAMPLE_EXPIRY_FRAMES) { + closeFile(); + } +} diff --git a/KREngine/kraken/KRAudioSample.h b/KREngine/kraken/KRAudioSample.h index ab7093b..e348401 100644 --- a/KREngine/kraken/KRAudioSample.h +++ b/KREngine/kraken/KRAudioSample.h @@ -60,8 +60,11 @@ public: float sample(int frame_offset, int frame_rate, int channel); void sample(__int64_t frame_offset, int frame_count, int channel, float *buffer, float amplitude, bool loop); + void _endFrame(); private: + long m_last_frame_used; + std::string m_extension; KRDataBlock *m_pData; @@ -78,6 +81,7 @@ private: void openFile(); void closeFile(); + void loadInfo(); static OSStatus ReadProc( // AudioFile_ReadProc void * inClientData,